From b92b0c97bbe23e9c45e29eb53a2baf9885578908 Mon Sep 17 00:00:00 2001
From: 小小儁爺 <1694218219@qq.com>
Date: 星期三, 14 一月 2026 17:05:53 +0800
Subject: [PATCH] 1.甘特图初步研究
---
src/components/dhtmlxGantt/bower.json | 22
src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_skyblue.css | 1
src/components/dhtmlxGantt/codebase/dhtmlxgantt.d.ts | 4764 ++
src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_terrace.css | 2027 +
src/views/gantt/index.vue | 1624
src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_meadow.css | 1
src/components/dhtmlxGantt/codebase/dhtmlxgantt.css | 1
src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_broadway.css | 2136 +
src/components/dhtmlxGantt/codebase/dhtmlxgantt.js.map | 1
src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_black.css | 1
src/components/dhtmlxGantt/README.md | 151
src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.css | 2027 +
src/components/dhtmlxGantt/Gantt-Useful-Info.html | 282
src/components/dhtmlxGantt/license.txt | 339
src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_broadway.css | 1
src/permission.js | 2
src/components/dhtmlxGantt/codebase/dhtmlxgantt.js | 30964 ++++++++++++++++
src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.js | 54865 +++++++++++++++++++++++++++++
src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_black.css | 2094 +
src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_meadow.css | 2036 +
src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_material.css | 1
src/router/index.js | 4
src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_white.css | 2104 +
src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_skyblue.css | 2016 +
src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_terrace.css | 1
src/components/dhtmlxGantt/whatsnew.md | 843
src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_white.css | 1
src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_material.css | 2454 +
src/components/dhtmlxGantt/package.json | 58
29 files changed, 110,820 insertions(+), 1 deletions(-)
diff --git a/src/components/dhtmlxGantt/Gantt-Useful-Info.html b/src/components/dhtmlxGantt/Gantt-Useful-Info.html
new file mode 100644
index 0000000..cc6c1c0
--- /dev/null
+++ b/src/components/dhtmlxGantt/Gantt-Useful-Info.html
@@ -0,0 +1,282 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="preconnect" href="https://fonts.gstatic.com">
+ <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
+ <title>Getting Started with DHTMLX Gantt</title>
+ <style>
+ :root {
+ --dark-color: #5F5F5F;
+ --blue-color: #2095F3;
+ --light-gray: #F7F7F7;
+ --light-color: #828282;
+ }
+ h1,h2,h3,h4,h5,h6,p,ul,button {
+ padding: 0;
+ margin: 0;
+ }
+ body {
+ margin: 0;
+ padding: 0;
+ font-family: 'Roboto', sans-serif;
+ }
+ code {
+ display: block;
+ }
+ .container {
+ max-width: 1280px;
+ margin: 0 auto;
+ box-sizing: border-box;
+ padding: 20px 25px;
+ display: flex;
+ }
+ .col {
+ box-sizing: border-box;
+ max-width: 545px;
+ }
+ .col:last-of-type {
+ max-width: 100%;
+ }
+ .title {
+ color: var(--dark-color);
+ font-size: 16px;
+ line-height: 19px;
+ font-weight: 500;
+ }
+ .title--link {
+ color: var(--blue-color);
+ text-decoration: underline;
+ }
+ .page-title {
+ font-size: 18px;
+ line-height: 21px;
+ }
+ .blue-line {
+ position: relative;
+ }
+ .blue-line:after {
+ position: absolute;
+ content: '';
+ background-color: var(--blue-color);
+ height: 4px;
+ width: 105px;
+ left: 0;
+ bottom: -13px;
+ }
+ .logo {
+ display: inline-block;
+ }
+ .link {
+ font-size: 16px;
+ line-height: 24px;
+ color: var(--blue-color);
+ text-decoration: underline;
+ font-weight: 300;
+ }
+ .text-block {
+ font-weight: 300;
+ font-size: 16px;
+ line-height: 24px;
+ color: var(--dark-color);
+ }
+ .code {
+ background-color: var(--light-gray);
+ color: var(--dark-color);
+ font-size: 16px;
+ line-height: 24px;
+ padding: 5px;
+ border: 1px solid #e0e0e0;
+ box-sizing: border-box;
+ }
+ .code a {
+ color: var(--dark-color);
+ }
+ .picture-block {
+ text-align: center;
+ height: 253px;
+ background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnYAAAD9CAYAAAAxvDrLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAMRZSURBVHja7P0HfFzHee+NO8XXTnyT2PnfN/7fuMi6yWvnOo6T2IntxF0iRapYVhcpFokiRUqkqMYikmIRKfbeey8AAaL3Duxie++76L33xS468Htnzu6Ci+UusNhFWQDz4+f5nPqcM2fO8swXU5750peYmJiYmJiYpkXfvF3/tcfOdD/+nQudP3Lte+xMx9PfPdf5yvfOdS7+znnr8z+9hC//+Ai+9vh5+/OPn7E//9iF7ifI/l/T/a5rsJxkYmJiYmJiYppi/VSBL//Dhc6/o+uPn7f+gMKbyx47a/9JIPsfu0LAkAAghb3HrrQ9zkCPiYmJiYmJiWkS9Y+nW7793bO2J4fB7Aa+TveP2EfMBX2+9n/nfPev3fd//0LXt+j+753u+oX7/m9d7vk+y3UmJiYmJiYmpgkShbHHLrVztWq0KdXVvOrZxDqe/T/cZfgf7vsfu9D1Mq2ho/tpM623/bSZl9XiMTExMTExMTEFIA6+3GrcAm1ipbV87vtpU6sLGEecf6H7idH2f/d8+ze4WrzzHb9ggMfExMTExMTE5Id+fBtfm6omVgp/49n/7TOt/zK8jwEeExMTExMTE5Nv/Z8ztn+hTaTBNLH6akod7346qtYd7rzBJj3fBZVMTExMTExMTExO0XAl4x3FOhFNrJ77v3fOtpADuPPt3xgPVLI3yMTExMTExDTn9fj5nh+EUhNrMP35mJiYmJiYmJjmrP7hVPtPQ7GJ1Z/+fJ77XbDJ+t0xMTExMTExzTl5jlYN1SbWQEKmPHbB/u+seZaJiYmJiYlp1mu0Ua+h2sQaGGzaFjK4Y2JiYmJiYprVUEfnag0mUPB0NbEGBpsM7piYmJiYmJhmqSjUzeQm1sBgk8EdExMTExMT0yzU7GhiDQA2T3f8gr19JiYmJiYmplkhGnh4djWxjh82/+FC74/YL4GJicmrdu3a9afvvffed1avfu+Fd95d+z5Zblq9eu2O1avf/ZzYHrLO2Sqyztkq1753PWzt8P531ry3e/W7jn1r1qwj645j77otuXWnrXnPcc67776/Z/W7ruPvP1yuddq77w9vr13rsb72A7L8gFtfO2L9/T3vrVu/27Xusvff/4Cz9es/fHiMbK/l9n80cn2tY+na//77bttrHddYv/7j3dy+D+g5jqXLPvjgE87o+voPP979wQeexx324ccbdjvOfejzwUefDK9/9NHDbW6dnveRY91hG92WxD7ZOLz+gdu+Tz5xHhu2zdy+h7bZYRs3c8c3bNi0e/jYxs0PjzvP2ehmju0tzm3ncvMWt/1ebLPjvM1k+dC2DS83Dm+72ZZtzmMjt7klsS1bto9cd55H10fYNrrcxi23bXNue9i2bTuHl9ucy88+27Wb297uZts8bPtI2759FzEvy527Rtp2p5H1nZztHnHctU2X7rZr1+e7d+6iS9c2We76YsT2Lm57z2663Dm87Thn1+4vHm7v/mJ4+/M9e3fT9d2793HmWueWX+wb3u/VvjjALb+gS3ruF451l9HtvXsPksWBEfuHjezft+8QMcf6joOnj71/6F70hoOXr9H92w6eP/3+obvR64m9f+Ru9IbDV6/tO3Bkz5b950+vO3wvau3h8PtrjkXfevdY7J6jR8/8008v1fyv0GxiHT9sPnal7XFWgjExMQ1r5cqVf0sg4zABrapFi5bg+T++iIVPP4t585/Ck/OewhNPzMMTT85zLN2N7HvStf/J+dzySbKk9oTH/uGl2zkjzn1y3gi/J53bT85zP2++F9+R/g579B70OvPmPbpveOk6Pu/h/nkj1p96eMy1Pnytp7hzuXOefHh8ntvyof9Tbtsjl651b+fMG2MfZ/O973vS/RhZzp+/wPv5dP9893MXkHMfPeby55bcOa5tx77RbPiaox53s6f83V44cvmU+z66vXD43KfI+lPObW7p3De8PWwOv6dGMe74Auf2Ard1T+OOPT3y+AI/7SkPX9c6sQVk3dOeGraFbvu8n8vZQl/7n3H4LXz6oS3wZ/kMFhKj69ySs6ed208P73c/5toesX/YnyyffsbrOQu92dMex5922NPPPIc/PP8CXn75VSxZsgxr131gX7/jaPaCM8rNM3VWCtd+Fxyy0oyJielLH27YMP/DjzY0vvLKa3jxxZewe/du3Lp1G2KxGHq9AWazBQWWAhQUOMxisQyve5rFdZ6lwOc5wzbGOe73sRBTqVSj3ne0dLlfT65QjHk/b8cc93BsazSakc87yjXGyi/XNca+9qPPyy09rmk0Grl93PEx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') center center no-repeat;
+ background-size: contain;
+ }
+ .technology {
+ display: flex;
+ justify-content: space-between;
+ }
+ .technology-col {
+ display: flex;
+ flex-direction: column;
+ }
+ .technology-link {
+ display: block;
+ position: relative;
+ font-size: 16px;
+ line-height: 24px;
+ text-decoration: underline;
+ color: var(--blue-color);
+ padding-left: 10px;
+ font-weight: 300;
+ }
+ .technology-link:before {
+ position: absolute;
+ content: '';
+ background-color: var(--blue-color);
+ width: 5px;
+ height: 5px;
+ border-radius: 50%;
+ left: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ }
+ .copyright {
+ text-align: right;
+ font-size: 14px;
+ font-weight: 300;
+ line-height: 24px;
+ color: var(--light-color);
+ }
+ .copyright span:first-of-type {
+ margin-right: 10px;
+ }
+ .m-b-25 {
+ margin-bottom: 25px;
+ }
+ .m-b-15 {
+ margin-bottom: 15px;
+ }
+ .m-b-10 {
+ margin-bottom: 10px;
+ }
+ .m-b-5 {
+ margin-bottom: 5px;
+ }
+ .m-t-10 {
+ margin-top: 10px;
+ }
+ .m-t-5 {
+ margin-top: 5px;
+ }
+ .m-r-50 {
+ margin-right: 50px;
+ }
+ @media screen and (max-width: 1000px) {
+ .container {
+ flex-direction: column;
+ }
+ .col {
+ width: 100%;
+ max-width: unset;
+ }
+ .picture-block img {
+ width: 100%;
+ }
+ .technology {
+ flex-direction: column;
+ }
+ .technology-col {
+ text-align: auto;
+ }
+ }
+ @media screen and (min-width: 600px) {
+ .technology {
+ flex-direction: row;
+ }
+ }
+ </style>
+</head>
+<body>
+ <main class="page">
+ <div class="container">
+ <div class="col m-r-50">
+ <a href="https://dhtmlx.com/?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" target="_blank" class="logo m-b-10">
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M42.06 30.6L38.1 23.16L34.14 30.6H28.2L34.8 19.74L28.2 9.60001H34.14L38.1 15.72L42.06 9.60001H48L40.74 19.74L48 30.6H42.06ZM0 33.6V32.4H48V33.6H0ZM27.6 30.6L32.4 23.16V16.8L27.6 9.60001V17.04H21V9.60001H15.6V11.88C16.56 12.66 17.4 13.62 18 14.82C18.78 16.32 19.2 18.06 19.2 20.1C19.2 22.08 18.78 23.82 17.94 25.38C17.28 26.52 16.5 27.48 15.6 28.26V30.6H21V21.78H27.6V30.6ZM18.6 20.1C18.6 22.08 18.18 23.82 17.34 25.38C16.5 26.94 15.42 28.14 14.1 28.92C13.02 29.64 11.82 30.06 10.56 30.3C9.3 30.48 7.92 30.6 6.48 30.6H0V9.60001H6.48C7.92 9.60001 9.3 9.72001 10.62 9.90001C11.88 10.08 13.08 10.56 14.22 11.28C15.6 12.18 16.68 13.38 17.46 14.88C18.18 16.32 18.6 18.12 18.6 20.1ZM10.56 14.28C11.52 14.82 12.24 15.6 12.72 16.56C13.2 17.52 13.44 18.72 13.5 20.04C13.5 21.48 13.26 22.62 12.84 23.58C12.36 24.54 11.7 25.32 10.86 25.86C10.14 26.34 9.35996 26.58 8.57996 26.64C7.73996 26.7 6.77996 26.7 5.57996 26.7H5.45996V13.56H5.57996C6.65996 13.56 7.55996 13.56 8.33996 13.62C9.11996 13.68 9.83996 13.86 10.56 14.28ZM2.4 35.4V36H1.2V37.8H2.4V38.4H0.6V35.4H2.4ZM2.4 37.8V36H3V37.8H2.4ZM11.4 36.6H10.2V35.4H9.6V38.4H10.2V37.2H11.4V38.4H12V35.4H11.4V36.6ZM21 35.4V36H19.8V38.4H19.2V36H18V35.4H21ZM28.2 36H27.6V35.4H27V38.4H27.6V36.6H28.2V37.2H28.8V36.6H29.4V38.4H30V35.4H29.4V36H28.8V36.6H28.2V36ZM36 35.4H36.6V37.8H38.4V38.4H36V35.4ZM45.6 36H45V35.4H44.4V36H45V36.6H45.6V37.2H45V37.8H44.4V38.4H45V37.8H45.6V37.2L46.2 37.2V37.8H46.8V38.4H47.4V37.8H46.8V37.2H46.2L46.2 36.6H46.8V36H47.4V35.4H46.8V36H46.2V36.6H45.6V36Z" fill="#2095F3"/>
+ </svg>
+ </a>
+ <h1 class="page-title title blue-line m-b-25">Getting Started with DHTMLX Gantt</h1>
+ <p class="text-block m-b-15">
+ Any web-based project management application can be complemented with a full-fledged Gantt chart built with DHTMLX Gantt. We鈥檝e put together links to useful materials devoted to initializing, configuring, customizing, and using DHTMLX Gantt with popular technologies. Thus, you will be able to make the most of DHTMLX in the shortest possible time.
+ </p>
+ <h2 class="title m-b-10">Samples</h2>
+ <p class="text-block m-b-10">
+ This package contains more than 100 code samples, which demonstrate different configurations of DHTMLX Gantt. In order to explore them, you can run a built-in app (you'll need Node.js for this):
+ <code class="code m-b-10 m-t-10">
+ npm install <br>
+ npm run start
+ </code>
+ And open <span class="code"><a href="http://localhost:9200" target="_blank">http://localhost:9200</a></span> in your browser.
+ </p>
+ <p class="text-block m-b-10">
+ Or you can find individual HTML <span class="code">samples</span> in the samples folder of the package.
+ </p>
+ <a class="title title--link m-b-10" target="_blank" href="https://docs.dhtmlx.com/gantt/api__refs__gantt.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt">
+ API Reference
+ </a>
+ <p class="text-block m-b-10">
+ Examine methods, events, properties, and templates
+ </p>
+ <a class="title title--link m-b-10" target="_blank" href="https://docs.dhtmlx.com/gantt/desktop__guides.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt">
+ Guides
+ </a>
+ <p class="text-block m-b-10">
+ Learn how to configure each and every Gantt element
+ </p>
+ <a class="title title--link m-b-10" target="_blank" href="https://docs.dhtmlx.com/gantt/desktop__video_guides.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt">
+ Video Guides
+ </a>
+ <p class="text-block m-b-10">
+ Watch a series of video guides about Gantt configuration and integration
+ </p>
+ </div>
+ <div class="col">
+ <div class="picture-block m-b-15"></div>
+
+ <div class="technology m-b-10">
+ <div class="technology-col">
+ <h2 class="title m-b-5 ">Client-Side Integrations</h2>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__initializing_gantt_chart.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" target="_blank" class="technology-link">JavaScript/HTML5</a>
+ <a href="https://dhtmlx.com/blog/create-react-gantt-chart-component-dhtmlxgantt/?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" target="_blank" class="technology-link">React</a>
+ <a href="https://dhtmlx.com/blog/dhtmlx-gantt-chart-usage-angularjs-2-framework/?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" target="_blank" class="technology-link">Angular</a>
+ <a href="https://dhtmlx.com/blog/use-dhtmlxgantt-vue-js-framework-demo/" class="technology-link" target="_blank">Vue.js</a>
+ </div>
+ <div class="technology-col">
+ <h2 class="title m-b-5">Server-Side Integrations</h2>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__howtostart_dotnet_core.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="technology-link" target="_blank">ASP.Net Core</a>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__howtostart_dotnet.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="technology-link" target="_blank">ASP.Net MVC</a>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__howtostart_nodejs.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="technology-link" target="_blank">Node.js</a>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__howtostart_php_laravel.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="technology-link" target="_blank">PHP Laravel</a>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__howtostart_php.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="technology-link" target="_blank">PHP Slim 3</a>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__howtostart_php_slim4.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="technology-link" target="_blank">PHP Slim 4</a>
+ <a href="https://docs.dhtmlx.com/gantt/desktop__howtostart_ruby.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="technology-link" target="_blank">Ruby on Rails</a>
+ </div>
+ <div class="technology-col">
+ <h2 class="title m-b-5">Integration with Salesforce</h2>
+ <p class="text-block"><span class="subtitle">Lightning Aura Framework:</span>
+ <a href="https://files.dhtmlx.com/30d/1ceb430172c26291dc773c038da796bc/dhtmlxGantt-for-Salesforce2.pdf" class="technology-link m-t-5" target="_blank">Short Guide</a>
+ <a href="https://files.dhtmlx.com/30d/006613a641ae5a8293ee4082b5aa0056/dhtmlxGantt_for_Salesforce_how_to_start_CRUD.pdf" class="technology-link m-b-5" target="_blank">How to Start CRUD</a>
+ </p>
+ <p class="text-block">
+ <span class="subtitle">Lightning Web Components:</span>
+ <a href="https://www.youtube.com/watch?v=cCvULTQxPfg" class="technology-link m-t-5" target="_blank">Video Guide</a>
+ <a href="https://github.com/DHTMLX/salesforce-gantt-demo" class="technology-link" target="_blank">GitHub</a>
+ </p>
+ </div>
+ </div>
+ <a class="title title--link m-b-10" target="_blank" href="https://docs.dhtmlx.com/gantt/faq.html?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" target="_blank">
+ FAQ
+ </a>
+ <p class="text-block m-b-10">
+ Find answers to frequently asked technical questions
+ </p>
+ <p class="text-block m-b-10">
+ If you decide to switch to a commercial version of DHTMLX with regular updates and timely customer support, learn more on our <a href="https://dhtmlx.com/docs/products/licenses.shtml?utm_source=trial_html&utm_medium=referral&utm_campaign=gantt" class="link" target="_blank">licensing and pricing page.</a>
+ </p>
+ <p class="text-block m-b-10">
+ If you don鈥檛 find the necessary information following the links below, please contact our technical support team via email: <a href="mailto:evaluation.support@dhtmlx.com" class="link">evaluation.support@dhtmlx.com</a>
+ </p>
+ <p class="copyright"><span>漏 XB Software Ltd.</span><span>All rights reserved</span></p>
+ </div>
+ </div>
+ </main>
+ </body>
+ </html>
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/README.md b/src/components/dhtmlxGantt/README.md
new file mode 100644
index 0000000..bd85829
--- /dev/null
+++ b/src/components/dhtmlxGantt/README.md
@@ -0,0 +1,151 @@
+# dhtmlxGantt #
+
+[](https://dhtmlx.com/)
+[](https://www.npmjs.com/package/dhtmlx-gantt)
+[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html)
+
+[Getting started](#getting-started) | [Features](#features) | [License](#license) | [Useful links](#links) | [Follow us](#followus)
+
+[DHTMLX Gantt](https://dhtmlx.com/docs/products/dhtmlxGantt) is an open source JavaScript Gantt chart library that helps you illustrate and manage a project schedule in a nice-looking diagram.
+
+<a href="https://dhtmlx.com/docs/products/dhtmlxGantt/">
+ <img src="https://github.com/plazarev/media/blob/master/opensource-gantt-javascript.png">
+</a>
+
+It can show the dependencies between tasks as lines and allows you to set up different relationships between tasks (finish-to-start, start-to-start, finish-to-finish, start-to-finish). The Standard edition also inludes intuituve drag-n-drop interface and smart rendering which considerably boost performance while working with a large amount of tasks.
+
+DHTMLX Gantt provides a flexible API and a large number of event handlers, which gives you the freedom to customize it for your needs. Moreover, the library comes with a comprehensive documentation and step-by-step video tutorials thus simplifying learning.
+
+<a name="getting-started"></a>
+## Getting started ##
+
+Add files:
+
+~~~html
+<script src="dhtmlxgantt.js" ></script>
+<link rel="stylesheet" href="dhtmlxgantt.css" type="text/css">
+~~~
+
+Add markup:
+
+~~~html
+<div id="gantt_here" style='width:100%; height:100vh;'></div>
+~~~
+
+And initialize:
+
+~~~js
+gantt.config.date_format = "%Y-%m-%d %H:%i";
+gantt.init("gantt_here");
+gantt.parse({
+ data: [
+ {id: 1, text: "Project #1", start_date: null, duration: null, parent:0, progress: 0, open: true},
+ {id: 2, text: "Task #1", start_date: "2019-08-01 00:00", duration:5, parent:1, progress: 1},
+ {id: 3, text: "Task #2", start_date: "2019-08-06 00:00", duration:2, parent:1, progress: 0.5},
+ {id: 4, text: "Task #3", start_date: null, duration: null, parent:1, progress: 0.8, open: true},
+ {id: 5, text: "Task #3.1", start_date: "2019-08-09 00:00", duration:2, parent:4, progress: 0.2},
+ {id: 6, text: "Task #3.2", start_date: "2019-08-11 00:00", duration:1, parent:4, progress: 0}
+ ],
+ links:[
+ {id:1, source:2, target:3, type:"0"},
+ {id:2, source:3, target:4, type:"0"},
+ {id:3, source:5, target:6, type:"0"}
+ ]
+});
+~~~
+
+==> [Check the live demo](https://snippet.dhtmlx.com/a69d7378a)
+
+### Complete guides ###
+
+- [Vue.js](https://dhtmlx.com/blog/use-dhtmlxgantt-vue-js-framework-demo/)
+- [Angular](https://dhtmlx.com/blog/dhtmlx-gantt-chart-usage-angularjs-2-framework/)
+- [React](https://dhtmlx.com/blog/create-react-gantt-chart-component-dhtmlxgantt/)
+- [Node](https://docs.dhtmlx.com/gantt/desktop__howtostart_nodejs.html)
+- ASP.NET
+ - [ASP.NET MVC 5](https://docs.dhtmlx.com/gantt/desktop__howtostart_dotnet.html)
+ - [ASP.NET Core](https://docs.dhtmlx.com/gantt/desktop__howtostart_dotnet_core.html)
+- PHP
+ - [Laravel](https://docs.dhtmlx.com/gantt/desktop__howtostart_php_laravel.html)
+ - [Slim framework](https://docs.dhtmlx.com/gantt/desktop__howtostart_php_laravel.html)
+- [Ruby on Rails](https://docs.dhtmlx.com/gantt/desktop__howtostart_ruby.html)
+- [Python](https://docs.dhtmlx.com/gantt/desktop__howtostart_python.html)
+- [Meteor](https://dhtmlx.com/blog/using-dhtmlx-gantt-chart-meteorjs-framework/)
+
+#### All tutorials ####
+
+[https://docs.dhtmlx.com/gantt/desktop__howtostart_guides.html](https://docs.dhtmlx.com/gantt/desktop__howtostart_guides.html)
+
+#### Video guides ####
+
+[https://www.youtube.com/user/dhtmlx/videos](https://www.youtube.com/user/dhtmlx/videos)
+
+<a name="features"></a>
+## Features of the Standard Edition ##
+
+- 4 types of tasks linking: finish-to-start, start-to-start, finish-to-finish, start-to-finish
+- dragging and dropping multiple tasks horizontally
+- multi-task selection
+
+<img src="https://github.com/plazarev/media/blob/master/drag-and-drop.gif" alt= "multitask-drag-n-drop" height="350">
+
+- backward planning
+- tasks filtering
+- smart rendering
+- inline editing
+
+<img src="https://github.com/plazarev/media/blob/master/inline-editing.gif" alt= "inline-editing" height="350">
+
+- managing editability/readonly modes of individual tasks
+- tooltips
+- undo/redo functionality
+- configurable columns in the grid
+- customizable time scale and task edit form
+- progress percent coloring for tasks
+- 7 different skins
+
+
+
+- online export to PDF, PNG, Excel, iCal, and MS Project
+- cross-browser compatibility
+- 32 locales
+- keyboard navigation
+- accessibility
+
+Resource management, critical path calculation, auto scheduling, and other enhanced features are available with the PRO edition. You can see the full list of features and compare the two DHTMLX Gantt editions [in the documentation](https://docs.dhtmlx.com/gantt/desktop__editions_comparison.html).
+
+<a name="license"></a>
+## License ##
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+
+<a name="links"></a>
+## Useful links
+
+- [DHTMLX Gantt product page](https://dhtmlx.com/docs/products/dhtmlxGantt/)
+- [Official documentation](https://docs.dhtmlx.com/gantt/)
+- [Online samples](https://docs.dhtmlx.com/gantt/samples/)
+- [Video tutorials](https://www.youtube.com/watch?v=cCvULTQxPfg&list=PLKS_XdyIGP4MEW6yvvQUZT8vJKHVOq2S0)
+- [Export services](https://dhtmlx.com/docs/products/dhtmlxGantt/export.shtml)
+- [List of available integrations](https://dhtmlx.com/docs/products/integrations/)
+- [Support forum](https://forum.dhtmlx.com/c/gantt)
+
+<a name="followus"></a>
+## Follow us ##
+
+Star our GitHub repo :star:
+
+Check our [roadmap](https://trello.com/b/fhOySHPj/gantt-roadmap) for future updates :wrench:
+
+Read us on [Medium](https://medium.com/@dhtmlx) :newspaper:
+
+Follow us on [Twitter](https://twitter.com/dhtmlx) :bird:
+
+Like our page on [Facebook](https://www.facebook.com/dhtmlx/) :thumbsup:
diff --git a/src/components/dhtmlxGantt/bower.json b/src/components/dhtmlxGantt/bower.json
new file mode 100644
index 0000000..1075ae4
--- /dev/null
+++ b/src/components/dhtmlxGantt/bower.json
@@ -0,0 +1,22 @@
+{
+ "name": "gantt",
+ "version": "8.0.6",
+ "homepage": "https://dhtmlx.com/docs/products/dhtmlxGantt/",
+ "description": "An open source JavaScript Gantt chart that helps you illustrate a project schedule in a nice-looking chart.",
+ "main": [
+ "codebase/dhtmlxgantt.js",
+ "codebase/dhtmlxgantt.css"
+ ],
+ "keywords": [
+ "gantt",
+ "chart",
+ "gantt chart",
+ "calendar",
+ "scheduler",
+ "dhtmlx",
+ "dhtmlxgantt",
+ "timeline",
+ "browser"
+ ],
+ "license": "GPL-2.0"
+}
diff --git a/src/components/dhtmlxGantt/codebase/dhtmlxgantt.css b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.css
new file mode 100644
index 0000000..56226a3
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.css
@@ -0,0 +1 @@
+.gridHoverStyle,.gridSelection,.timelineSelection{background-color:#fff3a1}.gantt_grid_scale .gantt_grid_head_cell{color:#a6a6a6;border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none;color:#454545}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_up{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:10px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#a6a6a6;border-right:1px solid #ebebeb}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51}.buttonBg{background:#fff}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.gantt_btn_set.gantt_cancel_btn_set{background:#fff;color:#454545;border:1px solid #cecece}.gantt_btn_set.gantt_save_btn_set{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff}.gantt_btn_set.gantt_delete_btn_set{text-shadow:0 -1px 0 #6f6f6f;background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_popup_button.gantt_ok_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.gantt_popup_button.gantt_cancel_button{font-weight:700;color:#454544}.gantt_popup_title{background-color:#fff}.gantt_popup_shadow{box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_qi_big_icon.icon_edit{color:#454545;background:#fff}.gantt_qi_big_icon.icon_delete{text-shadow:0 -1px 0 #a60;background:#ec8e00;color:#fff;border-width:0}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-size:8pt;color:#454545}.gantt_container,.gantt_tooltip{background-color:#fff;font-family:Arial}.gantt_container{font-size:13px;border:1px solid #cecece;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#6b6b6b;font-size:12px;border-bottom:1px solid #cecece;box-sizing:border-box}.gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cecece}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cecece;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:33px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#fff3a1}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#cecece;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#ebebeb;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #cecece;border-right:1px solid #cecece}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #cecece;border-bottom:1px solid #cecece;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cecece;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAArklEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNUAGcXJyMnz//h3uQrJdRLFBIAPQAchlJLsIFuCMjIwM////B5sJMoRkg2CuIdtrQcHBDOxsbHBfCQgIMHz48AHO//nrF8O6tWsJR7+7uzsDIxMTznT0/98/hp07d+I3iGopm2DewKFg8OV+AJWkfRMrTobLAAAAAElFTkSuQmCC);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAkUlEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNeIN4uTkxAin79+/M5AcRtgCHGQIyQbhijaiDQoKDmZgZ2PDGf0/f/1iWLd2LeHod3d3Z2BkYsJp0P9//xh27tyJ3yCqpWyCeQOHgsGX+wEZpW4T5LCxKwAAAABJRU5ErkJggg==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAs0lEQVQ4T62T0Q2EIBBEpQlzuaaMsQoqooqLsSljbMLLmMxmUXBR4U+Qt7Mzi2sqLVeJ00SgEMKWAnvvzYLyAyHfT5sU2fXDJSwCAXK8MI0/UTkva7IIFJsg3NSwnKdFoKtAWOQ1CN7CEqeTotE5L7QyJhmBcklZM4ZgTiAr3iOU3kD93ppO5SkMjB1EeXdBWoSkRql3YeIRe+cGvktS056JR9wsmeBUkujCfNXWCPC8GugPqn5ii/hV+FoAAAAASUVORK5CYII=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAfElEQVQ4T2NkoBJgpJI5DCgGTZ8+/T82gzMzMwlaCFcAM0RKQgyrI/0Dg/EahmIQyBB0DRvXr4W78tmLV1gtAbmYoEEgnciG4QpTogzCFyEwSyg2CBS2oCAZNQh3cA+hMAJ5AlcKxuVBlOgnNgVjMwyUrQjmamKLGaoZBAAOTFyLnFFW4wAAAABJRU5ErkJggg==)}.gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAeElEQVQ4T2NkoBJgRDZn+vTp/wmZm5mZiaIHph7DICkJMUJmMfgHBmMYhtUgbAo3rl+L4lp0NUQbBPI2umuRDaPIIFAYwAyjv0HoMQALM5JdhG4QLMxGDcKdyIdoGIE89OzFK4KZF5Rl8EY/QROQFGA1iBQD0NUCAJVjcxO0naAQAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#ffa011;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#ffa011}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#ffa011}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:Arial;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #cecece;background:#fff}.gantt_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.gantt_button,.gantt_popup_button{border:1px solid #cecece;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:10px}.gantt_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:4px;font-size:14px;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:1px solid #cecece;height:40px;line-height:40px;font-size:20px}.gantt_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.gantt-error,.gantt-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cecece}.gantt-error{background-color:#d81b1b;border:1px solid #ff3c3c}.gantt-error div{background-color:#d81b1b;border:1px solid #940000;color:#fff}.gantt-warning{background-color:#ff9000;border:1px solid #ffa633}.gantt-warning div{background-color:#ff9000;border:1px solid #b36500;color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#fff;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#299cb4}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:2px;position:absolute;box-sizing:border-box;background-color:#3db9d3;border:1px solid #2898b0;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;top:0;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:8.75px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #3db9d3}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#ffbf5e;border-color:#ffa011}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#ffa011}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#ffa011;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 4px 6px;border-color:transparent transparent #ffa011;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#ffa011;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-top-color:#ffa011;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:100%;width:8px;z-index:1;top:-1px}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAs0lEQVQoz6WMPW7CQBgFJxZaiZ60qcgdwjVMmzu8gpwhDULabXyBdHAGuzRHivQiQZovigS2+Jtu95t5T03TMITtCtjEc5VSOgx5k5F4CnxJWgKUUl5sv6eUvk/daiCeAe1fDCCpBtq4jQ/YngO9pMWpGH99OOcDtt8ifmWEuO3D/R+wXQOdpGcuIGkGdNFQ2RawlTTlSsLd2RY55+O95JyPFQ/y8MAE+CylfADpxvYHWP8CXj+JR4wdKHYAAAAASUVORK5CYII=)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #299cb4}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#d33daf;border:0 solid #61164f;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:6px;font-family:Arial;font-size:13px;border:1px solid #cecece;color:#6b6b6b;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:Arial;border:1px solid #cecece;font-size:13px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:Arial;font-size:13px;box-sizing:border-box;border:1px solid #cecece;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #cecece;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;border-radius:4px;border:0 solid #cecece;height:32px;font-weight:700;background:#fff;box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #cecece}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:13px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #cecece}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cecece}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:70px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px;padding-bottom:1px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #ebebeb;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:1px solid #cecece;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#454545;background-color:#fff;border-bottom:1px solid #cecece}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:13px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#454545;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:6px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-top-left-radius:0;border-bottom-left-radius:6px;border-top-right-radius:0;border-bottom-right-radius:6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cecece}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:13px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:13px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #cecece}.gantt_layout_cell_border_right{border-right:1px solid #cecece}.gantt_layout_cell_border_top{border-top:1px solid #cecece}.gantt_layout_cell_border_bottom{border-bottom:1px solid #cecece}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:Arial;font-size:13px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#f8fdfd}.gantt_popup_button.gantt_delete_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/dhtmlxgantt.d.ts b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.d.ts
new file mode 100644
index 0000000..fdfa55b
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.d.ts
@@ -0,0 +1,4764 @@
+// Type definitions for dhtmlxGantt 8.0.6
+// Project: https://dhtmlx.com/docs/products/dhtmlxGantt
+
+type GanttCallback = (...args: any[]) => any;
+
+
+export type GanttEventName = "onAfterAutoSchedule" | "onAfterBatchUpdate" | "onAfterBranchLoading" | "onAfterLightbox" | "onAfterLinkAdd" | "onAfterLinkDelete" | "onAfterLinkUpdate" | "onAfterQuickInfo" | "onAfterRedo" | "onAfterRowResize" | "onAfterSort" | "onAfterTaskAdd" | "onAfterTaskAutoSchedule" | "onAfterTaskDelete" | "onAfterTaskDrag" | "onAfterTaskMove" | "onAfterTaskUpdate" | "onAfterUndo" | "onAjaxError" | "onAutoScheduleCircularLink" | "onBeforeAutoSchedule" | "onBeforeBatchUpdate" | "onBeforeBranchLoading" | "onBeforeCollapse" | "onBeforeDataRender" | "onBeforeExpand" | "onBeforeGanttReady" | "onBeforeGanttRender" | "onBeforeLightbox" | "onBeforeLinkAdd" | "onBeforeLinkDelete" | "onBeforeLinkDisplay" | "onBeforeLinkUpdate" | "onBeforeMultiSelect" | "onBeforeParse" | "onBeforeRedo" | "onBeforeRedoStack" | "onBeforeRollupTaskDisplay" | "onBeforeRowDragEnd" | "onBeforeRowDragMove" | "onBeforeRowResize" | "onBeforeRowResizeEnd" | "onBeforeSplitTaskDisplay" | "onBeforeTaskAdd" | "onBeforeTaskAutoSchedule" | "onBeforeTaskChanged" | "onBeforeTaskDelete" | "onBeforeTaskDisplay" | "onBeforeTaskDrag" | "onBeforeTaskMove" | "onBeforeTaskMultiSelect" | "onBeforeTaskSelected" | "onBeforeTaskUpdate" | "onBeforeUndo" | "onBeforeUndoStack" | "onCircularLinkError" | "onClear" | "onCollapse" | "onColumnResize" | "onColumnResizeEnd" | "onColumnResizeStart" | "onContextMenu" | "onDataProcessorReady" | "onDataRender" | "onDestroy" | "onEmptyClick" | "onError" | "onExpand" | "onGanttLayoutReady" | "onGanttReady" | "onGanttRender" | "onGanttScroll" | "onGridHeaderClick" | "onGridResize" | "onGridResizeEnd" | "onGridResizeStart" | "onLightbox" | "onLightboxButton" | "onLightboxCancel" | "onLightboxChange" | "onLightboxDelete" | "onLightboxSave" | "onLinkClick" | "onLinkCreated" | "onLinkDblClick" | "onLinkIdChange" | "onLinkValidation" | "onLoadEnd" | "onLoadStart" | "onMouseMove" | "onMultiSelect" | "onOptionsLoad" | "onParse" | "onQuickInfo" | "onRowDragEnd" | "onRowDragStart" | "onRowResize" | "onScaleAdjusted" | "onScaleClick" | "onTaskClick" | "onTaskClosed" | "onTaskCreated" | "onTaskDblClick" | "onTaskDrag" | "onTaskIdChange" | "onTaskLoading" | "onTaskMultiSelect" | "onTaskOpened" | "onTaskRowClick" | "onTaskSelected" | "onTaskUnselected" | "onTemplatesReady";
+
+
+export interface GanttTemplates {
+
+ /**
+ * specifies the content of start date or end date columns in grid
+ * @param date the date which needs formatting
+ * @param task the task object
+ * @param column the name of the column that called the template
+ */
+ date_grid(date: Date, task: Task, column: string): string;
+
+ /**
+ * specifies the text of tooltips that are displayed when the user creates a new dependency link
+ * @param from the id of the source task
+ * @param from_start <i>true</i>, if the link is being dragged from the start of the source task, <i>false</i> - if <br> from the end of the task
+ * @param to the id of the target task( 'null' or 'undefined', if the target task isn't specified yet)
+ * @param to_start <i>true</i>, if the link is being dragged to the start of the target task, <i>false</i> - if <br> to the end of the task
+ */
+ drag_link(from: string | number, from_start: boolean, to: string | number, to_start: boolean): string;
+
+ /**
+ * specifies the CSS class that will be applied to the pop-up that appears when a user drags a link
+ * @param from the id of the source task
+ * @param from_start <i>true</i>, if the link is being dragged from the start of the source task, <i>false</i> - if <br> from the end of the task
+ * @param to the id of the target task( 'null' or 'undefined', if the target task isn't specified yet)
+ * @param to_start <i>true</i>, if the link is being dragged to the start of the target task, <i>false</i> - if <br> to the end of the task
+ */
+ drag_link_class(from: string | number, from_start: boolean, to: string | number, to_start: boolean): string;
+
+ /**
+ * converts a date object to a date string. Used to send data back to the server
+ * @param date the date which needs formatting
+ */
+ format_date(date: Date): string;
+
+ /**
+ * specifies the custom content inserted before the labels of child items in the tree column
+ * @param task the task object
+ */
+ grid_blank(task: Task): string;
+
+ /**
+ * specifies the format of dates in the "Start time" column
+ * @param date the date which needs formatting
+ * @param column the name of the column that called the template
+ */
+ grid_date_format(date: Date, column?: string): string;
+
+ /**
+ * specifies the icon of child items in the tree column
+ * @param task the task object
+ */
+ grid_file(task: Task): string;
+
+ /**
+ * specifies the icon of parent items in the tree column
+ * @param task the task object
+ */
+ grid_folder(task: Task): string;
+
+ /**
+ * specifies the CSS class that will be applied to the headers of the table's columns
+ * @param columnName the column's name (as specified in the "name" property of the column object)
+ * @param column column object (as specified in the <i>gantt.config.columns</i> config)
+ */
+ grid_header_class(columnName: string, column: any): string;
+
+ /**
+ * specifies the indent of the child items in a branch (in the tree column)
+ * @param task the task object
+ */
+ grid_indent(task: Task): string;
+
+ /**
+ * specifies the icon of the open/close sign in the tree column
+ * @param task the task object
+ */
+ grid_open(task: Task): string;
+
+ /**
+ * specifies the CSS class that will be applied to a grid row
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ grid_row_class(start: Date, end: Date, task: Task): string;
+
+ /**
+ * defines the height of the filled area in the resourceHistogram
+ * @param start_date start date of the scale cell
+ * @param end_date end date of the scale cell
+ * @param resource the resource object
+ * @param tasks tasks that are assigned to the specified resource and overlap start/end dates of the cell
+ * @param assignments resource assignments that are assigned to the specified start/end dates of the task
+ */
+ histogram_cell_allocated(start_date: Date, end_date: Date, resource: any, tasks: Array<Task>, assignments: any[]): void;
+
+ /**
+ * specifies the height of the line that defines the available capacity of the resource
+ * @param start_date start date of the scale cell
+ * @param end_date end date of the scale cell
+ * @param resource the resource object
+ * @param tasks tasks that are assigned to the specified resource and overlap start/end dates of the cell
+ * @param assignments resource assignments that are assigned to the specified start/end dates of the task
+ */
+ histogram_cell_capacity(start_date: Date, end_date: Date, resource: any, tasks: Array<Task>, assignments: any[]): void;
+
+ /**
+ * defines the CSS class which is applied to a cell of the resource panel
+ * @param start_date start date of the scale cell
+ * @param end_date end date of the scale cell
+ * @param resource the resource object
+ * @param tasks tasks that are assigned to the specified resource and overlap start/end dates of the cell
+ * @param assignments resource assignments that are assigned to the specified start/end dates of the task
+ */
+ histogram_cell_class(start_date: Date, end_date: Date, resource: any, tasks: Array<Task>, assignments: any[]): void;
+
+ /**
+ * defines the label inside a cell
+ * @param start_date start date of the scale cell
+ * @param end_date end date of the scale cell
+ * @param resource the resource object
+ * @param tasks tasks that are assigned to the specified resource and overlap start/end dates of the cell
+ * @param assignments resource assignments that are assigned to the specified start/end dates of the task
+ */
+ histogram_cell_label(start_date: Date, end_date: Date, resource: any, tasks: Array<Task>, assignments: any[]): void;
+
+ /**
+ * specifies the CSS class that will be applied to a link
+ * @param link the link object
+ */
+ link_class(link: Link): string;
+
+ /**
+ * specifies the text in the header of the link's "delete" confirm window
+ * @param link the link object
+ */
+ link_description(link: any): string;
+
+ /**
+ * converts date string into a Date object
+ * @param date the string which need to be parsed
+ */
+ parse_date(date: string): Date;
+
+ /**
+ * specifies the text in the completed part of the task bar
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ progress_text(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the CSS class that will be applied to the pop-up edit form
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ quick_info_class(start: Date, end: Date, task: Task): void;
+
+ /**
+ * specifies the content of the pop-up edit form
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ quick_info_content(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the date of the pop-up edit form
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ quick_info_date(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the title of the pop-up edit form
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ quick_info_title(start: Date, end: Date, task: Task): string;
+
+ /**
+ * defines the CSS class names of cells in the resource timeline cells
+ * @param start_date start date of the scale cell
+ * @param end_date end date of the scale cell
+ * @param resource the resource object
+ * @param tasks tasks that are assigned to specified resource and overlap start/end dates of the cell
+ * @param assignments resource assignments that are assigned to the specified start/end dates of the task
+ */
+ resource_cell_class(start_date: Date, end_date: Date, resource: any, tasks: Array<Task>, assignments: any[]): string;
+
+ /**
+ * defines the HTML content of resource timeline cells
+ * @param start_date start date of the scale cell
+ * @param end_date end date of the scale cell
+ * @param resource the resource object
+ * @param tasks tasks that are assigned to specified resource and overlap start/end dates of the cell
+ * @param assignments resource assignments that are assigned to the specified start/end dates of the task
+ */
+ resource_cell_value(start_date: Date, end_date: Date, resource: any, tasks: Array<Task>, assignments: any[]): string;
+
+ /**
+ * specifies the CSS class that will be applied to cells of the time scale of the timeline area
+ * @param date the date of a cell
+ */
+ scale_cell_class(date: Date): string;
+
+ /**
+ * specifies the CSS class that will be applied to the time scale
+ * @param scale the scale's configuration object
+ */
+ scale_row_class(scale: Scale): string;
+
+ /**
+ * specifies the CSS class that will be applied to task bars
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ task_class(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the date format of the label in the 'Time period' section of the lightbox
+ * @param date the date which needs formatting
+ */
+ task_date(date: Date): string;
+
+ /**
+ * specifies the format for the end dates of tasks in the lightbox
+ * @param date the date which needs formatting
+ */
+ task_end_date(date: Date): string;
+
+ /**
+ * specifies the CSS class that will be applied to the row of the timeline area
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ task_row_class(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the text in the task bars and the header of the lightbox
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ task_text(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the date period in the header of the lightbox
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ task_time(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the dates of unscheduled tasks
+ * @param task the task object
+ */
+ task_unscheduled_time(task: Task): void;
+
+ /**
+ * specifies the format of the drop-down time selector in the lightbox
+ * @param date the date which needs formatting
+ */
+ time_picker(date: Date): string;
+
+ /**
+ * specifies the CSS class that will be applied to the cells of the timeline area
+ * @param item either the task's or resource's object assigned to the row
+ * @param date the date of a cell
+ */
+ timeline_cell_class(item: any, date: Date): string;
+
+ /**
+ * specifies custom HTML content in the timeline cells
+ * @param task the task's object
+ * @param date the date of a cell
+ */
+ timeline_cell_content(task: Task, date: Date): string;
+
+ /**
+ * specifies the format of start and end dates displayed in the tooltip
+ * @param date the date which needs formatting
+ */
+ tooltip_date_format(date: Date): string;
+
+ /**
+ * specifies the text of tooltips
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ tooltip_text(start: Date, end: Date, task: Task): string;
+
+ /**
+ * a string from an XML file is converted into a date object in conformity with this template
+ * @param date the date which needs formatting
+ */
+ xml_date(date: Date): string;
+
+ /**
+ * a date object is converted into a string in conformity with this template. Used to send data back to the server
+ * @param date the date which needs formatting
+ */
+ xml_format(date: Date): string;
+
+ /**
+ * specifies the text assigned to tasks bars on the right side
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ rightside_text(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the text assigned to tasks bars on the left side
+ * @param start the date when a task is scheduled to begin
+ * @param end the date when a task is scheduled to be completed
+ * @param task the task object
+ */
+ leftside_text(start: Date, end: Date, task: Task): string;
+
+ /**
+ * specifies the lightbox's header
+ * @param start_date the date when a task is scheduled to begin
+ * @param end_date the date when a task is scheduled to be completed
+ * @param task the task's object
+ */
+ lightbox_header(start_date: Date, end_date: Date, task: Task): string;
+
+ /**
+ * specifies the CSS class that will be applied to markers
+ * @param marker the marker's configuration object
+ */
+ marker_class(marker: any): void;
+
+ [customTemplate: string]: any;
+}
+
+export interface GanttConfigOptions {
+
+ /**
+ * enables auto scheduling
+ */
+ auto_scheduling: boolean;
+
+ /**
+ * disables usage of time contraints for tasks
+ */
+ auto_scheduling_compatibility: boolean;
+
+ /**
+ * allows or forbids creating links from parent tasks (projects) to their children
+ */
+ auto_scheduling_descendant_links: boolean;
+
+ /**
+ * defines whether gantt will do autoscheduling on data loading/parsing
+ */
+ auto_scheduling_initial: boolean;
+
+ /**
+ * defines whether the whole project will be moved (see the details below)
+ */
+ auto_scheduling_move_projects: boolean;
+
+ /**
+ * defines whether tasks should inherit the constraint type from their parent project
+ */
+ auto_scheduling_project_constraint: boolean;
+
+ /**
+ * enables the auto scheduling mode, in which tasks will always be rescheduled to the earliest possible date
+ */
+ auto_scheduling_strict: boolean;
+
+ /**
+ * sets the way the scheduling algorithms process completed tasks
+ */
+ auto_scheduling_use_progress: boolean;
+
+ /**
+ * automatically converts tasks with subtasks to projects and projects without subtasks back to tasks
+ */
+ auto_types: boolean;
+
+ /**
+ * enables automatic adjusting of the grid's columns to the grid's width
+ */
+ autofit: boolean;
+
+ /**
+ * enables autoscrolling while dragging a task or link out of the current browser screen
+ */
+ autoscroll: boolean;
+
+ /**
+ * defines the speed of autoscrolling (in ms) while dragging a task or link out of the current browser screen
+ */
+ autoscroll_speed: number;
+
+ /**
+ * forces the Gantt chart to automatically change its size to show all tasks without scrolling
+ */
+ autosize: boolean | string;
+
+ /**
+ * sets the minimum width (in pixels) that the Gantt chart can take in the horizontal 'autosize' mode
+ */
+ autosize_min_width: number;
+
+ /**
+ * sets the height of task bars in the timeline area
+ */
+ bar_height: number | string;
+
+ /**
+ * enables dynamic loading in the Gantt chart
+ */
+ branch_loading: boolean;
+
+ /**
+ * specifies that the task has children that are not yet loaded from the backend
+ */
+ branch_loading_property: string;
+
+ /**
+ * stores a collection of buttons resided in the left bottom corner of the lightbox
+ */
+ buttons_left: any[];
+
+ /**
+ * stores a collection of buttons resided in the right bottom corner of the lightbox
+ */
+ buttons_right: any[];
+
+ /**
+ * changes the name of the property that affects binding of a calendar to a task/group of tasks
+ */
+ calendar_property: string;
+
+ /**
+ * enables cascade deleting of nested tasks and links
+ */
+ cascade_delete: boolean;
+
+ /**
+ * enables advanced drag-n-drop
+ */
+ click_drag: ClickDrag;
+
+ /**
+ * configures the columns of the table
+ */
+ columns: GridColumn[];
+
+ /**
+ * contains all available constraint types
+ */
+ constraint_types: any;
+
+ /**
+ * defines whether the gantt should track resizing of the container at time intervals
+ */
+ container_resize_method: string | undefined;
+
+ /**
+ * specifies the delay (in milliseconds) before redrawing the gantt when resizing the container
+ */
+ container_resize_timeout: number;
+
+ /**
+ * enables adjusting the task's start and end dates to the work time (while dragging)
+ */
+ correct_work_time: boolean;
+
+ /**
+ * defines internal implementation of the code of date formatting methods
+ */
+ csp: boolean | string;
+
+ /**
+ * sets the date format that is used to parse data from a data set and to send dates back to the server
+ */
+ date_format: string;
+
+ /**
+ * sets the format of dates in the "Start time" column of the table
+ */
+ date_grid: string;
+
+ /**
+ * sets the format of the time scale (X-Axis)
+ */
+ date_scale: string;
+
+ /**
+ * defines whether gantt will perform a deep copy of data objects passed into the gantt.parse() method
+ */
+ deepcopy_on_parse: boolean;
+
+ /**
+ * 'says' to open the lightbox while creating new events by clicking the '+' button
+ */
+ details_on_create: boolean;
+
+ /**
+ * 'says' to open the lightbox after double clicking on a task
+ */
+ details_on_dblclick: boolean;
+
+ /**
+ * enables the possibility to drag the lightbox by the header
+ */
+ drag_lightbox: boolean;
+
+ /**
+ * enables creating dependency links by drag-and-drop
+ */
+ drag_links: boolean;
+
+ /**
+ * stores the types of available drag-and-drop modes
+ */
+ drag_mode: any;
+
+ /**
+ * enables the possibility to move tasks by drag-and-drop
+ */
+ drag_move: boolean;
+
+ /**
+ * enables the possibility to drag several selected tasks at once
+ */
+ drag_multiple: boolean;
+
+ /**
+ * enables the possibility to change the task progress by dragging the progress knob
+ */
+ drag_progress: boolean;
+
+ /**
+ * enables drag and drop of items of the project type
+ */
+ drag_project: boolean;
+
+ /**
+ * enables the possibility to resize tasks by drag-and-drop
+ */
+ drag_resize: boolean;
+
+ /**
+ * configures the behavior of the drag_timeline extension
+ */
+ drag_timeline: any;
+
+ /**
+ * sets the number of 'gantt.config.duration_unit' units that will correspond to one unit of the 'duration' data property.
+ */
+ duration_step: number;
+
+ /**
+ * sets the duration unit
+ */
+ duration_unit: string;
+
+ /**
+ * enables automatic merging of multiple resource calendars into one
+ */
+ dynamic_resource_calendars: boolean;
+
+ /**
+ * changes the name of a property that affects the editing ability of tasks/links in the read-only Gantt chart
+ */
+ editable_property: string;
+
+ /**
+ * an object that contains definitions of inline editors
+ */
+ editor_types: any;
+
+ /**
+ * sets the end value of the time scale
+ */
+ end_date: Date | undefined;
+
+ /**
+ * renders an external component into the DOM
+ */
+ external_render: any;
+
+ /**
+ * 'says' the Gantt chart to automatically extend the time scale in order to fit all displayed tasks
+ */
+ fit_tasks: boolean;
+
+ /**
+ * adjusts the width of columns inside a scrollable grid
+ */
+ grid_elastic_columns: boolean | string;
+
+ /**
+ * makes the grid resizable by dragging the right grid's border
+ */
+ grid_resize: boolean;
+
+ /**
+ * sets the name of the attribute of the grid resizer's DOM element
+ */
+ grid_resizer_attribute: string;
+
+ /**
+ * sets the name of the attribute of the column resizer's DOM element. The attribute presents the column's index
+ */
+ grid_resizer_column_attribute: string;
+
+ /**
+ * sets the width of the grid
+ */
+ grid_width: number;
+
+ /**
+ * shows the critical path in the chart
+ */
+ highlight_critical_path: boolean;
+
+ /**
+ * enables/disables horizontal scroll by the Shift|Alt|Meta key + mouse wheel movement
+ */
+ horizontal_scroll_key: string | boolean;
+
+ /**
+ * defines whether tasks should inherit work calendars from their summary parents
+ */
+ inherit_calendar: boolean;
+
+ /**
+ * specifies whether sub-scales shall use the scale_cell_class template by default
+ */
+ inherit_scale_class: boolean;
+
+ /**
+ * sets whether the timeline area will be initially scrolled to display the earliest task
+ */
+ initial_scroll: boolean;
+
+ /**
+ * keeps the duration of a task unchanged during editing of the start/end of a task
+ */
+ inline_editors_date_processing: string | undefined;
+
+ /**
+ * defines whether inline editor should be opened after one click on a task when multi-task selection is enabled
+ */
+ inline_editors_multiselect_open: boolean | undefined;
+
+ /**
+ * 'says' to preserve the initial grid's width while resizing columns within
+ */
+ keep_grid_width: boolean;
+
+ /**
+ * enables keyboard navigation in gantt
+ */
+ keyboard_navigation: boolean;
+
+ /**
+ * enables keyboard navigation by cells
+ */
+ keyboard_navigation_cells: boolean;
+
+ /**
+ * sets the name of the attribute of the task layer's DOM element
+ */
+ layer_attribute: string;
+
+ /**
+ * specifies the layout object
+ */
+ layout: any;
+
+ /**
+ * specifies the lightbox object
+ */
+ lightbox: any;
+
+ /**
+ * increases the height of the lightbox
+ */
+ lightbox_additional_height: number;
+
+ /**
+ * sets the size of the link arrow
+ */
+ link_arrow_size: number;
+
+ /**
+ * sets the name of the attribute that will specify the id of the link's HTML element
+ */
+ link_attribute: string;
+
+ /**
+ * sets the width of dependency links in the timeline area
+ */
+ link_line_width: number;
+
+ /**
+ * sets the width of the area (over the link) sensitive to clicks
+ */
+ link_wrapper_width: number;
+
+ /**
+ * stores the types of links dependencies
+ */
+ links: any;
+
+ /**
+ * sets the minimum width for a column in the timeline area
+ */
+ min_column_width: number;
+
+ /**
+ * sets the minimum duration (in milliseconds) that can be set for a task during resizing.
+ */
+ min_duration: number;
+
+ /**
+ * sets the minimal width for each grid column (in pixels) while resizing grid
+ */
+ min_grid_column_width: number;
+
+ /**
+ * sets the minimal row height that can be set for a task during resizing
+ */
+ min_task_grid_row_height: number;
+
+ /**
+ * enables/disables multi-task selection in the Gantt chart
+ */
+ multiselect: boolean;
+
+ /**
+ * specifies whether multi-task selection will be available within one or any level
+ */
+ multiselect_one_level: boolean;
+
+ /**
+ * enables the possibility to expand/collapse split tasks by clicking the +/- button
+ */
+ open_split_tasks: boolean;
+
+ /**
+ * openes all branches initially
+ */
+ open_tree_initially: boolean;
+
+ /**
+ * activates the 'branch' mode that allows vertically reordering tasks within the same tree level
+ */
+ order_branch: string | boolean;
+
+ /**
+ * activates the 'branch' mode that allows reordering tasks within the whole gantt
+ */
+ order_branch_free: boolean;
+
+ /**
+ * adds an empty row into the end of the list of tasks to simplify tasks editing via keyboard
+ */
+ placeholder_task: any;
+
+ /**
+ * preserves the current position of the vertical and horizontal scrolls while re-drawing the gantt chart
+ */
+ preserve_scroll: boolean;
+
+ /**
+ * specifies whether the gantt container should block the mousewheel event, or should it be propagated up to the window element
+ */
+ prevent_default_scroll: boolean;
+
+ /**
+ * enables/disables parsing of the resource assignments
+ */
+ process_resource_assignments: boolean;
+
+ /**
+ * specifies the end date of a project
+ */
+ project_end: Date | undefined;
+
+ /**
+ * specifies the start date of a project
+ */
+ project_start: Date | undefined;
+
+ /**
+ * defines whether the task form will appear from the left/right side of the screen or near the selected task
+ */
+ quick_info_detached: boolean;
+
+ /**
+ * stores a collection of buttons resided in the pop-up task's details form
+ */
+ quickinfo_buttons: any[];
+
+ /**
+ * activates the read-only mode for the Gantt chart
+ */
+ readonly: boolean;
+
+ /**
+ * changes the name of a property that affects the read-only behaviour of tasks/links
+ */
+ readonly_property: string;
+
+ /**
+ * enables the Redo functionality for the gantt
+ */
+ redo: boolean;
+
+ /**
+ * enables the possibility to reorder grid columns by drag and drop
+ */
+ reorder_grid_columns: boolean;
+
+ /**
+ * enables the ability to adjust the row height by drag-and-drop
+ */
+ resize_rows: boolean;
+
+ /**
+ * specifies the name of the dataStore which stores resource assignments
+ */
+ resource_assignment_store: string;
+
+ /**
+ * changes the name of the attribute that Gantt uses to find which resource the task row in the resource grid/timeline is referring to
+ */
+ resource_attribute: string;
+
+ /**
+ * defines a set of working calendars that can be assigned to a specific resource, e.g. a user
+ */
+ resource_calendars: any;
+
+ /**
+ * defines the property of a task object that stores a resource id associated with resourceGrid/Timeline/Histogram/Calendar
+ */
+ resource_property: string;
+
+ /**
+ * tells the resource timeline to render elements and call templates for non-allocated cells
+ */
+ resource_render_empty_cells: boolean;
+
+ /**
+ * specifies the name of the dataStore connected to the resourceGrid/resourceTimeline/resourceHistogram views
+ */
+ resource_store: string;
+
+ /**
+ * defines an extra configuration for the resource store
+ */
+ resources: any;
+
+ /**
+ * sets the id of the virtual root element
+ */
+ root_id: string | number;
+
+ /**
+ * enables rounding the task's start and end dates to the nearest scale marks
+ */
+ round_dnd_dates: boolean;
+
+ /**
+ * sets the default height for rows of the table
+ */
+ row_height: number;
+
+ /**
+ * switches gantt to the right-to-left mode
+ */
+ rtl: boolean;
+
+ /**
+ * sets the height of the time scale and the header of the grid
+ */
+ scale_height: number;
+
+ /**
+ * sets the minimal scale unit (in case multiple scales are used) as the interval of the leading/closing empty space
+ */
+ scale_offset_minimal: boolean;
+
+ /**
+ * sets the unit of the time scale (X-Axis)
+ */
+ scale_unit: string;
+
+ /**
+ * defines configuration settings of the time scale
+ */
+ scales: Scale[];
+
+ /**
+ * enables backward scheduling
+ */
+ schedule_from_end: boolean;
+
+ /**
+ * specifies whether the timeline area shall be scrolled while selecting to display the selected task
+ */
+ scroll_on_click: boolean;
+
+ /**
+ * set the sizes of the vertical (width) and horizontal (height) scrolls
+ */
+ scroll_size: number;
+
+ /**
+ * enables selection of tasks in the Gantt chart
+ */
+ select_task: boolean;
+
+ /**
+ * enables converting server-side dates from UTC to a local time zone (and backward) while sending data to the server
+ */
+ server_utc: boolean;
+
+ /**
+ * shows the chart (timeline) area of the Gantt chart
+ */
+ show_chart: boolean;
+
+ /**
+ * defines whether to display the placeholder element inside the grid when it is empty
+ */
+ show_empty_state: boolean;
+
+ /**
+ * enables showing error alerts in case of unexpected behavior
+ */
+ show_errors: boolean;
+
+ /**
+ * shows the grid area of the Gantt chart
+ */
+ show_grid: boolean;
+
+ /**
+ * enables/disables displaying links in the Gantt chart
+ */
+ show_links: boolean;
+
+ /**
+ * shows/hides markers on the page
+ */
+ show_markers: boolean;
+
+ /**
+ * enables displaying of the progress inside the task bars
+ */
+ show_progress: boolean;
+
+ /**
+ * activates/disables the 'quick_info' extension (pop-up task's details form)
+ */
+ show_quick_info: boolean;
+
+ /**
+ * enables/disables displaying column borders in the chart area
+ */
+ show_task_cells: boolean;
+
+ /**
+ * enables showing tasks that are outside the specified date range in the Gantt chart
+ */
+ show_tasks_outside_timescale: boolean;
+
+ /**
+ * enables showing unscheduled tasks
+ */
+ show_unscheduled: boolean;
+
+ /**
+ * hides non-working time from the time scale
+ */
+ skip_off_time: boolean;
+
+ /**
+ * enables the smart rendering mode for gantt's tasks and links rendering
+ */
+ smart_rendering: boolean;
+
+ /**
+ * specifies that only visible part of the time scale is rendered on the screen
+ */
+ smart_scales: boolean;
+
+ /**
+ * enables sorting in the table
+ */
+ sort: boolean;
+
+ /**
+ * sets the start value of the time scale
+ */
+ start_date: Date | undefined;
+
+ /**
+ * sets the starting day of the week
+ */
+ start_on_monday: boolean;
+
+ /**
+ * generates a background image for the timeline area instead of rendering actual columns' and rows' lines
+ */
+ static_background: boolean;
+
+ /**
+ * enables rendering of highlighted cells in the static_background mode
+ */
+ static_background_cells: boolean;
+
+ /**
+ * sets the step of the time scale (X-Axis)
+ */
+ step: number;
+
+ /**
+ * specifies the second time scale(s) (deprecated)
+ */
+ subscales: any[];
+
+ /**
+ * sets the name of the attribute that will specify the id of the task's HTML element
+ */
+ task_attribute: string;
+
+ /**
+ * sets the format of the date label in the 'Time period' section of the lightbox
+ */
+ task_date: string;
+
+ /**
+ * sets the name of the attribute of the resizer's DOM element of the grid row. The attribute presents the row's index
+ */
+ task_grid_row_resizer_attribute: string;
+
+ /**
+ * sets the height of task bars in the timeline area
+ */
+ task_height: number | string;
+
+ /**
+ * sets the offset (in pixels) of the nearest task from the left border in the timeline
+ */
+ task_scroll_offset: number;
+
+ /**
+ * sets the format of the time drop-down selector in the lightbox
+ */
+ time_picker: string;
+
+ /**
+ * sets the minimum step (in minutes) for the task's time values
+ */
+ time_step: number;
+
+ /**
+ * shows the background grid in the empty timeline
+ */
+ timeline_placeholder: boolean;
+
+ /**
+ * sets the length of time, in milliseconds, before the tooltip hides
+ */
+ tooltip_hide_timeout: number;
+
+ /**
+ * sets the right (if positive) offset of the tooltip's position
+ */
+ tooltip_offset_x: number;
+
+ /**
+ * sets the top (if positive) offset of the tooltip's position
+ */
+ tooltip_offset_y: number;
+
+ /**
+ * sets the timeout in milliseconds before the tooltip is displayed for a task
+ */
+ tooltip_timeout: number;
+
+ /**
+ * enables/disables the touch support for the Gantt chart
+ */
+ touch: boolean | string;
+
+ /**
+ * defines the time period in milliseconds that is used to differ the long touch gesture from the scroll gesture
+ */
+ touch_drag: number | boolean;
+
+ /**
+ * returns vibration feedback before/after drag and drop on touch devices
+ */
+ touch_feedback: boolean;
+
+ /**
+ * defines the duration of vibration feedback before/after drag and drop on touch devices (in milliseconds)
+ */
+ touch_feedback_duration: number;
+
+ /**
+ * redefines functions responsible for displaying different types of tasks
+ */
+ type_renderers: any;
+
+ /**
+ * stores the names of lightbox's structures (used for different types of tasks)
+ */
+ types: any;
+
+ /**
+ * enables the Undo functionality for the gantt
+ */
+ undo: boolean;
+
+ /**
+ * sets the actions that the Undo operation will revert
+ */
+ undo_actions: any;
+
+ /**
+ * sets the number of steps that should be reverted by the undo method
+ */
+ undo_steps: number;
+
+ /**
+ * sets the types of entities for which the Undo operation will be applied
+ */
+ undo_types: any;
+
+ /**
+ * enables WAI-ARIA support to make the component recognizable for screen readers
+ */
+ wai_aria_attributes: boolean;
+
+ /**
+ * specifies the speed of scrolling the gantt by the mouse wheel
+ */
+ wheel_scroll_sensitivity: any;
+
+ /**
+ * sets both the section and its label on the same line
+ */
+ wide_form: boolean;
+
+ /**
+ * enables calculating the duration of tasks in working time instead of calendar time
+ */
+ work_time: boolean;
+
+ /**
+ * defines date formats that are used to parse data from a data set and to send data to a server
+ */
+ xml_date: string;
+
+ [customConfig: string]: any;
+}
+
+export interface GanttHotkeys {
+ edit_save: number;
+ edit_cancel: number;
+}
+
+export type MonthLabelList = [string, string, string, string, string, string, string, string, string, string, string, string];
+export type WeekDayLabelList = [string, string, string, string, string, string, string];
+
+export interface GanttLocaleDate {
+ month_full: MonthLabelList;
+ month_short: MonthLabelList;
+ day_full: WeekDayLabelList;
+ day_short: WeekDayLabelList;
+}
+
+export interface GanttLocaleLabels {
+ new_task: string;
+ icon_save: string;
+ icon_cancel: string;
+ icon_details: string;
+ icon_edit: string;
+ icon_delete: string;
+ confirm_closing: string;
+ confirm_deleting: string;
+ section_description: string;
+ section_time: string;
+ section_type: string;
+
+ /* grid columns */
+ column_wbs: string;
+ column_text: string;
+ column_start_date: string;
+ column_duration: string;
+ column_add: string;
+
+ /* link confirmation */
+ link: string;
+ confirm_link_deleting: string;
+ link_start: string;
+ link_end: string;
+
+ type_task: string;
+ type_project: string;
+ type_milestone: string;
+
+ minutes: string;
+ hours: string;
+ days: string;
+ weeks: string;
+ months: string;
+ years: string;
+
+ /* message popup */
+ message_ok: string;
+ message_cancel: string;
+
+ /* constraints */
+ section_constraint: string;
+ constraint_type: string;
+ constraint_date: string;
+ asap: string;
+ alap: string;
+ snet: string;
+ snlt: string;
+ fnet: string;
+ fnlt: string;
+ mso: string;
+ mfo: string;
+
+ /* resource control */
+ resources_filter_placeholder: string;
+ resources_filter_label: string;
+
+ [customLabel: string]: any;
+}
+
+export interface GanttLocale {
+ date: GanttLocaleDate;
+ labels: GanttLocaleLabels;
+}
+
+export interface GanttPlugins {
+ auto_scheduling?: boolean;
+ click_drag?: boolean;
+ critical_path?: boolean;
+ drag_timeline?: boolean;
+ fullscreen?: boolean;
+ keyboard_navigation?: boolean;
+ quick_info?: boolean;
+ tooltip?: boolean;
+ undo?: boolean;
+ grouping?: boolean;
+ marker?: boolean;
+ multiselect?: boolean;
+ overlay?: boolean;
+}
+
+export interface GanttInitializationConfig {
+ container?: string | HTMLElement;
+ config?: any;
+ templates?: any;
+ events?: any;
+ data?: any;
+ plugins?: GanttPlugins;
+ locale?: any;
+}
+
+export interface GanttInternationalization {
+ setLocale(locale: any): void;
+ getLocale(language?: string): GanttLocale;
+ addLocale(language: string, locale: GanttLocale): void;
+}
+export type GanttPlugin = (gantt: GanttStatic) => void;
+
+export interface GanttEnterprise {
+ plugin(plugin: GanttPlugin): void;
+ getGanttInstance(settings?: GanttInitializationConfig): GanttStatic;
+}
+
+
+export interface GanttStatic {
+
+ /**
+ * redefines the default click behavior for buttons of the Gantt chart
+ */
+ $click: any;
+
+ /**
+ * gantt ajax module
+ */
+ ajax: any;
+
+ /**
+ * the interface of the working calendar object
+ */
+ calendar: Calendar;
+
+ /**
+ * defines configuration options for dates, scale, controls
+ */
+ config: GanttConfigOptions;
+
+ /**
+ * stores various constants to reduce the use of magic numbers in the code
+ */
+ constants: any;
+
+ /**
+ * a set of datastore methods
+ */
+ datastore: DatastoreMethods;
+
+ /**
+ * a set of date formatting methods
+ */
+ date: DateHelpers;
+
+ /**
+ * a set of flags which describe current environment
+ */
+ env: any;
+
+ /**
+ * an object that stores various extensions
+ */
+ ext: Ext;
+
+ /**
+ * a set of methods for Gantt chart localization
+ */
+ i18n: GanttInternationalization;
+
+ /**
+ * hides a time unit in the time scale
+ */
+ ignore_time: GanttCallback;
+
+ /**
+ * specifies JSON serialization and parsing
+ */
+ json: any;
+
+ /**
+ * defines the hot keys for the Gantt chart
+ */
+ keys: GanttHotkeys;
+
+ /**
+ * returns the license name of dhtmlxGantt
+ */
+ license: string;
+
+ /**
+ * the current locale object (region-specific labels) of the Gantt chart
+ */
+ locale: GanttLocale;
+
+ /**
+ * specifies serialization and parsing in the XML format of dhtmlxGantt 1.0
+ */
+ oldxml: any;
+
+ /**
+ * returns the current skin of the Gantt chart
+ */
+ skin: string;
+
+ /**
+ * returns objects of the available skins
+ */
+ skins: any;
+
+ /**
+ * defines formatting templates for dates, titles, tooltips in the Gantt chart
+ */
+ templates: GanttTemplates;
+
+ /**
+ * a set of treeDatastore methods
+ */
+ treeDatastore: TreeDatastoreMethods;
+
+ /**
+ * various helper modules
+ */
+ utils: { dom: DomHelpers };
+
+ /**
+ * returns the version of dhtmlxGantt
+ */
+ version: string;
+
+ /**
+ * specifies XML serialization and parsing
+ */
+ xml: any;
+
+ $container: HTMLElement;
+
+ $grid: HTMLElement;
+
+ $grid_data: HTMLElement;
+
+ $grid_scale: HTMLElement;
+
+ $root: HTMLElement;
+
+ $scroll_hor: HTMLElement;
+
+ $scroll_ver: HTMLElement;
+
+ $task: HTMLElement;
+
+ $task_bars: HTMLElement;
+
+ $task_bg: HTMLElement;
+
+ $task_data: HTMLElement;
+
+ $task_links: HTMLElement;
+
+ $task_scale: HTMLElement;
+
+ $destroyed?: boolean;
+
+ [customProperty: string]: any;
+
+ /**
+ * Promise object constructor
+ * @param executor a callback used to initialize the promise
+ */
+ Promise: new (executor: (resolve: (value?: any) => void, reject: (reason?: any) => void) => void) => Promise<unknown>;
+
+ /**
+ * adds a calendar into Gantt
+ * @param calendar an object with configuration of the calendar
+ */
+ addCalendar(calendar: any): string;
+
+ /**
+ * adds a new dependency link
+ * @param link the link object
+ */
+ addLink(link: any): string | number;
+
+ /**
+ * displays an additional layer with custom elements for a link in the timeline area
+ * @param func a render function or a config object
+ */
+ addLinkLayer(func: any): string;
+
+ /**
+ * adds a marker to the timeline area
+ * @param marker the marker's configuration object
+ */
+ addMarker(marker: any): string;
+
+ /**
+ * adds a new keyboard shortcut
+ * @param shortcut the key name or the name of keys combination for a shortcut (<a href="desktop/keyboard_navigation.md#shortcutsyntax">shortcut syntax</a>)
+ * @param handler the handler of the shortcut call
+ * @param scope optional, the name of the context element to attach the handler function to (<a href="desktop/keyboard_navigation.md#scopes">list of scopes</a>); "gantt" by default
+ */
+ addShortcut(shortcut: string, handler: GanttCallback, scope?: string): void;
+
+ /**
+ * adds a new task
+ * @param task the task object
+ * @param parent optional, the parent's id
+ * @param index optional, the position the task will be added into (0 or greater)
+ */
+ addTask(task: any, parent?: string | number, index?: number): string | number;
+
+ /**
+ * displays an additional layer with custom elements for a task in the timeline area
+ * @param func a render function or a config object
+ */
+ addTaskLayer(func: any): string;
+
+ /**
+ * calls an alert message box
+ * @param config either an object with the alert box's configuration or the text to show
+ */
+ alert(config: any): HTMLElement;
+
+ /**
+ * if the specified expression is false, an errorMessage is shown in the red popup at the top right corner of the screen
+ * @param expression truthy value to assert the expression, falsy - if assertion fails
+ * @param errorMessage an error message that will be shown in the red popup
+ */
+ assert(expression: any, errorMessage: string): void;
+
+ /**
+ * attaches the handler to an inner event of dhtmlxGantt
+ * @param name the event's name, case-insensitive
+ * @param handler the handler function
+ * @param settings optional, an <a href="#propertiesofsettingsobject">object with settings</a> for the event handler
+ */
+ attachEvent(name: GanttEventName, handler: GanttCallback, settings?: any): string;
+
+ /**
+ * recalculates the schedule of the project
+ * @param taskId optional, the task id
+ */
+ autoSchedule(taskId?: string | number): void;
+
+ /**
+ * updates multiple tasks/links at once
+ * @param callback the callback function
+ * @param noRedraw optional, specifies if Gantt should repaint the chart after the callback function; <i>true</i> - not to repaint and <i>false</i> (by default) - to repaint
+ */
+ batchUpdate(callback: GanttCallback, noRedraw?: boolean): void;
+
+ /**
+ * creates a new function that, when called, has its <i>this</i> keyword set to the provided value
+ * @param method the target function
+ * @param thisArg the value to be passed as the <i>this</i> parameter to the target function when the bound function is called
+ */
+ bind(method: GanttCallback, thisArg: any): GanttCallback;
+
+ /**
+ * calculates the duration of a task
+ * @param config either the <a href="#configurationobjectproperties">configuration object</a> of a time span or the start date of the task
+ * @param end_date optional, the end date of the task. The parameter is required when the first parameter is specified as <i>start_date</i>.
+ */
+ calculateDuration: Calendar["calculateDuration"];
+
+ /**
+ * calculates the end date of a task
+ * @param config either the <a href="#configurationobjectproperties">configuration object</a> of a time span or the start date of the task
+ * @param duration optional, the duration of the task. The parameter is required when the first parameter is specified as <i>start_date</i>
+ */
+ calculateEndDate: Calendar["calculateEndDate"];
+
+ /**
+ * calculates the level of nesting of a task
+ * @param task the task's object
+ */
+ calculateTaskLevel(task: Task): number;
+
+ /**
+ * calls an inner event
+ * @param name the event's name, case-insensitive
+ * @param params optional, an array of the event-related data
+ */
+ callEvent(name: string, params?: any[]): boolean;
+
+ /**
+ * repaints the lighbox for the task according to its type
+ * @param type the task type
+ */
+ changeLightboxType(type: string): void;
+
+ /**
+ * changes the link's id
+ * @param id the current link's id
+ * @param new_id the new link's id
+ */
+ changeLinkId(id: string | number, new_id: string | number): void;
+
+ /**
+ * changes the task's id
+ * @param id the current task's id
+ * @param new_id the new task's id
+ */
+ changeTaskId(id: string | number, new_id: string | number): void;
+
+ /**
+ * checks whether an event has some handler(s) specified
+ * @param name the event's name
+ */
+ checkEvent(name: GanttEventName): boolean;
+
+ /**
+ * removes all tasks and additional elements (including markers) from the Gantt chart
+ */
+ clearAll(): void;
+
+ /**
+ * clears the stack of stored redo commands
+ */
+ clearRedoStack(): void;
+
+ /**
+ * clears the stack of stored undo commands
+ */
+ clearUndoStack(): void;
+
+ /**
+ * closes the branch with the specified id
+ * @param id the branch id
+ */
+ close(id: string | number): void;
+
+ /**
+ * collapses gantt from the full screen mode to the normal mode
+ */
+ collapse(): void;
+
+ /**
+ * returns the index of the column by the date
+ * @param date a date object
+ */
+ columnIndexByDate(date: Date): number;
+
+ /**
+ * calls a confirm message box
+ * @param config either an object with the confirm box's configuration or the text to show
+ */
+ confirm(config: any): HTMLElement;
+
+ /**
+ * creates a deep copy of provided object
+ * @param initialObject the object that needs to be copied
+ */
+ copy(initialObject: any): any;
+
+ /**
+ * recalculates the task duration in the work time
+ * @param task the task's object
+ */
+ correctTaskWorkTime(task: Task): void;
+
+ /**
+ * creates a working calendar
+ * @param parentCalendar (optional) an existing calendar that is used for creating a new one on the base of it
+ */
+ createCalendar(parentCalendar?: Calendar): Calendar;
+
+ /**
+ * creates a new dataProcessor instance and attaches it to gantt
+ * @param config dataProcessor configuration object
+ */
+ createDataProcessor(config: any): any;
+
+ /**
+ * creates a datastore according to the provided configuration
+ * @param config a configuration object of a datastore
+ */
+ createDatastore(config: any): DatastoreMethods & TreeDatastoreMethods;
+
+ /**
+ * adds a new task and opens the lightbox to confirm
+ * @param task optional, the task object
+ * @param parent optional, the parent's id
+ * @param index optional, the position the task will be added into (0 or greater)
+ */
+ createTask(task?: any, parent?: string | number, index?: number): string | number;
+
+ /**
+ * dataProcessor constructor
+ * @param url url to the data feed
+ */
+ dataProcessor(url: string): void;
+
+ /**
+ * gets the date of the specified horizontal position in the chart area
+ * @param pos the relative horizontal position you want to know the date of
+ */
+ dateFromPos(pos: number): Date;
+
+ /**
+ * returns false if the provided argument is undefined, otherwise true
+ * @param param a property of an object that should be checked
+ */
+ defined(param: any): boolean;
+
+ /**
+ * deletes a task calendar by its id
+ * @param id the id of the calendar
+ */
+ deleteCalendar(id: string | number): void;
+
+ /**
+ * deletes the specified dependency link
+ * @param id the dependency link's id
+ */
+ deleteLink(id: string | number): void;
+
+ /**
+ * deletes the specified marker
+ * @param markerId the marker's id
+ */
+ deleteMarker(markerId: string | number): void;
+
+ /**
+ * deletes the specified task
+ * @param id the task's id
+ */
+ deleteTask(id: string | number): void;
+
+ /**
+ * destroys the gantt instance
+ */
+ destructor(): void;
+
+ /**
+ * detaches all events from dhtmlxGantt (both custom and inner ones)
+ */
+ detachAllEvents(): void;
+
+ /**
+ * detaches a handler from an event (which was attached before by the attachEvent() method)
+ * @param id the event's id
+ */
+ detachEvent(id: string): void;
+
+ /**
+ * iterates over all parent tasks of the specified task in the Gantt chart
+ * @param code a function that will iterate over tasks. Takes a task object as a parameter
+ * @param startTask the id of the item the parent tasks of which should be iterated over
+ * @param master the object, that 'this' will refer to
+ */
+ eachParent(code: GanttCallback, startTask: string | number, master?: any): void;
+
+ /**
+ * iterates over all selected tasks in the Gantt chart
+ * @param code a function that will iterate over tasks. Takes a task id as a parameter
+ */
+ eachSelectedTask(code: GanttCallback): void;
+
+ /**
+ * iterates over all child tasks of a specific task or the of whole Gantt chart
+ * @param code a function that will iterate over tasks. Takes a task object as a parameter
+ * @param parent the parent id. If specified, the function will iterate over children of the <br> specified parent
+ * @param master the object, that 'this' will refer to
+ */
+ eachTask(code: GanttCallback, parent?: string | number, master?: any): void;
+
+ /**
+ * attaches an event handler to an HTML element
+ * @param node the HTML node or its id
+ * @param event the name of an HTML event (without the 'on' prefix)
+ * @param handler the event handler
+ * @param options optional, the value of either the <i>useCapture</i> or <i>options</i> parameter. <a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener">Read details</a>
+ */
+ event(node: HTMLElement | string, event: string, handler: GanttCallback, options?: any): void;
+
+ /**
+ * removes an event handler from an HTML element
+ * @param node the HTML node or its id
+ * @param event the name of an HTML event (without the 'on' prefix)
+ * @param handler the event handler
+ * @param options optional, the value of either the <i>useCapture</i> or <i>options</i> parameter. <a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener">Read details</a>
+ */
+ eventRemove(node: HTMLElement | string, event: string, handler: GanttCallback, options?: any): void;
+
+ /**
+ * expands gantt to the full screen mode
+ */
+ expand(): void;
+
+ /**
+ * exports data from the Gantt chart to an Excel document
+ * @param _export_ optional, an object with export settings (see the details)
+ */
+ exportToExcel(_export_?: any): void;
+
+ /**
+ * exports data from the Gantt chart to an iCal string
+ * @param _export_ optional, an object with export settings (see the details)
+ */
+ exportToICal(_export_?: any): void;
+
+ /**
+ * exports the structure and data of a Gantt chart into a JSON object
+ * @param config optional, an object with Gantt configuration
+ */
+ exportToJSON(config?: any): void;
+
+ /**
+ * exports data from the Gantt chart to MS Project
+ * @param _export_ optional, an object with export settings (see the details)
+ */
+ exportToMSProject(_export_?: any): void;
+
+ /**
+ * exports a Gantt chart into the PDF format
+ * @param _export_ optional, an object with export settings (see the details)
+ */
+ exportToPDF(_export_?: any): void;
+
+ /**
+ * exports a Gantt chart into the PNG format
+ * @param _export_ optional, an object with export settings (see the details)
+ */
+ exportToPNG(_export_?: any): void;
+
+ /**
+ * exports data from the Gantt chart to Primavera P6
+ * @param _export_ optional, an object with export settings (see the details)
+ */
+ exportToPrimaveraP6(_export_?: any): void;
+
+ /**
+ * returns all dependency loops in the chart
+ */
+ findCycles(): any[];
+
+ /**
+ * sets focus on the gantt
+ */
+ focus(): void;
+
+ /**
+ * gets worktime calendar by id
+ * @param calendarId optional, the id of the global calendar or "global"
+ */
+ getCalendar(calendarId?: string | number): Calendar;
+
+ /**
+ * gets all the calendars added into Gantt
+ */
+ getCalendars(): any[];
+
+ /**
+ * returns the 1st-level child tasks of the specified parent branch
+ * @param id the parent branch's id
+ */
+ getChildren(id: string | number): any[];
+
+ /**
+ * returns the closest working time
+ * @param config the configuration object or the date
+ */
+ getClosestWorkTime: Calendar["getClosestWorkTime"];
+
+ /**
+ * returns the index of the column by its name
+ * @param name the name of the column
+ * @param excludeHidden skips indexes of the hidden columns
+ */
+ getColumnIndex(name: string | number, excludeHidden?: boolean): number;
+
+ /**
+ * returns all tasks and links that a task is connected with
+ * @param id optional, the id of a task
+ */
+ getConnectedGroup(id?: string | number): any;
+
+ /**
+ * returns the earliest and latest dates allowed by the constraint applied to a task
+ * @param task a task object
+ */
+ getConstraintLimitations(task: Task): any;
+
+ /**
+ * returns the constraint type applied to the task
+ * @param task a task object
+ */
+ getConstraintType(task: Task): string;
+
+ /**
+ * returns the configuration object of a datastore
+ * @param name the name of the datastore
+ */
+ getDatastore(name: string): DatastoreMethods & TreeDatastoreMethods;
+
+ /**
+ * returns the free slack of a task
+ * @param task the object of a task
+ */
+ getFreeSlack(task: Task): number;
+
+ /**
+ * gets the index of a task in the tree
+ * @param id the task id
+ */
+ getGlobalTaskIndex(id: string | number): number;
+
+ /**
+ * gets the configuration object of a column
+ * @param name the column's name
+ */
+ getGridColumn(name: string | number): any;
+
+ /**
+ * gets columns of the Gantt chart
+ */
+ getGridColumns(): any[];
+
+ /**
+ * gets the label of a select control in the lightbox
+ * @param property the name of a data property that the control is mapped to
+ * @param key the option's id. This parameter is compared with the task's data property to <br> assign the select's option to the task
+ */
+ getLabel(property: string, key: string | number): string;
+
+ /**
+ * returns the id of the last selected task
+ */
+ getLastSelectedTask(): string | number;
+
+ /**
+ * returns the object of the layout view by its name
+ * @param name the name of the layout view
+ */
+ getLayoutView(name: string): any;
+
+ /**
+ * gets the lightbox's HTML object element
+ */
+ getLightbox(): HTMLElement;
+
+ /**
+ * returns the object of the lightbox's section
+ * @param name the name of the section
+ */
+ getLightboxSection(name: string | number): any;
+
+ /**
+ * returns the name of the active lighbox's structure
+ */
+ getLightboxType(): string;
+
+ /**
+ * returns values of the lightbox's sections
+ */
+ getLightboxValues(): any;
+
+ /**
+ * returns the dependency link object by the specified id
+ * @param id the link id
+ */
+ getLink(id: string | number): Link;
+
+ /**
+ * returns the number of all dependency links presented in the Gantt chart
+ */
+ getLinkCount(): number;
+
+ /**
+ * returns the HTML element of the specified dependency link
+ * @param id the link id
+ */
+ getLinkNode(id: string | number): HTMLElement;
+
+ /**
+ * returns all links presented in the Gantt chart
+ */
+ getLinks(): Array<Link>;
+
+ /**
+ * gets the marker's object
+ * @param markerId the marker's id
+ */
+ getMarker(markerId: string | number): any;
+
+ /**
+ * returns the id of the next item (no matter what the level of nesting is: the same or different)
+ * @param id the task id
+ */
+ getNext(id: string | number): string | number;
+
+ /**
+ * returns the id of the next task of the same level
+ * @param id the task id
+ */
+ getNextSibling(id: string | number): string | number;
+
+ /**
+ * returns the id of the parent task
+ * @param id the task id
+ */
+ getParent(id: string | number): string | number;
+
+ /**
+ * returns the id of the previous item (no matter what the level of nesting is: the same or different)
+ * @param id the task id
+ */
+ getPrev(id: string | number): string | number;
+
+ /**
+ * returns the id of the previous task of the same level
+ * @param id the task id
+ */
+ getPrevSibling(id: string | number): string | number;
+
+ /**
+ * returns the stack of stored redo user actions
+ */
+ getRedoStack(): any[];
+
+ /**
+ * returns all tasks assigned to the resource
+ * @param resourceId the id of the resource
+ * @param taskId the id of the task
+ */
+ getResourceAssignments(resourceId: string | number, taskId?: string | number): any[];
+
+ /**
+ * returns a calendar which the resource is assigned to
+ * @param resource the id or object of the resource
+ */
+ getResourceCalendar(resource: any): any;
+
+ /**
+ * returns the configuration of the time scale
+ */
+ getScale(): any;
+
+ /**
+ * returns the scroll position
+ */
+ getScrollState(): any;
+
+ /**
+ * returns the id of the selected task
+ */
+ getSelectedId(): string;
+
+ /**
+ * returns an array of the currently selected tasks
+ */
+ getSelectedTasks(): any[];
+
+ /**
+ * gets a key navigation shortcut handler
+ * @param shortcut the key name or the name of keys combination for a shortcut (<a href="desktop/keyboard_navigation.md#shortcutsyntax">shortcut syntax</a>)
+ * @param scope the name of the context element to attach the handler function to (<a href="desktop/keyboard_navigation.md#scopes">list of scopes</a>)
+ */
+ getShortcutHandler(shortcut: string, scope: string): GanttCallback;
+
+ /**
+ * returns siblings of the specified task (including itself)
+ * @param id the task id
+ */
+ getSiblings(id: string | number): any[];
+
+ /**
+ * checks how much time (in the current duration unit) a task has before it starts to affect other tasks
+ * @param task1 the object of the 1st task to check the slack for
+ * @param task2 the object of the 2nd task to check the slack for
+ */
+ getSlack(task1: any, task2: any): number | string;
+
+ /**
+ * gets the current state of the Gantt chart
+ */
+ getState(): any;
+
+ /**
+ * calculates the combined start/end dates of tasks nested in a project or another task
+ * @param task_id the task's id, api/gantt_root_id_config.md will be used if not specified
+ */
+ getSubtaskDates(task_id?: string | number): any;
+
+ /**
+ * calculates the combined duration of tasks nested in a project or another task.
+ * @param task_id the task's id, api/gantt_root_id_config.md will be used if not specified
+ */
+ getSubtaskDuration(task_id?: string | number): number;
+
+ /**
+ * returns the task object
+ * @param id the task id
+ */
+ getTask(id: string | number): Task;
+
+ /**
+ * returns the parsed resource assignments of a specific task from the datastore
+ * @param taskId the task id
+ */
+ getTaskAssignments(taskId: string | number): any[];
+
+ /**
+ * returns the height (in pixels) of the DOM element of the task
+ * @param taskId the task's id
+ */
+ getTaskBarHeight(taskId: number | string): number;
+
+ /**
+ * finds a task by the specified criteria
+ * @param propertyName the name of the property to match, or a filter function
+ * @param propertyValue the property value
+ * @param types an object with types of the tasks which should be returned
+ */
+ getTaskBy(propertyName: string | GanttCallback, propertyValue?: string | number | any[], types?: any): Array<Task>;
+
+ /**
+ * returns a task by its global task index
+ * @param index the task index in the tree (zero-based numbering)
+ */
+ getTaskByIndex(index: number | string): Task;
+
+ /**
+ * returns a collection of tasks which occur during the specified period
+ * @param from the start date of the period
+ * @param to the end date of the period
+ */
+ getTaskByTime(from?: Date, to?: Date): Array<Task>;
+
+ /**
+ * returns a task by its WBS code
+ * @param code the WBS code of the task
+ */
+ getTaskByWBSCode(code: string): Task;
+
+ /**
+ * gets a calendar assigned to the specified task (a task level calendar)
+ * @param task the id or object of a task
+ */
+ getTaskCalendar(task: any): any;
+
+ /**
+ * gets the number of tasks that are currently loaded in the gantt
+ */
+ getTaskCount(): number;
+
+ /**
+ * returns the visible height of a task
+ * @param id the task's id
+ */
+ getTaskHeight(id?: string | number): number;
+
+ /**
+ * gets the index of a task in the branch
+ * @param id the task id
+ */
+ getTaskIndex(id: string | number): number;
+
+ /**
+ * returns the HTML element of the task bar
+ * @param id the task id
+ */
+ getTaskNode(id: string | number): HTMLElement;
+
+ /**
+ * calculates the position and size of the task's DOM element in the timeline area
+ * @param task the task object
+ * @param from optional, the start date of the item
+ * @param to optional, the end date of the item
+ */
+ getTaskPosition(task: Task, from?: Date, to?: Date): any;
+
+ /**
+ * returns the HTML element of the task row in the table
+ * @param id the task id
+ */
+ getTaskRowNode(id: string | number): HTMLElement;
+
+ /**
+ * gets the top position of the task's DOM element in the timeline area
+ * @param id the task's id
+ */
+ getTaskTop(id: number | string): number;
+
+ /**
+ * returns the type of a task
+ * @param task the task object
+ */
+ getTaskType(task: Task): string;
+
+ /**
+ * returns the total slack of a task
+ * @param task optional, the object of a task or its ID
+ */
+ getTotalSlack(task?: Task | string | number): any;
+
+ /**
+ * returns the stack of stored undo user actions
+ */
+ getUndoStack(): any[];
+
+ /**
+ * gets the number of tasks visible on the screen (those that are not collapsed)
+ */
+ getVisibleTaskCount(): number;
+
+ /**
+ * returns the WBS code (the outline number) of a task
+ * @param task the object of a task
+ */
+ getWBSCode(task: Task): string;
+
+ /**
+ * returns the working hours of the specified date
+ * @param date a date to check
+ */
+ getWorkHours(date: Date): any[];
+
+ /**
+ * groups tasks by the specified task's attribute
+ * @param config the grouping configuration object, or false to ungroup tasks
+ */
+ groupBy(config: any): void;
+
+ /**
+ * returns the number of child task(s)
+ * @param id the task id
+ */
+ hasChild(id: string | number): number | undefined;
+
+ /**
+ * hides the lightbox modal overlay that blocks interactions with the remaining screen
+ * @param box an element to hide
+ */
+ hideCover(box?: HTMLElement): void;
+
+ /**
+ * closes the lightbox if it's currently active
+ */
+ hideLightbox(): void;
+
+ /**
+ * hides the pop-up task form (if it's currently active)
+ */
+ hideQuickInfo(): void;
+
+ /**
+ * converts an Excel file to JSON
+ * @param config an object with configuration properties of an imported file
+ */
+ importFromExcel(config: any): void;
+
+ /**
+ * converts an XML or MPP MS Project file to JSON
+ * @param config an object with configuration properties of an imported file
+ */
+ importFromMSProject(config: any): void;
+
+ /**
+ * converts an XML or XER Primavera P6 file to JSON
+ * @param config an object with configuration properties of an imported file
+ */
+ importFromPrimaveraP6(config: any): void;
+
+ /**
+ * initializes a dhtmlxGantt inside a container
+ * @param container an HTML container (or its id) where a dhtmlxGantt object will be initialized
+ * @param from the start value of the time scale (X–Axis)
+ * @param to the end value of the time scale (X–Axis)
+ */
+ init(container: string | HTMLElement, from?: Date, to?: Date): void;
+
+ /**
+ * checks whether a task is a child of a different task
+ * @param childId the id of a task that you want to check as a child
+ * @param parentId the id of a task that you want to check as a parent
+ */
+ isChildOf(childId: string | number, parentId: string | number): boolean;
+
+ /**
+ * checks whether the link is circular
+ * @param link the link object
+ */
+ isCircularLink(link: Link): boolean;
+
+ /**
+ * checks whether the specified link is critical
+ * @param link the link's object
+ */
+ isCriticalLink(link: Link): boolean;
+
+ /**
+ * checks whether the specified task is critical
+ * @param task the task's object
+ */
+ isCriticalTask(task: Task): boolean;
+
+ /**
+ * checks whether the specified link is correct
+ * @param link the link object
+ */
+ isLinkAllowed(link: any): boolean;
+
+ /**
+ * checks whether the specified link exists
+ * @param id the link id
+ */
+ isLinkExists(id: string | number): boolean;
+
+ /**
+ * checks whether the specified task/link, or the whole Gantt is read-only
+ * @param item optional, the id or an object of the task/link. If not specified, the method checks whether the Gantt is read-only
+ */
+ isReadonly(item?: number | string | Task | Link): boolean;
+
+ /**
+ * checks whether the specified task is currently selected
+ * @param task the task's id
+ */
+ isSelectedTask(task: string | number): boolean;
+
+ /**
+ * checks whether the specified task is split
+ * @param task the object of a task
+ */
+ isSplitTask(task: Task): boolean;
+
+ /**
+ * checks whether the specified task is summary
+ * @param task the object of a task
+ */
+ isSummaryTask(task: Task): boolean;
+
+ /**
+ * checks whether the specified task exists
+ * @param id the task id
+ */
+ isTaskExists(id: string | number): boolean;
+
+ /**
+ * checks whether the specifies task is currently rendered in the Gantt chart
+ * @param id the task's id
+ */
+ isTaskVisible(id: string | number): boolean;
+
+ /**
+ * checks if the task is unscheduled
+ * @param task the task's object
+ */
+ isUnscheduledTask(task: Task): boolean;
+
+ /**
+ * checks whether the specified date is working or not
+ * @param config either the configuration object of a time span or a specific date
+ */
+ isWorkTime: Calendar["isWorkTime"];
+
+ /**
+ * loads data to the gantt from an external data source
+ * @param url the server-side url (may be a static file or a server side script that outputs data)
+ * @param type <i>('json', 'xml', 'oldxml')</i> the data type. The default value - <i>'json'</i>
+ * @param callback the callback function
+ */
+ load(url: string, type?: string, callback?: GanttCallback): any;
+
+ /**
+ * gets the id of a task from the specified HTML event
+ * @param e a native event
+ */
+ locate(e: Event): string | number;
+
+ /**
+ * merges several working calendars into one
+ * @param calendars an array of calendars' objects
+ */
+ mergeCalendars(calendars: any[]): void;
+
+ /**
+ * calls a message box of the specified type
+ * @param config either an object with the message box's configuration or the text to show
+ */
+ message(config: any): HTMLElement;
+
+ /**
+ * adds properties of the 'source' object into the 'target' object
+ * @param target the target object
+ * @param source the source object
+ * @param force optional, if true, properties of the 'source' will overwrite matching properties of the 'target', if there are any. If false (by default), properties that already exist in the 'target' will be omitted
+ */
+ mixin(target: any, source: any, force?: boolean): void;
+
+ /**
+ * calls a modalbox
+ * @param config the modal box's configuration
+ */
+ modalbox(config: any): HTMLElement;
+
+ /**
+ * moves a task to a new position
+ * @param sid the id of the task to move
+ * @param tindex the index of the position that the task will be moved to <br> (the index within a branch)
+ * @param parent the parent id. If specified, the <b>tindex</b> will refer to the index in the <br> <b>'parent'</b> branch
+ */
+ moveTask(sid: string | number, tindex: number, parent?: string | number): boolean | void;
+
+ /**
+ * opens the branch with the specified id
+ * @param id the branch id
+ */
+ open(id: string | number): void;
+
+ /**
+ * loads data from a client-side resource
+ * @param data a string or object which represents <a href="https://docs.dhtmlx.com/gantt/desktop__loading.html#dataproperties">data</a>
+ * @param type optional, (<i>'json', 'xml'</i>) the data type. The default value - <i>'json'</i>
+ */
+ parse(data: any, type?: string): void;
+
+ /**
+ * activates specified extensions
+ * @param ext an object with extension names that need to be activated
+ */
+ plugins(ext: any): void;
+
+ /**
+ * gets the relative horizontal position of the specified date in the chart area
+ * @param date a date you want to know the position of
+ */
+ posFromDate(date: Date): number;
+
+ /**
+ * applies the reverted changes to the gantt once again
+ */
+ redo(): void;
+
+ /**
+ * refreshes data in the Gantt chart
+ */
+ refreshData(): void;
+
+ /**
+ * refreshes the specifies link
+ * @param id the link id
+ */
+ refreshLink(id: string | number): void;
+
+ /**
+ * refreshes the task and its related links
+ * @param id the task id
+ * @param refresh_links optional, defines whether links related to the task should be refreshed, <em>true</em> by default
+ */
+ refreshTask(id: string | number, refresh_links?: boolean): void;
+
+ /**
+ * removes the specified layer related to a link
+ * @param layerId a DOM element that will be displayed in the layer
+ */
+ removeLinkLayer(layerId: string | number): void;
+
+ /**
+ * removes a keyboard shortcut
+ * @param shortcut the key name or the name of keys combination for a shortcut (<a href="desktop/keyboard_navigation.md#shortcutsyntax">shortcut syntax</a>)
+ * @param scope the element to which the shortcut is attached (<a href="desktop/keyboard_navigation.md#scopes">list of scopes</a>)
+ */
+ removeShortcut(shortcut: string, scope: any): void;
+
+ /**
+ * removes the specified layer related to a task
+ * @param layerId a DOM element that will be displayed in the layer
+ */
+ removeTaskLayer(layerId: string | number): void;
+
+ /**
+ * renders the whole Gantt chart
+ */
+ render(): void;
+
+ /**
+ * updates all markers on the page
+ */
+ renderMarkers(): void;
+
+ /**
+ * rebuilds the Gantt layout using the current value of the layout config
+ */
+ resetLayout(): void;
+
+ /**
+ * removes the current lightbox's HTML object element
+ */
+ resetLightbox(): void;
+
+ /**
+ * re-calculates the duration of a project task depending on the dates of its children
+ * @param task the task's object
+ */
+ resetProjectDates(task: Task): void;
+
+ /**
+ * re-calculates the skin's settings from the related attached skin CSS file
+ */
+ resetSkin(): void;
+
+ /**
+ * forces the lightbox to resize
+ */
+ resizeLightbox(): void;
+
+ /**
+ * rounds the specified date to the nearest date in the time scale
+ * @param date the Date object to round or an object with settings
+ */
+ roundDate(date: any): Date;
+
+ /**
+ * rounds the start and end task's dates to the nearest dates in the time scale
+ * @param task the task object
+ */
+ roundTaskDates(task: Task): void;
+
+ /**
+ * scrolls the layout view to the specified position
+ * @param name the name of the layout view
+ * @param x optional, value of horizontal scroll or 'null' (if the scroll position shouldn't be changed)
+ * @param y optional, value of vertical scroll or 'null' (if the scroll position shouldn't be changed)
+ */
+ scrollLayoutCell(name: string, x: number | null, y: number | null): void;
+
+ /**
+ * scrolls the Gantt container to the specified position
+ * @param x optional, value of horizontal scroll or 'null' (if the scroll position shouldn't be changed)
+ * @param y optional, value of vertical scroll or 'null' (if the scroll position shouldn't be changed)
+ */
+ scrollTo(x?: number | null, y?: number | null): void;
+
+ /**
+ * selects the specified task
+ * @param id the task id
+ */
+ selectTask(id: string | number): string | number;
+
+ /**
+ * serializes the data into JSON or XML format
+ * @param type the format that the data will be serialized into. <br> Possible values: 'json' (<i>default</i> ), 'xml'.
+ */
+ serialize(type?: string): any;
+
+ /**
+ * returns a list of options
+ * @param list_name the name of a list
+ * @param options an array of options
+ */
+ serverList(list_name: string | number, options?: any[]): any[];
+
+ /**
+ * set the parent for a task
+ * @param task the task object
+ * @param pid the parent task id
+ */
+ setParent(task: Task, pid: number | string): void;
+
+ /**
+ * resizes the Gantt chart
+ */
+ setSizes(): void;
+
+ /**
+ * sets the working time for the Gantt chart
+ * @param config the configuration object of a time span
+ */
+ setWorkTime: Calendar["setWorkTime"];
+
+ /**
+ * shows the lightbox modal overlay that blocks interactions with the remaining screen
+ * @param box an element to hide
+ */
+ showCover(box?: HTMLElement): void;
+
+ /**
+ * scrolls the chart area to makes the specified date visible
+ * @param date the date to show in the chart
+ */
+ showDate(date: Date): void;
+
+ /**
+ * opens the lightbox for the specified task
+ * @param id the task id
+ */
+ showLightbox(id: string | number): void;
+
+ /**
+ * displays the pop-up task form for the specified task
+ * @param id the task id
+ */
+ showQuickInfo(id: string | number): void;
+
+ /**
+ * makes the specified task visible on the screen
+ * @param id the task id
+ */
+ showTask(id: string | number): void;
+
+ /**
+ * makes all code inside it not to trigger internal events or server-side calls
+ * @param callback the callback function
+ */
+ silent(callback: GanttCallback): void;
+
+ /**
+ * sorts tasks in the grid
+ * @param field the name of the column that the grid will be sorted by or a custom sorting function
+ * @param desc specifies the sorting direction: <i>true</i> - descending sort and <i>false</i> - ascending<br> sort. By default, <i>false</i>
+ * @param parent the id of the parent task. Specify the parameter if you want to sort tasks only in the branch of the specified parent.
+ * @param silent specifies whether rendering should be invoked after reordering items
+ */
+ sort(field: string | GanttCallback, desc?: boolean, parent?: string | number, silent?: boolean): void;
+
+ /**
+ * selects the specified task if it was unselected and vice versa
+ * @param task the task's id
+ */
+ toggleTaskSelection(task: string | number): void;
+
+ /**
+ * returns a unique id
+ */
+ uid(): number;
+
+ /**
+ * reverts the changes made in the gantt
+ */
+ undo(): void;
+
+ /**
+ * removes selection from the selected task
+ * @param id optional, the id of the task to remove selection from, see details
+ */
+ unselectTask(id?: string | number): void;
+
+ /**
+ * unsets a working time in the Gantt Chart
+ * @param config the configuration object of a time span
+ */
+ unsetWorkTime: Calendar["unsetWorkTime"];
+
+ /**
+ * updates the specified collection with new options
+ * @param collection the name of the collection to update
+ * @param options the new values of the collection
+ */
+ updateCollection(collection: string | number, options: any[]): boolean;
+
+ /**
+ * updates the specified dependency link
+ * @param id the task id
+ */
+ updateLink(id: string | number): void;
+
+ /**
+ * updates the specified marker
+ * @param markerId the marker's id
+ */
+ updateMarker(markerId: string | number): void;
+
+ /**
+ * updates the specified task
+ * @param id the task id
+ * @param newState optional, the new values of the task
+ */
+ updateTask(id: string | number, newState?: Task): void;
+
+ /**
+ * updates the resource property of the task object with the values of the resource assignments from the datastore
+ * @param taskId the task id
+ */
+ updateTaskAssignments(taskId: number | string): void;
+}
+
+export interface Task {
+
+ /**
+ * The task id, auto-generated if not set
+ */
+ id: string | number,
+
+ /**
+ * The date when a task is scheduled to begin. If not specified, Gantt will calculate it based on the end_date and duration properties.The property becomes optional when setting unscheduled: true.
+ */
+ start_date?: Date,
+
+ /**
+ * The date when a task is scheduled to be completed. If not specified, Gantt will calculate it based on the start_date and duration properties.The property becomes optional when setting unscheduled: true.
+ */
+ end_date?: Date,
+
+ /**
+ * The task duration. If not specified, Gantt will calculate it based on the start_date and end_date properties.
+ */
+ duration?: number,
+
+ /**
+ * Defines whether gantt should do auto-scheduling of the task (true or not specified) or not (false)
+ */
+ auto_scheduling?: boolean,
+
+ /**
+ * Sets the height of the DOM element of the task in the timeline area
+ */
+ bar_height?: number,
+
+ /**
+ * Sets the id of the custom calendar to be assigned to the task. The name of the property depends on the value of the calendar_property option
+ */
+ calendar_id?: number | string,
+
+ /**
+ * Sets the color of the task in the timeline area (i.e. sets background-color for the gantt_task_line element of the task)
+ */
+ color?: string,
+
+ /**
+ * The date of the task constraint. It is added to the task object when auto-scheduling with time constraints is enabled. The property isn't used if auto_scheduling_compatibility is enabled.
+ */
+ constraint_date?: Date,
+
+ /**
+ * The type of the task constraint ("asap", "alap", "snet", "snlt", "fnet", "fnlt", "mso", "mfo"). It is added to the task object when auto-scheduling with time constraints is enabled. The property isn't used if auto_scheduling_compatibility is enabled.
+ */
+ constraint_type?: string,
+
+ /**
+ * Defines whether the task can be editable in the read-only Gantt chart. The name of the property depends on the value of the editable_property option
+ */
+ editable?: boolean,
+
+ /**
+ * The group's id. It is added to the tasks grouped by some criterion if the property used for grouping tasks (relation_property in the groupBy() method) is specified as an object.
+ */
+ group_id?: string | number,
+
+ /**
+ * Defines whether a task (type:"task") or milestone (type:"milestone") should be hidden in the timeline area
+ */
+ hide_bar?: boolean,
+
+ /**
+ * The key of the group. It is added to the tasks grouped by some criterion if the property used for grouping tasks (relation_property in the groupBy() method) is specified as an array.It is also added to the tasks with the name of the group (for example, to the "High", "Normal", "Low" tasks if you've grouped tasks by priority. Check the example).
+ */
+ key?: string | number,
+
+ /**
+ * The label of the group. It is added to the tasks with the name of the group (for example, if you've grouped tasks by priority, the property will be added to the tasks with "High", "Normal", "Low" names. Check the example).
+ */
+ label?: string,
+
+ /**
+ * Specifies whether the task branch will be opened initially (to show child tasks). To close/open the branch after Gantt initialization, use the related methods: close() and open()
+ */
+ open?: boolean,
+
+ /**
+ * The id of the parent task. If the specified parent doesn't exist, the task won't be rendered in the Gantt. The id of the root task is specified by the api/gantt_root_id_config.md config.
+ */
+ parent?: number | string,
+
+ /**
+ * The task's progress (from 0 to 1)
+ */
+ progress?: number,
+
+ /**
+ * The color of the task progress in the timeline area (i.e. sets background-color for the gantt_task_progress element of the task progress)
+ */
+ progressColor?: string,
+
+ /**
+ * Defines whether the task must be readonly. The name of the property depends on the value of the readonly_property option
+ */
+ readonly?: boolean,
+
+ /**
+ * Defines how subtasks of the task must be displayed. Values: "split" | "". If set to "split", the subtasks will be displayed in one row. In addition, if you enable the open_split_tasks property, the subtasks will be rendered in one row only if the task is collapsed.
+ */
+ render?: string,
+
+ /**
+ * An array with resources assigned to the task. It is added to the task object when importing data from MS Project/Primavera
+ */
+ resource?: Array<string>,
+
+ /**
+ * Specifies whether a task (type:"task") or milestone (type:"milestone") should appear on the parent projects.
+ */
+ rollup?: boolean,
+
+ /**
+ * Sets the height for the task's row
+ */
+ row_height?: number,
+
+ /**
+ * The id of the target task. The property displays the same value as the $drop_target property. The property is added to the task object only if Data Processor is enabled, after the task is updated and data is sent to the server.
+ */
+ target?: string,
+
+ /**
+ * The name of the task. If necessary you may use any other name for this property.The property is used in default configurations of different parts of Gantt.
+ */
+ text?: any,
+
+ /**
+ * The color of the task's text in the timeline area (i.e. sets color for the gantt_task_line element of the task)
+ */
+ textColor?: string,
+
+ /**
+ * the task type. The available values are stored in the api/gantt_types_config.md object:
+ "task" - a regular task (default value).
+ "project" - a task that starts, when its earliest child task starts, and ends, when its latest child ends.
+ The start_date, end_date, duration properties are ignored for such tasks.
+
+ "milestone" - a zero-duration task that is used to mark out important dates of the project.
+ The duration, progress, end_date properties are ignored for such tasks.
+ */
+ type?: string,
+
+ /**
+ * Defines whether the task must be unscheduled. By default, the unscheduled task isn't displayed in the timeline area, empty values are displayed in the grid instead of the start and end dates.
+ */
+ unscheduled?: boolean,
+
+ /**
+ * A system property that is used in internal calculations.
+ */
+ $calculate_duration?: boolean,
+
+ /**
+ * An object which contains custom properties of a task which were defined in the importFromMSProject() and importFromPrimaveraP6() methods
+ */
+ $custom_data?: object,
+
+ /**
+ * A system property which defines whether the task has been updated. It is added to the task object when Data Processor is enabled. If the value of the property is "updated", the task's text will be bold in the grid but it is possible to define your own styles via CSS.
+ */
+ $dataprocessor_class?: string,
+
+ /**
+ * The id of the target task. A temporary property which is added to the task object when dragging the task vertically.
+ */
+ $drop_target?: string,
+
+ /**
+ * The id of the calendar (or resource calendar) assigned to the task. A system property that is used in internal calculations.
+ */
+ $effective_calendar?: string,
+
+ /**
+ * A system property which shows whether the task is visible depending on whether the task's parents are expanded or not. If at least one parent is collapsed, the task won't be visible. The exception is only split tasks (subtasks).
+ */
+ $expanded_branch?: boolean,
+
+ /**
+ * Defines whether the Gantt should send a request to the server to load the first-level subtasks of the task. The property is used when the branch_loading property is enabled. The name of the property depends on the value of the branch_loading_property option.
+ */
+ $has_child?: boolean,
+
+ /**
+ * The global vertical position of the task. It is bound to the task and changes if the tasks below or above are open or closed. If the parent of the task is collapsed, the property doesn't show the actual position of the task.
+ */
+ $index?: number,
+
+ /**
+ * The task's level in the tasks hierarchy (zero-based numbering)
+ */
+ $level?: number,
+
+ /**
+ * The vertical position of the task in the branch (under the parent). It isn't bound to the task and doesn't change if the tasks below or above are open or closed as inside the branch as globally. If the parent of the task is collapsed, the property doesn't show the actual position of the task.
+ */
+ $local_index?: number,
+
+ /**
+ * It is added for a new task when it is created via the createTask() method or via the "+" button. The property is added to the task object when you open the lightbox, and is removed after you save the task.
+ */
+ $new?: boolean,
+
+ /**
+ * Required, a system property which is added to the task object. True if the end_date property couldn't be calculated (when the start_date property is loaded but there is no duration or end_date one). In this case, you cannot move or resize the task. The end_date property will depend on the end_date of the subtasks (if any). The start_date property will be fixed and won't change. Auto-scheduling won't work for such a task. If the $no_start property is enabled, the task will fully depend on the dates of its subtasks or on the date of the first task.
+ */
+ $no_end?: boolean,
+
+ /**
+ * Required, a system property which is added to the task object. True if the start_date property couldn't be calculated (when the end_date property is loaded but there is no duration or start_date one). The start_date property will depend on the start_date of the subtasks (if any) or on the start date of the first task. The end_date property will be fixed and will change only if the start date of the subtasks/first task is bigger than the end date of the task. Auto-scheduling won't work for such a task. If the $no_end property is enabled, the task will fully depend on the dates of its subtasks or on the date of the first task.
+ */
+ $no_start?: boolean,
+
+ /**
+ * A system property which specifies whether the task is currently opened (true). If you change the value of the property and re-draw the Gantt, it will open or close the task. To change the state of the task, you may also apply the open() or close() methods.
+ */
+ $open?: boolean,
+
+ /**
+ * An object with original names of task properties which were imported from MS Project / Primavera into the export module (export server). The properties appear in the $raw object while the file is converted into JSON-format but before they are converted into names and format expected by Gantt.
+ */
+ $raw?: object,
+
+ /**
+ * The id of a row the rollup item / split task is rendered at. This is the temporary property which appears in the object of the rollup/split task only when it's been rendering on the page.
+ */
+ $rendered_at?: string | number,
+
+ /**
+ * The id of the parent under which the task is rendered (not id of the real parent of the task). The property is used in internal calculations and on tasks' grouping.
+ */
+ $rendered_parent?: number | string,
+
+ /**
+ * The type of the rendered task (a temporary property).
+ */
+ $rendered_type?: string,
+
+ /**
+ * An array with ids of resources assigned to the task (a temporary property). But the most actual data is stored in the store of resource assignments not in this property.
+ */
+ $resourceAssignments?: Array<any>,
+
+ /**
+ * An array with ids of tasks and milestones which have appeared on the current task
+ */
+ $rollup?: Array<string | number>,
+
+ /**
+ * Required, an array with ids of all links that come out of the task
+ */
+ $source?: Array<string | number>,
+
+ /**
+ * Appears if the task is a subtask of a split task (i.e. arranges in one row with other subtasks)
+ */
+ $split_subtask?: boolean,
+
+ /**
+ * Required, an array with ids of links that come into task
+ */
+ $target?: Array<string | number>,
+
+ /**
+ * A temporary property which is added to the task object when dragging the task vertically. The task looks a little bit transparent in grid on vertical dragging due to this property.
+ */
+ $transparent?: boolean,
+
+ /**
+ * It is added to the tasks grouped by some criterion. After the grouping is reset, tasks with $virtual: true are removed
+ */
+ $virtual?: boolean,
+
+ /**
+ * The WBS code of the task (a temporary property). It is added to the task object after applying the getWBSCode() method. If the value of the code has changed (the task's parent or position has been changed), you need to call the getWBSCode() method again to get the updated value of the code.
+ */
+ $wbs?: string,
+
+ [customProperty: string]: any;
+
+}
+
+export interface Link {
+
+ /**
+ * the link id
+ */
+ id: string | number,
+
+ /**
+ * the id of a task that the dependency will start from
+ */
+ source: string | number,
+
+ /**
+ * the id of a task that the dependency will end with.
+ */
+ target: string | number,
+
+ /**
+ * the dependency type. The available values are stored in the api/gantt_links_config.md object. By default, they are:
+ "0" - 'finish_to_start'.
+ "1" - 'start_to_start'.
+ "2" - 'finish_to_finish'.
+ "3" - 'start_to_finish'.
+ */
+ type: string,
+
+ /**
+ * the task's lag
+ */
+ lag?: number,
+
+ /**
+ * can mark link as readonly
+ */
+ readonly?: boolean,
+
+ /**
+ * can mark link as editable
+ */
+ editable?: boolean,
+
+ [customProperty: string]: any;
+
+}
+
+export interface Scale {
+
+ /**
+ * the name of the scale unit. The available values are: "minute", "hour", "day" (default), "week", "quarter", "month", "year".
+ */
+ unit: string,
+
+ /**
+ * the step of the time scale (X-Axis), 1 by default.
+ */
+ step?: number,
+
+ /**
+ * a function that returns the name of a CSS class that will be applied to the scale units. Takes a date object as a parameter.
+ * @param a date that will be checked
+ */
+ css?(date: Date): any,
+
+ /**
+ * the format of the scale's labels. If set as a function, expects a date object as a parameter.
+ * @param a date that will be converted
+ */
+ format?: string | ((date: Date,) => any),
+
+ /**
+ * the format of the scale's labels. If set as a function, expects a date object as a parameter.
+ * @param a date that will be converted
+ */
+ date?: string | ((date: Date,) => any)
+}
+
+export interface GridColumn {
+
+ /**
+ * sets the horizontal title alignment. Possible values: *'left'*, *'center'*, or *'right'*
+ */
+ align?: string,
+
+ /**
+ * hides/shows a column (PRO)
+ */
+ hide?: boolean,
+
+ /**
+ * specifies the title of the column
+ */
+ label?: string | number,
+
+ /**
+ * sets the maximum column width in case of resize operations
+ */
+ max_width?: number,
+
+ /**
+ * sets the minimum column width in case of resize operations
+ */
+ min_width?: number,
+
+ /**
+ * defines the column's id. The name 'add' allows you to add a column with the '+' sign
+ */
+ name?: string | number,
+
+ /**
+ * enables the possibility to resize a column by dragging the column's border (PRO)
+ */
+ resize?: boolean,
+
+ /**
+ * indicates that the related column should display a tree
+ */
+ tree?: boolean,
+
+ /**
+ * defines the width of the column
+ */
+ width?: number | string,
+
+ /**
+ * attached inline editor
+ * @param the type of the inline editor
+ * @param specifies which property of the task should be updated by the inline editor
+ * @param minimal value for the date and duration types
+ * @param maximal value for the date and duration types
+ * @param an array with the options for the select types
+ * @param formatter for the date and predecessor types
+ */
+ editor?: {
+ type: string,
+ map_to: string,
+ min?: Date | number,
+ max?: Date | number,
+ options?: Array<any>,
+ formatter?: DurationFormatter | LinkFormatter
+ },
+
+ /**
+ * sets a data template
+ * @param the Task object
+ */
+ template?(task: Task): any,
+
+ /**
+ * optional, a callback function for rendering a cell into the DOM. The function takes a task object and the DOM element of the grid cell as parameters and may return a component of the framework. See details here
+ * @param the Task object
+ * @param the HTML element of the Grid cell
+ */
+ onrender?(task: Task, node: HTMLElement): any,
+
+ /**
+ * sort configuration after clicking on the column header. When it is set to *false*, sorting is disabled. Otherwise you can set a different task property in the *string* to sort the column or use a custom sorting function
+ * @param the first task that will be sorted
+ * @param the second task that will be sorted
+ */
+ sort?: boolean | string | ((task1: Task, task2: Task,) => any)
+}
+
+export interface DateHelpers {
+
+ /**
+ * adds/subtracts the specified time interval to/from the date
+ * @param the date object that you need to add a time to/subtract a time from
+ * @param the number of units to add. If this number is positive - the time will be added to the date, if negative - the time will be subtracted
+ * @param the time unit. Values: 'minute', 'hour', 'day', 'week', 'month', 'year'.
+ */
+ add(date: Date, number: number, unit: string): Date,
+
+ /**
+ * adds/subtracts the specified number of quarters to/from the date
+ * @param the date object that you need to add quarters to/subtract quarters from
+ * @param the number of quarters
+ */
+ add_quarter(date: Date, number: number): Date,
+
+ /**
+ * converts local time to UTC
+ * @param the date object to convert
+ */
+ convert_to_utc(date: Date): Date,
+
+ /**
+ * makes a copy of a Date object
+ * @param the date object to copy
+ */
+ copy(date: Date): Date,
+
+ /**
+ * resets the time part of the provided date to 00:00:00
+ * @param the date object to format
+ */
+ date_part(date: Date): Date,
+
+ /**
+ * returns a function that converts a Date object to a string of the specified format
+ * @param the date format
+ * @param specifies whether local time should be converted to UTC
+ */
+ date_to_str(format: string, utc?: boolean): Function,
+
+ /**
+ * resets the time part of the provided date to 00:00:00. Alias of the date_part method. Used by the Day view to set the display date and can be redefined to provide the default behaviour
+ * @param the date object to format
+ */
+ day_start(date: Date): Date,
+
+ /**
+ * returns the ISO-8601 week number of the date, weeks starts on Monday
+ * @param the date object to format
+ */
+ getISOWeek(date: Date): number,
+
+ /**
+ * returns the week number of the date, but previously converts local time to UTC
+ * @param the date object to format
+ */
+ getUTCISOWeek(date: Date): number,
+
+ /**
+ * returns the week number of the date. Weeks start either on Monday or Sunday, depending on the value of the api/gantt_start_on_monday_config.md property.
+ * @param the date object to format
+ */
+ getWeek(date: Date): number,
+
+ /**
+ * returns a Date object of the first day of the month for the specified date and clears the time part to zero
+ * @param the date object to format
+ */
+ month_start(date: Date): Date,
+
+ /**
+ * converts a string of the specified format to a Date object
+ * @param a date as a string
+ * @param the date format
+ */
+ parseDate(date: string, format: string): Date,
+
+ /**
+ * returns a function that converts a string of the specified format to a Date object
+ * @param the date format
+ * @param specifies whether local time should be converted to UTC
+ */
+ str_to_date(format: string, utc?: boolean): Function,
+
+ /**
+ * returns the time of a Date object as a number of seconds counted from the midnight (00:00:00)
+ * @param the date object to format
+ */
+ time_part(date: Date): number,
+
+ /**
+ * adds the leading zero to numbers less than 10 and returns the result as a string. Doesn't affect numbers from 10
+ * @param the number to format
+ */
+ to_fixed(num: number): string,
+
+ /**
+ * returns a Date object of the specified date and clears the part with seconds to zero
+ * @param the date object to format
+ */
+ minute_start(date: Date): Date,
+
+ /**
+ * returns a Date object of the specified date and clears the part with minutes and seconds to zero
+ * @param the date object to format
+ */
+ hour_start(date: Date): Date,
+
+ /**
+ * returns a Date object of the first day of the week for the specified date and clears the time part to zero
+ * @param the date object to format
+ */
+ week_start(date: Date): Date,
+
+ /**
+ * returns a Date object of the first month of the quarter for the specified date and clears the time part to zero
+ * @param the date object to format
+ */
+ quarter_start(date: Date): Date,
+
+ /**
+ * returns a Date object of the first day of the year for the specified date and clears the time part to zero
+ * @param the date object to format
+ */
+ year_start(date: Date): Date
+
+ [customTemplate: string]: any;
+}
+
+export interface Calendar {
+
+ /**
+ * the id of a task's calendar
+ */
+ id: string | number,
+
+ /**
+ * sets the working time for the Gantt chart
+ * @param the [configuration object](api/gantt_setworktime.md#configurationobjectproperties) of a time span:
+ * @param optional, a number of a week day [0 (Sunday) - 6 (Saturday)]. Note, you can set only 1 day at once
+ * @param optional, a specific date to set as a working day or day off
+ * @param optional, an array of working hours as 'from'-'to' pairs.'false' value sets a day-off, 'true' (default value) applies the default hours (["8:00-17:00"])
+ * @param optional, an object with different working-time rules for different periods of time. The object can contain a set of key:value pairs where key is the name of a time span and value is an object with a list of attributes.
+ * @param the time span with the working time settings. The name of that object is used as the name of the time span
+ * @param the date when the time span is scheduled to begin
+ * @param the date when the time span is scheduled to be completed
+ * @param optional, an array of working hours as 'from'-'to' pairs.'false' value sets a day-off, 'true' (default value) applies the default hours (["8:00-17:00"])
+ * @param optional, an array of 7 days of the week (from 0 - Sunday, to 6 - Saturday), where 1/true stands for a working day and 0/false - a non-working day.
+ */
+ setWorkTime(
+ config: {
+ day?: string | number,
+ date?: Date,
+ hours?: Array<string | number> | boolean,
+ customWeeks?: {
+ [timespan: string]: {
+ from: Date,
+ to: Date,
+ hours?: Array<string | number>,
+ days?: Array<string | number | Array<string | number>> | boolean,
+ },
+ },
+ }
+ ): boolean,
+
+ /**
+ * unsets a working time in the Gantt Chart
+ * @param the [configuration object](api/gantt_unsetworktime.md#configurationobjectproperties) of a time span:
+ * @param optional, a number of a week day [0 (Sunday) - 6 (Saturday)]. Note, you can set only 1 day at once
+ * @param optional, a specific date to set as a working day or day off
+ * @param optional, an array of working hours as 'from'-'to' pairs.
+ */
+ unsetWorkTime(
+ config: {
+ day?: string | number,
+ date?: Date,
+ hours?: Array<string | number> | boolean,
+ }
+ ): void,
+
+ /**
+ * checks whether the specified date is working
+ * @param either a date to check or the [configuration object](api/gantt_isworktime.md#configurationobjectproperties) of a time span:
+ * @param a date to check
+ * @param optional, a time unit: "minute", "hour", "day", "week", "month", "year"
+ * @param optional, the object of the task the duration of which should be calculated
+ * @param optional, a time unit: "minute", "hour", "day", "week", "month", "year". Not needed at all when the first parameter is specified as an object
+ */
+ isWorkTime(
+ config: Date | {
+ date: Date,
+ unit?: string,
+ task?: Task,
+ },
+ time_unit?: string
+ ): boolean,
+
+ /**
+ * returns the closest working time
+ * @param the [configuration object](api/gantt_getclosestworktime.md#configurationobjectproperties):
+ * @param a date to get the closest working time for
+ * @param optional, specifies the direction of the closest time: "future" or "past"
+ * @param optional, a time unit to search for the closest working time
+ * @param optional, the object of the task to use its calendar
+ */
+ getClosestWorkTime(
+ config: Date | {
+ date: Date,
+ dir?: string,
+ unit?: string,
+ task?: Task,
+ }
+ ): Date,
+
+ /**
+ * calculates the end date of a task
+ * @param either the date when a task is scheduled to begin or the [configuration object](api/gantt_calculateenddate.md#configurationobjectproperties) of a time span:
+ * @param the date when a task is scheduled to begin
+ * @param the duration of a task
+ * @param optional, the time unit of the duration: "minute", "hour", "day", "week", "month", "year"
+ * @param optional, the object of the task the duration of which should be calculated
+ * @param optional, the duration of a task. Not needed at all when the first parameter is specified as an object
+ * @param optional, the time unit of the duration. Not needed at all when the first parameter is specified as an object
+ */
+ calculateEndDate(
+ config: Date | {
+ start_date: Date,
+ duration: number,
+ unit?: string,
+ task?: Task,
+ },
+ duration?: number,
+ unit?: string
+ ): Date,
+
+ /**
+ * calculates the duration of a task
+ * @param either the date when a task is scheduled to begin or the [configuration object](api/gantt_calculateduration.md#configurationobjectproperties) of a time span:
+ * @param the date when a task is scheduled to begin
+ * @param the date when a task is scheduled to be completed
+ * @param optional, the object of the task the duration of which should be calculated
+ * @param the date when a task is scheduled to be completed. Not needed at all when the first parameter is specified as an object
+ */
+ calculateDuration(
+ config: Date | {
+ start_date: Date,
+ end_date: Date,
+ task?: Task,
+ },
+ end?: Date
+ ): number
+
+ [customMethod: string]: any;
+}
+
+export interface DomHelpers {
+
+ /**
+ * returns position of the element on the screen in the format of `{x:number, y:number,width:number, height:number}` object
+ * @param DOM element that will be checked
+ */
+ getNodePosition(node: HTMLElement): object,
+
+ /**
+ * returns mouse coordinates relatively to the DOM element in the format of `{x:number, y:number}` object
+ * @param event that occured
+ * @param DOM element that will be checked
+ */
+ getRelativeEventPosition(e: Event, node: HTMLElement): object,
+
+ /**
+ * returns `true` if the node provided as the first argument is DOM child of the node provided as the second argument
+ * @param child node that will be checked
+ * @param parent node that will be checked
+ */
+ isChildOf(child: HTMLElement, parent: HTMLElement): boolean,
+
+ /**
+ * returns `true` if the class list of the provided `node` contains a specified css class
+ * @param DOM element that will be checked
+ * @param class name that will be checked
+ */
+ hasClass(node: HTMLElement, className: string): boolean,
+
+ /**
+ * returns the first node that matches the provided css selector, starting from the `node` attribute, up to its DOM parents' branch.
+ * @param DOM element will be checked
+ * @param a class name for the target node
+ */
+ closest(node: HTMLElement, cssSelector: string): HTMLElement
+
+ [customMethod: string]: any;
+}
+
+export interface DatastoreMethods {
+
+ /**
+ * loads data from an array
+ * @param the data to load
+ */
+ parse(data: Array<object>): void,
+
+ /**
+ * returns the item by its id
+ * @param the id of the item
+ */
+ getItem(id: string | number): object | void,
+
+ /**
+ * updates the specified item
+ * @param the id of the item
+ * @param an object the item
+ */
+ updateItem(id: string | number, item?: object): void,
+
+ /**
+ * deletes the specified item
+ * @param the id of the item
+ */
+ removeItem(id: string | number): void,
+
+ /**
+ * checks whether the specified item is visible or hidden via filters
+ * @param the id of the item
+ */
+ isVisible(id: string | number): boolean,
+
+ /**
+ * returns the array of visible items
+ */
+ getVisibleItems(): Array<object>,
+
+ /**
+ * adds a new item to the datastore
+ * @param the item object
+ * @param the position the task will be added into (0 or greater)
+ */
+ addItem(item: object, index?: number): number | string,
+
+ /**
+ * changes the id of the item
+ * @param the current item's id
+ * @param the new item's id
+ */
+ changeId(oldId: string | number, newId: string | number): void,
+
+ /**
+ * checks whether the specified item exists in the datastore
+ * @param the item's id
+ */
+ exists(id: string | number): boolean,
+
+ /**
+ * moves an item to a new position
+ * @param the index of the current position of the task
+ * @param the index of the position that the item will be moved to
+ */
+ move(sindex: number, tindex: number): void,
+
+ /**
+ * clears the datastore
+ */
+ clearAll(): void,
+
+ /**
+ * execute the code without firing API events of the datastore
+ * @param the callback function
+ */
+ silent(callback: Function): void,
+
+ /**
+ * fires repainting of events of the specified record, runs filters
+ * @param optional, the id of the record
+ */
+ refresh(id?: string | number): void,
+
+ /**
+ * returns the number of items that are currently loaded into the datastore
+ */
+ count(): number,
+
+ /**
+ * returns the number of items that are currently visible
+ */
+ countVisible(): number,
+
+ /**
+ * iterates over all tasks of the datastore
+ * @param the callback function
+ */
+ eachItem(callback: Function): void,
+
+ /**
+ * runs the filters and updates visible array of items
+ */
+ filter(): void,
+
+ /**
+ * sorts items in the resource grid
+ * @param the name of the column that the resource grid will be sorted by or a custom sorting function
+ * @param specifies the sorting direction: true - descending sort and false - ascending sort. By default, false
+ * @param the id of the parent item. Specify the parameter if you want to sort items only in the branch of the specified parent.
+ * @param specifies whether rendering should be invoked after reordering items
+ */
+ sort(field: string | Function, desc?: boolean, parent?: string | number, silent?: boolean): void,
+
+ /**
+ * returns records between the specified indexes
+ * @param the position of the start record
+ * @param the position of the end record
+ */
+ getIndexRange(from: number, to: number): Array<object>,
+
+ /**
+ * returns all records of the datastore
+ */
+ getItems(): Array<object>,
+
+ /**
+ * returns the id of the item by its index. Returns `undefined` if there is no item at the specified index.
+ * @param the position of the item
+ */
+ getIdByIndex(index: number): string | number | void,
+
+ /**
+ * returns the index of the item by its id. Returns `-1` if no such item exists in the datastore.
+ * @param the id of the item
+ */
+ getIndexById(id: string | number): number,
+
+ /**
+ * returns the id of the first item of the datastore
+ */
+ getFirst(): string | number | null,
+
+ /**
+ * returns the id of the last item of the datastore
+ */
+ getLast(): string | number | null,
+
+ /**
+ * returns the id of the next item of the datastore
+ * @param the item's id
+ */
+ getNext(id: string | number): string | number | null,
+
+ /**
+ * returns the id of the previous item of the datastore
+ * @param the item's id
+ */
+ getPrev(id: string | number): string | number | null,
+
+ /**
+ * clears the datastore and removes all attached event handlers. The datastore is not usable after this method is called.
+ */
+ destructor(): void,
+
+ /**
+ * attaches the handler to an inner event of DataStore
+ * @param the event's name, case-insensitive
+ * @param the handler function
+ * @param optional, an object with settings for the event handler
+ */
+ attachEvent<T extends keyof TreeDatastoreEvents>(event: T, handler: TreeDatastoreEvents[T], settings?: object): boolean,
+
+ /**
+ * calls an inner event
+ * @param the event's name, case-insensitive
+ * @param an array of the event-related data
+ */
+ callEvent(name: string, params: Array<any>): boolean,
+
+ /**
+ * detaches a handler from an event (which was attached before by the attachEvent() method)
+ * @param the event's id
+ */
+ detachEvent(id: string): void
+}
+
+export interface DatastoreEvents {
+
+ /**
+ * fires when an item is being loaded from the data source
+ * @param the object of an item
+ */
+ "onItemLoading": (item: any) => any,
+
+ /**
+ * fires before data started to be parsed
+ * @param the array with the data that was loaded
+ */
+ "onBeforeParse": (data: Array<any>) => any,
+
+ /**
+ * fires after data were parsed (became available for API) but before they were rendered in the Gantt chart
+ * @param the array with the data that was loaded
+ */
+ "onParse": (data: Array<any>) => any,
+
+ /**
+ * fires before an item is updated
+ * @param the id of an item
+ * @param the new (updated) object of the item
+ */
+ "onBeforeUpdate": (id: string | number, item: any) => any,
+
+ /**
+ * fires after an item is updated
+ * @param the id of an item
+ * @param the object of the item
+ */
+ "onAfterUpdate": (id: string | number, item: any) => any,
+
+ /**
+ * fires before an item is deleted
+ * @param the id of an item
+ * @param the object of the item
+ */
+ "onBeforeDelete": (id: string | number, item: any) => any,
+
+ /**
+ * fires after an item is deleted
+ * @param the id of an item
+ * @param the object of the item
+ */
+ "onAfterDelete": (id: string | number, item: any) => any,
+
+ /**
+ * fires before a new item is added to the datastore
+ * @param the id of an item
+ * @param the object of the item
+ */
+ "onBeforeAdd": (id: string | number, item: any) => any,
+
+ /**
+ * fires after an item is added to the datastore
+ * @param the id of an item
+ * @param the object of the item
+ */
+ "onAfterAdd": (id: string | number, item: any) => any,
+
+ /**
+ * fires when the id of an item is changed
+ * @param the id of an item
+ * @param the new id of the item
+ */
+ "onIdChange": (id: string | number, newId: string | number) => any,
+
+ /**
+ * fires after all items were removed from the datastore
+ */
+ "onClearAll": () => any,
+
+ /**
+ * fires before the datastore is refreshed
+ * @param the id of an item or null
+ * @param the item object or null
+ * @param the action type ("paint", "move", "add", "delete", null)
+ */
+ "onBeforeStoreUpdate": (id: string | number | null, item: any | null, action: string | null) => any,
+
+ /**
+ * fires after the datastore has been refreshed
+ * @param the id of an item or null
+ * @param the item object or null
+ * @param the action type ("paint", "move", "add", "delete", null)
+ */
+ "onStoreUpdated": (id: string | number | null, item: any | null, action: string | null) => any,
+
+ /**
+ * fires before filtering is applied
+ */
+ "onBeforeFilter": () => any,
+
+ /**
+ * fires after the datastore has update the filtering state
+ */
+ "onFilter": () => any,
+
+ /**
+ * fires for each item during the filtering stage, returning `false` will mark item as not visible
+ * @param the id of an item
+ * @param the item object
+ */
+ "onFilterItem": (id: string | number, item: any) => any,
+
+ /**
+ * fires after the destructor() method of the datastore is called
+ */
+ "onDestroy": () => any
+
+ [customEvent: string]: any;
+}
+
+export interface TreeDatastoreMethods extends DatastoreMethods {
+
+ /**
+ * moves an item to the new position or to a new parent
+ * @param the id of the item to move
+ * @param the index of the position that the item will be moved to (the index within a branch)
+ * @param the parent id. If specified, the tindex will refer to the index in the
+'parent' branch
+ */
+ move(sid: string | number, tindex: number, parent?: string | number): boolean | void,
+
+ /**
+ * returns the index of an item in the branch
+ * @param the id of the item
+ */
+ getBranchIndex(id: string | number): number,
+
+ /**
+ * checks whether the specified item has child items
+ * @param the id of the item
+ */
+ hasChild(id: string | number): number | void,
+
+ /**
+ * returns the 1st-level child items of the specified parent branch
+ * @param the id of the parent branch
+ */
+ getChildren(id: string | number): Array<number | string | object>,
+
+ /**
+ * checks whether an item is a child of a different item
+ * @param the id of an item that you want to check as a child
+ * @param the id of an item that you want to check as a parent
+ */
+ isChildOf(childId: string | number, parentId: string | number): boolean,
+
+ /**
+ * returns siblings of the specified item (including itself)
+ * @param the id of the item
+ */
+ getSiblings(id: string | number): Array<number | string | object>,
+
+ /**
+ * returns the id of the next item of the same level
+ * @param the id of the item
+ */
+ getNextSibling(id: string | number): number | string | null,
+
+ /**
+ * returns the id of the previous item of the same level
+ * @param the id of the item
+ */
+ getPrevSibling(id: string | number): number | string | null,
+
+ /**
+ * returns the id of the parent item or 0.
+ * @param the id of the item
+ */
+ getParent(id: string | number): number | string,
+
+ /**
+ * calculates the level of nesting of an item
+ * @param the item's object
+ */
+ calculateItemLevel(item: object): number,
+
+ /**
+ * sets the parent for an item. The parent id will be writen to the property specified by `parentProperty` config, "item.parent" by default.
+ * @param the item's object
+ * @param the id of the parent
+ */
+ setParent(item: object, newParentId: string | number | null): void,
+
+ /**
+ * iterates over all children of a specific item
+ * @param the callback function
+ * @param the id of the parent
+ */
+ eachItem(callback: Function, parentId?: string | number): void,
+
+ /**
+ * iterates over all parent items of the specified item
+ * @param the callback function
+ * @param the id of the item the parent item of which should be iterated over
+ */
+ eachParent(callback: Function, startItem: string | number): void,
+
+ /**
+ * opens the branch with the specified id
+ * @param the branch id
+ */
+ open(id: string | number): void,
+
+ /**
+ * closes the branch with the specified id
+ * @param the branch id
+ */
+ close(id: string | number): void,
+
+ /**
+ * sorts items in the resource grid
+ * @param the name of the column that the resource grid will be sorted by or a custom sorting function
+ * @param specifies the sorting direction: true - descending sort and false - ascending sort. By default, false
+ * @param the id of the parent item. Specify the parameter if you want to sort items only in the branch of the specified parent.
+ * @param specifies whether rendering should be invoked after reordering items
+ */
+ sort(field: string | Function, desc?: boolean, parent?: string | number, silent?: boolean): void
+}
+
+export interface TreeDatastoreEvents extends DatastoreEvents {
+
+ /**
+ * fires before an item is moved to a new position
+ * @param the id of the item to move
+ * @param the parent id
+ * @param the index of the position in the parent branch that the item will be moved to
+ */
+ "onBeforeItemMove": (id: string | number, parent: string | number, tindex: number) => any,
+
+ /**
+ * fires after an item was moved to a new position
+ * @param the id of the item to move
+ * @param the parent id
+ * @param the index of the position in the parent branch that the item will be moved to
+ */
+ "onAfterItemMove": (id: string | number, parent: string | number, tindex: number) => any,
+
+ /**
+ * fires on opening a branch
+ * @param the id of the branch
+ */
+ "onItemOpen": (id: string | number) => any,
+
+ /**
+ * fires on closing a branch
+ * @param the id of the branch
+ */
+ "onItemClose": (id: string | number) => any
+}
+
+export interface InlineEditorMethods {
+
+ /**
+ * opens an editor in the specified task/cell, sets the mapped value and puts browser focus on the editor
+ * @param the task ID
+ * @param the column name
+ */
+ startEdit(taskId: number | string, columnName: string): void,
+
+ /**
+ * opens an empty editor in specified task/cell
+ * @param the task ID
+ * @param the column name
+ */
+ show(taskId: number | string, columnName: string): void,
+
+ /**
+ * populates an opened editor with values from the task
+ */
+ setValue(): void,
+
+ /**
+ * saves changes and hides an editor
+ */
+ save(): void,
+
+ /**
+ * hides an editor without saving changes
+ */
+ hide(): void,
+
+ /**
+ * puts browser focus on the editor
+ */
+ focus(): void,
+
+ /**
+ * gets the state object {id: taskId, columnName: columnName, placeholder: HTMLElement}
+ */
+ getState(): object,
+
+ /**
+ * gets the current value of the editor
+ */
+ getValue(): string,
+
+ /**
+ * checks whether the current value of the editor differs from the initial value
+ */
+ isChanged(): boolean,
+
+ /**
+ * checks whether the editor is opened
+ */
+ isVisible(): boolean,
+
+ /**
+ * attaches an event handler to inlineEditors object
+ * @param the name of the event handler
+ * @param the function that will be called when the event fires
+ */
+ attachEvent<T extends keyof InlineEditorEvents>(event: T, handler: InlineEditorEvents[T]): boolean,
+
+ /**
+ * detaches a handler from an event (which was attached before by the attachEvent() method)
+ * @param the id of the attached event handler
+ */
+ detachEvent(id: string): void,
+
+ /**
+ * saves the current editor and moves editor to the next cell
+ * @param the parameter specifies whether it can move the editor to the first cell of the next row after the last cell of the current one
+ */
+ editNextCell(canChangeRow?: boolean): void,
+
+ /**
+ * saves the current editor and opens an editor in the same cell of the task below
+ * @param the parameter specifies whether it can skip the read-only task and open an editor in the cell of the first editable task. The default *false* state of the parameter closes the editor if the next task is read-only.
+ */
+ editNextRow(skipReadonly?: boolean): void,
+
+ /**
+ * saves the current editor and moves editor to the previous cell
+ * @param the parameter specifies whether it can move editor to the last cell of the row above after reaching the first cell of the current row
+ */
+ editPrevCell(canChangeRow?: boolean): void,
+
+ /**
+ * saves the current editor and opens an editor in the same cell of the task above
+ * @param the parameter specifies whether it can skip the read-only task and open an editor in the cell of the first editable task. The default *false* state of the parameter closes the editor if the previous task is read-only.
+ */
+ editPrevRow(skipReadonly?: boolean): void,
+
+ /**
+ * gets the name of the first editable column in the grid
+ */
+ getFirstCell(): string,
+
+ /**
+ * gets the name of the last editable column in the grid
+ */
+ getLastCell(): string,
+
+ /**
+ * returns the name of the next editable column
+ * @param the parameter specifies in which direction it should iterate the following cell. `1` - right, `-1` - left.
+ */
+ getNextCell(direction: number): string | null,
+
+ /**
+ * checks whether a provided DOM element is a task cell object and returns an editor state object, if it is so: {id: taskId, columnName: columnName}
+ * @param the HTML element
+ */
+ locateCell(node: HTMLElement): object | null,
+
+ /**
+ * sets a mapping object
+ * @param an object with the mapping configuration:
+ * @param the method to initialize mapping
+ * @param the method that will be called when the inline editor is opened
+ * @param the method that will be called when the inline editor is closed
+ * @param the method to destroy mapping
+ */
+ setMapping(
+ mapping: {
+ init: Function,
+ onShow: Function,
+ onHide: Function,
+ destroy: Function,
+ }
+ ): void,
+
+ /**
+ * returns a currently applied mapping object
+ */
+ getMapping(): object
+
+ [customMethod: string]: any;
+}
+
+export interface InlineEditorEvents {
+
+ "onBeforeEditStart": (state: {
+ id: number | string,
+ columnName: string,
+ }) => any,
+
+ "onEditStart": (state: {
+ id: number | string,
+ columnName: string,
+ }) => any,
+
+ "onBeforeSave": (state: {
+ id: number | string,
+ columnName: string,
+ oldValue: any,
+ newValue: any,
+ }) => any,
+
+ "onSave": (state: {
+ id: number | string,
+ columnName: string,
+ oldValue: any,
+ newValue: any,
+ }) => any,
+
+ "onEditEnd": (state: {
+ id: number | string,
+ columnName: string,
+ }) => any
+
+ [customEvent: string]: any;
+}
+
+export interface Fullscreen {
+
+ /**
+ * expands gantt to the full screen mode
+ */
+ expand(): void,
+
+ /**
+ * collapses gantt from the fullscreen mode to the normal mode
+ */
+ collapse(): void,
+
+ /**
+ * calls the **collapse()** method if gantt is expanded to full screen, and the **expand()** method otherwise
+ */
+ toggle(): void,
+
+ /**
+ * returns a DOM element that will be expanded to full screen by the **expand()** method.
+ */
+ getFullscreenElement(): HTMLElement
+
+ [customMethod: string]: any;
+}
+
+export interface KeyNav {
+
+ /**
+ * allows selecting any cell in the grid. Works only if the Grid already has the focus
+ * @param the config object
+ * @param the id of an edited task
+ * @param the column name
+ * @param type of the scope. Possible values: "gantt", "taskRow", "taskCell", "headerCell"
+ */
+ focus(
+ config: {
+ id: number | string,
+ column: string,
+ type: string,
+ }
+ ): void,
+
+ /**
+ * allows obtaining information about the active cell
+ */
+ getActiveNode(): boolean | void
+
+ [customMethod: string]: any;
+}
+
+export interface QuickInfo {
+
+ /**
+ * displays the quick info popup for a specified element
+ * @param the task ID
+ */
+ show(id: number | string): void,
+
+ /**
+ * displays the quick info popup at specific coordinates
+ * @param horizontal coordinate
+ * @param vertical coordinate
+ */
+ show(x: number | string, y: number | string): void,
+
+ /**
+ * hides the quick info popup. When **gantt.config.quick_info_detached** is set to *false*, the quick info will not disappear immediately, but after a short animation. Providing *true* value as an argument will cancel the animation and will remove the popup immediately.
+ * @param defines whether the quick info popup will be hidden immediately without animation
+ */
+ hide(force?: boolean): HTMLElement,
+
+ /**
+ * sets a container where the quick info will be displayed. If no custom container specified, QuickInfo will be placed into the first of the found nodes: **gantt.$task, gantt.$grid, gantt.$root**
+ * @param container element or its ID
+ */
+ setContainer(container: HTMLElement | string): void,
+
+ /**
+ * returns the HTMLElement of the quick info popup. Returns *null* if the quick info is not initialized
+ */
+ getNode(): HTMLElement | null,
+
+ /**
+ * puts the content into the quick info
+ * @param optional, the configuration object of a quick info which can include the following attributes:
+ * @param optional, the id of the task to which the action buttons of the quick info will be connected
+ * @param optional, the header of the pop-up edit form which may include:
+ * @param optional, the title of the pop-up edit form
+ * @param optional, the date of the pop-up edit form
+ * @param optional, the content of the pop-up edit form
+ * @param optional, buttons to be placed in the pop-up edit form
+ */
+ setContent(
+ config?: {
+ taskId?: string | number,
+ header?: {
+ title?: string,
+ date?: string,
+ }
+ content?: string,
+ buttons?: string[],
+ }
+ ): void
+
+ [customMethod: string]: any;
+}
+
+export interface Undo {
+
+ /**
+ * reverts the changes made in the gantt
+ */
+ undo(): void,
+
+ /**
+ * applies the reverted changes to the gantt once again
+ */
+ redo(): void,
+
+ /**
+ * returns the stack of stored undo user actions
+ */
+ getUndoStack(): Array<object>,
+
+ /**
+ * returns the stack of stored redo user actions
+ */
+ getRedoStack(): Array<object>,
+
+ /**
+ * clears the stack of stored undo commands
+ */
+ clearUndoStack(): void,
+
+ /**
+ * clears the stack of stored redo commands
+ */
+ clearRedoStack(): void,
+
+ /**
+ * saves the current state of a task/link before the changes are made
+ * @param the id of a task/link,
+ * @param the type of an entry for which the id is provided as the first argument.
+ */
+ saveState(id: string | number, type: string): boolean
+
+ [customMethod: string]: any;
+}
+
+export interface ClickDrag {
+
+ /**
+ * sets a custom CSS class for a selected element
+ */
+ className?: string,
+
+ /**
+ * the element to attach an event to and select
+ */
+ viewPort?: HTMLElement,
+
+ /**
+ * defines whether requestAnimationFrame is used during rendering
+ */
+ useRequestAnimationFrame?: boolean,
+
+ /**
+ * true to add selection only in one row equal to the height of a task
+ */
+ singleRow?: boolean,
+
+ /**
+ * CSS selector. Drag-n-drop won't be activated for the elements that match the selector
+ */
+ ignore?: string,
+
+ /**
+ * if the property is specified, drag-n-drop will be activated only when the specified modifier key is pressed. Supported values: "ctrlKey", "shiftKey", "metaKey", "altKey"
+ */
+ useKey?: string | boolean,
+
+ /**
+ * a function that will be called when the mouse button is released. Takes 6 parameters:
+ * @param an object with the following attributes:
+ * @param the coordinates of the left top corner of the document
+ * @param the left coordinate
+ * @param the top coordinate
+ * @param the coordinates of the left top element used as a viewPort
+ * @param the left coordinate
+ * @param the top coordinate
+ * @param an object with the following attributes:
+ * @param the coordinates of the left top corner of the document
+ * @param the left coordinate
+ * @param the top coordinate
+ * @param the coordinates of the left top element used as a viewPort
+ * @param the left coordinate
+ * @param the top coordinate
+ * @param the date that corresponds to the starting point
+ * @param the date that corresponds to the ending point
+ * @param an array of tasks between the start and end date points
+ * @param an array of tasks selected between the start and end coordinates vertically
+ */
+ callback?(
+ startPoint?: {
+ absolute: {
+ left: number,
+ top: number,
+ },
+ relative: {
+ left: number,
+ top: number,
+ },
+ },
+ endPoint?: {
+ absolute: {
+ left: number,
+ top: number,
+ },
+ relative: {
+ left: number,
+ top: number,
+ },
+ },
+ startDate?: Date,
+ endDate?: Date,
+ tasksBetweenDates?: Array<Task>,
+ tasksInRows?: Array<Task>
+ ): any,
+
+ /**
+ * a function that creates an element rendered during dragging. Takes two parameters:
+ * @param an object with the attributes:
+ * @param the coordinates of the left top corner of the document
+ * @param the left coordinate
+ * @param the top coordinate
+ * @param the coordinates of the left top element used as a viewPort
+ * @param the left coordinate
+ * @param the top coordinate
+ * @param an object with the attributes:
+ * @param the coordinates of the left top corner of the document
+ * @param the left coordinate
+ * @param the top coordinate
+ * @param the coordinates of the left top element used as a viewPort
+ * @param the left coordinate
+ * @param the top coordinate
+ */
+ render?(
+ startPoint?: {
+ absolute: {
+ left: number,
+ top: number,
+ },
+ relative: {
+ left: number,
+ top: number,
+ },
+ },
+ endPoint?: {
+ absolute: {
+ left: number,
+ top: number,
+ },
+ relative: {
+ left: number,
+ top: number,
+ },
+ }
+ ): any
+
+ [customMethod: string]: any;
+}
+
+export interface Overlay {
+
+ /**
+ * adds a new overlay into the Gantt Chart and returns its id
+ * @param the render function. Takes a container with custom content as a parameter
+ * @param optional, the ID of the overlay
+ */
+ addOverlay(render: Function, id?: number | string): string | number,
+
+ /**
+ * removes an overlay by its id
+ * @param the ID of the overlay
+ */
+ deleteOverlay(id: number | string): boolean,
+
+ /**
+ * returns an array with ids of overlays added into the chart
+ */
+ getOverlaysIds(): Array<string>,
+
+ /**
+ * repaints the specified overlay.
+ * @param the ID of the overlay
+ */
+ refreshOverlay(id: number | string): void,
+
+ /**
+ * shows an overlay by its id.
+ * @param the ID of the overlay
+ */
+ showOverlay(id: number | string): void,
+
+ /**
+ * hides an overlay by its id
+ * @param the ID of the overlay
+ */
+ hideOverlay(id: number | string): void,
+
+ /**
+ * checks visibility of the specified overlay. Returns *true* if the overlay is visible.
+ * @param the ID of the overlay
+ */
+ isOverlayVisible(id: number | string): boolean
+
+ [customMethod: string]: any;
+}
+
+export interface ZoomLevels {
+
+ /**
+ * required, an array of zooming levels, each of which includes the following properties:
+ * @param the name of the level
+ * @param the height of the scale
+ * @param the height of the scale
+ * @param the minimal width of a column. It has a higher priority than minColumnWidth and maxColumnWidth
+ * @param an array of scales to switch between while zooming in/out on this level
+ */
+ name: string,
+ scale_height?: number,
+ height?: number,
+ min_column_width?: number,
+ scales: Scale[],
+}
+
+export interface ZoomMethods {
+
+ /**
+ * initialize the extension with the provided configuration.
+ * @param an object with configuration settings that contains the *levels* array of zooming levels and a number of additional properties:
+ * @param required, an array of zooming levels, each of which includes the following properties:
+ * @param allows specifying a custom handler of the mouse wheel to work with zooming manually
+ * @param the start value of the time scale zooming
+ * @param the end value of the time scale zooming
+ * @param the number of the default active level
+ * @param the step of increasing/decreasing the width of scale while switching to the next/previous zooming level
+ * @param the minimal width of a column that allows switching to the previous zooming level
+ * @param the maximal width of a column that allows switching to the next zooming level
+ * @param the key that enables zooming by scrolling the mouse wheel:"ctrlKey" | "altKey" | "shiftKey"
+ * @param the trigger of zooming: "wheel" | null | undefined
+ * @param a DOM element over which zooming is triggered or a function that returns a DOM element
+ */
+ init(
+ zoomConfig: {
+ levels: ZoomLevels[],
+ handler?: Function,
+ startDate?: Date,
+ endDate?: Date,
+ activeLevelIndex?: number,
+ widthStep?: number,
+ minColumnWidth?: number,
+ maxColumnWidth?: number,
+ useKey?: string,
+ trigger?: string | null | undefined,
+ element?: HTMLElement | Function,
+ }
+ ): void,
+
+ /**
+ * returns the number (index) of the current zooming level
+ */
+ getCurrentLevel(): number,
+
+ /**
+ * switches to the specified zooming level.
+ * @param The level is defined either by a string (the name of the level from the config, e.g. "year"), or by its number in the array of levels
+ */
+ setLevel(level: number | string): void,
+
+ /**
+ * increases the current zooming level
+ */
+ zoomIn(): void,
+
+ /**
+ * decreases the current zooming level
+ */
+ zoomOut(): void,
+
+ /**
+ * attaches an event handler
+ * @param the name of the event handler
+ * @param the function that will be called when the event fires
+ */
+ attachEvent<T extends keyof ZoomEvents>(event: T, handler: ZoomEvents[T]): string,
+
+ /**
+ * detaches a handler from an event
+ * @param the id of the attached event handler
+ */
+ detachEvent(id: string): void
+
+ [customMethod: string]: any;
+}
+
+export interface ZoomEvents {
+
+ /**
+ * fires during switching of the zooming level
+ * @param the number of the level
+ * @param the config of the level
+ */
+ "onAfterZoom": (level: number | string, config: ZoomLevels) => any
+}
+
+export interface Tooltip {
+
+ /**
+ * returns the HTML element of the tooltip
+ */
+ getNode(): HTMLElement
+ /**
+ * locks the position of tooltip to the boundaries of the specified HTML element
+ * @param the HTML element under the question
+ */
+ setViewport(node: HTMLElement): object
+ /**
+ * displays the tooltip at specific coordinates (relative to document.body). The method can take different parameters, depending on the position you want to show the tooltip at. To display tooltip at specific coordinates (relative to document.body), pass x,y coordinates. To display tooltip at the mouse event coordinates pass the Event object. The *tooltip_offset_x/y* and viewport will be taken into account.
+ * @param the X coordinate or the mouse event object
+ * @param the Y coordinate
+ */
+ show(config?: number | Event, top?: number): object
+ /**
+ * hides the tooltip element
+ */
+ hide(): object
+ /**
+ * puts HTML content into the tooltip. Takes as a parameter:
+ * @param a string with HTML content for the tooltip
+ */
+ setContent(html: string): object
+}
+
+export interface Tooltips {
+
+ /**
+ * Tooltip object
+ */
+ tooltip: Tooltip,
+
+ /**
+ * adds tooltip with extended configuration. The method takes one parameter:
+ * @param an object with the tooltip settings. The settings are:
+ * @param defines CSS-selector for the elements to listen to mouse events on
+ * @param a handler called when the mouse pointer enters the element. The parameters are:
+ * @param a native mouse event
+ * @param the HTML node
+ * @param a handler called when the mouse pointer moves inside the element. The parameters are:
+ * @param a native mouse event
+ * @param the HTML node
+ * @param a handler called when the mouse pointer leaves the element. The parameters are:
+ * @param a native mouse event
+ * @param the HTML node
+ * @param defines whether the module listens to mouse events on the whole page (*true*) or only inside a gantt element (*false*). By default the option is set to *false*.
+ */
+ attach(
+ config: {
+ selector: string,
+ onmouseenter: ((
+ event: MouseEvent,
+ node: HTMLElement,
+ ) => any),
+ onmousemove?: ((
+ event: MouseEvent,
+ node: HTMLElement,
+ ) => any),
+ onmouseleave: ((
+ event: MouseEvent,
+ node: HTMLElement,
+ ) => any),
+ global?: boolean,
+ }
+ ): void,
+
+ /**
+ * adds a tooltip for the specified Gantt element. It is a more simplified version of the **attach()** method. The method takes one parameter:
+ * @param an object with the tooltip settings. The settings are:
+ * @param a CSS-selector of the Gantt element to add a tooltip to
+ * @param a template for the tooltip. The template function takes two parameters in its turn:
+ * @param a native mouse event
+ * @param the HTML node and returns a string with a template.
+ * @param optional, defines whether the module listens to mouse events on the whole page (*true*) or only inside a gantt element (*false*). By default the option is set to *false*.
+ */
+ tooltipFor(
+ config: {
+ selector: string,
+ html: ((
+ event: Event,
+ node: HTMLElement,
+ ) => any),
+ global?: boolean,
+ }
+ ): void,
+
+ /**
+ * removes tooltip. As a parameter the method takes:
+ * @param the CSS selector of a Gantt element
+ */
+ detach(selector: string): void
+}
+
+export interface DurationFormatter {
+
+ /**
+ * returns *true* if the provided string can be parsed into the duration value, otherwise
+ * @param the string that will be checked
+ */
+ canParse(value: string): boolean
+ /**
+ * converts the provided duration value into the duration string
+ * @param the duration value that will be converted
+ */
+ format(value: number): string
+ /**
+ * parses the provided string into the duration value. If the value can鈥檛 be parsed, 鈥榥ull鈥� will be returned
+ * @param the string that will be converted
+ */
+ parse(value: string): number
+}
+
+export interface LinkFormatter {
+
+ /**
+ * returns *true* if the provided string can be parsed into the link object, otherwise
+ * @param the string that will be checked
+ */
+ canParse(value: string): boolean
+ /**
+ * converts the provided link value into the string
+ * @param the link object that will be converted
+ */
+ format(value: Link): string
+ /**
+ * parses the provided string into the link object. If the value can鈥檛 be parsed, 鈥榥ull鈥� will be returned. **Note** that the *link.target* of the given link will have "null" value
+ * @param the string that will be converted
+ */
+ parse(value: string): object
+}
+
+export interface Formatters {
+
+ /**
+ * creates a Duration Formatter
+ * @param optional, a configuration object which can include the following attributes:
+ * @param specifies the default format for the **parse** method, which is used when an input value is entering without units. Default value: "day".
+ * @param specifies the format for the duration values storage in the gantt. This property affects the output value of the **parse** method. Default value: "hour".
+ * @param specifies the format for the output value. Supported values: "auto", "minute", "hour", "day", "week", "month", "year", "an array containing any of these values". The "auto" value means the formatter will try to select an appropriate unit depending on provided value (i.e. larger values will be formatted as days/months/years, smaller values will be formatted as minutes/hours).
+ * @param sets short labels (abbreviations) for time units. Default value: *false*
+ * @param defines how duration values will be converted from minutes to hours and vice-versa. *Default value: 60*
+ * @param defines how duration values will be converted from hours to days and vice-versa. *Default value: 8*
+ * @param defines how duration values will be converted from hours to weeks and vice-versa. *Default value: 40*
+ * @param defines how duration values will be converted from days to months and vice-versa. *Default value: 30*
+ * @param defines how duration values will be converted from days to years and vice-versa. *Default: 365*
+ * @param defines text labels for different time units. These labels are used both for parsed and formatted values.
+ * @param configuration for minutes
+ * @param full text label for minutes
+ * @param plural text label for minutes
+ * @param short text label for minutes
+ * @param configuration for hours
+ * @param full text label for hours
+ * @param plural text label for hours
+ * @param short text label for hours
+ * @param configuration for days
+ * @param full text label for days
+ * @param plural text label for days
+ * @param short text label for days
+ * @param configuration for weeks
+ * @param full text label for weeks
+ * @param plural text label for weeks
+ * @param short text label for weeks
+ * @param configuration for months
+ * @param full text label for months
+ * @param plural text label for months
+ * @param short text label for months
+ * @param configuration for years
+ * @param full text label for years
+ * @param plural text label for years
+ * @param short text label for years
+ */
+ durationFormatter(
+ config?: {
+ enter?: string,
+ store?: string,
+ format?: string | Array<string>,
+ short?: boolean,
+ minutesPerHour?: number,
+ hoursPerDay?: number,
+ hoursPerWeek?: number,
+ daysPerMonth?: number,
+ daysPerYear?: number,
+ labels?: {
+ minute?: {
+ full?: string,
+ plural?: string,
+ short?: string,
+ },
+ hour?: {
+ full?: string,
+ plural?: string,
+ short?: string,
+ },
+ day?: {
+ full?: string,
+ plural?: string,
+ short?: string,
+ },
+ week?: {
+ full?: string,
+ plural?: string,
+ short?: string,
+ },
+ month?: {
+ full?: string,
+ plural?: string,
+ short?: string,
+ },
+ year?: {
+ full?: string,
+ plural?: string,
+ short?: string,
+ },
+ },
+ }
+ ): DurationFormatter,
+
+ /**
+ * create a Link Formatter
+ * @param optional, a configuration object which can include the following attributes:
+ * @param an instance of the *DurationFormatter* created by the *gantt.ext.formatters.durationFormatter()*. It affects how lag/lead values of links are parsed and formatted:
+ * @param locale labels for different types of links
+ * @param labels for the Finish to Start links
+ * @param labels for the Start to Start links
+ * @param labels for the Finish to Finish links
+ * @param labels for the Start to Finish links
+ */
+ linkFormatter(
+ config?: {
+ durationFormatter?: DurationFormatter,
+ labels?: {
+ finish_to_start?: string,
+ start_to_start?: string,
+ finish_to_finish?: string,
+ start_to_finish?: string,
+ },
+ }
+ ): LinkFormatter
+}
+
+export interface EmptyState {
+
+ /**
+ * an array with the IDs of the attached handlers. Modified by the *attachAddTaskEvent* and *detachAddTaskEvents* methods.
+ */
+ clickEvents?: Array<string>,
+
+ /**
+ * returns *true* if there is no data loaded into the Gantt chart, otherwise
+ * @param the container element
+ */
+ isGanttEmpty(container: HTMLElement): boolean,
+
+ /**
+ * returns *true* if the api/gantt_show_empty_state_config.md property is enabled, otherwise
+ * @param the container element
+ */
+ isEnabled(container: HTMLElement): boolean,
+
+ /**
+ * puts an HTML content into the empty state element. The method can be redefined.
+ * @param the container element
+ */
+ renderContent(container: HTMLElement): void,
+
+ /**
+ * returns the DOM element where the empty state will be attached to. By default, returns the grid element (the "empty state" will be displayed in the grid). If there is no grid, returns the timeline element (the "empty state" will be displayed in the timeline). The method can be redefined.
+ */
+ getContainer(): HTMLElement | null,
+
+ /**
+ * returns the DOM node of the empty state element.
+ */
+ getNode(): HTMLElement | null,
+
+ /**
+ * displays the "empty state". Returns *false* if there is no container for the Empty State Element. The extension calls the method by itself
+ */
+ show(): null | void,
+
+ /**
+ * hides the "empty state". Returns *false* if there is no Empty State Element node, so there is nothing to hide. The extension calls the method by itself
+ */
+ hide(): boolean | void,
+
+ /**
+ * adds the handler that will fire after clicking on the Empty State Element. By default, used to add a new task.
+ */
+ attachAddTaskEvent(): void,
+
+ /**
+ * removes the handlers that were used to add a task after clicking on the Empty State Element.
+ */
+ detachAddTaskEvents(): void
+}
+
+export interface Ext {
+ inlineEditors: InlineEditorMethods,
+ emptyStateElement: EmptyState,
+ fullscreen: Fullscreen,
+ formatters: Formatters,
+ keyboardNavigation: KeyNav,
+ quickInfo: QuickInfo,
+ undo: Undo,
+ overlay: Overlay,
+ tooltips: Tooltips,
+ zoom: ZoomMethods,
+
+ [customMethod: string]: any;
+}
+
+declare var gantt: GanttStatic;
+
+declare var Gantt: GanttEnterprise;
+
+export { gantt, Gantt };
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/dhtmlxgantt.js b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.js
new file mode 100644
index 0000000..31e6697
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.js
@@ -0,0 +1,30964 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+!
+ function(t, e) {
+ "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define("dhtmlxgantt", [], e) : "object" == typeof exports ? exports.dhtmlxgantt = e() : t.dhtmlxgantt = e()
+ } (window,
+ function() {
+ return function(t) {
+ var e = {};
+ function n(i) {
+ if (e[i]) return e[i].exports;
+ var r = e[i] = {
+ i: i,
+ l: !1,
+ exports: {}
+ };
+ return t[i].call(r.exports, r, r.exports, n),
+ r.l = !0,
+ r.exports
+ }
+ return n.m = t,
+ n.c = e,
+ n.d = function(t, e, i) {
+ n.o(t, e) || Object.defineProperty(t, e, {
+ enumerable: !0,
+ get: i
+ })
+ },
+ n.r = function(t) {
+ "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {
+ value: "Module"
+ }),
+ Object.defineProperty(t, "__esModule", {
+ value: !0
+ })
+ },
+ n.t = function(t, e) {
+ if (1 & e && (t = n(t)), 8 & e) return t;
+ if (4 & e && "object" == typeof t && t && t.__esModule) return t;
+ var i = Object.create(null);
+ if (n.r(i), Object.defineProperty(i, "default", {
+ enumerable: !0,
+ value: t
+ }), 2 & e && "string" != typeof t) for (var r in t) n.d(i, r,
+ function(e) {
+ return t[e]
+ }.bind(null, r));
+ return i
+ },
+ n.n = function(t) {
+ var e = t && t.__esModule ?
+ function() {
+ return t.
+ default
+ }:
+ function() {
+ return t
+ };
+ return n.d(e, "a", e),
+ e
+ },
+ n.o = function(t, e) {
+ return Object.prototype.hasOwnProperty.call(t, e)
+ },
+ n.p = "/codebase/",
+ n(n.s = 299)
+ } ([function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r, a = n(2),
+ o = {}.constructor.toString();
+ t.exports = {
+ copy: function t(e) {
+ var n, r;
+ if (e && "object" == i(e)) switch (!0) {
+ case a.isDate(e):
+ r = new Date(e);
+ break;
+ case a.isArray(e):
+ for (r = new Array(e.length), n = 0; n < e.length; n++) r[n] = t(e[n]);
+ break;
+ default:
+ for (n in r = function(t) {
+ return t.constructor.toString() !== o
+ } (e) ? Object.create(e) : {},
+ e) Object.prototype.hasOwnProperty.apply(e, [n]) && (r[n] = t(e[n]))
+ }
+ return r || e
+ },
+ defined: function(t) {
+ return void 0 !== t
+ },
+ mixin: function(t, e, n) {
+ for (var i in e)(void 0 === t[i] || n) && (t[i] = e[i]);
+ return t
+ },
+ uid: function() {
+ return r || (r = (new Date).valueOf()),
+ ++r
+ },
+ bind: function(t, e) {
+ return t.bind ? t.bind(e) : function() {
+ return t.apply(e, arguments)
+ }
+ },
+ event: function(t, e, n, i) {
+ t.addEventListener ? t.addEventListener(e, n, void 0 !== i && i) : t.attachEvent && t.attachEvent("on" + e, n)
+ },
+ eventRemove: function(t, e, n, i) {
+ t.removeEventListener ? t.removeEventListener(e, n, void 0 !== i && i) : t.detachEvent && t.detachEvent("on" + e, n)
+ }
+ }
+ },
+ function(t, e) {
+ function n(t) {
+ var e = 0,
+ n = 0,
+ i = 0,
+ r = 0;
+ if (t.getBoundingClientRect) {
+ var a = t.getBoundingClientRect(),
+ o = document.body,
+ s = document.documentElement || document.body.parentNode || document.body,
+ l = window.pageYOffset || s.scrollTop || o.scrollTop,
+ c = window.pageXOffset || s.scrollLeft || o.scrollLeft,
+ u = s.clientTop || o.clientTop || 0,
+ d = s.clientLeft || o.clientLeft || 0;
+ e = a.top + l - u,
+ n = a.left + c - d,
+ i = document.body.offsetWidth - a.right,
+ r = document.body.offsetHeight - a.bottom
+ } else {
+ for (; t;) e += parseInt(t.offsetTop, 10),
+ n += parseInt(t.offsetLeft, 10),
+ t = t.offsetParent;
+ i = document.body.offsetWidth - t.offsetWidth - n,
+ r = document.body.offsetHeight - t.offsetHeight - e
+ }
+ return {
+ y: Math.round(e),
+ x: Math.round(n),
+ width: t.offsetWidth,
+ height: t.offsetHeight,
+ right: Math.round(i),
+ bottom: Math.round(r)
+ }
+ }
+ function i(t) {
+ var e = !1,
+ n = !1;
+ if (window.getComputedStyle) {
+ var i = window.getComputedStyle(t, null);
+ e = i.display,
+ n = i.visibility
+ } else t.currentStyle && (e = t.currentStyle.display, n = t.currentStyle.visibility);
+ return "none" != e && "hidden" != n
+ }
+ function r(t) {
+ return ! isNaN(t.getAttribute("tabindex")) && 1 * t.getAttribute("tabindex") >= 0
+ }
+ function a(t) {
+ return ! {
+ a: !0,
+ area: !0
+ } [t.nodeName.loLowerCase()] || !!t.getAttribute("href")
+ }
+ function o(t) {
+ return ! {
+ input: !0,
+ select: !0,
+ textarea: !0,
+ button: !0,
+ object: !0
+ } [t.nodeName.toLowerCase()] || !t.hasAttribute("disabled")
+ }
+ function s(t) {
+ if (!t) return "";
+ var e = t.className || "";
+ return e.baseVal && (e = e.baseVal),
+ e.indexOf || (e = ""),
+ u(e)
+ }
+ var l;
+ function c(t) {
+ var e;
+ return t.tagName ? e = t: (e = (t = t || window.event).target || t.srcElement).shadowRoot && t.composedPath && (e = t.composedPath()[0]),
+ e
+ }
+ function u(t) {
+ return (String.prototype.trim ||
+ function() {
+ return this.replace(/^\s+|\s+$/g, "")
+ }).apply(t)
+ }
+ function d() {
+ return document.head.createShadowRoot || document.head.attachShadow
+ }
+ function h(t) {
+ if (!t) return document.body;
+ if (!d()) return document.body;
+ for (; t.parentNode && (t = t.parentNode);) if (t instanceof ShadowRoot) return t.host;
+ return document.body
+ }
+ t.exports = {
+ getNodePosition: n,
+ getFocusableNodes: function(t) {
+ for (var e = t.querySelectorAll(["a[href]", "area[href]", "input", "select", "textarea", "button", "iframe", "object", "embed", "[tabindex]", "[contenteditable]"].join(", ")), n = Array.prototype.slice.call(e, 0), s = 0; s < n.length; s++) n[s].$position = s;
+ for (n.sort(function(t, e) {
+ return 0 === t.tabIndex && 0 !== e.tabIndex ? 1 : 0 !== t.tabIndex && 0 === e.tabIndex ? -1 : t.tabIndex === e.tabIndex ? t.$position - e.$position: t.tabIndex < e.tabIndex ? -1 : 1
+ }), s = 0; s < n.length; s++) {
+ var l = n[s]; (r(l) || o(l) || a(l)) && i(l) || (n.splice(s, 1), s--)
+ }
+ return n
+ },
+ getScrollSize: function() {
+ var t = document.createElement("div");
+ t.style.cssText = "visibility:hidden;position:absolute;left:-1000px;width:100px;padding:0px;margin:0px;height:110px;min-height:100px;overflow-y:scroll;",
+ document.body.appendChild(t);
+ var e = t.offsetWidth - t.clientWidth;
+ return document.body.removeChild(t),
+ e
+ },
+ getClassName: s,
+ addClassName: function(t, e) {
+ e && -1 === t.className.indexOf(e) && (t.className += " " + e)
+ },
+ removeClassName: function(t, e) {
+ e = e.split(" ");
+ for (var n = 0; n < e.length; n++) {
+ var i = new RegExp("\\s?\\b" + e[n] + "\\b(?![-_.])", "");
+ t.className = t.className.replace(i, "")
+ }
+ },
+ insertNode: function(t, e) {
+ l || (l = document.createElement("div")),
+ l.innerHTML = e;
+ var n = l.firstChild;
+ return t.appendChild(n),
+ n
+ },
+ removeNode: function(t) {
+ t && t.parentNode && t.parentNode.removeChild(t)
+ },
+ getChildNodes: function(t, e) {
+ for (var n = t.childNodes,
+ i = n.length,
+ r = [], a = 0; a < i; a++) {
+ var o = n[a];
+ o.className && -1 !== o.className.indexOf(e) && r.push(o)
+ }
+ return r
+ },
+ toNode: function(t) {
+ return "string" == typeof t ? document.getElementById(t) || document.querySelector(t) || document.body: t || document.body
+ },
+ locateClassName: function(t, e, n) {
+ var i = c(t),
+ r = "";
+ for (void 0 === n && (n = !0); i;) {
+ if (r = s(i)) {
+ var a = r.indexOf(e);
+ if (a >= 0) {
+ if (!n) return i;
+ var o = 0 === a || !u(r.charAt(a - 1)),
+ l = a + e.length >= r.length || !u(r.charAt(a + e.length));
+ if (o && l) return i
+ }
+ }
+ i = i.parentNode
+ }
+ return null
+ },
+ locateAttribute: function(t, e) {
+ if (e) {
+ for (var n = c(t); n;) {
+ if (n.getAttribute && n.getAttribute(e)) return n;
+ n = n.parentNode
+ }
+ return null
+ }
+ },
+ getTargetNode: c,
+ getRelativeEventPosition: function(t, e) {
+ var i = document.documentElement,
+ r = n(e);
+ return {
+ x: t.clientX + i.scrollLeft - i.clientLeft - r.x + e.scrollLeft,
+ y: t.clientY + i.scrollTop - i.clientTop - r.y + e.scrollTop
+ }
+ },
+ isChildOf: function(t, e) {
+ if (!t || !e) return ! 1;
+ for (; t && t != e;) t = t.parentNode;
+ return t === e
+ },
+ hasClass: function(t, e) {
+ return "classList" in t ? t.classList.contains(e) : new RegExp("\\b" + e + "\\b").test(t.className)
+ },
+ closest: function(t, e) {
+ if (t.closest) return t.closest(e);
+ if (t.matches || t.msMatchesSelector || t.webkitMatchesSelector) {
+ var n = t;
+ if (!document.documentElement.contains(n)) return null;
+ do {
+ if ((n.matches || n.msMatchesSelector || n.webkitMatchesSelector).call(n, e)) return n;
+ n = n.parentElement || n.parentNode
+ } while ( null !== n && 1 === n . nodeType );
+ return null
+ }
+ return console.error("Your browser is not supported"),
+ null
+ },
+ getRootNode: h,
+ hasShadowParent: function(t) {
+ return !! h(t)
+ },
+ isShadowDomSupported: d,
+ getActiveElement: function() {
+ var t = document.activeElement;
+ return t.shadowRoot && (t = t.shadowRoot.activeElement),
+ t === document.body && document.getSelection && (t = document.getSelection().focusNode || document.body),
+ t
+ }
+ }
+ },
+ function(t, e) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var i = {
+ second: 1,
+ minute: 60,
+ hour: 3600,
+ day: 86400,
+ week: 604800,
+ month: 2592e3,
+ quarter: 7776e3,
+ year: 31536e3
+ };
+ function r(t) {
+ return ! (!t || "object" !== n(t)) && !!(t.getFullYear && t.getMonth && t.getDate)
+ }
+ function a(t, e) {
+ var n = [];
+ if (t.filter) return t.filter(e);
+ for (var i = 0; i < t.length; i++) e(t[i], i) && (n[n.length] = t[i]);
+ return n
+ }
+ function o(t) {
+ return 0 === t
+ }
+ t.exports = {
+ getSecondsInUnit: function(t) {
+ return i[t] || i.hour
+ },
+ forEach: function(t, e) {
+ if (t.forEach) t.forEach(e);
+ else for (var n = t.slice(), i = 0; i < n.length; i++) e(n[i], i)
+ },
+ arrayMap: function(t, e) {
+ if (t.map) return t.map(e);
+ for (var n = t.slice(), i = [], r = 0; r < n.length; r++) i.push(e(n[r], r));
+ return i
+ },
+ arrayIncludes: function(t, e) {
+ if (t.includes) return t.includes(e);
+ for (var n = 0; n < t.length; n++) if (t[n] === e) return ! 0;
+ return ! 1
+ },
+ arrayFind: function(t, e) {
+ if (t.find) return t.find(e);
+ for (var n = 0; n < t.length; n++) if (e(t[n], n)) return t[n]
+ },
+ arrayFilter: a,
+ arrayDifference: function(t, e) {
+ return a(t,
+ function(t, n) {
+ return ! e(t, n)
+ })
+ },
+ arraySome: function(t, e) {
+ if (0 === t.length) return ! 1;
+ for (var n = 0; n < t.length; n++) if (e(t[n], n, t)) return ! 0;
+ return ! 1
+ },
+ hashToArray: function(t) {
+ var e = [];
+ for (var n in t) t.hasOwnProperty(n) && e.push(t[n]);
+ return e
+ },
+ sortArrayOfHash: function(t, e, n) {
+ var i = function(t, e) {
+ return t < e
+ };
+ t.sort(function(t, r) {
+ return t[e] === r[e] ? 0 : n ? i(t[e], r[e]) : i(r[e], t[e])
+ })
+ },
+ throttle: function(t, e) {
+ var n = !1;
+ return function() {
+ n || (t.apply(null, arguments), n = !0, setTimeout(function() {
+ n = !1
+ },
+ e))
+ }
+ },
+ isArray: function(t) {
+ return Array.isArray ? Array.isArray(t) : t && void 0 !== t.length && t.pop && t.push
+ },
+ isDate: r,
+ isValidDate: function(t) {
+ return r(t) && !isNaN(t.getTime())
+ },
+ isStringObject: function(t) {
+ return t && "object" === n(t) && "function String() { [native code] }" === Function.prototype.toString.call(t.constructor)
+ },
+ isNumberObject: function(t) {
+ return t && "object" === n(t) && "function Number() { [native code] }" === Function.prototype.toString.call(t.constructor)
+ },
+ isBooleanObject: function(t) {
+ return t && "object" === n(t) && "function Boolean() { [native code] }" === Function.prototype.toString.call(t.constructor)
+ },
+ delay: function(t, e) {
+ var n, i = function i() {
+ i.$cancelTimeout(),
+ i.$pending = !0;
+ var r = Array.prototype.slice.call(arguments);
+ n = setTimeout(function() {
+ t.apply(this, r),
+ i.$pending = !1
+ },
+ e)
+ };
+ return i.$pending = !1,
+ i.$cancelTimeout = function() {
+ clearTimeout(n),
+ i.$pending = !1
+ },
+ i.$execute = function() {
+ var e = Array.prototype.slice.call(arguments);
+ t.apply(this, e),
+ i.$cancelTimeout()
+ },
+ i
+ },
+ objectKeys: function(t) {
+ if (Object.keys) return Object.keys(t);
+ var e, n = [];
+ for (e in t) Object.prototype.hasOwnProperty.call(t, e) && n.push(e);
+ return n
+ },
+ isEventable: function(t) {
+ return t.attachEvent && t.detachEvent
+ },
+ replaceValidZeroId: function(t, e) {
+ return o(t) && !o(e) && (t = "0"),
+ t
+ },
+ checkZeroId: o,
+ findBinary: function(t, e) {
+ for (var n, i, r, a = 0,
+ o = t.length - 1; a <= o;) if (i = +t[n = Math.floor((a + o) / 2)], r = +t[n - 1], i < e) a = n + 1;
+ else {
+ if (! (i > e)) {
+ for (; + t[n] == +t[n + 1];) n++;
+ return n
+ }
+ if (!isNaN(r) && r < e) return n - 1;
+ o = n - 1
+ }
+ return t.length - 1
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e) {
+ for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]);
+ function i() {
+ this.constructor = t
+ }
+ t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ }
+ },
+ function(t, e) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var i;
+ i = function() {
+ return this
+ } ();
+ try {
+ i = i || Function("return this")() || (0, eval)("this")
+ } catch(t) {
+ "object" === ("undefined" == typeof window ? "undefined": n(window)) && (i = window)
+ }
+ t.exports = i
+ },
+ function(t, e) {
+ var n = function() {
+ this._silent_mode = !1,
+ this.listeners = {}
+ };
+ n.prototype = {
+ _silentStart: function() {
+ this._silent_mode = !0
+ },
+ _silentEnd: function() {
+ this._silent_mode = !1
+ }
+ };
+ var i = function(t) {
+ var e = {},
+ n = 0,
+ i = function() {
+ var n = !0;
+ for (var i in e) {
+ var r = e[i].apply(t, arguments);
+ n = n && r
+ }
+ return n
+ };
+ return i.addEvent = function(t, r) {
+ if ("function" == typeof t) {
+ var a;
+ if (r && r.id ? a = r.id: (a = n, n++), r && r.once) {
+ var o = t;
+ t = function() {
+ o(),
+ i.removeEvent(a)
+ }
+ }
+ return e[a] = t,
+ a
+ }
+ return ! 1
+ },
+ i.removeEvent = function(t) {
+ delete e[t]
+ },
+ i.clear = function() {
+ e = {}
+ },
+ i
+ };
+ t.exports = function(t) {
+ var e = new n;
+ t.attachEvent = function(t, n, r) {
+ t = "ev_" + t.toLowerCase(),
+ e.listeners[t] || (e.listeners[t] = i(this)),
+ r && r.thisObject && (n = n.bind(r.thisObject));
+ var a = t + ":" + e.listeners[t].addEvent(n, r);
+ return r && r.id && (a = r.id),
+ a
+ },
+ t.attachAll = function(t) {
+ this.attachEvent("listen_all", t)
+ },
+ t.callEvent = function(t, n) {
+ if (e._silent_mode) return ! 0;
+ var i = "ev_" + t.toLowerCase(),
+ r = e.listeners;
+ return r.ev_listen_all && r.ev_listen_all.apply(this, [t].concat(n)),
+ !r[i] || r[i].apply(this, n)
+ },
+ t.checkEvent = function(t) {
+ return !! e.listeners["ev_" + t.toLowerCase()]
+ },
+ t.detachEvent = function(t) {
+ if (t) {
+ var n = e.listeners;
+ for (var i in n) n[i].removeEvent(t);
+ var r = t.split(":");
+ if (n = e.listeners, 2 === r.length) {
+ var a = r[0],
+ o = r[1];
+ n[a] && n[a].removeEvent(o)
+ }
+ }
+ },
+ t.detachAllEvents = function() {
+ for (var t in e.listeners) e.listeners[t].clear()
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e, n, i, r) {
+ var a = e.getItemIndexByTopPosition(r.y) || 0,
+ o = e.getItemIndexByTopPosition(r.y_end) || i.count();
+ return {
+ start: Math.max(0, a - 1),
+ end: Math.min(i.count(), o + 1)
+ }
+ }
+ },
+ function(t, e) {
+ function n() {
+ console.log("Method is not implemented.")
+ }
+ function i() {}
+ i.prototype.render = n,
+ i.prototype.set_value = n,
+ i.prototype.get_value = n,
+ i.prototype.focus = n,
+ t.exports = function(t) {
+ return i
+ }
+ },
+ function(t, e) {
+ "function" == typeof Object.create ? t.exports = function(t, e) {
+ t.super_ = e,
+ t.prototype = Object.create(e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ })
+ }: t.exports = function(t, e) {
+ t.super_ = e;
+ var n = function() {};
+ n.prototype = e.prototype,
+ t.prototype = new n,
+ t.prototype.constructor = t
+ }
+ },
+ function(t, e) {
+ var n, i, r = t.exports = {};
+ function a() {
+ throw new Error("setTimeout has not been defined")
+ }
+ function o() {
+ throw new Error("clearTimeout has not been defined")
+ }
+ function s(t) {
+ if (n === setTimeout) return setTimeout(t, 0);
+ if ((n === a || !n) && setTimeout) return n = setTimeout,
+ setTimeout(t, 0);
+ try {
+ return n(t, 0)
+ } catch(e) {
+ try {
+ return n.call(null, t, 0)
+ } catch(e) {
+ return n.call(this, t, 0)
+ }
+ }
+ } !
+ function() {
+ try {
+ n = "function" == typeof setTimeout ? setTimeout: a
+ } catch(t) {
+ n = a
+ }
+ try {
+ i = "function" == typeof clearTimeout ? clearTimeout: o
+ } catch(t) {
+ i = o
+ }
+ } ();
+ var l, c = [],
+ u = !1,
+ d = -1;
+ function h() {
+ u && l && (u = !1, l.length ? c = l.concat(c) : d = -1, c.length && f())
+ }
+ function f() {
+ if (!u) {
+ var t = s(h);
+ u = !0;
+ for (var e = c.length; e;) {
+ for (l = c, c = []; ++d < e;) l && l[d].run();
+ d = -1,
+ e = c.length
+ }
+ l = null,
+ u = !1,
+ function(t) {
+ if (i === clearTimeout) return clearTimeout(t);
+ if ((i === o || !i) && clearTimeout) return i = clearTimeout,
+ clearTimeout(t);
+ try {
+ i(t)
+ } catch(e) {
+ try {
+ return i.call(null, t)
+ } catch(e) {
+ return i.call(this, t)
+ }
+ }
+ } (t)
+ }
+ }
+ function _(t, e) {
+ this.fun = t,
+ this.array = e
+ }
+ function g() {}
+ r.nextTick = function(t) {
+ var e = new Array(arguments.length - 1);
+ if (arguments.length > 1) for (var n = 1; n < arguments.length; n++) e[n - 1] = arguments[n];
+ c.push(new _(t, e)),
+ 1 !== c.length || u || s(f)
+ },
+ _.prototype.run = function() {
+ this.fun.apply(null, this.array)
+ },
+ r.title = "browser",
+ r.browser = !0,
+ r.env = {},
+ r.argv = [],
+ r.version = "",
+ r.versions = {},
+ r.on = g,
+ r.addListener = g,
+ r.once = g,
+ r.off = g,
+ r.removeListener = g,
+ r.removeAllListeners = g,
+ r.emit = g,
+ r.prependListener = g,
+ r.prependOnceListener = g,
+ r.listeners = function(t) {
+ return []
+ },
+ r.binding = function(t) {
+ throw new Error("process.binding is not supported")
+ },
+ r.cwd = function() {
+ return "/"
+ },
+ r.chdir = function(t) {
+ throw new Error("process.chdir is not supported")
+ },
+ r.umask = function() {
+ return 0
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = function() {};
+ return e.prototype = {
+ show: function(t, e, n, i) {},
+ hide: function() {},
+ set_value: function(t, e, n, i) {
+ this.get_input(i).value = t
+ },
+ get_value: function(t, e, n) {
+ return this.get_input(n).value || ""
+ },
+ is_changed: function(t, e, n, i) {
+ var r = this.get_value(e, n, i);
+ return r && t && r.valueOf && t.valueOf ? r.valueOf() != t.valueOf() : r != t
+ },
+ is_valid: function(t, e, n, i) {
+ return ! 0
+ },
+ save: function(t, e, n) {},
+ get_input: function(t) {
+ return t.querySelector("input")
+ },
+ focus: function(t) {
+ var e = this.get_input(t);
+ e && (e.focus && e.focus(), e.select && e.select())
+ }
+ },
+ e
+ }
+ },
+ function(t, e) {
+ var n = "undefined" != typeof window,
+ i = {
+ isIE: n && (navigator.userAgent.indexOf("MSIE") >= 0 || navigator.userAgent.indexOf("Trident") >= 0),
+ isIE6: n && !XMLHttpRequest && navigator.userAgent.indexOf("MSIE") >= 0,
+ isIE7: n && navigator.userAgent.indexOf("MSIE 7.0") >= 0 && navigator.userAgent.indexOf("Trident") < 0,
+ isIE8: n && navigator.userAgent.indexOf("MSIE 8.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0,
+ isOpera: n && navigator.userAgent.indexOf("Opera") >= 0,
+ isChrome: n && navigator.userAgent.indexOf("Chrome") >= 0,
+ isKHTML: n && (navigator.userAgent.indexOf("Safari") >= 0 || navigator.userAgent.indexOf("Konqueror") >= 0),
+ isFF: n && navigator.userAgent.indexOf("Firefox") >= 0,
+ isIPad: n && navigator.userAgent.search(/iPad/gi) >= 0,
+ isEdge: n && -1 != navigator.userAgent.indexOf("Edge"),
+ isNode: !n || "undefined" == typeof navigator
+ };
+ t.exports = i
+ },
+ function(t, e, n) {
+ "use strict";
+ var i = n(23),
+ r = Object.keys ||
+ function(t) {
+ var e = [];
+ for (var n in t) e.push(n);
+ return e
+ };
+ t.exports = d;
+ var a = n(17);
+ a.inherits = n(8);
+ var o = n(62),
+ s = n(58);
+ a.inherits(d, o);
+ for (var l = r(s.prototype), c = 0; c < l.length; c++) {
+ var u = l[c];
+ d.prototype[u] || (d.prototype[u] = s.prototype[u])
+ }
+ function d(t) {
+ if (! (this instanceof d)) return new d(t);
+ o.call(this, t),
+ s.call(this, t),
+ t && !1 === t.readable && (this.readable = !1),
+ t && !1 === t.writable && (this.writable = !1),
+ this.allowHalfOpen = !0,
+ t && !1 === t.allowHalfOpen && (this.allowHalfOpen = !1),
+ this.once("end", h)
+ }
+ function h() {
+ this.allowHalfOpen || this._writableState.ended || i.nextTick(f, this)
+ }
+ function f(t) {
+ t.end()
+ }
+ Object.defineProperty(d.prototype, "writableHighWaterMark", {
+ enumerable: !1,
+ get: function() {
+ return this._writableState.highWaterMark
+ }
+ }),
+ Object.defineProperty(d.prototype, "destroyed", {
+ get: function() {
+ return void 0 !== this._readableState && void 0 !== this._writableState && (this._readableState.destroyed && this._writableState.destroyed)
+ },
+ set: function(t) {
+ void 0 !== this._readableState && void 0 !== this._writableState && (this._readableState.destroyed = t, this._writableState.destroyed = t)
+ }
+ }),
+ d.prototype._destroy = function(t, e) {
+ this.push(null),
+ this.end(),
+ i.nextTick(e, t)
+ }
+ },
+ function(t, e, n) {
+ "use strict"; (function(t) {
+ /*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+ var i = n(291),
+ r = n(290),
+ a = n(67);
+ function o() {
+ return l.TYPED_ARRAY_SUPPORT ? 2147483647 : 1073741823
+ }
+ function s(t, e) {
+ if (o() < e) throw new RangeError("Invalid typed array length");
+ return l.TYPED_ARRAY_SUPPORT ? (t = new Uint8Array(e)).__proto__ = l.prototype: (null === t && (t = new l(e)), t.length = e),
+ t
+ }
+ function l(t, e, n) {
+ if (! (l.TYPED_ARRAY_SUPPORT || this instanceof l)) return new l(t, e, n);
+ if ("number" == typeof t) {
+ if ("string" == typeof e) throw new Error("If encoding is specified then the first argument must be a string");
+ return d(this, t)
+ }
+ return c(this, t, e, n)
+ }
+ function c(t, e, n, i) {
+ if ("number" == typeof e) throw new TypeError('"value" argument must not be a number');
+ return "undefined" != typeof ArrayBuffer && e instanceof ArrayBuffer ?
+ function(t, e, n, i) {
+ if (e.byteLength, n < 0 || e.byteLength < n) throw new RangeError("'offset' is out of bounds");
+ if (e.byteLength < n + (i || 0)) throw new RangeError("'length' is out of bounds");
+ e = void 0 === n && void 0 === i ? new Uint8Array(e) : void 0 === i ? new Uint8Array(e, n) : new Uint8Array(e, n, i);
+ l.TYPED_ARRAY_SUPPORT ? (t = e).__proto__ = l.prototype: t = h(t, e);
+ return t
+ } (t, e, n, i) : "string" == typeof e ?
+ function(t, e, n) {
+ "string" == typeof n && "" !== n || (n = "utf8");
+ if (!l.isEncoding(n)) throw new TypeError('"encoding" must be a valid string encoding');
+ var i = 0 | _(e, n),
+ r = (t = s(t, i)).write(e, n);
+ r !== i && (t = t.slice(0, r));
+ return t
+ } (t, e, n) : function(t, e) {
+ if (l.isBuffer(e)) {
+ var n = 0 | f(e.length);
+ return 0 === (t = s(t, n)).length ? t: (e.copy(t, 0, 0, n), t)
+ }
+ if (e) {
+ if ("undefined" != typeof ArrayBuffer && e.buffer instanceof ArrayBuffer || "length" in e) return "number" != typeof e.length ||
+ function(t) {
+ return t != t
+ } (e.length) ? s(t, 0) : h(t, e);
+ if ("Buffer" === e.type && a(e.data)) return h(t, e.data)
+ }
+ throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")
+ } (t, e)
+ }
+ function u(t) {
+ if ("number" != typeof t) throw new TypeError('"size" argument must be a number');
+ if (t < 0) throw new RangeError('"size" argument must not be negative')
+ }
+ function d(t, e) {
+ if (u(e), t = s(t, e < 0 ? 0 : 0 | f(e)), !l.TYPED_ARRAY_SUPPORT) for (var n = 0; n < e; ++n) t[n] = 0;
+ return t
+ }
+ function h(t, e) {
+ var n = e.length < 0 ? 0 : 0 | f(e.length);
+ t = s(t, n);
+ for (var i = 0; i < n; i += 1) t[i] = 255 & e[i];
+ return t
+ }
+ function f(t) {
+ if (t >= o()) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + o().toString(16) + " bytes");
+ return 0 | t
+ }
+ function _(t, e) {
+ if (l.isBuffer(t)) return t.length;
+ if ("undefined" != typeof ArrayBuffer && "function" == typeof ArrayBuffer.isView && (ArrayBuffer.isView(t) || t instanceof ArrayBuffer)) return t.byteLength;
+ "string" != typeof t && (t = "" + t);
+ var n = t.length;
+ if (0 === n) return 0;
+ for (var i = !1;;) switch (e) {
+ case "ascii":
+ case "latin1":
+ case "binary":
+ return n;
+ case "utf8":
+ case "utf-8":
+ case void 0:
+ return F(t).length;
+ case "ucs2":
+ case "ucs-2":
+ case "utf16le":
+ case "utf-16le":
+ return 2 * n;
+ case "hex":
+ return n >>> 1;
+ case "base64":
+ return B(t).length;
+ default:
+ if (i) return F(t).length;
+ e = ("" + e).toLowerCase(),
+ i = !0
+ }
+ }
+ function g(t, e, n) {
+ var i = t[e];
+ t[e] = t[n],
+ t[n] = i
+ }
+ function p(t, e, n, i, r) {
+ if (0 === t.length) return - 1;
+ if ("string" == typeof n ? (i = n, n = 0) : n > 2147483647 ? n = 2147483647 : n < -2147483648 && (n = -2147483648), n = +n, isNaN(n) && (n = r ? 0 : t.length - 1), n < 0 && (n = t.length + n), n >= t.length) {
+ if (r) return - 1;
+ n = t.length - 1
+ } else if (n < 0) {
+ if (!r) return - 1;
+ n = 0
+ }
+ if ("string" == typeof e && (e = l.from(e, i)), l.isBuffer(e)) return 0 === e.length ? -1 : v(t, e, n, i, r);
+ if ("number" == typeof e) return e &= 255,
+ l.TYPED_ARRAY_SUPPORT && "function" == typeof Uint8Array.prototype.indexOf ? r ? Uint8Array.prototype.indexOf.call(t, e, n) : Uint8Array.prototype.lastIndexOf.call(t, e, n) : v(t, [e], n, i, r);
+ throw new TypeError("val must be string, number or Buffer")
+ }
+ function v(t, e, n, i, r) {
+ var a, o = 1,
+ s = t.length,
+ l = e.length;
+ if (void 0 !== i && ("ucs2" === (i = String(i).toLowerCase()) || "ucs-2" === i || "utf16le" === i || "utf-16le" === i)) {
+ if (t.length < 2 || e.length < 2) return - 1;
+ o = 2,
+ s /= 2,
+ l /= 2,
+ n /= 2
+ }
+ function c(t, e) {
+ return 1 === o ? t[e] : t.readUInt16BE(e * o)
+ }
+ if (r) {
+ var u = -1;
+ for (a = n; a < s; a++) if (c(t, a) === c(e, -1 === u ? 0 : a - u)) {
+ if ( - 1 === u && (u = a), a - u + 1 === l) return u * o
+ } else - 1 !== u && (a -= a - u),
+ u = -1
+ } else for (n + l > s && (n = s - l), a = n; a >= 0; a--) {
+ for (var d = !0,
+ h = 0; h < l; h++) if (c(t, a + h) !== c(e, h)) {
+ d = !1;
+ break
+ }
+ if (d) return a
+ }
+ return - 1
+ }
+ function m(t, e, n, i) {
+ n = Number(n) || 0;
+ var r = t.length - n;
+ i ? (i = Number(i)) > r && (i = r) : i = r;
+ var a = e.length;
+ if (a % 2 != 0) throw new TypeError("Invalid hex string");
+ i > a / 2 && (i = a / 2);
+ for (var o = 0; o < i; ++o) {
+ var s = parseInt(e.substr(2 * o, 2), 16);
+ if (isNaN(s)) return o;
+ t[n + o] = s
+ }
+ return o
+ }
+ function y(t, e, n, i) {
+ return z(F(e, t.length - n), t, n, i)
+ }
+ function k(t, e, n, i) {
+ return z(function(t) {
+ for (var e = [], n = 0; n < t.length; ++n) e.push(255 & t.charCodeAt(n));
+ return e
+ } (e), t, n, i)
+ }
+ function b(t, e, n, i) {
+ return k(t, e, n, i)
+ }
+ function x(t, e, n, i) {
+ return z(B(e), t, n, i)
+ }
+ function w(t, e, n, i) {
+ return z(function(t, e) {
+ for (var n, i, r, a = [], o = 0; o < t.length && !((e -= 2) < 0); ++o) n = t.charCodeAt(o),
+ i = n >> 8,
+ r = n % 256,
+ a.push(r),
+ a.push(i);
+ return a
+ } (e, t.length - n), t, n, i)
+ }
+ function S(t, e, n) {
+ return 0 === e && n === t.length ? i.fromByteArray(t) : i.fromByteArray(t.slice(e, n))
+ }
+ function T(t, e, n) {
+ n = Math.min(t.length, n);
+ for (var i = [], r = e; r < n;) {
+ var a, o, s, l, c = t[r],
+ u = null,
+ d = c > 239 ? 4 : c > 223 ? 3 : c > 191 ? 2 : 1;
+ if (r + d <= n) switch (d) {
+ case 1:
+ c < 128 && (u = c);
+ break;
+ case 2:
+ 128 == (192 & (a = t[r + 1])) && (l = (31 & c) << 6 | 63 & a) > 127 && (u = l);
+ break;
+ case 3:
+ a = t[r + 1],
+ o = t[r + 2],
+ 128 == (192 & a) && 128 == (192 & o) && (l = (15 & c) << 12 | (63 & a) << 6 | 63 & o) > 2047 && (l < 55296 || l > 57343) && (u = l);
+ break;
+ case 4:
+ a = t[r + 1],
+ o = t[r + 2],
+ s = t[r + 3],
+ 128 == (192 & a) && 128 == (192 & o) && 128 == (192 & s) && (l = (15 & c) << 18 | (63 & a) << 12 | (63 & o) << 6 | 63 & s) > 65535 && l < 1114112 && (u = l)
+ }
+ null === u ? (u = 65533, d = 1) : u > 65535 && (u -= 65536, i.push(u >>> 10 & 1023 | 55296), u = 56320 | 1023 & u),
+ i.push(u),
+ r += d
+ }
+ return function(t) {
+ var e = t.length;
+ if (e <= $) return String.fromCharCode.apply(String, t);
+ var n = "",
+ i = 0;
+ for (; i < e;) n += String.fromCharCode.apply(String, t.slice(i, i += $));
+ return n
+ } (i)
+ }
+ e.Buffer = l,
+ e.SlowBuffer = function(t) { + t != t && (t = 0);
+ return l.alloc( + t)
+ },
+ e.INSPECT_MAX_BYTES = 50,
+ l.TYPED_ARRAY_SUPPORT = void 0 !== t.TYPED_ARRAY_SUPPORT ? t.TYPED_ARRAY_SUPPORT: function() {
+ try {
+ var t = new Uint8Array(1);
+ return t.__proto__ = {
+ __proto__: Uint8Array.prototype,
+ foo: function() {
+ return 42
+ }
+ },
+ 42 === t.foo() && "function" == typeof t.subarray && 0 === t.subarray(1, 1).byteLength
+ } catch(t) {
+ return ! 1
+ }
+ } (),
+ e.kMaxLength = o(),
+ l.poolSize = 8192,
+ l._augment = function(t) {
+ return t.__proto__ = l.prototype,
+ t
+ },
+ l.from = function(t, e, n) {
+ return c(null, t, e, n)
+ },
+ l.TYPED_ARRAY_SUPPORT && (l.prototype.__proto__ = Uint8Array.prototype, l.__proto__ = Uint8Array, "undefined" != typeof Symbol && Symbol.species && l[Symbol.species] === l && Object.defineProperty(l, Symbol.species, {
+ value: null,
+ configurable: !0
+ })),
+ l.alloc = function(t, e, n) {
+ return function(t, e, n, i) {
+ return u(e),
+ e <= 0 ? s(t, e) : void 0 !== n ? "string" == typeof i ? s(t, e).fill(n, i) : s(t, e).fill(n) : s(t, e)
+ } (null, t, e, n)
+ },
+ l.allocUnsafe = function(t) {
+ return d(null, t)
+ },
+ l.allocUnsafeSlow = function(t) {
+ return d(null, t)
+ },
+ l.isBuffer = function(t) {
+ return ! (null == t || !t._isBuffer)
+ },
+ l.compare = function(t, e) {
+ if (!l.isBuffer(t) || !l.isBuffer(e)) throw new TypeError("Arguments must be Buffers");
+ if (t === e) return 0;
+ for (var n = t.length,
+ i = e.length,
+ r = 0,
+ a = Math.min(n, i); r < a; ++r) if (t[r] !== e[r]) {
+ n = t[r],
+ i = e[r];
+ break
+ }
+ return n < i ? -1 : i < n ? 1 : 0
+ },
+ l.isEncoding = function(t) {
+ switch (String(t).toLowerCase()) {
+ case "hex":
+ case "utf8":
+ case "utf-8":
+ case "ascii":
+ case "latin1":
+ case "binary":
+ case "base64":
+ case "ucs2":
+ case "ucs-2":
+ case "utf16le":
+ case "utf-16le":
+ return ! 0;
+ default:
+ return ! 1
+ }
+ },
+ l.concat = function(t, e) {
+ if (!a(t)) throw new TypeError('"list" argument must be an Array of Buffers');
+ if (0 === t.length) return l.alloc(0);
+ var n;
+ if (void 0 === e) for (e = 0, n = 0; n < t.length; ++n) e += t[n].length;
+ var i = l.allocUnsafe(e),
+ r = 0;
+ for (n = 0; n < t.length; ++n) {
+ var o = t[n];
+ if (!l.isBuffer(o)) throw new TypeError('"list" argument must be an Array of Buffers');
+ o.copy(i, r),
+ r += o.length
+ }
+ return i
+ },
+ l.byteLength = _,
+ l.prototype._isBuffer = !0,
+ l.prototype.swap16 = function() {
+ var t = this.length;
+ if (t % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
+ for (var e = 0; e < t; e += 2) g(this, e, e + 1);
+ return this
+ },
+ l.prototype.swap32 = function() {
+ var t = this.length;
+ if (t % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
+ for (var e = 0; e < t; e += 4) g(this, e, e + 3),
+ g(this, e + 1, e + 2);
+ return this
+ },
+ l.prototype.swap64 = function() {
+ var t = this.length;
+ if (t % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
+ for (var e = 0; e < t; e += 8) g(this, e, e + 7),
+ g(this, e + 1, e + 6),
+ g(this, e + 2, e + 5),
+ g(this, e + 3, e + 4);
+ return this
+ },
+ l.prototype.toString = function() {
+ var t = 0 | this.length;
+ return 0 === t ? "": 0 === arguments.length ? T(this, 0, t) : function(t, e, n) {
+ var i = !1;
+ if ((void 0 === e || e < 0) && (e = 0), e > this.length) return "";
+ if ((void 0 === n || n > this.length) && (n = this.length), n <= 0) return "";
+ if ((n >>>= 0) <= (e >>>= 0)) return "";
+ for (t || (t = "utf8");;) switch (t) {
+ case "hex":
+ return A(this, e, n);
+ case "utf8":
+ case "utf-8":
+ return T(this, e, n);
+ case "ascii":
+ return C(this, e, n);
+ case "latin1":
+ case "binary":
+ return E(this, e, n);
+ case "base64":
+ return S(this, e, n);
+ case "ucs2":
+ case "ucs-2":
+ case "utf16le":
+ case "utf-16le":
+ return D(this, e, n);
+ default:
+ if (i) throw new TypeError("Unknown encoding: " + t);
+ t = (t + "").toLowerCase(),
+ i = !0
+ }
+ }.apply(this, arguments)
+ },
+ l.prototype.equals = function(t) {
+ if (!l.isBuffer(t)) throw new TypeError("Argument must be a Buffer");
+ return this === t || 0 === l.compare(this, t)
+ },
+ l.prototype.inspect = function() {
+ var t = "",
+ n = e.INSPECT_MAX_BYTES;
+ return this.length > 0 && (t = this.toString("hex", 0, n).match(/.{2}/g).join(" "), this.length > n && (t += " ... ")),
+ "<Buffer " + t + ">"
+ },
+ l.prototype.compare = function(t, e, n, i, r) {
+ if (!l.isBuffer(t)) throw new TypeError("Argument must be a Buffer");
+ if (void 0 === e && (e = 0), void 0 === n && (n = t ? t.length: 0), void 0 === i && (i = 0), void 0 === r && (r = this.length), e < 0 || n > t.length || i < 0 || r > this.length) throw new RangeError("out of range index");
+ if (i >= r && e >= n) return 0;
+ if (i >= r) return - 1;
+ if (e >= n) return 1;
+ if (e >>>= 0, n >>>= 0, i >>>= 0, r >>>= 0, this === t) return 0;
+ for (var a = r - i,
+ o = n - e,
+ s = Math.min(a, o), c = this.slice(i, r), u = t.slice(e, n), d = 0; d < s; ++d) if (c[d] !== u[d]) {
+ a = c[d],
+ o = u[d];
+ break
+ }
+ return a < o ? -1 : o < a ? 1 : 0
+ },
+ l.prototype.includes = function(t, e, n) {
+ return - 1 !== this.indexOf(t, e, n)
+ },
+ l.prototype.indexOf = function(t, e, n) {
+ return p(this, t, e, n, !0)
+ },
+ l.prototype.lastIndexOf = function(t, e, n) {
+ return p(this, t, e, n, !1)
+ },
+ l.prototype.write = function(t, e, n, i) {
+ if (void 0 === e) i = "utf8",
+ n = this.length,
+ e = 0;
+ else if (void 0 === n && "string" == typeof e) i = e,
+ n = this.length,
+ e = 0;
+ else {
+ if (!isFinite(e)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
+ e |= 0,
+ isFinite(n) ? (n |= 0, void 0 === i && (i = "utf8")) : (i = n, n = void 0)
+ }
+ var r = this.length - e;
+ if ((void 0 === n || n > r) && (n = r), t.length > 0 && (n < 0 || e < 0) || e > this.length) throw new RangeError("Attempt to write outside buffer bounds");
+ i || (i = "utf8");
+ for (var a = !1;;) switch (i) {
+ case "hex":
+ return m(this, t, e, n);
+ case "utf8":
+ case "utf-8":
+ return y(this, t, e, n);
+ case "ascii":
+ return k(this, t, e, n);
+ case "latin1":
+ case "binary":
+ return b(this, t, e, n);
+ case "base64":
+ return x(this, t, e, n);
+ case "ucs2":
+ case "ucs-2":
+ case "utf16le":
+ case "utf-16le":
+ return w(this, t, e, n);
+ default:
+ if (a) throw new TypeError("Unknown encoding: " + i);
+ i = ("" + i).toLowerCase(),
+ a = !0
+ }
+ },
+ l.prototype.toJSON = function() {
+ return {
+ type: "Buffer",
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ }
+ };
+ var $ = 4096;
+ function C(t, e, n) {
+ var i = "";
+ n = Math.min(t.length, n);
+ for (var r = e; r < n; ++r) i += String.fromCharCode(127 & t[r]);
+ return i
+ }
+ function E(t, e, n) {
+ var i = "";
+ n = Math.min(t.length, n);
+ for (var r = e; r < n; ++r) i += String.fromCharCode(t[r]);
+ return i
+ }
+ function A(t, e, n) {
+ var i = t.length; (!e || e < 0) && (e = 0),
+ (!n || n < 0 || n > i) && (n = i);
+ for (var r = "",
+ a = e; a < n; ++a) r += H(t[a]);
+ return r
+ }
+ function D(t, e, n) {
+ for (var i = t.slice(e, n), r = "", a = 0; a < i.length; a += 2) r += String.fromCharCode(i[a] + 256 * i[a + 1]);
+ return r
+ }
+ function M(t, e, n) {
+ if (t % 1 != 0 || t < 0) throw new RangeError("offset is not uint");
+ if (t + e > n) throw new RangeError("Trying to access beyond buffer length")
+ }
+ function I(t, e, n, i, r, a) {
+ if (!l.isBuffer(t)) throw new TypeError('"buffer" argument must be a Buffer instance');
+ if (e > r || e < a) throw new RangeError('"value" argument is out of bounds');
+ if (n + i > t.length) throw new RangeError("Index out of range")
+ }
+ function P(t, e, n, i) {
+ e < 0 && (e = 65535 + e + 1);
+ for (var r = 0,
+ a = Math.min(t.length - n, 2); r < a; ++r) t[n + r] = (e & 255 << 8 * (i ? r: 1 - r)) >>> 8 * (i ? r: 1 - r)
+ }
+ function N(t, e, n, i) {
+ e < 0 && (e = 4294967295 + e + 1);
+ for (var r = 0,
+ a = Math.min(t.length - n, 4); r < a; ++r) t[n + r] = e >>> 8 * (i ? r: 3 - r) & 255
+ }
+ function O(t, e, n, i, r, a) {
+ if (n + i > t.length) throw new RangeError("Index out of range");
+ if (n < 0) throw new RangeError("Index out of range")
+ }
+ function L(t, e, n, i, a) {
+ return a || O(t, 0, n, 4),
+ r.write(t, e, n, i, 23, 4),
+ n + 4
+ }
+ function R(t, e, n, i, a) {
+ return a || O(t, 0, n, 8),
+ r.write(t, e, n, i, 52, 8),
+ n + 8
+ }
+ l.prototype.slice = function(t, e) {
+ var n, i = this.length;
+ if (t = ~~t, e = void 0 === e ? i: ~~e, t < 0 ? (t += i) < 0 && (t = 0) : t > i && (t = i), e < 0 ? (e += i) < 0 && (e = 0) : e > i && (e = i), e < t && (e = t), l.TYPED_ARRAY_SUPPORT)(n = this.subarray(t, e)).__proto__ = l.prototype;
+ else {
+ var r = e - t;
+ n = new l(r, void 0);
+ for (var a = 0; a < r; ++a) n[a] = this[a + t]
+ }
+ return n
+ },
+ l.prototype.readUIntLE = function(t, e, n) {
+ t |= 0,
+ e |= 0,
+ n || M(t, e, this.length);
+ for (var i = this[t], r = 1, a = 0; ++a < e && (r *= 256);) i += this[t + a] * r;
+ return i
+ },
+ l.prototype.readUIntBE = function(t, e, n) {
+ t |= 0,
+ e |= 0,
+ n || M(t, e, this.length);
+ for (var i = this[t + --e], r = 1; e > 0 && (r *= 256);) i += this[t + --e] * r;
+ return i
+ },
+ l.prototype.readUInt8 = function(t, e) {
+ return e || M(t, 1, this.length),
+ this[t]
+ },
+ l.prototype.readUInt16LE = function(t, e) {
+ return e || M(t, 2, this.length),
+ this[t] | this[t + 1] << 8
+ },
+ l.prototype.readUInt16BE = function(t, e) {
+ return e || M(t, 2, this.length),
+ this[t] << 8 | this[t + 1]
+ },
+ l.prototype.readUInt32LE = function(t, e) {
+ return e || M(t, 4, this.length),
+ (this[t] | this[t + 1] << 8 | this[t + 2] << 16) + 16777216 * this[t + 3]
+ },
+ l.prototype.readUInt32BE = function(t, e) {
+ return e || M(t, 4, this.length),
+ 16777216 * this[t] + (this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3])
+ },
+ l.prototype.readIntLE = function(t, e, n) {
+ t |= 0,
+ e |= 0,
+ n || M(t, e, this.length);
+ for (var i = this[t], r = 1, a = 0; ++a < e && (r *= 256);) i += this[t + a] * r;
+ return i >= (r *= 128) && (i -= Math.pow(2, 8 * e)),
+ i
+ },
+ l.prototype.readIntBE = function(t, e, n) {
+ t |= 0,
+ e |= 0,
+ n || M(t, e, this.length);
+ for (var i = e,
+ r = 1,
+ a = this[t + --i]; i > 0 && (r *= 256);) a += this[t + --i] * r;
+ return a >= (r *= 128) && (a -= Math.pow(2, 8 * e)),
+ a
+ },
+ l.prototype.readInt8 = function(t, e) {
+ return e || M(t, 1, this.length),
+ 128 & this[t] ? -1 * (255 - this[t] + 1) : this[t]
+ },
+ l.prototype.readInt16LE = function(t, e) {
+ e || M(t, 2, this.length);
+ var n = this[t] | this[t + 1] << 8;
+ return 32768 & n ? 4294901760 | n: n
+ },
+ l.prototype.readInt16BE = function(t, e) {
+ e || M(t, 2, this.length);
+ var n = this[t + 1] | this[t] << 8;
+ return 32768 & n ? 4294901760 | n: n
+ },
+ l.prototype.readInt32LE = function(t, e) {
+ return e || M(t, 4, this.length),
+ this[t] | this[t + 1] << 8 | this[t + 2] << 16 | this[t + 3] << 24
+ },
+ l.prototype.readInt32BE = function(t, e) {
+ return e || M(t, 4, this.length),
+ this[t] << 24 | this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3]
+ },
+ l.prototype.readFloatLE = function(t, e) {
+ return e || M(t, 4, this.length),
+ r.read(this, t, !0, 23, 4)
+ },
+ l.prototype.readFloatBE = function(t, e) {
+ return e || M(t, 4, this.length),
+ r.read(this, t, !1, 23, 4)
+ },
+ l.prototype.readDoubleLE = function(t, e) {
+ return e || M(t, 8, this.length),
+ r.read(this, t, !0, 52, 8)
+ },
+ l.prototype.readDoubleBE = function(t, e) {
+ return e || M(t, 8, this.length),
+ r.read(this, t, !1, 52, 8)
+ },
+ l.prototype.writeUIntLE = function(t, e, n, i) { (t = +t, e |= 0, n |= 0, i) || I(this, t, e, n, Math.pow(2, 8 * n) - 1, 0);
+ var r = 1,
+ a = 0;
+ for (this[e] = 255 & t; ++a < n && (r *= 256);) this[e + a] = t / r & 255;
+ return e + n
+ },
+ l.prototype.writeUIntBE = function(t, e, n, i) { (t = +t, e |= 0, n |= 0, i) || I(this, t, e, n, Math.pow(2, 8 * n) - 1, 0);
+ var r = n - 1,
+ a = 1;
+ for (this[e + r] = 255 & t; --r >= 0 && (a *= 256);) this[e + r] = t / a & 255;
+ return e + n
+ },
+ l.prototype.writeUInt8 = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 1, 255, 0),
+ l.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)),
+ this[e] = 255 & t,
+ e + 1
+ },
+ l.prototype.writeUInt16LE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 2, 65535, 0),
+ l.TYPED_ARRAY_SUPPORT ? (this[e] = 255 & t, this[e + 1] = t >>> 8) : P(this, t, e, !0),
+ e + 2
+ },
+ l.prototype.writeUInt16BE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 2, 65535, 0),
+ l.TYPED_ARRAY_SUPPORT ? (this[e] = t >>> 8, this[e + 1] = 255 & t) : P(this, t, e, !1),
+ e + 2
+ },
+ l.prototype.writeUInt32LE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 4, 4294967295, 0),
+ l.TYPED_ARRAY_SUPPORT ? (this[e + 3] = t >>> 24, this[e + 2] = t >>> 16, this[e + 1] = t >>> 8, this[e] = 255 & t) : N(this, t, e, !0),
+ e + 4
+ },
+ l.prototype.writeUInt32BE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 4, 4294967295, 0),
+ l.TYPED_ARRAY_SUPPORT ? (this[e] = t >>> 24, this[e + 1] = t >>> 16, this[e + 2] = t >>> 8, this[e + 3] = 255 & t) : N(this, t, e, !1),
+ e + 4
+ },
+ l.prototype.writeIntLE = function(t, e, n, i) {
+ if (t = +t, e |= 0, !i) {
+ var r = Math.pow(2, 8 * n - 1);
+ I(this, t, e, n, r - 1, -r)
+ }
+ var a = 0,
+ o = 1,
+ s = 0;
+ for (this[e] = 255 & t; ++a < n && (o *= 256);) t < 0 && 0 === s && 0 !== this[e + a - 1] && (s = 1),
+ this[e + a] = (t / o >> 0) - s & 255;
+ return e + n
+ },
+ l.prototype.writeIntBE = function(t, e, n, i) {
+ if (t = +t, e |= 0, !i) {
+ var r = Math.pow(2, 8 * n - 1);
+ I(this, t, e, n, r - 1, -r)
+ }
+ var a = n - 1,
+ o = 1,
+ s = 0;
+ for (this[e + a] = 255 & t; --a >= 0 && (o *= 256);) t < 0 && 0 === s && 0 !== this[e + a + 1] && (s = 1),
+ this[e + a] = (t / o >> 0) - s & 255;
+ return e + n
+ },
+ l.prototype.writeInt8 = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 1, 127, -128),
+ l.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)),
+ t < 0 && (t = 255 + t + 1),
+ this[e] = 255 & t,
+ e + 1
+ },
+ l.prototype.writeInt16LE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 2, 32767, -32768),
+ l.TYPED_ARRAY_SUPPORT ? (this[e] = 255 & t, this[e + 1] = t >>> 8) : P(this, t, e, !0),
+ e + 2
+ },
+ l.prototype.writeInt16BE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 2, 32767, -32768),
+ l.TYPED_ARRAY_SUPPORT ? (this[e] = t >>> 8, this[e + 1] = 255 & t) : P(this, t, e, !1),
+ e + 2
+ },
+ l.prototype.writeInt32LE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 4, 2147483647, -2147483648),
+ l.TYPED_ARRAY_SUPPORT ? (this[e] = 255 & t, this[e + 1] = t >>> 8, this[e + 2] = t >>> 16, this[e + 3] = t >>> 24) : N(this, t, e, !0),
+ e + 4
+ },
+ l.prototype.writeInt32BE = function(t, e, n) {
+ return t = +t,
+ e |= 0,
+ n || I(this, t, e, 4, 2147483647, -2147483648),
+ t < 0 && (t = 4294967295 + t + 1),
+ l.TYPED_ARRAY_SUPPORT ? (this[e] = t >>> 24, this[e + 1] = t >>> 16, this[e + 2] = t >>> 8, this[e + 3] = 255 & t) : N(this, t, e, !1),
+ e + 4
+ },
+ l.prototype.writeFloatLE = function(t, e, n) {
+ return L(this, t, e, !0, n)
+ },
+ l.prototype.writeFloatBE = function(t, e, n) {
+ return L(this, t, e, !1, n)
+ },
+ l.prototype.writeDoubleLE = function(t, e, n) {
+ return R(this, t, e, !0, n)
+ },
+ l.prototype.writeDoubleBE = function(t, e, n) {
+ return R(this, t, e, !1, n)
+ },
+ l.prototype.copy = function(t, e, n, i) {
+ if (n || (n = 0), i || 0 === i || (i = this.length), e >= t.length && (e = t.length), e || (e = 0), i > 0 && i < n && (i = n), i === n) return 0;
+ if (0 === t.length || 0 === this.length) return 0;
+ if (e < 0) throw new RangeError("targetStart out of bounds");
+ if (n < 0 || n >= this.length) throw new RangeError("sourceStart out of bounds");
+ if (i < 0) throw new RangeError("sourceEnd out of bounds");
+ i > this.length && (i = this.length),
+ t.length - e < i - n && (i = t.length - e + n);
+ var r, a = i - n;
+ if (this === t && n < e && e < i) for (r = a - 1; r >= 0; --r) t[r + e] = this[r + n];
+ else if (a < 1e3 || !l.TYPED_ARRAY_SUPPORT) for (r = 0; r < a; ++r) t[r + e] = this[r + n];
+ else Uint8Array.prototype.set.call(t, this.subarray(n, n + a), e);
+ return a
+ },
+ l.prototype.fill = function(t, e, n, i) {
+ if ("string" == typeof t) {
+ if ("string" == typeof e ? (i = e, e = 0, n = this.length) : "string" == typeof n && (i = n, n = this.length), 1 === t.length) {
+ var r = t.charCodeAt(0);
+ r < 256 && (t = r)
+ }
+ if (void 0 !== i && "string" != typeof i) throw new TypeError("encoding must be a string");
+ if ("string" == typeof i && !l.isEncoding(i)) throw new TypeError("Unknown encoding: " + i)
+ } else "number" == typeof t && (t &= 255);
+ if (e < 0 || this.length < e || this.length < n) throw new RangeError("Out of range index");
+ if (n <= e) return this;
+ var a;
+ if (e >>>= 0, n = void 0 === n ? this.length: n >>> 0, t || (t = 0), "number" == typeof t) for (a = e; a < n; ++a) this[a] = t;
+ else {
+ var o = l.isBuffer(t) ? t: F(new l(t, i).toString()),
+ s = o.length;
+ for (a = 0; a < n - e; ++a) this[a + e] = o[a % s]
+ }
+ return this
+ };
+ var j = /[^+\/0-9A-Za-z-_]/g;
+ function H(t) {
+ return t < 16 ? "0" + t.toString(16) : t.toString(16)
+ }
+ function F(t, e) {
+ var n;
+ e = e || 1 / 0;
+ for (var i = t.length,
+ r = null,
+ a = [], o = 0; o < i; ++o) {
+ if ((n = t.charCodeAt(o)) > 55295 && n < 57344) {
+ if (!r) {
+ if (n > 56319) { (e -= 3) > -1 && a.push(239, 191, 189);
+ continue
+ }
+ if (o + 1 === i) { (e -= 3) > -1 && a.push(239, 191, 189);
+ continue
+ }
+ r = n;
+ continue
+ }
+ if (n < 56320) { (e -= 3) > -1 && a.push(239, 191, 189),
+ r = n;
+ continue
+ }
+ n = 65536 + (r - 55296 << 10 | n - 56320)
+ } else r && (e -= 3) > -1 && a.push(239, 191, 189);
+ if (r = null, n < 128) {
+ if ((e -= 1) < 0) break;
+ a.push(n)
+ } else if (n < 2048) {
+ if ((e -= 2) < 0) break;
+ a.push(n >> 6 | 192, 63 & n | 128)
+ } else if (n < 65536) {
+ if ((e -= 3) < 0) break;
+ a.push(n >> 12 | 224, n >> 6 & 63 | 128, 63 & n | 128)
+ } else {
+ if (! (n < 1114112)) throw new Error("Invalid code point");
+ if ((e -= 4) < 0) break;
+ a.push(n >> 18 | 240, n >> 12 & 63 | 128, n >> 6 & 63 | 128, 63 & n | 128)
+ }
+ }
+ return a
+ }
+ function B(t) {
+ return i.toByteArray(function(t) {
+ if ((t = function(t) {
+ return t.trim ? t.trim() : t.replace(/^\s+|\s+$/g, "")
+ } (t).replace(j, "")).length < 2) return "";
+ for (; t.length % 4 != 0;) t += "=";
+ return t
+ } (t))
+ }
+ function z(t, e, n, i) {
+ for (var r = 0; r < i && !(r + n >= e.length || r >= t.length); ++r) e[r + n] = t[r];
+ return r
+ }
+ }).call(this, n(4))
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(5),
+ a = n(1),
+ o = function() {
+ "use strict";
+ function t(t, e, n, o) {
+ t && (this.$container = a.toNode(t), this.$parent = t),
+ this.$config = i.mixin(e, {
+ headerHeight: 33
+ }),
+ this.$gantt = o,
+ this.$domEvents = o._createDomEventScope(),
+ this.$id = e.id || "c" + i.uid(),
+ this.$name = "cell",
+ this.$factory = n,
+ r(this)
+ }
+ return t.prototype.destructor = function() {
+ this.$parent = this.$container = this.$view = null,
+ this.$gantt.$services.getService("mouseEvents").detach("click", "gantt_header_arrow", this._headerClickHandler),
+ this.$domEvents.detachAll(),
+ this.callEvent("onDestroy", []),
+ this.detachAllEvents()
+ },
+ t.prototype.cell = function(t) {
+ return null
+ },
+ t.prototype.scrollTo = function(t, e) {
+ var n = this.$view;
+ this.$config.html && (n = this.$view.firstChild),
+ 1 * t == t && (n.scrollLeft = t),
+ 1 * e == e && (n.scrollTop = e)
+ },
+ t.prototype.clear = function() {
+ this.getNode().innerHTML = "",
+ this.getNode().className = "gantt_layout_content",
+ this.getNode().style.padding = "0"
+ },
+ t.prototype.resize = function(t) {
+ if (this.$parent) return this.$parent.resize(t); ! 1 === t && (this.$preResize = !0);
+ var e = this.$container,
+ n = e.offsetWidth,
+ i = e.offsetHeight,
+ r = this.getSize();
+ e === document.body && (n = document.body.offsetWidth, i = document.body.offsetHeight),
+ n < r.minWidth && (n = r.minWidth),
+ n > r.maxWidth && (n = r.maxWidth),
+ i < r.minHeight && (i = r.minHeight),
+ i > r.maxHeight && (i = r.maxHeight),
+ this.setSize(n, i),
+ this.$preResize,
+ this.$preResize = !1
+ },
+ t.prototype.hide = function() {
+ this._hide(!0),
+ this.resize()
+ },
+ t.prototype.show = function(t) {
+ this._hide(!1),
+ t && this.$parent && this.$parent.show(),
+ this.resize()
+ },
+ t.prototype._hide = function(t) {
+ if (!0 === t && this.$view.parentNode) this.$view.parentNode.removeChild(this.$view);
+ else if (!1 === t && !this.$view.parentNode) {
+ var e = this.$parent.cellIndex(this.$id);
+ this.$parent.moveView(this, e)
+ }
+ this.$config.hidden = t
+ },
+ t.prototype.$toHTML = function(t, e) {
+ void 0 === t && (t = ""),
+ e = [e || "", this.$config.css || ""].join(" ");
+ var n = this.$config,
+ i = "";
+ n.raw ? t = "string" == typeof n.raw ? n.raw: "": (t || (t = "<div class='gantt_layout_content' " + (e ? " class='" + e + "' ": "") + " >" + (n.html || "") + "</div>"), n.header && (i = "<div class='gantt_layout_header'>" + (n.canCollapse ? "<div class='gantt_layout_header_arrow'></div>": "") + "<div class='gantt_layout_header_content'>" + n.header + "</div></div>"));
+ return "<div class='gantt_layout_cell " + e + "' data-cell-id='" + this.$id + "'>" + i + t + "</div>"
+ },
+ t.prototype.$fill = function(t, e) {
+ this.$view = t,
+ this.$parent = e,
+ this.init()
+ },
+ t.prototype.getNode = function() {
+ return this.$view.querySelector("gantt_layout_cell") || this.$view
+ },
+ t.prototype.init = function() {
+ var t = this;
+ this._headerClickHandler = function(e) {
+ a.locateAttribute(e, "data-cell-id") == t.$id && t.toggle()
+ },
+ this.$gantt.$services.getService("mouseEvents").delegate("click", "gantt_header_arrow", this._headerClickHandler),
+ this.callEvent("onReady", [])
+ },
+ t.prototype.toggle = function() {
+ this.$config.collapsed = !this.$config.collapsed,
+ this.resize()
+ },
+ t.prototype.getSize = function() {
+ var t = {
+ height: this.$config.height || 0,
+ width: this.$config.width || 0,
+ gravity: this.$config.gravity || 1,
+ minHeight: this.$config.minHeight || 0,
+ minWidth: this.$config.minWidth || 0,
+ maxHeight: this.$config.maxHeight || 1e11,
+ maxWidth: this.$config.maxWidth || 1e11
+ };
+ if (this.$config.collapsed) {
+ var e = "x" === this.$config.mode;
+ t[e ? "width": "height"] = t[e ? "maxWidth": "maxHeight"] = this.$config.headerHeight
+ }
+ return t
+ },
+ t.prototype.getContentSize = function() {
+ var t = this.$lastSize.contentX;
+ t !== 1 * t && (t = this.$lastSize.width);
+ var e = this.$lastSize.contentY;
+ return e !== 1 * e && (e = this.$lastSize.height),
+ {
+ width: t,
+ height: e
+ }
+ },
+ t.prototype._getBorderSizes = function() {
+ var t = {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ horizontal: 0,
+ vertical: 0
+ };
+ return this._currentBorders && (this._currentBorders[this._borders.left] && (t.left = 1, t.horizontal++), this._currentBorders[this._borders.right] && (t.right = 1, t.horizontal++), this._currentBorders[this._borders.top] && (t.top = 1, t.vertical++), this._currentBorders[this._borders.bottom] && (t.bottom = 1, t.vertical++)),
+ t
+ },
+ t.prototype.setSize = function(t, e) {
+ this.$view.style.width = t + "px",
+ this.$view.style.height = e + "px";
+ var n = this._getBorderSizes(),
+ i = e - n.vertical,
+ r = t - n.horizontal;
+ this.$lastSize = {
+ x: t,
+ y: e,
+ contentX: r,
+ contentY: i
+ },
+ this.$config.header ? this._sizeHeader() : this._sizeContent()
+ },
+ t.prototype._borders = {
+ left: "gantt_layout_cell_border_left",
+ right: "gantt_layout_cell_border_right",
+ top: "gantt_layout_cell_border_top",
+ bottom: "gantt_layout_cell_border_bottom"
+ },
+ t.prototype._setBorders = function(t, e) {
+ e || (e = this);
+ var n = e.$view;
+ for (var i in this._borders) a.removeClassName(n, this._borders[i]);
+ "string" == typeof t && (t = [t]);
+ var r = {};
+ for (i = 0; i < t.length; i++) a.addClassName(n, t[i]),
+ r[t[i]] = !0;
+ e._currentBorders = r
+ },
+ t.prototype._sizeContent = function() {
+ var t = this.$view.childNodes[0];
+ t && "gantt_layout_content" == t.className && (t.style.height = this.$lastSize.contentY + "px")
+ },
+ t.prototype._sizeHeader = function() {
+ var t = this.$lastSize;
+ t.contentY -= this.$config.headerHeight;
+ var e = this.$view.childNodes[0],
+ n = this.$view.childNodes[1],
+ i = "x" === this.$config.mode;
+ if (this.$config.collapsed) if (n.style.display = "none", i) {
+ e.className = "gantt_layout_header collapsed_x",
+ e.style.width = t.y + "px";
+ var r = Math.floor(t.y / 2 - t.x / 2);
+ e.style.transform = "rotate(90deg) translate(" + r + "px, " + r + "px)",
+ n.style.display = "none"
+ } else e.className = "gantt_layout_header collapsed_y";
+ else e.className = i ? "gantt_layout_header": "gantt_layout_header vertical",
+ e.style.width = "auto",
+ e.style.transform = "",
+ n.style.display = "",
+ n.style.height = t.contentY + "px";
+ e.style.height = this.$config.headerHeight + "px"
+ },
+ t
+ } ();
+ t.exports = o
+ },
+ function(t, e, n) {
+ var i = n(11);
+ t.exports = function(t) {
+ return i.isNode || !t.$root
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e, n, i) {
+ if ((i = e ? e.config: i) && i.placeholder_task && n.exists(t)) return n.getItem(t).type === i.types.placeholder;
+ return ! 1
+ }
+ },
+ function(t, e, n) { (function(t) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ function i(t) {
+ return Object.prototype.toString.call(t)
+ }
+ e.isArray = function(t) {
+ return Array.isArray ? Array.isArray(t) : "[object Array]" === i(t)
+ },
+ e.isBoolean = function(t) {
+ return "boolean" == typeof t
+ },
+ e.isNull = function(t) {
+ return null === t
+ },
+ e.isNullOrUndefined = function(t) {
+ return null == t
+ },
+ e.isNumber = function(t) {
+ return "number" == typeof t
+ },
+ e.isString = function(t) {
+ return "string" == typeof t
+ },
+ e.isSymbol = function(t) {
+ return "symbol" === n(t)
+ },
+ e.isUndefined = function(t) {
+ return void 0 === t
+ },
+ e.isRegExp = function(t) {
+ return "[object RegExp]" === i(t)
+ },
+ e.isObject = function(t) {
+ return "object" === n(t) && null !== t
+ },
+ e.isDate = function(t) {
+ return "[object Date]" === i(t)
+ },
+ e.isError = function(t) {
+ return "[object Error]" === i(t) || t instanceof Error
+ },
+ e.isFunction = function(t) {
+ return "function" == typeof t
+ },
+ e.isPrimitive = function(t) {
+ return null === t || "boolean" == typeof t || "number" == typeof t || "string" == typeof t || "symbol" === n(t) || void 0 === t
+ },
+ e.isBuffer = t.isBuffer
+ }).call(this, n(13).Buffer)
+ },
+ function(t, e, n) {
+ var i = n(3),
+ r = n(36);
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function a() {
+ return e.apply(this, arguments) || this
+ }
+ return i(a, e),
+ a.prototype.render = function(t) {
+ var e = "<div class='gantt_cal_ltext' style='height:" + ((t.height || "23") + "px") + ";'>";
+ return e += r.getHtmlSelect(t.options, [{
+ key: "style",
+ value: "width:100%;"
+ },
+ {
+ key: "title",
+ value: t.name
+ }]),
+ e += "</div>"
+ },
+ a.prototype.set_value = function(t, e, n, i) {
+ var r = t.firstChild; ! r._dhx_onchange && i.onchange && (r.onchange = i.onchange, r._dhx_onchange = !0),
+ void 0 === e && (e = (r.options[0] || {}).value),
+ r.value = e || ""
+ },
+ a.prototype.get_value = function(t) {
+ return t.firstChild.value
+ },
+ a.prototype.focus = function(e) {
+ var n = e.firstChild;
+ t._focus(n, !0)
+ },
+ a
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e, n, i, r) {
+ if (!t.start_date || !t.end_date) return null;
+ var a = n.getItemTop(t.id),
+ o = n.getItemHeight(t.id);
+ if (a > e.y_end || a + o < e.y) return ! 1;
+ var s = n.posFromDate(t.start_date),
+ l = n.posFromDate(t.end_date),
+ c = Math.min(s, l) - 200,
+ u = Math.max(s, l) + 200;
+ return ! (c > e.x_end || u < e.x)
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ return t.config.smart_rendering && t._smart_render
+ }
+ },
+ function(t, e, n) { (function(e) {
+ var n;
+ n = "undefined" != typeof window ? window: e,
+ t.exports = n
+ }).call(this, n(4))
+ },
+ function(t, e, n) {
+ var i = n(13),
+ r = i.Buffer;
+ function a(t, e) {
+ for (var n in t) e[n] = t[n]
+ }
+ function o(t, e, n) {
+ return r(t, e, n)
+ }
+ r.from && r.alloc && r.allocUnsafe && r.allocUnsafeSlow ? t.exports = i: (a(i, e), e.Buffer = o),
+ a(r, o),
+ o.from = function(t, e, n) {
+ if ("number" == typeof t) throw new TypeError("Argument must not be a number");
+ return r(t, e, n)
+ },
+ o.alloc = function(t, e, n) {
+ if ("number" != typeof t) throw new TypeError("Argument must be a number");
+ var i = r(t);
+ return void 0 !== e ? "string" == typeof n ? i.fill(e, n) : i.fill(e) : i.fill(0),
+ i
+ },
+ o.allocUnsafe = function(t) {
+ if ("number" != typeof t) throw new TypeError("Argument must be a number");
+ return r(t)
+ },
+ o.allocUnsafeSlow = function(t) {
+ if ("number" != typeof t) throw new TypeError("Argument must be a number");
+ return i.SlowBuffer(t)
+ }
+ },
+ function(t, e, n) {
+ "use strict"; (function(e) { ! e.version || 0 === e.version.indexOf("v0.") || 0 === e.version.indexOf("v1.") && 0 !== e.version.indexOf("v1.8.") ? t.exports = {
+ nextTick: function(t, n, i, r) {
+ if ("function" != typeof t) throw new TypeError('"callback" argument must be a function');
+ var a, o, s = arguments.length;
+ switch (s) {
+ case 0:
+ case 1:
+ return e.nextTick(t);
+ case 2:
+ return e.nextTick(function() {
+ t.call(null, n)
+ });
+ case 3:
+ return e.nextTick(function() {
+ t.call(null, n, i)
+ });
+ case 4:
+ return e.nextTick(function() {
+ t.call(null, n, i, r)
+ });
+ default:
+ for (a = new Array(s - 1), o = 0; o < a.length;) a[o++] = arguments[o];
+ return e.nextTick(function() {
+ t.apply(null, a)
+ })
+ }
+ }
+ }: t.exports = e
+ }).call(this, n(9))
+ },
+ function(t, e, n) {
+ var i = n(0);
+ t.exports = {
+ createDropTargetObject: function(t) {
+ var e = {
+ targetParent: null,
+ targetIndex: 0,
+ targetId: null,
+ child: !1,
+ nextSibling: !1,
+ prevSibling: !1
+ };
+ return t && i.mixin(e, t, !0),
+ e
+ },
+ nextSiblingTarget: function(t, e, n) {
+ var i = this.createDropTargetObject();
+ return i.targetId = e,
+ i.nextSibling = !0,
+ i.targetParent = n.getParent(i.targetId),
+ i.targetIndex = n.getBranchIndex(i.targetId),
+ (n.getParent(t) != i.targetParent || i.targetIndex < n.getBranchIndex(t)) && (i.targetIndex += 1),
+ i
+ },
+ prevSiblingTarget: function(t, e, n) {
+ var i = this.createDropTargetObject();
+ return i.targetId = e,
+ i.prevSibling = !0,
+ i.targetParent = n.getParent(i.targetId),
+ i.targetIndex = n.getBranchIndex(i.targetId),
+ n.getParent(t) == i.targetParent && i.targetIndex > n.getBranchIndex(t) && (i.targetIndex -= 1),
+ i
+ },
+ firstChildTarget: function(t, e, n) {
+ var i = this.createDropTargetObject();
+ return i.targetId = e,
+ i.targetParent = i.targetId,
+ i.targetIndex = 0,
+ i.child = !0,
+ i
+ },
+ lastChildTarget: function(t, e, n) {
+ var i = n.getChildren(e),
+ r = this.createDropTargetObject();
+ return r.targetId = i[i.length - 1],
+ r.targetParent = e,
+ r.targetIndex = i.length,
+ r.nextSibling = !0,
+ r
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(20);
+ t.exports = function(t, e, n, r) {
+ var a = e.width[t];
+ if (a <= 0) return ! 1;
+ if (!r.config.smart_rendering || i(r)) return ! 0;
+ var o = e.left[t] - a,
+ s = e.left[t] + a;
+ return o <= n.x_end && s >= n.x
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e) {
+ var n = 0,
+ i = t.left.length - 1;
+ if (e) for (var r = 0; r < t.left.length; r++) {
+ var a = t.left[r];
+ if (a < e.x && (n = r), a > e.x_end) {
+ i = r;
+ break
+ }
+ }
+ return {
+ start: n,
+ end: i
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e, n) {
+ return {
+ top: e.getItemTop(t.id),
+ height: e.getItemHeight(t.id),
+ left: 0,
+ right: 1 / 0
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ function e(e, a, o) {
+ if (!t._isAllowedUnscheduledTask(e) && t._isTaskInTimelineLimits(e)) {
+ var s = a.getItemPosition(e),
+ l = o,
+ c = a.$getTemplates(),
+ u = t.getTaskType(e.type),
+ d = a.getBarHeight(e.id, u == l.types.milestone),
+ h = 0;
+ u == l.types.milestone && (h = (d - s.height) / 2);
+ var f = Math.floor((a.getItemHeight(e.id) - d) / 2);
+ u == l.types.milestone && (s.left -= Math.round(d / 2), s.width = d);
+ var _ = document.createElement("div"),
+ g = Math.round(s.width);
+ a.$config.item_attribute && (_.setAttribute(a.$config.item_attribute, e.id), _.setAttribute(a.$config.bind + "_id", e.id)),
+ l.show_progress && u != l.types.milestone &&
+ function(e, n, i, r, a) {
+ var o = 1 * e.progress || 0;
+ i = Math.max(i - 2, 0);
+ var s = document.createElement("div"),
+ l = Math.round(i * o);
+ l = Math.min(i, l),
+ e.progressColor && (s.style.backgroundColor = e.progressColor, s.style.opacity = 1),
+ s.style.width = l + "px",
+ s.className = "gantt_task_progress",
+ s.innerHTML = a.progress_text(e.start_date, e.end_date, e),
+ r.rtl && (s.style.position = "absolute", s.style.right = "0px");
+ var c = document.createElement("div");
+ if (c.className = "gantt_task_progress_wrapper", c.appendChild(s), n.appendChild(c), t.config.drag_progress && !t.isReadonly(e)) {
+ var u = document.createElement("div"),
+ d = l;
+ r.rtl && (d = i - l),
+ u.style.left = d + "px",
+ u.className = "gantt_task_progress_drag",
+ s.appendChild(u),
+ n.appendChild(u)
+ }
+ } (e, _, g, l, c);
+ var p = function(e, n, i) {
+ var r = document.createElement("div");
+ return t.getTaskType(e.type) != t.config.types.milestone ? r.innerHTML = i.task_text(e.start_date, e.end_date, e) : t.getTaskType(e.type) == t.config.types.milestone && n && (r.style.height = r.style.width = n + "px"),
+ r.className = "gantt_task_content",
+ r
+ } (e, g, c);
+ e.textColor && (p.style.color = e.textColor),
+ _.appendChild(p);
+ var v = function(e, n, i, r) {
+ var a = r.$getConfig(),
+ o = [e];
+ n && o.push(n);
+ var s = t.getState(),
+ l = t.getTask(i);
+ if (t.getTaskType(l.type) == a.types.milestone ? o.push("gantt_milestone") : t.getTaskType(l.type) == a.types.project && o.push("gantt_project"), o.push("gantt_bar_" + t.getTaskType(l.type)), t.isSummaryTask(l) && o.push("gantt_dependent_task"), t.isSplitTask(l) && (a.open_split_tasks && !l.$open || !a.open_split_tasks) && o.push("gantt_split_parent"), a.select_task && t.isSelectedTask(i) && o.push("gantt_selected"), i == s.drag_id && (o.push("gantt_drag_" + s.drag_mode), s.touch_drag && o.push("gantt_touch_" + s.drag_mode)), s.link_source_id == i && o.push("gantt_link_source"), s.link_target_id == i && o.push("gantt_link_target"), a.highlight_critical_path && t.isCriticalTask && t.isCriticalTask(l) && o.push("gantt_critical_task"), s.link_landing_area && s.link_target_id && s.link_source_id && s.link_target_id != s.link_source_id && (s.link_target_id == i || s.link_source_id == i)) {
+ var c = s.link_source_id,
+ u = s.link_from_start,
+ d = s.link_to_start,
+ h = t.isLinkAllowed(c, i, u, d),
+ f = "";
+ f = h ? d ? "link_start_allow": "link_finish_allow": d ? "link_start_deny": "link_finish_deny",
+ o.push(f)
+ }
+ return o.join(" ")
+ } ("gantt_task_line", c.task_class(e.start_date, e.end_date, e), e.id, a); (e.color || e.progressColor || e.textColor) && (v += " gantt_task_inline_color"),
+ s.width < 20 && (v += " gantt_thin_task"),
+ _.className = v;
+ var m = ["left:" + s.left + "px", "top:" + (f + s.top) + "px", "height:" + (u == l.types.milestone ? s.height: d) + "px", "line-height:" + Math.max(d < 30 ? d - 2 : d, 0) + "px", "width:" + g + "px"];
+ e.color && m.push("background-color:" + e.color),
+ e.textColor && m.push("color:" + e.textColor),
+ _.style.cssText = m.join(";");
+ var y = function(t, e, r, a) {
+ var o = "gantt_left " + i(!e.rtl, t),
+ s = null;
+ return a && (s = {
+ type: "marginRight",
+ value: a
+ }),
+ n(t, r.leftside_text, o, s)
+ } (e, l, c, h);
+ y && _.appendChild(y),
+ (y = function(t, e, r, a) {
+ var o = "gantt_right " + i( !! e.rtl, t),
+ s = null;
+ return a && (s = {
+ type: "marginLeft",
+ value: a
+ }),
+ n(t, r.rightside_text, o, s)
+ } (e, l, c, h)) && _.appendChild(y),
+ t._waiAria.setTaskBarAttr(e, _);
+ var k = t.getState();
+ return t.isReadonly(e) || (l.drag_resize && !t.isSummaryTask(e) && u != l.types.milestone && r(_, "gantt_task_drag", e,
+ function(t) {
+ var e = document.createElement("div");
+ return e.className = t,
+ e
+ },
+ l), l.drag_links && l.show_links && r(_, "gantt_link_control", e,
+ function(t) {
+ var e = document.createElement("div");
+ e.className = t,
+ e.style.cssText = ["height:" + d + "px", "line-height:" + d + "px"].join(";");
+ var n = document.createElement("div");
+ n.className = "gantt_link_point";
+ var i = !1;
+ return k.link_source_id && l.touch && (i = !0),
+ n.style.display = i ? "block": "",
+ e.appendChild(n),
+ e
+ },
+ l, h)),
+ _
+ }
+ }
+ function n(t, e, n, i) {
+ if (!e) return null;
+ var r = e(t.start_date, t.end_date, t);
+ if (!r) return null;
+ var a = document.createElement("div");
+ return a.className = "gantt_side_content " + n,
+ a.innerHTML = r,
+ i && (a.style[i.type] = Math.abs(i.value) + "px"),
+ a
+ }
+ function i(e, n) {
+ var i = function(e) {
+ return e ? {
+ $source: [t.config.links.start_to_start],
+ $target: [t.config.links.start_to_start, t.config.links.finish_to_start]
+ }: {
+ $source: [t.config.links.finish_to_start, t.config.links.finish_to_finish],
+ $target: [t.config.links.finish_to_finish]
+ }
+ } (e);
+ for (var r in i) for (var a = n[r], o = 0; o < a.length; o++) for (var s = t.getLink(a[o]), l = 0; l < i[r].length; l++) if (s.type == i[r][l]) return "gantt_link_crossing";
+ return ""
+ }
+ function r(e, n, i, r, a, o) {
+ var s, l = t.getState(); + i.start_date >= +l.min_date && ((s = r([n, a.rtl ? "task_right": "task_left", "task_start_date"].join(" "))).setAttribute("data-bind-property", "start_date"), o && (s.style.marginLeft = o + "px"), e.appendChild(s)),
+ +i.end_date <= +l.max_date && ((s = r([n, a.rtl ? "task_left": "task_right", "task_end_date"].join(" "))).setAttribute("data-bind-property", "end_date"), o && (s.style.marginRight = o + "px"), e.appendChild(s))
+ }
+ return function(n, i, r) {
+ var a = (r = i.$getConfig()).type_renderers[t.getTaskType(n.type)],
+ o = e;
+ return a ? a.call(t, n,
+ function(e) {
+ return o.call(t, e, i, r)
+ },
+ i) : o.call(t, n, i, r)
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(33),
+ r = n(5),
+ a = n(0),
+ o = n(2),
+ s = n(43),
+ l = n(128),
+ c = function(t, e, n, o) {
+ this.$config = a.mixin({},
+ e || {}),
+ this.$scaleHelper = new i(o),
+ this.$gantt = o,
+ this._posFromDateCache = {},
+ this._timelineDragScroll = null,
+ a.mixin(this, s(this)),
+ r(this)
+ };
+ c.prototype = {
+ init: function(t) {
+ t.innerHTML += "<div class='gantt_task' style='width:inherit;height:inherit;'></div>",
+ this.$task = t.childNodes[0],
+ this.$task.innerHTML = "<div class='gantt_task_scale'></div><div class='gantt_data_area'></div>",
+ this.$task_scale = this.$task.childNodes[0],
+ this.$task_data = this.$task.childNodes[1],
+ this.$task_data.innerHTML = "<div class='gantt_task_bg'></div><div class='gantt_links_area'></div><div class='gantt_bars_area'></div>",
+ this.$task_bg = this.$task_data.childNodes[0],
+ this.$task_links = this.$task_data.childNodes[1],
+ this.$task_bars = this.$task_data.childNodes[2],
+ this._tasks = {
+ col_width: 0,
+ width: [],
+ full_width: 0,
+ trace_x: [],
+ rendered: {}
+ };
+ var e = this.$getConfig(),
+ n = e[this.$config.bind + "_attribute"],
+ i = e[this.$config.bindLinks + "_attribute"]; ! n && this.$config.bind && (n = "data-" + this.$config.bind + "-id"),
+ !i && this.$config.bindLinks && (i = "data-" + this.$config.bindLinks + "-id"),
+ this.$config.item_attribute = n || null,
+ this.$config.link_attribute = i || null;
+ var r = this._createLayerConfig();
+ this.$config.layers || (this.$config.layers = r.tasks),
+ this.$config.linkLayers || (this.$config.linkLayers = r.links),
+ this._attachLayers(this.$gantt),
+ this.callEvent("onReady", []),
+ this.$gantt.ext.dragTimeline && (this._timelineDragScroll = this.$gantt.ext.dragTimeline.create(), this._timelineDragScroll.attach(this))
+ },
+ setSize: function(t, e) {
+ var n = this.$getConfig();
+ if (1 * t === t && (this.$config.width = t), 1 * e === e) {
+ this.$config.height = e;
+ var i = Math.max(this.$config.height - n.scale_height);
+ this.$task_data.style.height = i + "px"
+ }
+ this.refresh(),
+ this.$task_bg.style.backgroundImage = "",
+ n.smart_rendering && this.$config.rowStore ? this.$task_bg.style.height = this.getTotalHeight() + "px": this.$task_bg.style.height = "";
+ for (var r = this._tasks,
+ a = this.$task_data.childNodes,
+ o = 0,
+ s = a.length; o < s; o++) {
+ var l = a[o];
+ l.hasAttribute("data-layer") && l.style && (l.style.width = r.full_width + "px")
+ }
+ },
+ isVisible: function() {
+ return this.$parent && this.$parent.$config ? !this.$parent.$config.hidden: this.$task.offsetWidth
+ },
+ getSize: function() {
+ var t = this.$getConfig(),
+ e = this.$config.rowStore ? this.getTotalHeight() : 0,
+ n = this.isVisible() ? this._tasks.full_width: 0;
+ return {
+ x: this.isVisible() ? this.$config.width: 0,
+ y: this.isVisible() ? this.$config.height: 0,
+ contentX: this.isVisible() ? n: 0,
+ contentY: this.isVisible() ? t.scale_height + e: 0,
+ scrollHeight: this.isVisible() ? e: 0,
+ scrollWidth: this.isVisible() ? n: 0
+ }
+ },
+ scrollTo: function(t, e) {
+ if (this.isVisible()) {
+ var n = !1;
+ this.$config.scrollTop = this.$config.scrollTop || 0,
+ this.$config.scrollLeft = this.$config.scrollLeft || 0,
+ 1 * e === e && (this.$config.scrollTop = e, this.$task_data.scrollTop = this.$config.scrollTop, n = !0),
+ 1 * t === t && (this.$task.scrollLeft = t, this.$config.scrollLeft = this.$task.scrollLeft, this._refreshScales(), n = !0),
+ n && this.callEvent("onScroll", [this.$config.scrollLeft, this.$config.scrollTop])
+ }
+ },
+ _refreshScales: function() {
+ if (this.isVisible() && this.$getConfig().smart_scales) {
+ var t = this.getViewPort(),
+ e = this._scales;
+ this.$task_scale.innerHTML = this._getScaleChunkHtml(e, t.x, t.x_end)
+ }
+ },
+ getViewPort: function() {
+ var t = this.$config.scrollLeft || 0,
+ e = this.$config.scrollTop || 0,
+ n = this.$config.height || 0,
+ i = this.$config.width || 0;
+ return {
+ y: e,
+ y_end: e + n,
+ x: t,
+ x_end: t + i,
+ height: n,
+ width: i
+ }
+ },
+ _createLayerConfig: function() {
+ var t = this,
+ e = function() {
+ return t.isVisible()
+ };
+ return {
+ tasks: [{
+ expose: !0,
+ renderer: this.$gantt.$ui.layers.taskBar(),
+ container: this.$task_bars,
+ filter: [e,
+ function(t, e) {
+ return ! e.hide_bar
+ }]
+ },
+ {
+ renderer: this.$gantt.$ui.layers.taskSplitBar(),
+ filter: [e],
+ container: this.$task_bars,
+ append: !0
+ },
+ {
+ renderer: this.$gantt.$ui.layers.taskRollupBar(),
+ filter: [e],
+ container: this.$task_bars,
+ append: !0
+ },
+ {
+ renderer: this.$gantt.$ui.layers.taskBg(),
+ container: this.$task_bg,
+ filter: [e]
+ }],
+ links: [{
+ expose: !0,
+ renderer: this.$gantt.$ui.layers.link(),
+ container: this.$task_links,
+ filter: [e]
+ }]
+ }
+ },
+ _attachLayers: function(t) {
+ this._taskLayers = [],
+ this._linkLayers = [];
+ var e = this,
+ n = this.$gantt.$services.getService("layers");
+ if (this.$config.bind) {
+ this._bindStore();
+ var i = n.getDataRender(this.$config.bind);
+ i || (i = n.createDataRender({
+ name: this.$config.bind,
+ defaultContainer: function() {
+ return e.$task_data
+ }
+ })),
+ i.container = function() {
+ return e.$task_data
+ };
+ for (var r = this.$config.layers,
+ a = 0; r && a < r.length; a++) {
+ "string" == typeof(c = r[a]) && (c = this.$gantt.$ui.layers[c]()),
+ ("function" == typeof c || c && c.render && c.update) && (c = {
+ renderer: c
+ }),
+ c.view = this;
+ var o = i.addLayer(c);
+ this._taskLayers.push(o),
+ c.expose && (this._taskRenderer = i.getLayer(o))
+ }
+ this._initStaticBackgroundRender()
+ }
+ if (this.$config.bindLinks) {
+ e.$config.linkStore = e.$gantt.getDatastore(e.$config.bindLinks);
+ var s = n.getDataRender(this.$config.bindLinks);
+ s || (s = n.createDataRender({
+ name: this.$config.bindLinks,
+ defaultContainer: function() {
+ return e.$task_data
+ }
+ }));
+ var l = this.$config.linkLayers;
+ for (a = 0; l && a < l.length; a++) {
+ var c;
+ "string" == typeof c && (c = this.$gantt.$ui.layers[c]()),
+ (c = l[a]).view = this;
+ var u = s.addLayer(c);
+ this._taskLayers.push(u),
+ l[a].expose && (this._linkRenderer = s.getLayer(u))
+ }
+ }
+ },
+ _initStaticBackgroundRender: function() {
+ var t = this,
+ e = l.create(),
+ n = t.$config.rowStore;
+ n && (this._staticBgHandler = n.attachEvent("onStoreUpdated",
+ function(n, i, r) {
+ if (null === n && t.isVisible()) {
+ var a = t.$getConfig();
+ if (a.static_background || a.timeline_placeholder) {
+ var o = t.$gantt.getDatastore(t.$config.bind),
+ s = t.$task_bg_static;
+ if (s || ((s = document.createElement("div")).className = "gantt_task_bg", t.$task_bg_static = s, t.$task_bg.nextSibling ? t.$task_data.insertBefore(s, t.$task_bg.nextSibling) : t.$task_data.appendChild(s)), o) {
+ var l = t.getTotalHeight();
+ a.timeline_placeholder && (l = a.timeline_placeholder.height || t.$task_data.offsetHeight || 99999),
+ e.render(s, a, t.getScale(), l, t.getItemHeight(i ? i.id: null))
+ }
+ } else a.static_background && t.$task_bg_static && t.$task_bg_static.parentNode && t.$task_bg_static.parentNode.removeChild(t.$task_bg_static)
+ }
+ }), this.attachEvent("onDestroy",
+ function() {
+ e.destroy()
+ }), this._initStaticBackgroundRender = function() {})
+ },
+ _clearLayers: function(t) {
+ var e = this.$gantt.$services.getService("layers"),
+ n = e.getDataRender(this.$config.bind),
+ i = e.getDataRender(this.$config.bindLinks);
+ if (this._taskLayers) for (var r = 0; r < this._taskLayers.length; r++) n.removeLayer(this._taskLayers[r]);
+ if (this._linkLayers) for (r = 0; r < this._linkLayers.length; r++) i.removeLayer(this._linkLayers[r]);
+ this._linkLayers = [],
+ this._taskLayers = []
+ },
+ _render_tasks_scales: function() {
+ var t = this.$getConfig(),
+ e = "",
+ n = 0,
+ i = 0,
+ r = this.$gantt.getState();
+ if (this.isVisible()) {
+ var a = this.$scaleHelper,
+ o = this._getScales();
+ i = t.scale_height;
+ var s = this.$config.width;
+ "x" != t.autosize && "xy" != t.autosize || (s = Math.max(t.autosize_min_width, 0));
+ var l = a.prepareConfigs(o, t.min_column_width, s, i - 1, r.min_date, r.max_date, t.rtl),
+ c = this._tasks = l[l.length - 1];
+ this._scales = l,
+ this._posFromDateCache = {},
+ e = this._getScaleChunkHtml(l, 0, this.$config.width),
+ n = c.full_width + "px",
+ i += "px"
+ }
+ this.$task_scale.style.height = i,
+ this.$task_data.style.width = this.$task_scale.style.width = n,
+ this.$task_scale.innerHTML = e
+ },
+ _getScaleChunkHtml: function(t, e, n) {
+ for (var i = [], r = this.$gantt.templates.scale_row_class, a = 0; a < t.length; a++) {
+ var o = "gantt_scale_line",
+ s = r(t[a]);
+ s && (o += " " + s),
+ i.push('<div class="' + o + '" style="height:' + t[a].height + "px;position:relative;line-height:" + t[a].height + 'px">' + this._prepareScaleHtml(t[a], e, n) + "</div>")
+ }
+ return i.join("")
+ },
+ _prepareScaleHtml: function(t, e, n) {
+ var i = this.$getConfig(),
+ r = this.$gantt.templates,
+ a = [],
+ s = null,
+ l = null,
+ c = t.format || t.template || t.date;
+ "string" == typeof c && (c = this.$gantt.date.date_to_str(c));
+ var u = 0,
+ d = t.count; ! i.smart_scales || isNaN(e) || isNaN(n) || (u = o.findBinary(t.left, e), d = o.findBinary(t.left, n) + 1),
+ l = t.css ||
+ function() {},
+ !t.css && i.inherit_scale_class && (l = r.scale_cell_class);
+ for (var h = u; h < d && t.trace_x[h]; h++) {
+ s = new Date(t.trace_x[h]);
+ var f = c.call(this, s),
+ _ = t.width[h],
+ g = t.height,
+ p = t.left[h],
+ v = "",
+ m = "",
+ y = "";
+ if (_) {
+ v = "width:" + _ + "px;height:" + g + "px;" + (i.smart_scales ? "position:absolute;left:" + p + "px": ""),
+ y = "gantt_scale_cell" + (h == t.count - 1 ? " gantt_last_cell": ""),
+ (m = l.call(this, s)) && (y += " " + m);
+ var k = "<div class='" + y + "'" + this.$gantt._waiAria.getTimelineCellAttr(f) + " style='" + v + "'>" + f + "</div>";
+ a.push(k)
+ }
+ }
+ return a.join("")
+ },
+ dateFromPos: function(t) {
+ var e = this._tasks;
+ if (t < 0 || t > e.full_width || !e.full_width) return null;
+ var n = o.findBinary(this._tasks.left, t),
+ i = this._tasks.left[n],
+ r = e.width[n] || e.col_width,
+ a = 0;
+ r && (a = (t - i) / r, e.rtl && (a = 1 - a));
+ var s = 0;
+ return a && (s = this._getColumnDuration(e, e.trace_x[n])),
+ new Date(e.trace_x[n].valueOf() + Math.round(a * s))
+ },
+ posFromDate: function(t) {
+ if (!this.isVisible()) return 0;
+ if (!t) return 0;
+ var e = String(t.valueOf());
+ if (void 0 !== this._posFromDateCache[e]) return this._posFromDateCache[e];
+ var n = this.columnIndexByDate(t);
+ this.$gantt.assert(n >= 0, "Invalid day index");
+ var i = Math.floor(n),
+ r = n % 1,
+ a = this._tasks.left[Math.min(i, this._tasks.width.length - 1)];
+ i == this._tasks.width.length && (a += this._tasks.width[this._tasks.width.length - 1]),
+ r && (i < this._tasks.width.length ? a += this._tasks.width[i] * (r % 1) : a += 1);
+ var o = Math.round(a);
+ return this._posFromDateCache[e] = o,
+ Math.round(o)
+ },
+ _getNextVisibleColumn: function(t, e, n) {
+ for (var i = +e[t], r = t; n[i];) i = +e[++r];
+ return r
+ },
+ _getPrevVisibleColumn: function(t, e, n) {
+ for (var i = +e[t], r = t; n[i];) i = +e[--r];
+ return r
+ },
+ _getClosestVisibleColumn: function(t, e, n) {
+ var i = this._getNextVisibleColumn(t, e, n);
+ return e[i] || (i = this._getPrevVisibleColumn(t, e, n)),
+ i
+ },
+ columnIndexByDate: function(t) {
+ var e = new Date(t).valueOf(),
+ n = this._tasks.trace_x_ascending,
+ i = this._tasks.ignore_x,
+ r = this.$gantt.getState();
+ if (e <= r.min_date) return this._tasks.rtl ? n.length: 0;
+ if (e >= r.max_date) return this._tasks.rtl ? 0 : n.length;
+ var a = o.findBinary(n, e),
+ s = this._getClosestVisibleColumn(a, n, i),
+ l = n[s],
+ c = this._tasks.trace_index_transition;
+ if (!l) return c ? c[0] : 0;
+ var u = (t - n[s]) / this._getColumnDuration(this._tasks, n[s]);
+ return c ? c[s] + (1 - u) : s + u
+ },
+ getItemPosition: function(t, e, n) {
+ var i, r, a;
+ return this._tasks.rtl ? (r = this.posFromDate(e || t.start_date), i = this.posFromDate(n || t.end_date)) : (i = this.posFromDate(e || t.start_date), r = this.posFromDate(n || t.end_date)),
+ a = Math.max(r - i, 0),
+ {
+ left: i,
+ top: this.getItemTop(t.id),
+ height: this.getBarHeight(t.id),
+ width: a,
+ rowHeight: this.getItemHeight(t.id)
+ }
+ },
+ getBarHeight: function(t, e) {
+ var n = this.$getConfig(),
+ i = this.$config.rowStore.getItem(t),
+ r = i.task_height || i.bar_height || n.bar_height || n.task_height,
+ a = this.getItemHeight(t);
+ "full" == r && (r = a - (n.task_height_offset || 5));
+ return r = Math.min(r, a),
+ e && (r = Math.round(r / Math.sqrt(2))),
+ Math.max(r, 0)
+ },
+ getScale: function() {
+ return this._tasks
+ },
+ _getScales: function() {
+ var t = this.$getConfig(),
+ e = this.$scaleHelper,
+ n = [e.primaryScale(t)].concat(e.getSubScales(t));
+ return e.sortScales(n),
+ n
+ },
+ _getColumnDuration: function(t, e) {
+ return this.$gantt.date.add(e, t.step, t.unit) - e
+ },
+ _bindStore: function() {
+ if (this.$config.bind) {
+ var t = this.$gantt.getDatastore(this.$config.bind);
+ if (this.$config.rowStore = t, t && !t._timelineCacheAttached) {
+ var e = this;
+ t._timelineCacheAttached = t.attachEvent("onBeforeFilter",
+ function() {
+ e._resetTopPositionHeight()
+ })
+ }
+ }
+ },
+ _unbindStore: function() {
+ if (this.$config.bind) {
+ var t = this.$gantt.getDatastore(this.$config.bind);
+ t && t._timelineCacheAttached && (t.detachEvent(t._timelineCacheAttached), t._timelineCacheAttached = !1)
+ }
+ },
+ refresh: function() {
+ this._bindStore(),
+ this.$config.bindLinks && (this.$config.linkStore = this.$gantt.getDatastore(this.$config.bindLinks)),
+ this._resetTopPositionHeight(),
+ this._resetHeight(),
+ this._initStaticBackgroundRender(),
+ this._render_tasks_scales()
+ },
+ destructor: function() {
+ var t = this.$gantt;
+ this._clearLayers(t),
+ this._unbindStore(),
+ this.$task = null,
+ this.$task_scale = null,
+ this.$task_data = null,
+ this.$task_bg = null,
+ this.$task_links = null,
+ this.$task_bars = null,
+ this.$gantt = null,
+ this.$config.rowStore && (this.$config.rowStore.detachEvent(this._staticBgHandler), this.$config.rowStore = null),
+ this.$config.linkStore && (this.$config.linkStore = null),
+ this._timelineDragScroll && (this._timelineDragScroll.destructor(), this._timelineDragScroll = null),
+ this.callEvent("onDestroy", []),
+ this.detachAllEvents()
+ }
+ },
+ t.exports = c
+ },
+ function(t, e) {
+ t.exports = function(t, e, n) {
+ return {
+ top: e.getItemTop(t.id),
+ height: e.getItemHeight(t.id),
+ left: 0,
+ right: 1 / 0
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = [];
+ return {
+ delegate: function(n, i, r, a) {
+ e.push([n, i, r, a]),
+ t.$services.getService("mouseEvents").delegate(n, i, r, a)
+ },
+ destructor: function() {
+ for (var n = t.$services.getService("mouseEvents"), i = 0; i < e.length; i++) {
+ var r = e[i];
+ n.detach(r[0], r[1], r[2], r[3])
+ }
+ e = []
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(1),
+ r = n(0),
+ a = n(5),
+ o = n(209),
+ s = n(43),
+ l = n(207),
+ c = n(206).
+ default,
+ u = function(t, e, n, i) {
+ this.$config = r.mixin({},
+ e || {}),
+ this.$gantt = i,
+ this.$parent = t,
+ a(this),
+ this.$state = {},
+ r.mixin(this, s(this))
+ };
+ u.prototype = {
+ init: function(t) {
+ var e = this.$gantt,
+ i = e._waiAria.gridAttrString(),
+ r = e._waiAria.gridDataAttrString(),
+ a = this.$getConfig(),
+ s = a.reorder_grid_columns || !1;
+ void 0 !== this.$config.reorder_grid_columns && (s = this.$config.reorder_grid_columns),
+ t.innerHTML = "<div class='gantt_grid' style='height:inherit;width:inherit;' " + i + "></div>",
+ this.$grid = t.childNodes[0],
+ this.$grid.innerHTML = "<div class='gantt_grid_scale' " + e._waiAria.gridScaleRowAttrString() + "></div><div class='gantt_grid_data' " + r + "></div>",
+ this.$grid_scale = this.$grid.childNodes[0],
+ this.$grid_data = this.$grid.childNodes[1];
+ var u = a[this.$config.bind + "_attribute"];
+ if (!u && this.$config.bind && (u = "data-" + this.$config.bind + "-id"), this.$config.item_attribute = u || null, !this.$config.layers) {
+ var d = this._createLayerConfig();
+ this.$config.layers = d
+ }
+ var h = o(e, this);
+ h.init(),
+ this._renderHeaderResizers = h.doOnRender,
+ this._mouseDelegates = n(31)(e),
+ l(e, this).init(),
+ this._addLayers(this.$gantt),
+ this._initEvents(),
+ s && (this._columnDND = new c(e, this), this._columnDND.init()),
+ this.callEvent("onReady", [])
+ },
+ _validateColumnWidth: function(t, e) {
+ var n = t[e];
+ if (n && "*" != n) {
+ var i = this.$gantt,
+ r = 1 * n;
+ isNaN(r) ? i.assert(!1, "Wrong " + e + " value of column " + t.name) : t[e] = r
+ }
+ },
+ setSize: function(t, e) {
+ this.$config.width = this.$state.width = t,
+ this.$config.height = this.$state.height = e;
+ for (var n, i = this.getGridColumns(), r = 0, a = (d = this.$getConfig()).grid_elastic_columns, o = 0, s = i.length; o < s; o++) this._validateColumnWidth(i[o], "min_width"),
+ this._validateColumnWidth(i[o], "max_width"),
+ this._validateColumnWidth(i[o], "width"),
+ r += 1 * i[o].width;
+ if (!isNaN(r) && this.$config.scrollable || (r = n = this._setColumnsWidth(t + 1)), this.$config.scrollable && a && !isNaN(r)) {
+ var l = "width";
+ "min_width" == a && (l = "min_width");
+ var c = 0;
+ i.forEach(function(t) {
+ c += t[l] || d.min_grid_column_width
+ });
+ var u = Math.max(c, t);
+ r = this._setColumnsWidth(u),
+ n = t
+ }
+ this.$config.scrollable ? (this.$grid_scale.style.width = r + "px", this.$grid_data.style.width = r + "px") : (this.$grid_scale.style.width = "inherit", this.$grid_data.style.width = "inherit"),
+ this.$config.width -= 1;
+ var d = this.$getConfig();
+ n !== t && (void 0 !== n ? (d.grid_width = n, this.$config.width = n - 1) : isNaN(r) || (this._setColumnsWidth(r), d.grid_width = r, this.$config.width = r - 1));
+ var h = Math.max(this.$state.height - d.scale_height, 0);
+ this.$grid_data.style.height = h + "px",
+ this.refresh()
+ },
+ getSize: function() {
+ var t = this.$getConfig(),
+ e = this.$config.rowStore ? this.getTotalHeight() : 0,
+ n = this._getGridWidth();
+ return {
+ x: this.$state.width,
+ y: this.$state.height,
+ contentX: this.isVisible() ? n: 0,
+ contentY: this.isVisible() ? t.scale_height + e: 0,
+ scrollHeight: this.isVisible() ? e: 0,
+ scrollWidth: this.isVisible() ? n: 0
+ }
+ },
+ _bindStore: function() {
+ if (this.$config.bind) {
+ var t = this.$gantt.getDatastore(this.$config.bind);
+ if (this.$config.rowStore = t, t && !t._gridCacheAttached) {
+ var e = this;
+ t._gridCacheAttached = t.attachEvent("onBeforeFilter",
+ function() {
+ e._resetTopPositionHeight()
+ })
+ }
+ }
+ },
+ _unbindStore: function() {
+ if (this.$config.bind) {
+ var t = this.$gantt.getDatastore(this.$config.bind);
+ t && t._gridCacheAttached && (t.detachEvent(t._gridCacheAttached), t._gridCacheAttached = !1)
+ }
+ },
+ refresh: function() {
+ this._bindStore(),
+ this._resetTopPositionHeight(),
+ this._resetHeight(),
+ this._initSmartRenderingPlaceholder(),
+ this._calculateGridWidth(),
+ this._renderGridHeader()
+ },
+ getViewPort: function() {
+ var t = this.$config.scrollLeft || 0,
+ e = this.$config.scrollTop || 0,
+ n = this.$config.height || 0,
+ i = this.$config.width || 0;
+ return {
+ y: e,
+ y_end: e + n,
+ x: t,
+ x_end: t + i,
+ height: n,
+ width: i
+ }
+ },
+ scrollTo: function(t, e) {
+ if (this.isVisible()) {
+ var n = !1;
+ this.$config.scrollTop = this.$config.scrollTop || 0,
+ this.$config.scrollLeft = this.$config.scrollLeft || 0,
+ 1 * t == t && (this.$config.scrollLeft = this.$state.scrollLeft = this.$grid.scrollLeft = t, n = !0),
+ 1 * e == e && (this.$config.scrollTop = this.$state.scrollTop = this.$grid_data.scrollTop = e, n = !0),
+ n && this.callEvent("onScroll", [this.$config.scrollLeft, this.$config.scrollTop])
+ }
+ },
+ getColumnIndex: function(t, e) {
+ for (var n = this.$getConfig().columns, i = 0, r = 0; r < n.length; r++) if (e && n[r].hide && i++, n[r].name == t) return r - i;
+ return null
+ },
+ getColumn: function(t) {
+ var e = this.getColumnIndex(t);
+ return null === e ? null: this.$getConfig().columns[e]
+ },
+ getGridColumns: function() {
+ return this.$getConfig().columns.slice()
+ },
+ isVisible: function() {
+ return this.$parent && this.$parent.$config ? !this.$parent.$config.hidden: this.$grid.offsetWidth
+ },
+ _createLayerConfig: function() {
+ var t = this.$gantt,
+ e = this;
+ return [{
+ renderer: t.$ui.layers.gridLine(),
+ container: this.$grid_data,
+ filter: [function() {
+ return e.isVisible()
+ }]
+ },
+ {
+ renderer: t.$ui.layers.gridTaskRowResizer(),
+ container: this.$grid_data,
+ append: !0,
+ filter: [function() {
+ return t.config.resize_rows
+ }]
+ }]
+ },
+ _addLayers: function(t) {
+ if (this.$config.bind) {
+ this._taskLayers = [];
+ var e = this,
+ n = this.$gantt.$services.getService("layers"),
+ i = n.getDataRender(this.$config.bind);
+ i || (i = n.createDataRender({
+ name: this.$config.bind,
+ defaultContainer: function() {
+ return e.$grid_data
+ }
+ }));
+ for (var r = this.$config.layers,
+ a = 0; r && a < r.length; a++) {
+ var o = r[a];
+ o.view = this;
+ var s = i.addLayer(o);
+ this._taskLayers.push(s)
+ }
+ this._bindStore(),
+ this._initSmartRenderingPlaceholder()
+ }
+ },
+ _refreshPlaceholderOnStoreUpdate: function(t) {
+ var e = this.$getConfig(),
+ n = this.$config.rowStore;
+ if (n && null === t && this.isVisible() && e.smart_rendering) {
+ var i;
+ if (this.$config.scrollY) {
+ var r = this.$gantt.$ui.getView(this.$config.scrollY);
+ r && (i = r.getScrollState().scrollSize)
+ }
+ if (i || (i = n ? this.getTotalHeight() : 0), i) {
+ this.$rowsPlaceholder && this.$rowsPlaceholder.parentNode && this.$rowsPlaceholder.parentNode.removeChild(this.$rowsPlaceholder);
+ var a = this.$rowsPlaceholder = document.createElement("div");
+ a.style.visibility = "hidden",
+ a.style.height = i + "px",
+ a.style.width = "1px",
+ this.$grid_data.appendChild(a)
+ }
+ }
+ },
+ _initSmartRenderingPlaceholder: function() {
+ var t = this.$config.rowStore;
+ t && (this._initSmartRenderingPlaceholder = function() {},
+ this._staticBgHandler = t.attachEvent("onStoreUpdated", r.bind(this._refreshPlaceholderOnStoreUpdate, this)))
+ },
+ _initEvents: function() {
+ var t = this.$gantt;
+ this._mouseDelegates.delegate("click", "gantt_close", t.bind(function(t, e, n) {
+ var r = this.$config.rowStore;
+ if (!r) return ! 0;
+ var a = i.locateAttribute(t, this.$config.item_attribute);
+ return a && r.close(a.getAttribute(this.$config.item_attribute)),
+ !1
+ },
+ this), this.$grid),
+ this._mouseDelegates.delegate("click", "gantt_open", t.bind(function(t, e, n) {
+ var r = this.$config.rowStore;
+ if (!r) return ! 0;
+ var a = i.locateAttribute(t, this.$config.item_attribute);
+ return a && r.open(a.getAttribute(this.$config.item_attribute)),
+ !1
+ },
+ this), this.$grid)
+ },
+ _clearLayers: function(t) {
+ var e = this.$gantt.$services.getService("layers").getDataRender(this.$config.bind);
+ if (this._taskLayers) for (var n = 0; n < this._taskLayers.length; n++) e.removeLayer(this._taskLayers[n]);
+ this._taskLayers = []
+ },
+ _getColumnWidth: function(t, e, n) {
+ var i = t.min_width || e.min_grid_column_width,
+ r = Math.max(n, i || 10);
+ return t.max_width && (r = Math.min(r, t.max_width)),
+ r
+ },
+ _checkGridColumnMinWidthLimits: function(t, e) {
+ for (var n = 0,
+ i = t.length; n < i; n++) {
+ var r = 1 * t[n].width; ! t[n].min_width && r < e.min_grid_column_width && (t[n].min_width = r)
+ }
+ },
+ _getGridWidthLimits: function() {
+ for (var t = this.$getConfig(), e = this.getGridColumns(), n = 0, i = 0, r = 0; r < e.length; r++) n += e[r].min_width ? e[r].min_width: t.min_grid_column_width,
+ void 0 !== i && (i = e[r].max_width ? i + e[r].max_width: void 0);
+ return this._checkGridColumnMinWidthLimits(e, t),
+ [n, i]
+ },
+ _setColumnsWidth: function(t, e) {
+ var n = this.$getConfig(),
+ i = this.getGridColumns(),
+ r = 0,
+ a = t;
+ e = window.isNaN(e) ? -1 : e;
+ for (var o = 0,
+ s = i.length; o < s; o++) r += 1 * i[o].width;
+ if (window.isNaN(r)) {
+ this._calculateGridWidth(),
+ r = 0;
+ for (o = 0, s = i.length; o < s; o++) r += 1 * i[o].width
+ }
+ var l = a - r,
+ c = 0;
+ for (o = 0; o < e + 1; o++) c += i[o].width;
+ r -= c;
+ for (o = e + 1; o < i.length; o++) {
+ var u = i[o],
+ d = Math.round(l * (u.width / r));
+ l < 0 ? u.min_width && u.width + d < u.min_width ? d = u.min_width - u.width: !u.min_width && n.min_grid_column_width && u.width + d < n.min_grid_column_width && (d = n.min_grid_column_width - u.width) : u.max_width && u.width + d > u.max_width && (d = u.max_width - u.width),
+ r -= u.width,
+ u.width += d,
+ l -= d
+ }
+ for (var h = l > 0 ? 1 : -1; l > 0 && 1 === h || l < 0 && -1 === h;) {
+ var f = l;
+ for (o = e + 1; o < i.length; o++) {
+ var _;
+ if ((_ = i[o].width + h) == this._getColumnWidth(i[o], n, _) && (l -= h, i[o].width = _), !l) break
+ }
+ if (f == l) break
+ }
+ l && e > -1 && ((_ = i[e].width + l) == this._getColumnWidth(i[e], n, _) && (i[e].width = _));
+ return this._getColsTotalWidth()
+ },
+ _getColsTotalWidth: function() {
+ for (var t = this.getGridColumns(), e = 0, n = 0; n < t.length; n++) {
+ var i = parseFloat(t[n].width);
+ if (window.isNaN(i)) return ! 1;
+ e += i
+ }
+ return e
+ },
+ _calculateGridWidth: function() {
+ for (var t = this.$getConfig(), e = this.getGridColumns(), n = 0, i = [], r = [], a = 0; a < e.length; a++) {
+ var o = parseFloat(e[a].width);
+ window.isNaN(o) && (o = t.min_grid_column_width || 10, i.push(a)),
+ r[a] = o,
+ n += o
+ }
+ var s = this._getGridWidth() + 1;
+ if (t.autofit || i.length) {
+ var l = s - n;
+ if (t.autofit && !t.grid_elastic_columns) for (a = 0; a < r.length; a++) {
+ var c = Math.round(l / (r.length - a));
+ r[a] += c,
+ (u = this._getColumnWidth(e[a], t, r[a])) != r[a] && (c = u - r[a], r[a] = u),
+ l -= c
+ } else if (i.length) for (a = 0; a < i.length; a++) {
+ c = Math.round(l / (i.length - a));
+ var u, d = i[a];
+ r[d] += c,
+ (u = this._getColumnWidth(e[d], t, r[d])) != r[d] && (c = u - r[d], r[d] = u),
+ l -= c
+ }
+ for (a = 0; a < r.length; a++) e[a].width = r[a]
+ } else {
+ var h = s != n;
+ this.$config.width = n - 1,
+ t.grid_width = n,
+ h && this.$parent._setContentSize(this.$config.width, null)
+ }
+ },
+ _renderGridHeader: function() {
+ var t = this.$gantt,
+ e = this.$getConfig(),
+ n = this.$gantt.locale,
+ i = this.$gantt.templates,
+ r = this.getGridColumns();
+ e.rtl && (r = r.reverse());
+ for (var a = [], o = 0, s = n.labels, l = e.scale_height - 1, c = 0; c < r.length; c++) {
+ var u = c == r.length - 1,
+ d = r[c];
+ d.name || (d.name = t.uid() + "");
+ var h = 1 * d.width,
+ f = this._getGridWidth();
+ u && f > o + h && (d.width = h = f - o),
+ o += h;
+ var _ = t._sort && d.name == t._sort.name ? "<div class='gantt_sort gantt_" + t._sort.direction + "'></div>": "",
+ g = ["gantt_grid_head_cell", "gantt_grid_head_" + d.name, u ? "gantt_last_cell": "", i.grid_header_class(d.name, d)].join(" "),
+ p = "width:" + (h - (u ? 1 : 0)) + "px;",
+ v = d.label || s["column_" + d.name] || s[d.name];
+ v = v || "";
+ var m = "<div class='" + g + "' style='" + p + "' " + t._waiAria.gridScaleCellAttrString(d, v) + " data-column-id='" + d.name + "' column_id='" + d.name + "' data-column-name='" + d.name + "' data-column-index='" + c + "'>" + v + _ + "</div>";
+ a.push(m)
+ }
+ this.$grid_scale.style.height = e.scale_height + "px",
+ this.$grid_scale.style.lineHeight = l + "px",
+ this.$grid_scale.innerHTML = a.join(""),
+ this._renderHeaderResizers && this._renderHeaderResizers()
+ },
+ _getGridWidth: function() {
+ return this.$config.width
+ },
+ destructor: function() {
+ this._clearLayers(this.$gantt),
+ this._mouseDelegates && (this._mouseDelegates.destructor(), this._mouseDelegates = null),
+ this._unbindStore(),
+ this.$grid = null,
+ this.$grid_scale = null,
+ this.$grid_data = null,
+ this.$gantt = null,
+ this.$config.rowStore && (this.$config.rowStore.detachEvent(this._staticBgHandler), this.$config.rowStore = null),
+ this.callEvent("onDestroy", []),
+ this.detachAllEvents()
+ }
+ },
+ t.exports = u
+ },
+ function(t, e, n) {
+ var i = n(0);
+ t.exports = function(t) {
+ var e = t.date,
+ n = t.$services;
+ return {
+ getSum: function(t, e, n) {
+ void 0 === n && (n = t.length - 1),
+ void 0 === e && (e = 0);
+ for (var i = 0,
+ r = e; r <= n; r++) i += t[r];
+ return i
+ },
+ setSumWidth: function(t, e, n, i) {
+ var r = e.width;
+ void 0 === i && (i = r.length - 1),
+ void 0 === n && (n = 0);
+ var a = i - n + 1;
+ if (! (n > r.length - 1 || a <= 0 || i > r.length - 1)) {
+ var o = t - this.getSum(r, n, i);
+ this.adjustSize(o, r, n, i),
+ this.adjustSize( - o, r, i + 1),
+ e.full_width = this.getSum(r)
+ }
+ },
+ splitSize: function(t, e) {
+ for (var n = [], i = 0; i < e; i++) n[i] = 0;
+ return this.adjustSize(t, n),
+ n
+ },
+ adjustSize: function(t, e, n, i) {
+ n || (n = 0),
+ void 0 === i && (i = e.length - 1);
+ for (var r = i - n + 1,
+ a = this.getSum(e, n, i), o = n; o <= i; o++) {
+ var s = Math.floor(t * (a ? e[o] / a: 1 / r));
+ a -= e[o],
+ t -= s,
+ r--,
+ e[o] += s
+ }
+ e[e.length - 1] += t
+ },
+ sortScales: function(t) {
+ function n(t, n) {
+ var i = new Date(1970, 0, 1);
+ return e.add(i, n, t) - i
+ }
+ t.sort(function(t, e) {
+ return n(t.unit, t.step) < n(e.unit, e.step) ? 1 : n(t.unit, t.step) > n(e.unit, e.step) ? -1 : 0
+ });
+ for (var i = 0; i < t.length; i++) t[i].index = i
+ },
+ _isLegacyMode: function(e) {
+ var n = e || t.config;
+ return n.scale_unit || n.date_scale || n.subscales
+ },
+ _prepareScaleObject: function(e) {
+ var n = e.format;
+ return n || (n = e.template || e.date || "%d %M"),
+ "string" == typeof n && (n = t.date.date_to_str(n)),
+ {
+ unit: e.unit || "day",
+ step: e.step || 1,
+ format: n,
+ css: e.css
+ }
+ },
+ primaryScale: function(e) {
+ var i, r = n.getService("templateLoader"),
+ a = this._isLegacyMode(e),
+ o = e || t.config;
+ if (a) r.initTemplate("date_scale", void 0, void 0, o, t.config.templates),
+ i = {
+ unit: t.config.scale_unit,
+ step: t.config.step,
+ template: t.templates.date_scale,
+ date: t.config.date_scale,
+ css: t.templates.scale_cell_class
+ };
+ else {
+ var s = o.scales[0];
+ i = {
+ unit: s.unit,
+ step: s.step,
+ template: s.template,
+ format: s.format,
+ date: s.date,
+ css: s.css || t.templates.scale_cell_class
+ }
+ }
+ return this._prepareScaleObject(i)
+ },
+ getSubScales: function(e) {
+ var n = this._isLegacyMode(e),
+ i = e || t.config;
+ return (n ? i.subscales || [] : i.scales.slice(1)).map(function(t) {
+ return this._prepareScaleObject(t)
+ }.bind(this))
+ },
+ prepareConfigs: function(t, e, n, i, r, a, o) {
+ for (var s = this.splitSize(i, t.length), l = n, c = [], u = t.length - 1; u >= 0; u--) {
+ var d = u == t.length - 1,
+ h = this.initScaleConfig(t[u], r, a);
+ d && this.processIgnores(h),
+ this.initColSizes(h, e, l, s[u]),
+ this.limitVisibleRange(h),
+ d && (l = h.full_width),
+ c.unshift(h)
+ }
+ for (u = 0; u < c.length - 1; u++) this.alineScaleColumns(c[c.length - 1], c[u]);
+ for (u = 0; u < c.length; u++) o && this.reverseScale(c[u]),
+ this.setPosSettings(c[u]);
+ return c
+ },
+ reverseScale: function(t) {
+ t.width = t.width.reverse(),
+ t.trace_x = t.trace_x.reverse();
+ var e = t.trace_indexes;
+ t.trace_indexes = {},
+ t.trace_index_transition = {},
+ t.rtl = !0;
+ for (var n = 0; n < t.trace_x.length; n++) t.trace_indexes[t.trace_x[n].valueOf()] = n,
+ t.trace_index_transition[e[t.trace_x[n].valueOf()]] = n;
+ return t
+ },
+ setPosSettings: function(t) {
+ for (var e = 0,
+ n = t.trace_x.length; e < n; e++) t.left.push((t.width[e - 1] || 0) + (t.left[e - 1] || 0))
+ },
+ _ignore_time_config: function(n, i) {
+ if (t.config.skip_off_time) {
+ for (var r = !0,
+ a = n,
+ o = 0; o < i.step; o++) o && (a = e.add(n, o, i.unit)),
+ r = r && !this.isWorkTime(a, i.unit);
+ return r
+ }
+ return ! 1
+ },
+ processIgnores: function(t) {
+ t.ignore_x = {},
+ t.display_count = t.count
+ },
+ initColSizes: function(t, n, i, r) {
+ var a = i;
+ t.height = r;
+ var o = void 0 === t.display_count ? t.count: t.display_count;
+ o || (o = 1),
+ t.col_width = Math.floor(a / o),
+ n && t.col_width < n && (t.col_width = n, a = t.col_width * o),
+ t.width = [];
+ for (var s = t.ignore_x || {},
+ l = 0; l < t.trace_x.length; l++) if (s[t.trace_x[l].valueOf()] || t.display_count == t.count) t.width[l] = 0;
+ else {
+ var c = 1;
+ "month" == t.unit && (c = Math.round((e.add(t.trace_x[l], t.step, t.unit) - t.trace_x[l]) / 864e5)),
+ t.width[l] = c
+ }
+ this.adjustSize(a - this.getSum(t.width), t.width),
+ t.full_width = this.getSum(t.width)
+ },
+ initScaleConfig: function(t, e, n) {
+ var r = i.mixin({
+ count: 0,
+ col_width: 0,
+ full_width: 0,
+ height: 0,
+ width: [],
+ left: [],
+ trace_x: [],
+ trace_indexes: {},
+ min_date: new Date(e),
+ max_date: new Date(n)
+ },
+ t);
+ return this.eachColumn(t.unit, t.step, e, n,
+ function(t) {
+ r.count++,
+ r.trace_x.push(new Date(t)),
+ r.trace_indexes[t.valueOf()] = r.trace_x.length - 1
+ }),
+ r.trace_x_ascending = r.trace_x.slice(),
+ r
+ },
+ iterateScales: function(t, e, n, i, r) {
+ for (var a = e.trace_x,
+ o = t.trace_x,
+ s = n || 0,
+ l = i || o.length - 1,
+ c = 0,
+ u = 1; u < a.length; u++) {
+ var d = t.trace_indexes[ + a[u]];
+ void 0 !== d && d <= l && (r && r.apply(this, [c, u, s, d]), s = d, c = u)
+ }
+ },
+ alineScaleColumns: function(t, e, n, i) {
+ this.iterateScales(t, e, n, i,
+ function(n, i, r, a) {
+ var o = this.getSum(t.width, r, a - 1);
+ this.getSum(e.width, n, i - 1) != o && this.setSumWidth(o, e, n, i - 1)
+ })
+ },
+ eachColumn: function(n, i, r, a, o) {
+ var s = new Date(r),
+ l = new Date(a);
+ e[n + "_start"] && (s = e[n + "_start"](s));
+ var c = new Date(s);
+ for ( + c >= +l && (l = e.add(c, i, n)); + c < +l;) {
+ o.call(this, new Date(c));
+ var u = c.getTimezoneOffset();
+ c = e.add(c, i, n),
+ c = t._correct_dst_change(c, u, i, n),
+ e[n + "_start"] && (c = e[n + "_start"](c))
+ }
+ },
+ limitVisibleRange: function(t) {
+ var n = t.trace_x,
+ i = t.width.length - 1,
+ r = 0;
+ if ( + n[0] < +t.min_date && 0 != i) {
+ var a = Math.floor(t.width[0] * ((n[1] - t.min_date) / (n[1] - n[0])));
+ r += t.width[0] - a,
+ t.width[0] = a,
+ n[0] = new Date(t.min_date)
+ }
+ var o = n.length - 1,
+ s = n[o],
+ l = e.add(s, t.step, t.unit);
+ if ( + l > +t.max_date && o > 0 && (a = t.width[o] - Math.floor(t.width[o] * ((l - t.max_date) / (l - s))), r += t.width[o] - a, t.width[o] = a), r) {
+ for (var c = this.getSum(t.width), u = 0, d = 0; d < t.width.length; d++) {
+ var h = Math.floor(r * (t.width[d] / c));
+ t.width[d] += h,
+ u += h
+ }
+ this.adjustSize(r - u, t.width)
+ }
+ }
+ }
+ }
+ },
+ ,
+ function(t, e, n) {},
+ function(t, e, n) {
+ var i = n(2),
+ r = {
+ getHtmlSelect: function(t, e, n) {
+ var r = "",
+ o = this;
+ return t = t || [],
+ i.forEach(t,
+ function(t) {
+ var e = [{
+ key: "value",
+ value: t.key
+ }];
+ n == t.key && (e[e.length] = {
+ key: "selected",
+ value: "selected"
+ }),
+ t.attributes && (e = e.concat(t.attributes)),
+ r += o.getHtmlOption({
+ innerHTML: t.label
+ },
+ e)
+ }),
+ a("select", {
+ innerHTML: r
+ },
+ e)
+ },
+ getHtmlOption: function(t, e) {
+ return a("option", t, e)
+ },
+ getHtmlButton: function(t, e) {
+ return a("button", t, e)
+ },
+ getHtmlDiv: function(t, e) {
+ return a("div", t, e)
+ },
+ getHtmlLabel: function(t, e) {
+ return a("label", t, e)
+ },
+ getHtmlInput: function(t) {
+ return "<input" + o(t || []) + ">"
+ }
+ };
+ function a(t, e, n) {
+ return e = e || [],
+ "<" + t + o(n || []) + ">" + (e.innerHTML || "") + "</" + t + ">"
+ }
+ function o(t) {
+ var e = "";
+ return i.forEach(t,
+ function(t) {
+ e += " " + t.key + "='" + t.value + "'"
+ }),
+ e
+ }
+ t.exports = r
+ },
+ function(t, e, n) {
+ var i = n(2);
+ t.exports = function(t) {
+ var e = {};
+ return t.$data.tasksStore.attachEvent("onStoreUpdated",
+ function() {
+ e = {}
+ }),
+ function(n, r, a, o) {
+ var s = n.id + "_" + r + "_" + a.unit + "_" + a.step;
+ return e[s] ? e[s] : e[s] = function(e, n, r, a) {
+ var o, s = !1,
+ l = {};
+ t.config.process_resource_assignments && n === t.config.resource_property ? (o = "task" == e.$role ? t.getResourceAssignments(e.$resource_id, e.$task_id) : t.getResourceAssignments(e.id), s = !0) : o = "task" == e.$role ? [] : t.getTaskBy(n, e.id);
+ for (var c, u, d, h, f, l = function(e, n, r) {
+ for (var a = n.unit,
+ o = n.step,
+ s = {},
+ l = {},
+ c = 0; c < e.length; c++) {
+ var u = e[c],
+ d = u;
+ r && (d = t.getTask(u.task_id));
+ var h = u.start_date || d.start_date,
+ f = u.end_date || d.end_date;
+ r && (u.start_date && (h = new Date(Math.max(u.start_date.valueOf(), d.start_date.valueOf()))), u.end_date && (f = new Date(Math.min(u.end_date.valueOf(), d.end_date.valueOf()))));
+ var _ = i.findBinary(n.trace_x, h.valueOf()),
+ g = new Date(n.trace_x[_] || t.date[a + "_start"](new Date(h))),
+ p = t.config.work_time ? t.getTaskCalendar(d) : t;
+ for (l[p.id] = {}; g < f;) {
+ var v = l[p.id],
+ m = g,
+ y = m.valueOf();
+ if (g = t.date.add(g, o, a), !1 !== v[y]) {
+ var k = p.isWorkTime({
+ date: m,
+ task: d,
+ unit: a
+ });
+ k ? (s[y] || (s[y] = {
+ tasks: [],
+ assignments: []
+ }), s[y].tasks.push(d), r && s[y].assignments.push(u)) : v[y] = !1
+ }
+ }
+ }
+ return s
+ } (o, r, s), _ = r.unit, g = r.step, p = [], v = a.$getConfig(), m = 0; m < r.trace_x.length; m++) c = new Date(r.trace_x[m]),
+ u = t.date.add(c, g, _),
+ f = l[c.valueOf()] || {},
+ d = f.tasks || [],
+ h = f.assignments || [],
+ d.length || v.resource_render_empty_cells ? p.push({
+ start_date: c,
+ end_date: u,
+ tasks: d,
+ assignments: h
+ }) : p.push(null);
+ return p
+ } (n, r, a, o)
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(3),
+ r = n(1),
+ a = function(t) {
+ "use strict";
+ function e(e, n, i) {
+ var r = t.apply(this, arguments) || this;
+ return e && (r.$root = !0),
+ r._parseConfig(n),
+ r.$name = "layout",
+ r
+ }
+ return i(e, t),
+ e.prototype.destructor = function() {
+ this.$container && this.$view && r.removeNode(this.$view);
+ for (var e = 0; e < this.$cells.length; e++) {
+ this.$cells[e].destructor()
+ }
+ this.$cells = [],
+ t.prototype.destructor.call(this)
+ },
+ e.prototype._resizeScrollbars = function(t, e) {
+ var n, i = !1,
+ r = [],
+ a = [],
+ o = [];
+ function s(t) {
+ t.$parent.show(),
+ i = !0,
+ r.push(t)
+ }
+ function l(t) {
+ t.$parent.hide(),
+ i = !0,
+ a.push(t)
+ }
+ for (var c = 0; c < e.length; c++) t[(n = e[c]).$config.scroll] ? l(n) : n.shouldHide() ? o.push(n) : n.shouldShow() ? s(n) : n.isVisible() ? r.push(n) : a.push(n);
+ var u = {};
+ for (c = 0; c < r.length; c++) r[c].$config.group && (u[r[c].$config.group] = !0);
+ o.forEach(function(t) {
+ t.$config.group && u[t.$config.group] || l(t)
+ });
+ for (c = 0; c < a.length; c++) if ((n = a[c]).$config.group && u[n.$config.group]) {
+ s(n);
+ for (var d = 0; d < r.length; d++) if (r[d] == n) {
+ this.$gantt.$scrollbarRepaint = !0;
+ break
+ }
+ }
+ return i
+ },
+ e.prototype._syncCellSizes = function(t, e) {
+ if (t) {
+ var n = {};
+ return this._eachChild(function(t) {
+ t.$config.group && "scrollbar" != t.$name && "resizer" != t.$name && (n[t.$config.group] || (n[t.$config.group] = []), n[t.$config.group].push(t))
+ }),
+ n[t] && this._syncGroupSize(n[t], e),
+ n[t]
+ }
+ },
+ e.prototype._syncGroupSize = function(t, e) {
+ if (t.length) for (var n = t[0].$parent._xLayout ? "width": "height", i = t[0].$parent.getNextSibling(t[0].$id) ? 1 : -1, r = e.value, a = e.isGravity, o = 0; o < t.length; o++) {
+ var s = t[o].getSize(),
+ l = i > 0 ? t[o].$parent.getNextSibling(t[o].$id) : t[o].$parent.getPrevSibling(t[o].$id);
+ "resizer" == l.$name && (l = i > 0 ? l.$parent.getNextSibling(l.$id) : l.$parent.getPrevSibling(l.$id));
+ var c = l.getSize();
+ if (a) t[o].$config.gravity = r;
+ else if (l[n]) {
+ var u = s.gravity + c.gravity,
+ d = s[n] + c[n],
+ h = u / d;
+ t[o].$config.gravity = h * r,
+ l.$config[n] = d - r,
+ l.$config.gravity = u - h * r
+ } else t[o].$config[n] = r;
+ var f = this.$gantt.$ui.getView("grid"); ! f || t[o].$content !== f || f.$config.scrollable || a || (this.$gantt.config.grid_width = r)
+ }
+ },
+ e.prototype.resize = function(e) {
+ var n = !1;
+ if (this.$root && !this._resizeInProgress && (this.callEvent("onBeforeResize", []), n = !0, this._resizeInProgress = !0), t.prototype.resize.call(this, !0), t.prototype.resize.call(this, !1), n) {
+ var i = [];
+ i = (i = (i = i.concat(this.getCellsByType("viewCell"))).concat(this.getCellsByType("viewLayout"))).concat(this.getCellsByType("hostCell"));
+ for (var r = this.getCellsByType("scroller"), a = 0; a < i.length; a++) i[a].$config.hidden || i[a].setContentSize();
+ var o = this._getAutosizeMode(this.$config.autosize),
+ s = this._resizeScrollbars(o, r);
+ if (this.$config.autosize && (this.autosize(this.$config.autosize), i.forEach(function(t) {
+ var e = t.$parent,
+ n = e.getContentSize(o);
+ o.x && (e.$config.$originalWidthStored || (e.$config.$originalWidthStored = !0, e.$config.$originalWidth = e.$config.width), e.$config.width = n.width),
+ o.y && (e.$config.$originalHeightStored || (e.$config.$originalHeightStored = !0, e.$config.$originalHeight = e.$config.height), e.$config.height = n.height)
+ }), s = !0), s) {
+ this.resize();
+ for (a = 0; a < i.length; a++) i[a].$config.hidden || i[a].setContentSize()
+ }
+ this.callEvent("onResize", [])
+ }
+ n && (this._resizeInProgress = !1)
+ },
+ e.prototype._eachChild = function(t, e) {
+ if (t(e = e || this), e.$cells) for (var n = 0; n < e.$cells.length; n++) this._eachChild(t, e.$cells[n])
+ },
+ e.prototype.isChild = function(t) {
+ var e = !1;
+ return this._eachChild(function(n) {
+ n !== t && n.$content !== t || (e = !0)
+ }),
+ e
+ },
+ e.prototype.getCellsByType = function(t) {
+ var n = [];
+ if (t === this.$name && n.push(this), this.$content && this.$content.$name == t && n.push(this.$content), this.$cells) for (var i = 0; i < this.$cells.length; i++) {
+ var r = e.prototype.getCellsByType.call(this.$cells[i], t);
+ r.length && n.push.apply(n, r)
+ }
+ return n
+ },
+ e.prototype.getNextSibling = function(t) {
+ var e = this.cellIndex(t);
+ return e >= 0 && this.$cells[e + 1] ? this.$cells[e + 1] : null
+ },
+ e.prototype.getPrevSibling = function(t) {
+ var e = this.cellIndex(t);
+ return e >= 0 && this.$cells[e - 1] ? this.$cells[e - 1] : null
+ },
+ e.prototype.cell = function(t) {
+ for (var e = 0; e < this.$cells.length; e++) {
+ var n = this.$cells[e];
+ if (n.$id === t) return n;
+ var i = n.cell(t);
+ if (i) return i
+ }
+ },
+ e.prototype.cellIndex = function(t) {
+ for (var e = 0; e < this.$cells.length; e++) if (this.$cells[e].$id === t) return e;
+ return - 1
+ },
+ e.prototype.moveView = function(t, e) {
+ if (this.$cells[e] !== t) return window.alert("Not implemented");
+ e += this.$config.header ? 1 : 0;
+ var n = this.$view;
+ e >= n.childNodes.length ? n.appendChild(t.$view) : n.insertBefore(t.$view, n.childNodes[e])
+ },
+ e.prototype._parseConfig = function(t) {
+ this.$cells = [],
+ this._xLayout = !t.rows;
+ for (var e = t.rows || t.cols || t.views,
+ n = 0; n < e.length; n++) {
+ var i = e[n];
+ i.mode = this._xLayout ? "x": "y";
+ var r = this.$factory.initUI(i, this);
+ r ? (r.$parent = this, this.$cells.push(r)) : (e.splice(n, 1), n--)
+ }
+ },
+ e.prototype.getCells = function() {
+ return this.$cells
+ },
+ e.prototype.render = function() {
+ var t = r.insertNode(this.$container, this.$toHTML());
+ this.$fill(t, null),
+ this.callEvent("onReady", []),
+ this.resize(),
+ this.render = this.resize
+ },
+ e.prototype.$fill = function(t, e) {
+ this.$view = t,
+ this.$parent = e;
+ for (var n = r.getChildNodes(t, "gantt_layout_cell"), i = n.length - 1; i >= 0; i--) {
+ var a = this.$cells[i];
+ a.$fill(n[i], this),
+ a.$config.hidden && a.$view.parentNode.removeChild(a.$view)
+ }
+ },
+ e.prototype.$toHTML = function() {
+ for (var e = this._xLayout ? "x": "y", n = [], i = 0; i < this.$cells.length; i++) n.push(this.$cells[i].$toHTML());
+ return t.prototype.$toHTML.call(this, n.join(""), (this.$root ? "gantt_layout_root ": "") + "gantt_layout gantt_layout_" + e)
+ },
+ e.prototype.getContentSize = function(t) {
+ for (var e, n, i, r = 0,
+ a = 0,
+ o = 0; o < this.$cells.length; o++)(n = this.$cells[o]).$config.hidden || (e = n.getContentSize(t), "scrollbar" === n.$config.view && t[n.$config.scroll] && (e.height = 0, e.width = 0), n.$config.resizer && (this._xLayout ? e.height = 0 : e.width = 0), i = n._getBorderSizes(), this._xLayout ? (r += e.width + i.horizontal, a = Math.max(a, e.height + i.vertical)) : (r = Math.max(r, e.width + i.horizontal), a += e.height + i.vertical));
+ return {
+ width: r += (i = this._getBorderSizes()).horizontal,
+ height: a += i.vertical
+ }
+ },
+ e.prototype._cleanElSize = function(t) {
+ return 1 * (t || "").toString().replace("px", "") || 0
+ },
+ e.prototype._getBoxStyles = function(t) {
+ var e = null,
+ n = ["width", "height", "paddingTop", "paddingBottom", "paddingLeft", "paddingRight", "borderLeftWidth", "borderRightWidth", "borderTopWidth", "borderBottomWidth"],
+ i = {
+ boxSizing: "border-box" == (e = window.getComputedStyle ? window.getComputedStyle(t, null) : {
+ width: t.clientWidth,
+ height: t.clientHeight
+ }).boxSizing
+ };
+ e.MozBoxSizing && (i.boxSizing = "border-box" == e.MozBoxSizing);
+ for (var r = 0; r < n.length; r++) i[n[r]] = e[n[r]] ? this._cleanElSize(e[n[r]]) : 0;
+ var a = {
+ horPaddings: i.paddingLeft + i.paddingRight + i.borderLeftWidth + i.borderRightWidth,
+ vertPaddings: i.paddingTop + i.paddingBottom + i.borderTopWidth + i.borderBottomWidth,
+ borderBox: i.boxSizing,
+ innerWidth: i.width,
+ innerHeight: i.height,
+ outerWidth: i.width,
+ outerHeight: i.height
+ };
+ return a.borderBox ? (a.innerWidth -= a.horPaddings, a.innerHeight -= a.vertPaddings) : (a.outerWidth += a.horPaddings, a.outerHeight += a.vertPaddings),
+ a
+ },
+ e.prototype._getAutosizeMode = function(t) {
+ var e = {
+ x: !1,
+ y: !1
+ };
+ return "xy" === t ? e.x = e.y = !0 : "y" === t || !0 === t ? e.y = !0 : "x" === t && (e.x = !0),
+ e
+ },
+ e.prototype.autosize = function(t) {
+ var e = this._getAutosizeMode(t),
+ n = this._getBoxStyles(this.$container),
+ i = this.getContentSize(t),
+ r = this.$container;
+ e.x && (n.borderBox && (i.width += n.horPaddings), r.style.width = i.width + "px"),
+ e.y && (n.borderBox && (i.height += n.vertPaddings), r.style.height = i.height + "px")
+ },
+ e.prototype.getSize = function() {
+ this._sizes = [];
+ for (var e = 0,
+ n = 0,
+ i = 1e11,
+ r = 0,
+ a = 1e11,
+ o = 0,
+ s = 0; s < this.$cells.length; s++) {
+ var l = this._sizes[s] = this.$cells[s].getSize();
+ this.$cells[s].$config.hidden || (this._xLayout ? (!l.width && l.minWidth ? e += l.minWidth: e += l.width, i += l.maxWidth, n += l.minWidth, r = Math.max(r, l.height), a = Math.min(a, l.maxHeight), o = Math.max(o, l.minHeight)) : (!l.height && l.minHeight ? r += l.minHeight: r += l.height, a += l.maxHeight, o += l.minHeight, e = Math.max(e, l.width), i = Math.min(i, l.maxWidth), n = Math.max(n, l.minWidth)))
+ }
+ var c = t.prototype.getSize.call(this);
+ return c.maxWidth >= 1e5 && (c.maxWidth = i),
+ c.maxHeight >= 1e5 && (c.maxHeight = a),
+ c.minWidth = c.minWidth != c.minWidth ? 0 : c.minWidth,
+ c.minHeight = c.minHeight != c.minHeight ? 0 : c.minHeight,
+ this._xLayout ? (c.minWidth += this.$config.margin * this.$cells.length || 0, c.minWidth += 2 * this.$config.padding || 0, c.minHeight += 2 * this.$config.padding || 0) : (c.minHeight += this.$config.margin * this.$cells.length || 0, c.minHeight += 2 * this.$config.padding || 0),
+ c
+ },
+ e.prototype._calcFreeSpace = function(t, e, n) {
+ var i = n ? e.minWidth: e.minHeight,
+ r = e.maxWidth,
+ a = t;
+ return a ? (a > r && (a = r), a < i && (a = i), this._free -= a) : ((a = Math.floor(this._free / this._gravity * e.gravity)) > r && (a = r, this._free -= a, this._gravity -= e.gravity), a < i && (a = i, this._free -= a, this._gravity -= e.gravity)),
+ a
+ },
+ e.prototype._calcSize = function(t, e, n) {
+ var i = t,
+ r = n ? e.minWidth: e.minHeight,
+ a = n ? e.maxWidth: e.maxHeight;
+ return i || (i = Math.floor(this._free / this._gravity * e.gravity)),
+ i > a && (i = a),
+ i < r && (i = r),
+ i
+ },
+ e.prototype._configureBorders = function() {
+ this.$root && this._setBorders([this._borders.left, this._borders.top, this._borders.right, this._borders.bottom], this);
+ for (var t = this._xLayout ? this._borders.right: this._borders.bottom, e = this.$cells, n = e.length - 1, i = n; i >= 0; i--) if (!e[i].$config.hidden) {
+ n = i;
+ break
+ }
+ for (i = 0; i < e.length; i++) if (!e[i].$config.hidden) {
+ var r = i >= n,
+ a = ""; ! r && e[i + 1] && "scrollbar" == e[i + 1].$config.view && (this._xLayout ? r = !0 : a = "gantt_layout_cell_border_transparent"),
+ this._setBorders(r ? [] : [t, a], e[i])
+ }
+ },
+ e.prototype._updateCellVisibility = function() {
+ for (var t = this._visibleCells || {},
+ e = !this._visibleCells,
+ n = {},
+ i = null,
+ r = [], a = 0; a < this._sizes.length; a++)(i = this.$cells[a]).$config.hide_empty && r.push(i),
+ !e && i.$config.hidden && t[i.$id] ? i._hide(!0) : i.$config.hidden || t[i.$id] || i._hide(!1),
+ i.$config.hidden || (n[i.$id] = !0);
+ this._visibleCells = n;
+ for (a = 0; a < r.length; a++) {
+ var o = !0; (i = r[a]).$cells.forEach(function(t) {
+ t.$config.hidden || t.$config.resizer || (o = !1)
+ }),
+ i.$config.hidden = o
+ }
+ },
+ e.prototype.setSize = function(e, n) {
+ this._configureBorders(),
+ t.prototype.setSize.call(this, e, n),
+ n = this.$lastSize.contentY,
+ e = this.$lastSize.contentX;
+ var i, r, a = this.$config.padding || 0;
+ this.$view.style.padding = a + "px",
+ this._gravity = 0,
+ this._free = this._xLayout ? e: n,
+ this._free -= 2 * a,
+ this._updateCellVisibility();
+ for (var o = 0; o < this._sizes.length; o++) if (! (i = this.$cells[o]).$config.hidden) {
+ var s = this.$config.margin || 0;
+ "resizer" != i.$name || s || (s = -1);
+ var l = i.$view,
+ c = this._xLayout ? "marginRight": "marginBottom";
+ o !== this.$cells.length - 1 && (l.style[c] = s + "px", this._free -= s),
+ r = this._sizes[o],
+ this._xLayout ? r.width || (this._gravity += r.gravity) : r.height || (this._gravity += r.gravity)
+ }
+ for (o = 0; o < this._sizes.length; o++) if (! (i = this.$cells[o]).$config.hidden) {
+ var u = (r = this._sizes[o]).width,
+ d = r.height;
+ this._xLayout ? this._calcFreeSpace(u, r, !0) : this._calcFreeSpace(d, r, !1)
+ }
+ for (o = 0; o < this.$cells.length; o++) if (! (i = this.$cells[o]).$config.hidden) {
+ r = this._sizes[o];
+ var h = void 0,
+ f = void 0;
+ this._xLayout ? (h = this._calcSize(r.width, r, !0), f = n - 2 * a) : (h = e - 2 * a, f = this._calcSize(r.height, r, !1)),
+ i.setSize(h, f)
+ }
+ },
+ e
+ } (n(14));
+ t.exports = a
+ },
+ function(t, e) {
+ t.exports = function(t, e, n, i, r) {
+ var a = n.$gantt.getTask(t.source),
+ o = n.$gantt.getTask(t.target),
+ s = n.getItemTop(a.id),
+ l = n.getItemHeight(a.id),
+ c = n.getItemTop(o.id),
+ u = n.getItemHeight(o.id);
+ if (e.y > s + l && e.y > c + u) return ! 1;
+ if (e.y_end < c && e.y_end < s) return ! 1;
+ var d = n.posFromDate(a.start_date),
+ h = n.posFromDate(a.end_date),
+ f = n.posFromDate(o.start_date),
+ _ = n.posFromDate(o.end_date);
+ if (d > h) {
+ var g = h;
+ h = d,
+ d = g
+ }
+ if (f > _) {
+ g = _;
+ _ = f,
+ f = g
+ }
+ return d += -100,
+ h += 100,
+ f += -100,
+ _ += 100,
+ !(e.x > h && e.x > _) && !(e.x_end < d && e.x_end < f)
+ }
+ },
+ function(t, e, n) {
+ var i = n(134);
+ t.exports = function() {
+ var t = [],
+ e = !1;
+ function n() {
+ t = [],
+ e = !1
+ }
+ var r = !1;
+ return function(a, o, s, l, c) { !
+ function(t) {
+ r || (r = !0, t.attachEvent("onPreFilter", n), t.attachEvent("onStoreUpdated", n), t.attachEvent("onClearAll", n), t.attachEvent("onBeforeStoreUpdate", n))
+ } (l),
+ e ||
+ function(n, r, a) {
+ var o = r.$getConfig();
+ n.getVisibleItems().forEach(function(e) {
+ var n = i(e, r, o, a);
+ n && t.push({
+ id: e.id,
+ rec: n
+ })
+ }),
+ t.sort(function(t, e) {
+ return t.rec.right < e.rec.right ? -1 : 1
+ }),
+ e = !0
+ } (l, o, a);
+ for (var u = [], d = 0; d < t.length; d++) {
+ var h = t[d],
+ f = h.rec;
+ f.right < c.x || f.left < c.x_end && f.right > c.x && f.top < c.y_end && f.bottom > c.y && u.push(h.id)
+ }
+ return {
+ ids: u
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(196),
+ r = n(195),
+ a = n(194);
+ e.LargerUnitsCache = a.LargerUnitsCache,
+ e.createCacheObject = function() {
+ return "undefined" != typeof Map ? new i.WorkUnitsMapCache: new r.WorkUnitsObjectCache
+ }
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(2);
+ function a(t, e, n, i, r) {
+ return this.date = t,
+ this.unit = e,
+ this.task = n,
+ this.id = i,
+ this.calendar = r,
+ this
+ }
+ function o(t, e, n, i, r, a) {
+ return this.date = t,
+ this.dir = e,
+ this.unit = n,
+ this.task = i,
+ this.id = r,
+ this.calendar = a,
+ this
+ }
+ function s(t, e, n, i, r, a, o) {
+ return this.start_date = t,
+ this.duration = e,
+ this.unit = n,
+ this.step = i,
+ this.task = r,
+ this.id = a,
+ this.calendar = o,
+ this
+ }
+ function l(t, e, n, i) {
+ return this.start_date = t,
+ this.end_date = e,
+ this.task = n,
+ this.calendar = i,
+ this.unit = null,
+ this.step = null,
+ this
+ }
+ t.exports = function(t) {
+ return {
+ getWorkHoursArguments: function() {
+ var e = arguments[0];
+ if (e = r.isDate(e) ? {
+ date: e
+ }: i.mixin({},
+ e), !r.isValidDate(e.date)) throw t.assert(!1, "Invalid date argument for getWorkHours method"),
+ new Error("Invalid date argument for getWorkHours method");
+ return e
+ },
+ setWorkTimeArguments: function() {
+ return arguments[0]
+ },
+ unsetWorkTimeArguments: function() {
+ return arguments[0]
+ },
+ isWorkTimeArguments: function() {
+ var e, n = arguments[0];
+ if (n instanceof a) return n;
+ if ((e = n.date ? new a(n.date, n.unit, n.task, null, n.calendar) : new a(arguments[0], arguments[1], arguments[2], null, arguments[3])).unit = e.unit || t.config.duration_unit, !r.isValidDate(e.date)) throw t.assert(!1, "Invalid date argument for isWorkTime method"),
+ new Error("Invalid date argument for isWorkTime method");
+ return e
+ },
+ getClosestWorkTimeArguments: function(e) {
+ var n, i = arguments[0];
+ if (i instanceof o) return i;
+ if (n = r.isDate(i) ? new o(i) : new o(i.date, i.dir, i.unit, i.task, null, i.calendar), i.id && (n.task = i), n.dir = i.dir || "any", n.unit = i.unit || t.config.duration_unit, !r.isValidDate(n.date)) throw t.assert(!1, "Invalid date argument for getClosestWorkTime method"),
+ new Error("Invalid date argument for getClosestWorkTime method");
+ return n
+ },
+ _getStartEndConfig: function(e) {
+ var n, i = l;
+ if (e instanceof i) return e;
+ if (r.isDate(e) ? n = new i(arguments[0], arguments[1], arguments[2], arguments[3]) : (n = new i(e.start_date, e.end_date, e.task), null !== e.id && void 0 !== e.id && (n.task = e)), n.unit = n.unit || t.config.duration_unit, n.step = n.step || t.config.duration_step, n.start_date = n.start_date || n.start || n.date, !r.isValidDate(n.start_date)) throw t.assert(!1, "Invalid start_date argument for getDuration method"),
+ new Error("Invalid start_date argument for getDuration method");
+ if (!r.isValidDate(n.end_date)) throw t.assert(!1, "Invalid end_date argument for getDuration method"),
+ new Error("Invalid end_date argument for getDuration method");
+ return n
+ },
+ getDurationArguments: function(t, e, n, i) {
+ return this._getStartEndConfig.apply(this, arguments)
+ },
+ hasDurationArguments: function(t, e, n, i) {
+ return this._getStartEndConfig.apply(this, arguments)
+ },
+ calculateEndDateArguments: function(e, n, i, a) {
+ var o, l = arguments[0];
+ if (l instanceof s) return l;
+ if (o = r.isDate(l) ? new s(arguments[0], arguments[1], arguments[2], void 0, arguments[3], void 0, arguments[4]) : new s(l.start_date, l.duration, l.unit, l.step, l.task, null, l.calendar), null !== l.id && void 0 !== l.id && (o.task = l, o.unit = null, o.step = null), o.unit = o.unit || t.config.duration_unit, o.step = o.step || t.config.duration_step, !r.isValidDate(o.start_date)) throw t.assert(!1, "Invalid start_date argument for calculateEndDate method"),
+ new Error("Invalid start_date argument for calculateEndDate method");
+ return o
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(208);
+ t.exports = function(t) {
+ var e = {},
+ n = {},
+ r = null,
+ a = -1,
+ o = null,
+ s = i(t);
+ return {
+ _resetTopPositionHeight: function() {
+ e = {},
+ n = {},
+ s.resetCache()
+ },
+ _resetHeight: function() {
+ var t = this.$config.rowStore,
+ e = this.getCacheStateTotalHeight(t);
+ o ? this.shouldClearHeightCache(o, e) && (o = e, r = null) : o = e,
+ a = -1,
+ s.resetCache()
+ },
+ getRowTop: function(t) {
+ if (s.canUseSimpleCalculation()) return s.getRowTop(t);
+ var e = this.$config.rowStore;
+ if (!e) return 0;
+ if (void 0 !== n[t]) return n[t];
+ for (var i = e.getIndexRange(), r = 0, a = 0, o = 0; o < i.length; o++) n[o] = r,
+ r += this.getItemHeight(i[o].id),
+ o < t && (a = r);
+ return a
+ },
+ getItemTop: function(t) {
+ if (this.$config.rowStore) {
+ if (void 0 !== e[t]) return e[t];
+ var n = this.$config.rowStore;
+ if (!n) return 0;
+ var i = n.getIndexById(t);
+ if ( - 1 === i && n.getParent && n.exists(t)) {
+ var r = n.getParent(t);
+ if (n.exists(r)) {
+ var a = n.getItem(r);
+ if (this.$gantt.isSplitTask(a)) return this.getItemTop(r)
+ }
+ }
+ return e[t] = this.getRowTop(i),
+ e[t]
+ }
+ return 0
+ },
+ getItemHeight: function(t) {
+ if (s.canUseSimpleCalculation()) return s.getItemHeight(t);
+ if (!r && this.$config.rowStore && this._fillHeightCache(this.$config.rowStore), void 0 !== r[t]) return r[t];
+ var e = this.$getConfig().row_height;
+ if (this.$config.rowStore) {
+ var n = this.$config.rowStore;
+ if (!n) return e;
+ var i = n.getItem(t);
+ return r[t] = i && i.row_height || e
+ }
+ return e
+ },
+ _fillHeightCache: function(t) {
+ if (t) {
+ r = {};
+ var e = this.$getConfig().row_height;
+ t.eachItem(function(t) {
+ return r[t.id] = t && t.row_height || e
+ })
+ }
+ },
+ getCacheStateTotalHeight: function(t) {
+ var e = this.$getConfig().row_height,
+ n = {},
+ i = [],
+ r = 0;
+ return t && t.eachItem(function(t) {
+ i.push(t),
+ n[t.id] = t.row_height,
+ r += t.row_height || e
+ }),
+ {
+ globalHeight: e,
+ items: i,
+ count: i.length,
+ sumHeight: r
+ }
+ },
+ shouldClearHeightCache: function(t, e) {
+ if (t.count != e.count) return ! 0;
+ if (t.globalHeight != e.globalHeight) return ! 0;
+ if (t.sumHeight != e.sumHeight) return ! 0;
+ for (var n in t.items) {
+ var i = e.items[n];
+ if (void 0 !== i && i != t.items[n]) return ! 0
+ }
+ return ! 1
+ },
+ getTotalHeight: function() {
+ if (s.canUseSimpleCalculation()) return s.getTotalHeight();
+ if ( - 1 != a) return a;
+ if (this.$config.rowStore) {
+ var t = this.$config.rowStore;
+ this._fillHeightCache(t);
+ var e = this.getItemHeight.bind(this),
+ n = 0;
+ return t.getVisibleItems().forEach(function(t) {
+ n += e(t.id)
+ }),
+ a = n,
+ n
+ }
+ return 0
+ },
+ getItemIndexByTopPosition: function(t) {
+ if (this.$config.rowStore) {
+ if (s.canUseSimpleCalculation()) return s.getItemIndexByTopPosition(t);
+ for (var e = this.$config.rowStore,
+ n = 0; n < e.countVisible(); n++) {
+ var i = this.getRowTop(n),
+ r = this.getRowTop(n + 1);
+ if (!r) {
+ var a = e.getIdByIndex(n);
+ r = i + this.getItemHeight(a)
+ }
+ if (t >= i && t < r) return n
+ }
+ return e.countVisible() + 2
+ }
+ return 0
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t() {
+ var t = this;
+ this.canParse = function(e) {
+ return ! isNaN(t.parse(e))
+ },
+ this.format = function(t) {
+ return String(t)
+ },
+ this.parse = function(t) {
+ return parseInt(t, 10)
+ }
+ }
+ return t.create = function(e) {
+ return void 0 === e && (e = null),
+ new t
+ },
+ t
+ } ();
+ e.
+ default = i
+ },
+ function(t, e) {
+ function n(t, e, n) {
+ for (var i = 0; i < e.length; i++) t.isLinkExists(e[i]) && (n[e[i]] = t.getLink(e[i]))
+ }
+ function i(t, e, i) {
+ n(t, e.$source, i),
+ n(t, e.$target, i)
+ }
+ t.exports = {
+ getSubtreeLinks: function(t, e) {
+ var n = {};
+ return t.isTaskExists(e) && i(t, t.getTask(e), n),
+ t.eachTask(function(e) {
+ i(t, e, n)
+ },
+ e),
+ n
+ },
+ getSubtreeTasks: function(t, e) {
+ var n = {};
+ return t.eachTask(function(t) {
+ n[t.id] = t
+ },
+ e),
+ n
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(33),
+ r = n(33);
+ function a(t) {
+ var e = function(t) {
+ var e = new r(t).primaryScale(),
+ n = e.unit,
+ a = e.step;
+ if (t.config.scale_offset_minimal) {
+ var o = new i(t),
+ s = [o.primaryScale()].concat(o.getSubScales());
+ o.sortScales(s),
+ n = s[s.length - 1].unit,
+ a = s[s.length - 1].step || 1
+ }
+ return {
+ unit: n,
+ step: a
+ }
+ } (t),
+ n = e.unit,
+ a = e.step,
+ o = function(t, e) {
+ var n = {
+ start_date: null,
+ end_date: null
+ };
+ if (e.config.start_date && e.config.end_date) {
+ n.start_date = e.date[t + "_start"](new Date(e.config.start_date));
+ var i = new Date(e.config.end_date),
+ r = e.date[t + "_start"](new Date(i));
+ i = +i != +r ? e.date.add(r, 1, t) : r,
+ n.end_date = i
+ }
+ return n
+ } (n, t);
+ if (!o.start_date || !o.end_date) {
+ for (var s = !0,
+ l = t.getTaskByTime(), c = 0; c < l.length; c++) {
+ if (l[c].type !== t.config.types.project) {
+ s = !1;
+ break
+ }
+ }
+ if (l.length && s) {
+ var u = l[0].start_date,
+ d = t.date.add(u, 1, t.config.duration_unit);
+ o = {
+ start_date: new Date(u),
+ end_date: new Date(d)
+ }
+ } else o = t.getSubtaskDates();
+ o.start_date && o.end_date || (o = {
+ start_date: new Date,
+ end_date: new Date
+ }),
+ o.start_date = t.date[n + "_start"](o.start_date),
+ o.start_date = t.calculateEndDate({
+ start_date: t.date[n + "_start"](o.start_date),
+ duration: -1,
+ unit: n,
+ step: a
+ }),
+ o.end_date = t.date[n + "_start"](o.end_date),
+ o.end_date = t.calculateEndDate({
+ start_date: o.end_date,
+ duration: 2,
+ unit: n,
+ step: a
+ })
+ }
+ t._min_date = o.start_date,
+ t._max_date = o.end_date
+ }
+ t.exports = function(t) {
+ a(t),
+ function(t) {
+ if (t.config.fit_tasks) {
+ var e = +t._min_date,
+ n = +t._max_date;
+ if ( + t._min_date != e || +t._max_date != n) return t.render(),
+ t.callEvent("onScaleAdjusted", []),
+ !0
+ }
+ } (t)
+ }
+ },
+ function(t, e, n) {
+ var i = n(48),
+ r = n(0),
+ a = n(2),
+ o = n(49),
+ s = n(16),
+ l = n(2).replaceValidZeroId;
+ o.
+ default && (o = o.
+ default);
+ var c = function(t) {
+ o.apply(this, [t]),
+ this._branches = {},
+ this.pull = {},
+ this.$initItem = function(e) {
+ var n = e;
+ t.initItem && (n = t.initItem(n));
+ var i = this.getItem(e.id);
+ return i && i.parent != n.parent && this.move(n.id, n.$index || -1, n.parent || this._ganttConfig.root_id),
+ n
+ },
+ this.$parentProperty = t.parentProperty || "parent",
+ "function" != typeof t.rootId ? this.$getRootId = function(t) {
+ return function() {
+ return t
+ }
+ } (t.rootId || 0) : this.$getRootId = t.rootId,
+ this.$openInitially = t.openInitially,
+ this.visibleOrder = i.$create(),
+ this.fullOrder = i.$create(),
+ this._searchVisibleOrder = {},
+ this._indexRangeCache = {},
+ this._eachItemMainRangeCache = null,
+ this._getItemsCache = null,
+ this._skip_refresh = !1,
+ this._ganttConfig = null,
+ t.getConfig && (this._ganttConfig = t.getConfig());
+ var e = {},
+ n = {},
+ r = {},
+ a = {},
+ s = !1;
+ return this._attachDataChange(function() {
+ return this._indexRangeCache = {},
+ this._eachItemMainRangeCache = null,
+ this._getItemsCache = null,
+ !0
+ }),
+ this.attachEvent("onPreFilter",
+ function() {
+ this._indexRangeCache = {},
+ this._eachItemMainRangeCache = null,
+ e = {},
+ n = {},
+ r = {},
+ a = {},
+ s = !1,
+ this.eachItem(function(t) {
+ var i = this.getParent(t.id);
+ t.$open && !1 !== r[i] ? r[t.id] = !0 : r[t.id] = !1,
+ this._isSplitItem(t) && (s = !0, e[t.id] = !0, n[t.id] = !0),
+ s && n[i] && (n[t.id] = !0),
+ r[i] || void 0 === r[i] ? a[t.id] = !0 : a[t.id] = !1
+ })
+ }),
+ this.attachEvent("onFilterItem",
+ function(t, i) {
+ var r = !1;
+ if (this._ganttConfig) r = this._ganttConfig.open_split_tasks;
+ var o = a[i.id];
+ return s && (o && n[i.id] && !e[i.id] && (o = !!r), n[i.id] && !e[i.id] && (i.$split_subtask = !0)),
+ i.$expanded_branch = !!a[i.id],
+ !!o
+ }),
+ this.attachEvent("onFilter",
+ function() {
+ e = {},
+ n = {},
+ r = {},
+ a = {}
+ }),
+ this
+ };
+ c.prototype = r.mixin({
+ _buildTree: function(t) {
+ for (var e = null,
+ n = this.$getRootId(), i = 0, a = t.length; i < a; i++) e = t[i],
+ this.setParent(e, l(this.getParent(e), n) || n);
+ for (i = 0, a = t.length; i < a; i++) e = t[i],
+ this._add_branch(e),
+ e.$level = this.calculateItemLevel(e),
+ e.$local_index = this.getBranchIndex(e.id),
+ r.defined(e.$open) || (e.$open = r.defined(e.open) ? e.open: this.$openInitially());
+ this._updateOrder()
+ },
+ _isSplitItem: function(t) {
+ return "split" == t.render && this.hasChild(t.id)
+ },
+ parse: function(t) {
+ this._skip_refresh || this.callEvent("onBeforeParse", [t]);
+ var e = this._parseInner(t);
+ this._buildTree(e),
+ this.filter(),
+ this._skip_refresh || this.callEvent("onParse", [e])
+ },
+ _addItemInner: function(t, e) {
+ var n = this.getParent(t);
+ r.defined(n) || (n = this.$getRootId(), this.setParent(t, n));
+ var i = this.getIndexById(n) + Math.min(Math.max(e, 0), this.visibleOrder.length);
+ 1 * i !== i && (i = void 0),
+ o.prototype._addItemInner.call(this, t, i),
+ this.setParent(t, n),
+ t.hasOwnProperty("$rendered_parent") && this._move_branch(t, t.$rendered_parent),
+ this._add_branch(t, e)
+ },
+ _changeIdInner: function(t, e) {
+ var n = this.getChildren(t),
+ i = this._searchVisibleOrder[t];
+ o.prototype._changeIdInner.call(this, t, e);
+ var r = this.getParent(e);
+ this._replace_branch_child(r, t, e),
+ this._branches[t] && (this._branches[e] = this._branches[t]);
+ for (var a = 0; a < n.length; a++) {
+ var s = this.getItem(n[a]);
+ s[this.$parentProperty] = e,
+ s.$rendered_parent = e
+ }
+ this._searchVisibleOrder[e] = i,
+ delete this._branches[t]
+ },
+ _traverseBranches: function(t, e) {
+ r.defined(e) || (e = this.$getRootId());
+ var n = this._branches[e];
+ if (n) for (var i = 0; i < n.length; i++) {
+ var a = n[i];
+ t.call(this, a),
+ this._branches[a] && this._traverseBranches(t, a)
+ }
+ },
+ _updateOrder: function(t) {
+ this.fullOrder = i.$create(),
+ this._traverseBranches(function(t) {
+ this.fullOrder.push(t)
+ }),
+ t && o.prototype._updateOrder.call(this, t)
+ },
+ _removeItemInner: function(t) {
+ var e = [];
+ this.eachItem(function(t) {
+ e.push(t)
+ },
+ t),
+ e.push(this.getItem(t));
+ for (var n = 0; n < e.length; n++) this._move_branch(e[n], this.getParent(e[n]), null),
+ o.prototype._removeItemInner.call(this, e[n].id),
+ this._move_branch(e[n], this.getParent(e[n]), null)
+ },
+ move: function(t, e, n) {
+ var i = arguments[3],
+ a = (this._ganttConfig || {}).root_id || 0;
+ if (i = l(i, a)) {
+ if (i === t) return;
+ n = this.getParent(i),
+ e = this.getBranchIndex(i)
+ }
+ if (t != n) {
+ r.defined(n) || (n = this.$getRootId());
+ var o = this.getItem(t),
+ c = this.getParent(o.id),
+ u = this.getChildren(n);
+ if ( - 1 == e && (e = u.length + 1), c == n) if (this.getBranchIndex(t) == e) return;
+ if (!1 === this.callEvent("onBeforeItemMove", [t, n, e])) return ! 1;
+ for (var d = [], h = 0; h < u.length; h++) s(u[h], null, this, this._ganttConfig) && (d.push(u[h]), u.splice(h, 1), h--);
+ this._replace_branch_child(c, t);
+ var f = (u = this.getChildren(n))[e]; (f = l(f, a)) ? u = u.slice(0, e).concat([t]).concat(u.slice(e)) : u.push(t),
+ d.length && (u = u.concat(d)),
+ this.setParent(o, n),
+ this._branches[n] = u;
+ var _ = this.calculateItemLevel(o) - o.$level;
+ o.$level += _,
+ this.eachItem(function(t) {
+ t.$level += _
+ },
+ o.id, this),
+ this._moveInner(this.getIndexById(t), this.getIndexById(n) + e),
+ this.callEvent("onAfterItemMove", [t, n, e]),
+ this.refresh()
+ }
+ },
+ getBranchIndex: function(t) {
+ var e = this.getChildren(this.getParent(t)),
+ n = e.indexOf(t + "");
+ return - 1 == n && (n = e.indexOf( + t)),
+ n
+ },
+ hasChild: function(t) {
+ var e = this._branches[t];
+ return e && e.length
+ },
+ getChildren: function(t) {
+ var e = this._branches[t];
+ return e || i.$create()
+ },
+ isChildOf: function(t, e) {
+ if (!this.exists(t)) return ! 1;
+ if (e === this.$getRootId()) return ! 0;
+ if (!this.hasChild(e)) return ! 1;
+ var n = this.getItem(t),
+ i = this.getParent(t);
+ if (this.getItem(e).$level >= n.$level) return ! 1;
+ for (; n && this.exists(i);) {
+ if ((n = this.getItem(i)) && n.id == e) return ! 0;
+ i = this.getParent(n)
+ }
+ return ! 1
+ },
+ getSiblings: function(t) {
+ if (!this.exists(t)) return i.$create();
+ var e = this.getParent(t);
+ return this.getChildren(e)
+ },
+ getNextSibling: function(t) {
+ for (var e = this.getSiblings(t), n = 0, i = e.length; n < i; n++) if (e[n] == t) {
+ var r = e[n + 1];
+ return 0 === r && n > 0 && (r = "0"),
+ r || null
+ }
+ return null
+ },
+ getPrevSibling: function(t) {
+ for (var e = this.getSiblings(t), n = 0, i = e.length; n < i; n++) if (e[n] == t) {
+ var r = e[n - 1];
+ return 0 === r && n > 0 && (r = "0"),
+ r || null
+ }
+ return null
+ },
+ getParent: function(t) {
+ var e = null;
+ return (e = void 0 !== t.id ? t: this.getItem(t)) ? e[this.$parentProperty] : this.$getRootId()
+ },
+ clearAll: function() {
+ this._branches = {},
+ o.prototype.clearAll.call(this)
+ },
+ calculateItemLevel: function(t) {
+ var e = 0;
+ return this.eachParent(function() {
+ e++
+ },
+ t),
+ e
+ },
+ _setParentInner: function(t, e, n) {
+ n || (t.hasOwnProperty("$rendered_parent") ? this._move_branch(t, t.$rendered_parent, e) : this._move_branch(t, t[this.$parentProperty], e))
+ },
+ setParent: function(t, e, n) {
+ this._setParentInner(t, e, n),
+ t[this.$parentProperty] = e
+ },
+ _eachItemCached: function(t, e) {
+ for (var n = 0,
+ i = e.length; n < i; n++) t.call(this, e[n])
+ },
+ _eachItemIterate: function(t, e, n) {
+ var i = this.getChildren(e);
+ for (i.length && (i = i.slice().reverse()); i.length;) {
+ var r = i.pop(),
+ a = this.getItem(r);
+ if (t.call(this, a), n && n.push(a), this.hasChild(a.id)) for (var o = this.getChildren(a.id), s = o.length - 1; s >= 0; s--) i.push(o[s])
+ }
+ },
+ eachItem: function(t, e) {
+ var n = this.$getRootId();
+ r.defined(e) || (e = n);
+ var i = l(e, n) || n,
+ a = !1,
+ o = !1,
+ s = null;
+ i === n && (this._eachItemMainRangeCache ? (a = !0, s = this._eachItemMainRangeCache) : (o = !0, s = this._eachItemMainRangeCache = [])),
+ a ? this._eachItemCached(t, s) : this._eachItemIterate(t, i, o ? s: null)
+ },
+ eachParent: function(t, e) {
+ for (var n = {},
+ i = e,
+ r = this.getParent(i); this.exists(r);) {
+ if (n[r]) throw new Error("Invalid tasks tree. Cyclic reference has been detected on task " + r);
+ n[r] = !0,
+ i = this.getItem(r),
+ t.call(this, i),
+ r = this.getParent(i)
+ }
+ },
+ _add_branch: function(t, e, n) {
+ var r = void 0 === n ? this.getParent(t) : n;
+ this.hasChild(r) || (this._branches[r] = i.$create());
+ var a = this.getChildren(r);
+ a.indexOf(t.id + "") > -1 || a.indexOf( + t.id) > -1 || (1 * e == e ? a.splice(e, 0, t.id) : a.push(t.id), t.$rendered_parent = r)
+ },
+ _move_branch: function(t, e, n) {
+ this._eachItemMainRangeCache = null,
+ this._replace_branch_child(e, t.id),
+ this.exists(n) || n == this.$getRootId() ? this._add_branch(t, void 0, n) : delete this._branches[t.id],
+ t.$level = this.calculateItemLevel(t),
+ this.eachItem(function(t) {
+ t.$level = this.calculateItemLevel(t)
+ },
+ t.id)
+ },
+ _replace_branch_child: function(t, e, n) {
+ var r = this.getChildren(t);
+ if (r && void 0 !== t) {
+ var a = i.$create(),
+ o = r.indexOf(e + ""); - 1 != o || isNaN( + e) || (o = r.indexOf( + e)),
+ o > -1 && (n ? r.splice(o, 1, n) : r.splice(o, 1)),
+ a = r,
+ this._branches[t] = a
+ }
+ },
+ sort: function(t, e, n) {
+ this.exists(n) || (n = this.$getRootId()),
+ t || (t = "order");
+ var i = "string" == typeof t ?
+ function(e, n) {
+ return e[t] == n[t] || a.isDate(e[t]) && a.isDate(n[t]) && e[t].valueOf() == n[t].valueOf() ? 0 : e[t] > n[t] ? 1 : -1
+ }: t;
+ if (e) {
+ var r = i;
+ i = function(t, e) {
+ return r(e, t)
+ }
+ }
+ var o = this.getChildren(n);
+ if (o) {
+ for (var s = [], l = o.length - 1; l >= 0; l--) s[l] = this.getItem(o[l]);
+ s.sort(i);
+ for (l = 0; l < s.length; l++) o[l] = s[l].id,
+ this.sort(t, e, o[l])
+ }
+ },
+ filter: function(t) {
+ for (var e in this.pull) {
+ var n = this.pull[e].$rendered_parent,
+ i = this.getParent(this.pull[e]);
+ n !== i && this._move_branch(this.pull[e], n, i)
+ }
+ return o.prototype.filter.apply(this, arguments)
+ },
+ open: function(t) {
+ this.exists(t) && (this.getItem(t).$open = !0, this._skipTaskRecalculation = !0, this.callEvent("onItemOpen", [t]))
+ },
+ close: function(t) {
+ this.exists(t) && (this.getItem(t).$open = !1, this._skipTaskRecalculation = !0, this.callEvent("onItemClose", [t]))
+ },
+ destructor: function() {
+ o.prototype.destructor.call(this),
+ this._branches = null,
+ this._indexRangeCache = {},
+ this._eachItemMainRangeCache = null
+ }
+ },
+ o.prototype),
+ t.exports = c
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = {
+ $create: function(t) {
+ return i.mixin(t || [], this)
+ },
+ $removeAt: function(t, e) {
+ t >= 0 && this.splice(t, e || 1)
+ },
+ $remove: function(t) {
+ this.$removeAt(this.$find(t))
+ },
+ $insertAt: function(t, e) {
+ if (e || 0 === e) {
+ var n = this.splice(e, this.length - e);
+ this[e] = t,
+ this.push.apply(this, n)
+ } else this.push(t)
+ },
+ $find: function(t) {
+ for (var e = 0; e < this.length; e++) if (t == this[e]) return e;
+ return - 1
+ },
+ $each: function(t, e) {
+ for (var n = 0; n < this.length; n++) t.call(e || this, this[n])
+ },
+ $map: function(t, e) {
+ for (var n = 0; n < this.length; n++) this[n] = t.call(e || this, this[n]);
+ return this
+ },
+ $filter: function(t, e) {
+ for (var n = 0; n < this.length; n++) t.call(e || this, this[n]) || (this.splice(n, 1), n--);
+ return this
+ }
+ };
+ t.exports = r
+ },
+ function(t, e, n) {
+ var i = n(48),
+ r = n(0),
+ a = n(5),
+ o = n(16),
+ s = function(t) {
+ return this.pull = {},
+ this.$initItem = t.initItem,
+ this.visibleOrder = i.$create(),
+ this.fullOrder = i.$create(),
+ this._skip_refresh = !1,
+ this._filterRule = null,
+ this._searchVisibleOrder = {},
+ this._indexRangeCache = {},
+ this._getItemsCache = null,
+ this.$config = t,
+ a(this),
+ this._attachDataChange(function() {
+ return this._indexRangeCache = {},
+ this._getItemsCache = null,
+ !0
+ }),
+ this
+ };
+ s.prototype = {
+ _attachDataChange: function(t) {
+ this.attachEvent("onClearAll", t),
+ this.attachEvent("onBeforeParse", t),
+ this.attachEvent("onBeforeUpdate", t),
+ this.attachEvent("onBeforeDelete", t),
+ this.attachEvent("onBeforeAdd", t),
+ this.attachEvent("onParse", t),
+ this.attachEvent("onBeforeFilter", t)
+ },
+ _parseInner: function(t) {
+ for (var e = null,
+ n = [], i = 0, a = t.length; i < a; i++) e = t[i],
+ this.$initItem && (this.$config.copyOnParse() && (e = r.copy(e)), e = this.$initItem(e)),
+ this.callEvent("onItemLoading", [e]) && (this.pull.hasOwnProperty(e.id) || this.fullOrder.push(e.id), n.push(e), this.pull[e.id] = e);
+ return n
+ },
+ parse: function(t) {
+ this.isSilent() || this.callEvent("onBeforeParse", [t]);
+ var e = this._parseInner(t);
+ this.isSilent() || (this.refresh(), this.callEvent("onParse", [e]))
+ },
+ getItem: function(t) {
+ return this.pull[t]
+ },
+ _updateOrder: function(t) {
+ t.call(this.visibleOrder),
+ t.call(this.fullOrder)
+ },
+ updateItem: function(t, e) {
+ if (r.defined(e) || (e = this.getItem(t)), !this.isSilent() && !1 === this.callEvent("onBeforeUpdate", [e.id, e])) return ! 1;
+ r.mixin(this.pull[t], e, !0),
+ this.isSilent() || (this.callEvent("onAfterUpdate", [e.id, e]), this.callEvent("onStoreUpdated", [e.id, e, "update"]))
+ },
+ _removeItemInner: function(t) {
+ this._updateOrder(function() {
+ this.$remove(t)
+ }),
+ delete this.pull[t]
+ },
+ removeItem: function(t) {
+ var e = this.getItem(t);
+ if (!this.isSilent() && !1 === this.callEvent("onBeforeDelete", [e.id, e])) return ! 1;
+ this.callEvent("onAfterDeleteConfirmed", [e.id, e]),
+ this._removeItemInner(t),
+ this.isSilent() || (this.filter(), this.callEvent("onAfterDelete", [e.id, e]), this.callEvent("onStoreUpdated", [e.id, e, "delete"]))
+ },
+ _addItemInner: function(t, e) {
+ if (this.exists(t.id)) this.silent(function() {
+ this.updateItem(t.id, t)
+ });
+ else {
+ var n = this.visibleOrder,
+ i = n.length; (!r.defined(e) || e < 0) && (e = i),
+ e > i && (e = Math.min(n.length, e))
+ }
+ this.pull[t.id] = t,
+ this.isSilent() || this._updateOrder(function() { - 1 === this.$find(t.id) && this.$insertAt(t.id, e)
+ }),
+ this.filter()
+ },
+ isVisible: function(t) {
+ return this.visibleOrder.$find(t) > -1
+ },
+ getVisibleItems: function() {
+ return this.getIndexRange()
+ },
+ addItem: function(t, e) {
+ return r.defined(t.id) || (t.id = r.uid()),
+ this.$initItem && (t = this.$initItem(t)),
+ !(!this.isSilent() && !1 === this.callEvent("onBeforeAdd", [t.id, t])) && (this._addItemInner(t, e), this.isSilent() || (this.callEvent("onAfterAdd", [t.id, t]), this.callEvent("onStoreUpdated", [t.id, t, "add"])), t.id)
+ },
+ _changeIdInner: function(t, e) {
+ this.pull[t] && (this.pull[e] = this.pull[t]);
+ var n = this._searchVisibleOrder[t];
+ this.pull[e].id = e,
+ this._updateOrder(function() {
+ this[this.$find(t)] = e
+ }),
+ this._searchVisibleOrder[e] = n,
+ delete this._searchVisibleOrder[t],
+ delete this.pull[t]
+ },
+ changeId: function(t, e) {
+ this._changeIdInner(t, e),
+ this.callEvent("onIdChange", [t, e])
+ },
+ exists: function(t) {
+ return !! this.pull[t]
+ },
+ _moveInner: function(t, e) {
+ var n = this.getIdByIndex(t);
+ this._updateOrder(function() {
+ this.$removeAt(t),
+ this.$insertAt(n, Math.min(this.length, e))
+ })
+ },
+ move: function(t, e) {
+ var n = this.getIdByIndex(t),
+ i = this.getItem(n);
+ this._moveInner(t, e),
+ this.isSilent() || this.callEvent("onStoreUpdated", [i.id, i, "move"])
+ },
+ clearAll: function() {
+ this.$destroyed || (this.silent(function() {
+ this.unselect()
+ }), this.pull = {},
+ this.visibleOrder = i.$create(), this.fullOrder = i.$create(), this.isSilent() || (this.callEvent("onClearAll", []), this.refresh()))
+ },
+ silent: function(t, e) {
+ var n = !1;
+ this.isSilent() && (n = !0),
+ this._skip_refresh = !0,
+ t.call(e || this),
+ n || (this._skip_refresh = !1)
+ },
+ isSilent: function() {
+ return !! this._skip_refresh
+ },
+ arraysEqual: function(t, e) {
+ if (t.length !== e.length) return ! 1;
+ for (var n = 0; n < t.length; n++) if (t[n] !== e[n]) return ! 1;
+ return ! 0
+ },
+ refresh: function(t, e) {
+ var n, i;
+ if (!this.isSilent() && (t && (n = this.getItem(t)), i = t ? [t, n, "paint"] : [null, null, null], !1 !== this.callEvent("onBeforeStoreUpdate", i))) {
+ var r = this._quick_refresh && !this._mark_recompute;
+ if (this._mark_recompute = !1, t) {
+ if (!e && !r) {
+ var a = this.visibleOrder;
+ this.filter(),
+ this.arraysEqual(a, this.visibleOrder) || (t = void 0)
+ }
+ } else r || this.filter();
+ i = t ? [t, n, "paint"] : [null, null, null],
+ this.callEvent("onStoreUpdated", i)
+ }
+ },
+ count: function() {
+ return this.fullOrder.length
+ },
+ countVisible: function() {
+ return this.visibleOrder.length
+ },
+ sort: function(t) {},
+ serialize: function() {},
+ eachItem: function(t) {
+ for (var e = 0; e < this.fullOrder.length; e++) {
+ var n = this.getItem(this.fullOrder[e]);
+ t.call(this, n)
+ }
+ },
+ find: function(t) {
+ var e = [];
+ return this.eachItem(function(n) {
+ t(n) && e.push(n)
+ }),
+ e
+ },
+ filter: function(t) {
+ this.isSilent() || this.callEvent("onBeforeFilter", []),
+ this.callEvent("onPreFilter", []);
+ var e = i.$create(),
+ n = [];
+ this.eachItem(function(t) {
+ this.callEvent("onFilterItem", [t.id, t]) && (o(t.id, null, this, this._ganttConfig) ? n.push(t.id) : e.push(t.id))
+ });
+ for (var r = 0; r < n.length; r++) e.push(n[r]);
+ this.visibleOrder = e,
+ this._searchVisibleOrder = {};
+ for (r = 0; r < this.visibleOrder.length; r++) this._searchVisibleOrder[this.visibleOrder[r]] = r;
+ this.isSilent() || this.callEvent("onFilter", [])
+ },
+ getIndexRange: function(t, e) {
+ var n = Math.min(e || 1 / 0, this.countVisible() - 1),
+ i = t || 0,
+ r = i + "-" + n;
+ if (this._indexRangeCache[r]) return this._indexRangeCache[r].slice();
+ for (var a = [], o = i; o <= n; o++) a.push(this.getItem(this.visibleOrder[o]));
+ return this._indexRangeCache[r] = a.slice(),
+ a
+ },
+ getItems: function() {
+ if (this._getItemsCache) return this._getItemsCache.slice();
+ var t = [];
+ for (var e in this.pull) t.push(this.pull[e]);
+ return this._getItemsCache = t.slice(),
+ t
+ },
+ getIdByIndex: function(t) {
+ return this.visibleOrder[t]
+ },
+ getIndexById: function(t) {
+ var e = this._searchVisibleOrder[t];
+ return void 0 === e && (e = -1),
+ e
+ },
+ _getNullIfUndefined: function(t) {
+ return void 0 === t ? null: t
+ },
+ getFirst: function() {
+ return this._getNullIfUndefined(this.visibleOrder[0])
+ },
+ getLast: function() {
+ return this._getNullIfUndefined(this.visibleOrder[this.visibleOrder.length - 1])
+ },
+ getNext: function(t) {
+ return this._getNullIfUndefined(this.visibleOrder[this.getIndexById(t) + 1])
+ },
+ getPrev: function(t) {
+ return this._getNullIfUndefined(this.visibleOrder[this.getIndexById(t) - 1])
+ },
+ destructor: function() {
+ this.callEvent("onDestroy", []),
+ this.detachAllEvents(),
+ this.$destroyed = !0,
+ this.pull = null,
+ this.$initItem = null,
+ this.visibleOrder = null,
+ this.fullOrder = null,
+ this._skip_refresh = null,
+ this._filterRule = null,
+ this._searchVisibleOrder = null,
+ this._indexRangeCache = {}
+ }
+ },
+ t.exports = s
+ },
+ function(t, e) {
+ t.exports = function(t, e) {
+ if (!e) return ! 0;
+ if (t._on_timeout) return ! 1;
+ var n = Math.ceil(1e3 / e);
+ return n < 2 || (setTimeout(function() {
+ delete t._on_timeout
+ },
+ n), t._on_timeout = !0, !0)
+ }
+ },
+ function(t, e, n) {
+ var i = n(0);
+ t.exports = function t(e, n) {
+ e = e || i.event,
+ n = n || i.eventRemove;
+ var r = [],
+ a = {
+ attach: function(t, n, i, a) {
+ r.push({
+ element: t,
+ event: n,
+ callback: i,
+ capture: a
+ }),
+ e(t, n, i, a)
+ },
+ detach: function(t, e, i, a) {
+ n(t, e, i, a);
+ for (var o = 0; o < r.length; o++) {
+ var s = r[o];
+ s.element === t && s.event === e && s.callback === i && s.capture === a && (r.splice(o, 1), o--)
+ }
+ },
+ detachAll: function() {
+ for (var t = r.slice(), e = 0; e < t.length; e++) {
+ var n = t[e];
+ a.detach(n.element, n.event, n.callback, n.capture),
+ a.detach(n.element, n.event, n.callback, void 0),
+ a.detach(n.element, n.event, n.callback, !1),
+ a.detach(n.element, n.event, n.callback, !0)
+ }
+ r.splice(0, r.length)
+ },
+ extend: function() {
+ return t(this.event, this.eventRemove)
+ }
+ };
+ return a
+ }
+ },
+ function(t, e) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ t.exports = "object" == ("undefined" == typeof self ? "undefined": n(self)) ? self.FormData: window.FormData
+ },
+ function(t, e) { (function(e) {
+ t.exports = e
+ }).call(this, {})
+ },
+ function(t, e, n) {
+ "use strict";
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(278),
+ a = n(276);
+ function o() {
+ this.protocol = null,
+ this.slashes = null,
+ this.auth = null,
+ this.host = null,
+ this.port = null,
+ this.hostname = null,
+ this.hash = null,
+ this.search = null,
+ this.query = null,
+ this.pathname = null,
+ this.path = null,
+ this.href = null
+ }
+ e.parse = k,
+ e.resolve = function(t, e) {
+ return k(t, !1, !0).resolve(e)
+ },
+ e.resolveObject = function(t, e) {
+ return t ? k(t, !1, !0).resolveObject(e) : e
+ },
+ e.format = function(t) {
+ a.isString(t) && (t = k(t));
+ return t instanceof o ? t.format() : o.prototype.format.call(t)
+ },
+ e.Url = o;
+ var s = /^([a-z0-9.+-]+:)/i,
+ l = /:[0-9]*$/,
+ c = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
+ u = ["{", "}", "|", "\\", "^", "`"].concat(["<", ">", '"', "`", " ", "\r", "\n", "\t"]),
+ d = ["'"].concat(u),
+ h = ["%", "/", "?", ";", "#"].concat(d),
+ f = ["/", "?", "#"],
+ _ = /^[+a-z0-9A-Z_-]{0,63}$/,
+ g = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
+ p = {
+ javascript: !0,
+ "javascript:": !0
+ },
+ v = {
+ javascript: !0,
+ "javascript:": !0
+ },
+ m = {
+ http: !0,
+ https: !0,
+ ftp: !0,
+ gopher: !0,
+ file: !0,
+ "http:": !0,
+ "https:": !0,
+ "ftp:": !0,
+ "gopher:": !0,
+ "file:": !0
+ },
+ y = n(275);
+ function k(t, e, n) {
+ if (t && a.isObject(t) && t instanceof o) return t;
+ var i = new o;
+ return i.parse(t, e, n),
+ i
+ }
+ o.prototype.parse = function(t, e, n) {
+ if (!a.isString(t)) throw new TypeError("Parameter 'url' must be a string, not " + i(t));
+ var o = t.indexOf("?"),
+ l = -1 !== o && o < t.indexOf("#") ? "?": "#",
+ u = t.split(l);
+ u[0] = u[0].replace(/\\/g, "/");
+ var k = t = u.join(l);
+ if (k = k.trim(), !n && 1 === t.split("#").length) {
+ var b = c.exec(k);
+ if (b) return this.path = k,
+ this.href = k,
+ this.pathname = b[1],
+ b[2] ? (this.search = b[2], this.query = e ? y.parse(this.search.substr(1)) : this.search.substr(1)) : e && (this.search = "", this.query = {}),
+ this
+ }
+ var x = s.exec(k);
+ if (x) {
+ var w = (x = x[0]).toLowerCase();
+ this.protocol = w,
+ k = k.substr(x.length)
+ }
+ if (n || x || k.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+ var S = "//" === k.substr(0, 2); ! S || x && v[x] || (k = k.substr(2), this.slashes = !0)
+ }
+ if (!v[x] && (S || x && !m[x])) {
+ for (var T, $, C = -1,
+ E = 0; E < f.length; E++) { - 1 !== (A = k.indexOf(f[E])) && ( - 1 === C || A < C) && (C = A)
+ } - 1 !== ($ = -1 === C ? k.lastIndexOf("@") : k.lastIndexOf("@", C)) && (T = k.slice(0, $), k = k.slice($ + 1), this.auth = decodeURIComponent(T)),
+ C = -1;
+ for (E = 0; E < h.length; E++) {
+ var A; - 1 !== (A = k.indexOf(h[E])) && ( - 1 === C || A < C) && (C = A)
+ } - 1 === C && (C = k.length),
+ this.host = k.slice(0, C),
+ k = k.slice(C),
+ this.parseHost(),
+ this.hostname = this.hostname || "";
+ var D = "[" === this.hostname[0] && "]" === this.hostname[this.hostname.length - 1];
+ if (!D) for (var M = this.hostname.split(/\./), I = (E = 0, M.length); E < I; E++) {
+ var P = M[E];
+ if (P && !P.match(_)) {
+ for (var N = "",
+ O = 0,
+ L = P.length; O < L; O++) P.charCodeAt(O) > 127 ? N += "x": N += P[O];
+ if (!N.match(_)) {
+ var R = M.slice(0, E),
+ j = M.slice(E + 1),
+ H = P.match(g);
+ H && (R.push(H[1]), j.unshift(H[2])),
+ j.length && (k = "/" + j.join(".") + k),
+ this.hostname = R.join(".");
+ break
+ }
+ }
+ }
+ this.hostname.length > 255 ? this.hostname = "": this.hostname = this.hostname.toLowerCase(),
+ D || (this.hostname = r.toASCII(this.hostname));
+ var F = this.port ? ":" + this.port: "",
+ B = this.hostname || "";
+ this.host = B + F,
+ this.href += this.host,
+ D && (this.hostname = this.hostname.substr(1, this.hostname.length - 2), "/" !== k[0] && (k = "/" + k))
+ }
+ if (!p[w]) for (E = 0, I = d.length; E < I; E++) {
+ var z = d[E];
+ if ( - 1 !== k.indexOf(z)) {
+ var U = encodeURIComponent(z);
+ U === z && (U = escape(z)),
+ k = k.split(z).join(U)
+ }
+ }
+ var W = k.indexOf("#"); - 1 !== W && (this.hash = k.substr(W), k = k.slice(0, W));
+ var V = k.indexOf("?");
+ if ( - 1 !== V ? (this.search = k.substr(V), this.query = k.substr(V + 1), e && (this.query = y.parse(this.query)), k = k.slice(0, V)) : e && (this.search = "", this.query = {}), k && (this.pathname = k), m[w] && this.hostname && !this.pathname && (this.pathname = "/"), this.pathname || this.search) {
+ F = this.pathname || "";
+ var q = this.search || "";
+ this.path = F + q
+ }
+ return this.href = this.format(),
+ this
+ },
+ o.prototype.format = function() {
+ var t = this.auth || "";
+ t && (t = (t = encodeURIComponent(t)).replace(/%3A/i, ":"), t += "@");
+ var e = this.protocol || "",
+ n = this.pathname || "",
+ i = this.hash || "",
+ r = !1,
+ o = "";
+ this.host ? r = t + this.host: this.hostname && (r = t + ( - 1 === this.hostname.indexOf(":") ? this.hostname: "[" + this.hostname + "]"), this.port && (r += ":" + this.port)),
+ this.query && a.isObject(this.query) && Object.keys(this.query).length && (o = y.stringify(this.query));
+ var s = this.search || o && "?" + o || "";
+ return e && ":" !== e.substr( - 1) && (e += ":"),
+ this.slashes || (!e || m[e]) && !1 !== r ? (r = "//" + (r || ""), n && "/" !== n.charAt(0) && (n = "/" + n)) : r || (r = ""),
+ i && "#" !== i.charAt(0) && (i = "#" + i),
+ s && "?" !== s.charAt(0) && (s = "?" + s),
+ e + r + (n = n.replace(/[?#]/g,
+ function(t) {
+ return encodeURIComponent(t)
+ })) + (s = s.replace("#", "%23")) + i
+ },
+ o.prototype.resolve = function(t) {
+ return this.resolveObject(k(t, !1, !0)).format()
+ },
+ o.prototype.resolveObject = function(t) {
+ if (a.isString(t)) {
+ var e = new o;
+ e.parse(t, !1, !0),
+ t = e
+ }
+ for (var n = new o,
+ i = Object.keys(this), r = 0; r < i.length; r++) {
+ var s = i[r];
+ n[s] = this[s]
+ }
+ if (n.hash = t.hash, "" === t.href) return n.href = n.format(),
+ n;
+ if (t.slashes && !t.protocol) {
+ for (var l = Object.keys(t), c = 0; c < l.length; c++) {
+ var u = l[c];
+ "protocol" !== u && (n[u] = t[u])
+ }
+ return m[n.protocol] && n.hostname && !n.pathname && (n.path = n.pathname = "/"),
+ n.href = n.format(),
+ n
+ }
+ if (t.protocol && t.protocol !== n.protocol) {
+ if (!m[t.protocol]) {
+ for (var d = Object.keys(t), h = 0; h < d.length; h++) {
+ var f = d[h];
+ n[f] = t[f]
+ }
+ return n.href = n.format(),
+ n
+ }
+ if (n.protocol = t.protocol, t.host || v[t.protocol]) n.pathname = t.pathname;
+ else {
+ for (var _ = (t.pathname || "").split("/"); _.length && !(t.host = _.shift()););
+ t.host || (t.host = ""),
+ t.hostname || (t.hostname = ""),
+ "" !== _[0] && _.unshift(""),
+ _.length < 2 && _.unshift(""),
+ n.pathname = _.join("/")
+ }
+ if (n.search = t.search, n.query = t.query, n.host = t.host || "", n.auth = t.auth, n.hostname = t.hostname || t.host, n.port = t.port, n.pathname || n.search) {
+ var g = n.pathname || "",
+ p = n.search || "";
+ n.path = g + p
+ }
+ return n.slashes = n.slashes || t.slashes,
+ n.href = n.format(),
+ n
+ }
+ var y = n.pathname && "/" === n.pathname.charAt(0),
+ k = t.host || t.pathname && "/" === t.pathname.charAt(0),
+ b = k || y || n.host && t.pathname,
+ x = b,
+ w = n.pathname && n.pathname.split("/") || [],
+ S = (_ = t.pathname && t.pathname.split("/") || [], n.protocol && !m[n.protocol]);
+ if (S && (n.hostname = "", n.port = null, n.host && ("" === w[0] ? w[0] = n.host: w.unshift(n.host)), n.host = "", t.protocol && (t.hostname = null, t.port = null, t.host && ("" === _[0] ? _[0] = t.host: _.unshift(t.host)), t.host = null), b = b && ("" === _[0] || "" === w[0])), k) n.host = t.host || "" === t.host ? t.host: n.host,
+ n.hostname = t.hostname || "" === t.hostname ? t.hostname: n.hostname,
+ n.search = t.search,
+ n.query = t.query,
+ w = _;
+ else if (_.length) w || (w = []),
+ w.pop(),
+ w = w.concat(_),
+ n.search = t.search,
+ n.query = t.query;
+ else if (!a.isNullOrUndefined(t.search)) {
+ if (S) n.hostname = n.host = w.shift(),
+ (A = !!(n.host && n.host.indexOf("@") > 0) && n.host.split("@")) && (n.auth = A.shift(), n.host = n.hostname = A.shift());
+ return n.search = t.search,
+ n.query = t.query,
+ a.isNull(n.pathname) && a.isNull(n.search) || (n.path = (n.pathname ? n.pathname: "") + (n.search ? n.search: "")),
+ n.href = n.format(),
+ n
+ }
+ if (!w.length) return n.pathname = null,
+ n.search ? n.path = "/" + n.search: n.path = null,
+ n.href = n.format(),
+ n;
+ for (var T = w.slice( - 1)[0], $ = (n.host || t.host || w.length > 1) && ("." === T || ".." === T) || "" === T, C = 0, E = w.length; E >= 0; E--)"." === (T = w[E]) ? w.splice(E, 1) : ".." === T ? (w.splice(E, 1), C++) : C && (w.splice(E, 1), C--);
+ if (!b && !x) for (; C--; C) w.unshift(".."); ! b || "" === w[0] || w[0] && "/" === w[0].charAt(0) || w.unshift(""),
+ $ && "/" !== w.join("/").substr( - 1) && w.push("");
+ var A, D = "" === w[0] || w[0] && "/" === w[0].charAt(0);
+ S && (n.hostname = n.host = D ? "": w.length ? w.shift() : "", (A = !!(n.host && n.host.indexOf("@") > 0) && n.host.split("@")) && (n.auth = A.shift(), n.host = n.hostname = A.shift()));
+ return (b = b || n.host && w.length) && !D && w.unshift(""),
+ w.length ? n.pathname = w.join("/") : (n.pathname = null, n.path = null),
+ a.isNull(n.pathname) && a.isNull(n.search) || (n.path = (n.pathname ? n.pathname: "") + (n.search ? n.search: "")),
+ n.auth = t.auth || n.auth,
+ n.slashes = n.slashes || t.slashes,
+ n.href = n.format(),
+ n
+ },
+ o.prototype.parseHost = function() {
+ var t = this.host,
+ e = l.exec(t);
+ e && (":" !== (e = e[0]) && (this.port = e.substr(1)), t = t.substr(0, t.length - e.length)),
+ t && (this.hostname = t)
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ t.exports = a;
+ var i = n(12),
+ r = n(17);
+ function a(t) {
+ if (! (this instanceof a)) return new a(t);
+ i.call(this, t),
+ this._transformState = {
+ afterTransform: function(t, e) {
+ var n = this._transformState;
+ n.transforming = !1;
+ var i = n.writecb;
+ if (!i) return this.emit("error", new Error("write callback called multiple times"));
+ n.writechunk = null,
+ n.writecb = null,
+ null != e && this.push(e),
+ i(t);
+ var r = this._readableState;
+ r.reading = !1,
+ (r.needReadable || r.length < r.highWaterMark) && this._read(r.highWaterMark)
+ }.bind(this),
+ needTransform: !1,
+ transforming: !1,
+ writecb: null,
+ writechunk: null,
+ writeencoding: null
+ },
+ this._readableState.needReadable = !0,
+ this._readableState.sync = !1,
+ t && ("function" == typeof t.transform && (this._transform = t.transform), "function" == typeof t.flush && (this._flush = t.flush)),
+ this.on("prefinish", o)
+ }
+ function o() {
+ var t = this;
+ "function" == typeof this._flush ? this._flush(function(e, n) {
+ s(t, e, n)
+ }) : s(this, null, null)
+ }
+ function s(t, e, n) {
+ if (e) return t.emit("error", e);
+ if (null != n && t.push(n), t._writableState.length) throw new Error("Calling transform done when ws.length != 0");
+ if (t._transformState.transforming) throw new Error("Calling transform done when still transforming");
+ return t.push(null)
+ }
+ r.inherits = n(8),
+ r.inherits(a, i),
+ a.prototype.push = function(t, e) {
+ return this._transformState.needTransform = !1,
+ i.prototype.push.call(this, t, e)
+ },
+ a.prototype._transform = function(t, e, n) {
+ throw new Error("_transform() is not implemented")
+ },
+ a.prototype._write = function(t, e, n) {
+ var i = this._transformState;
+ if (i.writecb = n, i.writechunk = t, i.writeencoding = e, !i.transforming) {
+ var r = this._readableState; (i.needTransform || r.needReadable || r.length < r.highWaterMark) && this._read(r.highWaterMark)
+ }
+ },
+ a.prototype._read = function(t) {
+ var e = this._transformState;
+ null !== e.writechunk && e.writecb && !e.transforming ? (e.transforming = !0, this._transform(e.writechunk, e.writeencoding, e.afterTransform)) : e.needTransform = !0
+ },
+ a.prototype._destroy = function(t, e) {
+ var n = this;
+ i.prototype._destroy.call(this, t,
+ function(t) {
+ e(t),
+ n.emit("close")
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ var i = n(22).Buffer,
+ r = i.isEncoding ||
+ function(t) {
+ switch ((t = "" + t) && t.toLowerCase()) {
+ case "hex":
+ case "utf8":
+ case "utf-8":
+ case "ascii":
+ case "binary":
+ case "base64":
+ case "ucs2":
+ case "ucs-2":
+ case "utf16le":
+ case "utf-16le":
+ case "raw":
+ return ! 0;
+ default:
+ return ! 1
+ }
+ };
+ function a(t) {
+ var e;
+ switch (this.encoding = function(t) {
+ var e = function(t) {
+ if (!t) return "utf8";
+ for (var e;;) switch (t) {
+ case "utf8":
+ case "utf-8":
+ return "utf8";
+ case "ucs2":
+ case "ucs-2":
+ case "utf16le":
+ case "utf-16le":
+ return "utf16le";
+ case "latin1":
+ case "binary":
+ return "latin1";
+ case "base64":
+ case "ascii":
+ case "hex":
+ return t;
+ default:
+ if (e) return;
+ t = ("" + t).toLowerCase(),
+ e = !0
+ }
+ } (t);
+ if ("string" != typeof e && (i.isEncoding === r || !r(t))) throw new Error("Unknown encoding: " + t);
+ return e || t
+ } (t), this.encoding) {
+ case "utf16le":
+ this.text = l,
+ this.end = c,
+ e = 4;
+ break;
+ case "utf8":
+ this.fillLast = s,
+ e = 4;
+ break;
+ case "base64":
+ this.text = u,
+ this.end = d,
+ e = 3;
+ break;
+ default:
+ return this.write = h,
+ void(this.end = f)
+ }
+ this.lastNeed = 0,
+ this.lastTotal = 0,
+ this.lastChar = i.allocUnsafe(e)
+ }
+ function o(t) {
+ return t <= 127 ? 0 : t >> 5 == 6 ? 2 : t >> 4 == 14 ? 3 : t >> 3 == 30 ? 4 : t >> 6 == 2 ? -1 : -2
+ }
+ function s(t) {
+ var e = this.lastTotal - this.lastNeed,
+ n = function(t, e, n) {
+ if (128 != (192 & e[0])) return t.lastNeed = 0,
+ "锟�";
+ if (t.lastNeed > 1 && e.length > 1) {
+ if (128 != (192 & e[1])) return t.lastNeed = 1,
+ "锟�";
+ if (t.lastNeed > 2 && e.length > 2 && 128 != (192 & e[2])) return t.lastNeed = 2,
+ "锟�"
+ }
+ } (this, t);
+ return void 0 !== n ? n: this.lastNeed <= t.length ? (t.copy(this.lastChar, e, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (t.copy(this.lastChar, e, 0, t.length), void(this.lastNeed -= t.length))
+ }
+ function l(t, e) {
+ if ((t.length - e) % 2 == 0) {
+ var n = t.toString("utf16le", e);
+ if (n) {
+ var i = n.charCodeAt(n.length - 1);
+ if (i >= 55296 && i <= 56319) return this.lastNeed = 2,
+ this.lastTotal = 4,
+ this.lastChar[0] = t[t.length - 2],
+ this.lastChar[1] = t[t.length - 1],
+ n.slice(0, -1)
+ }
+ return n
+ }
+ return this.lastNeed = 1,
+ this.lastTotal = 2,
+ this.lastChar[0] = t[t.length - 1],
+ t.toString("utf16le", e, t.length - 1)
+ }
+ function c(t) {
+ var e = t && t.length ? this.write(t) : "";
+ if (this.lastNeed) {
+ var n = this.lastTotal - this.lastNeed;
+ return e + this.lastChar.toString("utf16le", 0, n)
+ }
+ return e
+ }
+ function u(t, e) {
+ var n = (t.length - e) % 3;
+ return 0 === n ? t.toString("base64", e) : (this.lastNeed = 3 - n, this.lastTotal = 3, 1 === n ? this.lastChar[0] = t[t.length - 1] : (this.lastChar[0] = t[t.length - 2], this.lastChar[1] = t[t.length - 1]), t.toString("base64", e, t.length - n))
+ }
+ function d(t) {
+ var e = t && t.length ? this.write(t) : "";
+ return this.lastNeed ? e + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : e
+ }
+ function h(t) {
+ return t.toString(this.encoding)
+ }
+ function f(t) {
+ return t && t.length ? this.write(t) : ""
+ }
+ e.StringDecoder = a,
+ a.prototype.write = function(t) {
+ if (0 === t.length) return "";
+ var e, n;
+ if (this.lastNeed) {
+ if (void 0 === (e = this.fillLast(t))) return "";
+ n = this.lastNeed,
+ this.lastNeed = 0
+ } else n = 0;
+ return n < t.length ? e ? e + this.text(t, n) : this.text(t, n) : e || ""
+ },
+ a.prototype.end = function(t) {
+ var e = t && t.length ? this.write(t) : "";
+ return this.lastNeed ? e + "锟�": e
+ },
+ a.prototype.text = function(t, e) {
+ var n = function(t, e, n) {
+ var i = e.length - 1;
+ if (i < n) return 0;
+ var r = o(e[i]);
+ if (r >= 0) return r > 0 && (t.lastNeed = r - 1),
+ r;
+ if (--i < n || -2 === r) return 0;
+ if ((r = o(e[i])) >= 0) return r > 0 && (t.lastNeed = r - 2),
+ r;
+ if (--i < n || -2 === r) return 0;
+ if ((r = o(e[i])) >= 0) return r > 0 && (2 === r ? r = 0 : t.lastNeed = r - 3),
+ r;
+ return 0
+ } (this, t, e);
+ if (!this.lastNeed) return t.toString("utf8", e);
+ this.lastTotal = n;
+ var i = t.length - (n - this.lastNeed);
+ return t.copy(this.lastChar, 0, i),
+ t.toString("utf8", e, i)
+ },
+ a.prototype.fillLast = function(t) {
+ if (this.lastNeed <= t.length) return t.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed),
+ this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ t.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, t.length),
+ this.lastNeed -= t.length
+ }
+ },
+ function(t, e, n) { (function(t) {
+ var i = void 0 !== t && t || "undefined" != typeof self && self || window,
+ r = Function.prototype.apply;
+ function a(t, e) {
+ this._id = t,
+ this._clearFn = e
+ }
+ e.setTimeout = function() {
+ return new a(r.call(setTimeout, i, arguments), clearTimeout)
+ },
+ e.setInterval = function() {
+ return new a(r.call(setInterval, i, arguments), clearInterval)
+ },
+ e.clearTimeout = e.clearInterval = function(t) {
+ t && t.close()
+ },
+ a.prototype.unref = a.prototype.ref = function() {},
+ a.prototype.close = function() {
+ this._clearFn.call(i, this._id)
+ },
+ e.enroll = function(t, e) {
+ clearTimeout(t._idleTimeoutId),
+ t._idleTimeout = e
+ },
+ e.unenroll = function(t) {
+ clearTimeout(t._idleTimeoutId),
+ t._idleTimeout = -1
+ },
+ e._unrefActive = e.active = function(t) {
+ clearTimeout(t._idleTimeoutId);
+ var e = t._idleTimeout;
+ e >= 0 && (t._idleTimeoutId = setTimeout(function() {
+ t._onTimeout && t._onTimeout()
+ },
+ e))
+ },
+ n(284),
+ e.setImmediate = "undefined" != typeof self && self.setImmediate || void 0 !== t && t.setImmediate || this && this.setImmediate,
+ e.clearImmediate = "undefined" != typeof self && self.clearImmediate || void 0 !== t && t.clearImmediate || this && this.clearImmediate
+ }).call(this, n(4))
+ },
+ function(t, e, n) {
+ "use strict"; (function(e, i, r) {
+ var a = n(23);
+ function o(t) {
+ var e = this;
+ this.next = null,
+ this.entry = null,
+ this.finish = function() { !
+ function(t, e, n) {
+ var i = t.entry;
+ t.entry = null;
+ for (; i;) {
+ var r = i.callback;
+ e.pendingcb--,
+ r(n),
+ i = i.next
+ }
+ e.corkedRequestsFree ? e.corkedRequestsFree.next = t: e.corkedRequestsFree = t
+ } (e, t)
+ }
+ }
+ t.exports = m;
+ var s, l = !e.browser && ["v0.10", "v0.9."].indexOf(e.version.slice(0, 5)) > -1 ? i: a.nextTick;
+ m.WritableState = v;
+ var c = n(17);
+ c.inherits = n(8);
+ var u = {
+ deprecate: n(283)
+ },
+ d = n(60),
+ h = n(22).Buffer,
+ f = r.Uint8Array ||
+ function() {};
+ var _, g = n(59);
+ function p() {}
+ function v(t, e) {
+ s = s || n(12),
+ t = t || {};
+ var i = e instanceof s;
+ this.objectMode = !!t.objectMode,
+ i && (this.objectMode = this.objectMode || !!t.writableObjectMode);
+ var r = t.highWaterMark,
+ c = t.writableHighWaterMark,
+ u = this.objectMode ? 16 : 16384;
+ this.highWaterMark = r || 0 === r ? r: i && (c || 0 === c) ? c: u,
+ this.highWaterMark = Math.floor(this.highWaterMark),
+ this.finalCalled = !1,
+ this.needDrain = !1,
+ this.ending = !1,
+ this.ended = !1,
+ this.finished = !1,
+ this.destroyed = !1;
+ var d = !1 === t.decodeStrings;
+ this.decodeStrings = !d,
+ this.defaultEncoding = t.defaultEncoding || "utf8",
+ this.length = 0,
+ this.writing = !1,
+ this.corked = 0,
+ this.sync = !0,
+ this.bufferProcessing = !1,
+ this.onwrite = function(t) { !
+ function(t, e) {
+ var n = t._writableState,
+ i = n.sync,
+ r = n.writecb;
+ if (function(t) {
+ t.writing = !1,
+ t.writecb = null,
+ t.length -= t.writelen,
+ t.writelen = 0
+ } (n), e) !
+ function(t, e, n, i, r) {--e.pendingcb,
+ n ? (a.nextTick(r, i), a.nextTick(S, t, e), t._writableState.errorEmitted = !0, t.emit("error", i)) : (r(i), t._writableState.errorEmitted = !0, t.emit("error", i), S(t, e))
+ } (t, n, i, e, r);
+ else {
+ var o = x(n);
+ o || n.corked || n.bufferProcessing || !n.bufferedRequest || b(t, n),
+ i ? l(k, t, n, o, r) : k(t, n, o, r)
+ }
+ } (e, t)
+ },
+ this.writecb = null,
+ this.writelen = 0,
+ this.bufferedRequest = null,
+ this.lastBufferedRequest = null,
+ this.pendingcb = 0,
+ this.prefinished = !1,
+ this.errorEmitted = !1,
+ this.bufferedRequestCount = 0,
+ this.corkedRequestsFree = new o(this)
+ }
+ function m(t) {
+ if (s = s || n(12), !(_.call(m, this) || this instanceof s)) return new m(t);
+ this._writableState = new v(t, this),
+ this.writable = !0,
+ t && ("function" == typeof t.write && (this._write = t.write), "function" == typeof t.writev && (this._writev = t.writev), "function" == typeof t.destroy && (this._destroy = t.destroy), "function" == typeof t.final && (this._final = t.final)),
+ d.call(this)
+ }
+ function y(t, e, n, i, r, a, o) {
+ e.writelen = i,
+ e.writecb = o,
+ e.writing = !0,
+ e.sync = !0,
+ n ? t._writev(r, e.onwrite) : t._write(r, a, e.onwrite),
+ e.sync = !1
+ }
+ function k(t, e, n, i) {
+ n ||
+ function(t, e) {
+ 0 === e.length && e.needDrain && (e.needDrain = !1, t.emit("drain"))
+ } (t, e),
+ e.pendingcb--,
+ i(),
+ S(t, e)
+ }
+ function b(t, e) {
+ e.bufferProcessing = !0;
+ var n = e.bufferedRequest;
+ if (t._writev && n && n.next) {
+ var i = e.bufferedRequestCount,
+ r = new Array(i),
+ a = e.corkedRequestsFree;
+ a.entry = n;
+ for (var s = 0,
+ l = !0; n;) r[s] = n,
+ n.isBuf || (l = !1),
+ n = n.next,
+ s += 1;
+ r.allBuffers = l,
+ y(t, e, !0, e.length, r, "", a.finish),
+ e.pendingcb++,
+ e.lastBufferedRequest = null,
+ a.next ? (e.corkedRequestsFree = a.next, a.next = null) : e.corkedRequestsFree = new o(e),
+ e.bufferedRequestCount = 0
+ } else {
+ for (; n;) {
+ var c = n.chunk,
+ u = n.encoding,
+ d = n.callback;
+ if (y(t, e, !1, e.objectMode ? 1 : c.length, c, u, d), n = n.next, e.bufferedRequestCount--, e.writing) break
+ }
+ null === n && (e.lastBufferedRequest = null)
+ }
+ e.bufferedRequest = n,
+ e.bufferProcessing = !1
+ }
+ function x(t) {
+ return t.ending && 0 === t.length && null === t.bufferedRequest && !t.finished && !t.writing
+ }
+ function w(t, e) {
+ t._final(function(n) {
+ e.pendingcb--,
+ n && t.emit("error", n),
+ e.prefinished = !0,
+ t.emit("prefinish"),
+ S(t, e)
+ })
+ }
+ function S(t, e) {
+ var n = x(e);
+ return n && (!
+ function(t, e) {
+ e.prefinished || e.finalCalled || ("function" == typeof t._final ? (e.pendingcb++, e.finalCalled = !0, a.nextTick(w, t, e)) : (e.prefinished = !0, t.emit("prefinish")))
+ } (t, e), 0 === e.pendingcb && (e.finished = !0, t.emit("finish"))),
+ n
+ }
+ c.inherits(m, d),
+ v.prototype.getBuffer = function() {
+ for (var t = this.bufferedRequest,
+ e = []; t;) e.push(t),
+ t = t.next;
+ return e
+ },
+ function() {
+ try {
+ Object.defineProperty(v.prototype, "buffer", {
+ get: u.deprecate(function() {
+ return this.getBuffer()
+ },
+ "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003")
+ })
+ } catch(t) {}
+ } (),
+ "function" == typeof Symbol && Symbol.hasInstance && "function" == typeof Function.prototype[Symbol.hasInstance] ? (_ = Function.prototype[Symbol.hasInstance], Object.defineProperty(m, Symbol.hasInstance, {
+ value: function(t) {
+ return !! _.call(this, t) || this === m && (t && t._writableState instanceof v)
+ }
+ })) : _ = function(t) {
+ return t instanceof this
+ },
+ m.prototype.pipe = function() {
+ this.emit("error", new Error("Cannot pipe, not readable"))
+ },
+ m.prototype.write = function(t, e, n) {
+ var i = this._writableState,
+ r = !1,
+ o = !i.objectMode &&
+ function(t) {
+ return h.isBuffer(t) || t instanceof f
+ } (t);
+ return o && !h.isBuffer(t) && (t = function(t) {
+ return h.from(t)
+ } (t)),
+ "function" == typeof e && (n = e, e = null),
+ o ? e = "buffer": e || (e = i.defaultEncoding),
+ "function" != typeof n && (n = p),
+ i.ended ?
+ function(t, e) {
+ var n = new Error("write after end");
+ t.emit("error", n),
+ a.nextTick(e, n)
+ } (this, n) : (o ||
+ function(t, e, n, i) {
+ var r = !0,
+ o = !1;
+ return null === n ? o = new TypeError("May not write null values to stream") : "string" == typeof n || void 0 === n || e.objectMode || (o = new TypeError("Invalid non-string/buffer chunk")),
+ o && (t.emit("error", o), a.nextTick(i, o), r = !1),
+ r
+ } (this, i, t, n)) && (i.pendingcb++, r = function(t, e, n, i, r, a) {
+ if (!n) {
+ var o = function(t, e, n) {
+ t.objectMode || !1 === t.decodeStrings || "string" != typeof e || (e = h.from(e, n));
+ return e
+ } (e, i, r);
+ i !== o && (n = !0, r = "buffer", i = o)
+ }
+ var s = e.objectMode ? 1 : i.length;
+ e.length += s;
+ var l = e.length < e.highWaterMark;
+ l || (e.needDrain = !0);
+ if (e.writing || e.corked) {
+ var c = e.lastBufferedRequest;
+ e.lastBufferedRequest = {
+ chunk: i,
+ encoding: r,
+ isBuf: n,
+ callback: a,
+ next: null
+ },
+ c ? c.next = e.lastBufferedRequest: e.bufferedRequest = e.lastBufferedRequest,
+ e.bufferedRequestCount += 1
+ } else y(t, e, !1, s, i, r, a);
+ return l
+ } (this, i, o, t, e, n)),
+ r
+ },
+ m.prototype.cork = function() {
+ this._writableState.corked++
+ },
+ m.prototype.uncork = function() {
+ var t = this._writableState;
+ t.corked && (t.corked--, t.writing || t.corked || t.finished || t.bufferProcessing || !t.bufferedRequest || b(this, t))
+ },
+ m.prototype.setDefaultEncoding = function(t) {
+ if ("string" == typeof t && (t = t.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((t + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + t);
+ return this._writableState.defaultEncoding = t,
+ this
+ },
+ Object.defineProperty(m.prototype, "writableHighWaterMark", {
+ enumerable: !1,
+ get: function() {
+ return this._writableState.highWaterMark
+ }
+ }),
+ m.prototype._write = function(t, e, n) {
+ n(new Error("_write() is not implemented"))
+ },
+ m.prototype._writev = null,
+ m.prototype.end = function(t, e, n) {
+ var i = this._writableState;
+ "function" == typeof t ? (n = t, t = null, e = null) : "function" == typeof e && (n = e, e = null),
+ null !== t && void 0 !== t && this.write(t, e),
+ i.corked && (i.corked = 1, this.uncork()),
+ i.ending || i.finished ||
+ function(t, e, n) {
+ e.ending = !0,
+ S(t, e),
+ n && (e.finished ? a.nextTick(n) : t.once("finish", n));
+ e.ended = !0,
+ t.writable = !1
+ } (this, i, n)
+ },
+ Object.defineProperty(m.prototype, "destroyed", {
+ get: function() {
+ return void 0 !== this._writableState && this._writableState.destroyed
+ },
+ set: function(t) {
+ this._writableState && (this._writableState.destroyed = t)
+ }
+ }),
+ m.prototype.destroy = g.destroy,
+ m.prototype._undestroy = g.undestroy,
+ m.prototype._destroy = function(t, e) {
+ this.end(),
+ e(t)
+ }
+ }).call(this, n(9), n(57).setImmediate, n(4))
+ },
+ function(t, e, n) {
+ "use strict";
+ var i = n(23);
+ function r(t, e) {
+ t.emit("error", e)
+ }
+ t.exports = {
+ destroy: function(t, e) {
+ var n = this,
+ a = this._readableState && this._readableState.destroyed,
+ o = this._writableState && this._writableState.destroyed;
+ return a || o ? (e ? e(t) : !t || this._writableState && this._writableState.errorEmitted || i.nextTick(r, this, t), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(t || null,
+ function(t) { ! e && t ? (i.nextTick(r, n, t), n._writableState && (n._writableState.errorEmitted = !0)) : e && e(t)
+ }), this)
+ },
+ undestroy: function() {
+ this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1),
+ this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1)
+ }
+ }
+ },
+ function(t, e, n) {
+ t.exports = n(61).EventEmitter
+ },
+ function(t, e) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ function i() {
+ this._events = this._events || {},
+ this._maxListeners = this._maxListeners || void 0
+ }
+ function r(t) {
+ return "function" == typeof t
+ }
+ function a(t) {
+ return "object" === n(t) && null !== t
+ }
+ function o(t) {
+ return void 0 === t
+ }
+ t.exports = i,
+ i.EventEmitter = i,
+ i.prototype._events = void 0,
+ i.prototype._maxListeners = void 0,
+ i.defaultMaxListeners = 10,
+ i.prototype.setMaxListeners = function(t) {
+ if (!
+ function(t) {
+ return "number" == typeof t
+ } (t) || t < 0 || isNaN(t)) throw TypeError("n must be a positive number");
+ return this._maxListeners = t,
+ this
+ },
+ i.prototype.emit = function(t) {
+ var e, n, i, s, l, c;
+ if (this._events || (this._events = {}), "error" === t && (!this._events.error || a(this._events.error) && !this._events.error.length)) {
+ if ((e = arguments[1]) instanceof Error) throw e;
+ var u = new Error('Uncaught, unspecified "error" event. (' + e + ")");
+ throw u.context = e,
+ u
+ }
+ if (o(n = this._events[t])) return ! 1;
+ if (r(n)) switch (arguments.length) {
+ case 1:
+ n.call(this);
+ break;
+ case 2:
+ n.call(this, arguments[1]);
+ break;
+ case 3:
+ n.call(this, arguments[1], arguments[2]);
+ break;
+ default:
+ s = Array.prototype.slice.call(arguments, 1),
+ n.apply(this, s)
+ } else if (a(n)) for (s = Array.prototype.slice.call(arguments, 1), i = (c = n.slice()).length, l = 0; l < i; l++) c[l].apply(this, s);
+ return ! 0
+ },
+ i.prototype.addListener = function(t, e) {
+ var n;
+ if (!r(e)) throw TypeError("listener must be a function");
+ return this._events || (this._events = {}),
+ this._events.newListener && this.emit("newListener", t, r(e.listener) ? e.listener: e),
+ this._events[t] ? a(this._events[t]) ? this._events[t].push(e) : this._events[t] = [this._events[t], e] : this._events[t] = e,
+ a(this._events[t]) && !this._events[t].warned && (n = o(this._maxListeners) ? i.defaultMaxListeners: this._maxListeners) && n > 0 && this._events[t].length > n && (this._events[t].warned = !0, console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[t].length), "function" == typeof console.trace && console.trace()),
+ this
+ },
+ i.prototype.on = i.prototype.addListener,
+ i.prototype.once = function(t, e) {
+ if (!r(e)) throw TypeError("listener must be a function");
+ var n = !1;
+ function i() {
+ this.removeListener(t, i),
+ n || (n = !0, e.apply(this, arguments))
+ }
+ return i.listener = e,
+ this.on(t, i),
+ this
+ },
+ i.prototype.removeListener = function(t, e) {
+ var n, i, o, s;
+ if (!r(e)) throw TypeError("listener must be a function");
+ if (!this._events || !this._events[t]) return this;
+ if (o = (n = this._events[t]).length, i = -1, n === e || r(n.listener) && n.listener === e) delete this._events[t],
+ this._events.removeListener && this.emit("removeListener", t, e);
+ else if (a(n)) {
+ for (s = o; s-->0;) if (n[s] === e || n[s].listener && n[s].listener === e) {
+ i = s;
+ break
+ }
+ if (i < 0) return this;
+ 1 === n.length ? (n.length = 0, delete this._events[t]) : n.splice(i, 1),
+ this._events.removeListener && this.emit("removeListener", t, e)
+ }
+ return this
+ },
+ i.prototype.removeAllListeners = function(t) {
+ var e, n;
+ if (!this._events) return this;
+ if (!this._events.removeListener) return 0 === arguments.length ? this._events = {}: this._events[t] && delete this._events[t],
+ this;
+ if (0 === arguments.length) {
+ for (e in this._events)"removeListener" !== e && this.removeAllListeners(e);
+ return this.removeAllListeners("removeListener"),
+ this._events = {},
+ this
+ }
+ if (r(n = this._events[t])) this.removeListener(t, n);
+ else if (n) for (; n.length;) this.removeListener(t, n[n.length - 1]);
+ return delete this._events[t],
+ this
+ },
+ i.prototype.listeners = function(t) {
+ return this._events && this._events[t] ? r(this._events[t]) ? [this._events[t]] : this._events[t].slice() : []
+ },
+ i.prototype.listenerCount = function(t) {
+ if (this._events) {
+ var e = this._events[t];
+ if (r(e)) return 1;
+ if (e) return e.length
+ }
+ return 0
+ },
+ i.listenerCount = function(t, e) {
+ return t.listenerCount(e)
+ }
+ },
+ function(t, e, n) {
+ "use strict"; (function(e, i) {
+ var r = n(23);
+ t.exports = y;
+ var a, o = n(67);
+ y.ReadableState = m;
+ n(61).EventEmitter;
+ var s = function(t, e) {
+ return t.listeners(e).length
+ },
+ l = n(60),
+ c = n(22).Buffer,
+ u = e.Uint8Array ||
+ function() {};
+ var d = n(17);
+ d.inherits = n(8);
+ var h = n(287),
+ f = void 0;
+ f = h && h.debuglog ? h.debuglog("stream") : function() {};
+ var _, g = n(286),
+ p = n(59);
+ d.inherits(y, l);
+ var v = ["error", "close", "destroy", "pause", "resume"];
+ function m(t, e) {
+ a = a || n(12),
+ t = t || {};
+ var i = e instanceof a;
+ this.objectMode = !!t.objectMode,
+ i && (this.objectMode = this.objectMode || !!t.readableObjectMode);
+ var r = t.highWaterMark,
+ o = t.readableHighWaterMark,
+ s = this.objectMode ? 16 : 16384;
+ this.highWaterMark = r || 0 === r ? r: i && (o || 0 === o) ? o: s,
+ this.highWaterMark = Math.floor(this.highWaterMark),
+ this.buffer = new g,
+ this.length = 0,
+ this.pipes = null,
+ this.pipesCount = 0,
+ this.flowing = null,
+ this.ended = !1,
+ this.endEmitted = !1,
+ this.reading = !1,
+ this.sync = !0,
+ this.needReadable = !1,
+ this.emittedReadable = !1,
+ this.readableListening = !1,
+ this.resumeScheduled = !1,
+ this.destroyed = !1,
+ this.defaultEncoding = t.defaultEncoding || "utf8",
+ this.awaitDrain = 0,
+ this.readingMore = !1,
+ this.decoder = null,
+ this.encoding = null,
+ t.encoding && (_ || (_ = n(56).StringDecoder), this.decoder = new _(t.encoding), this.encoding = t.encoding)
+ }
+ function y(t) {
+ if (a = a || n(12), !(this instanceof y)) return new y(t);
+ this._readableState = new m(t, this),
+ this.readable = !0,
+ t && ("function" == typeof t.read && (this._read = t.read), "function" == typeof t.destroy && (this._destroy = t.destroy)),
+ l.call(this)
+ }
+ function k(t, e, n, i, r) {
+ var a, o = t._readableState;
+ null === e ? (o.reading = !1,
+ function(t, e) {
+ if (e.ended) return;
+ if (e.decoder) {
+ var n = e.decoder.end();
+ n && n.length && (e.buffer.push(n), e.length += e.objectMode ? 1 : n.length)
+ }
+ e.ended = !0,
+ S(t)
+ } (t, o)) : (r || (a = function(t, e) {
+ var n; (function(t) {
+ return c.isBuffer(t) || t instanceof u
+ })(e) || "string" == typeof e || void 0 === e || t.objectMode || (n = new TypeError("Invalid non-string/buffer chunk"));
+ return n
+ } (o, e)), a ? t.emit("error", a) : o.objectMode || e && e.length > 0 ? ("string" == typeof e || o.objectMode || Object.getPrototypeOf(e) === c.prototype || (e = function(t) {
+ return c.from(t)
+ } (e)), i ? o.endEmitted ? t.emit("error", new Error("stream.unshift() after end event")) : b(t, o, e, !0) : o.ended ? t.emit("error", new Error("stream.push() after EOF")) : (o.reading = !1, o.decoder && !n ? (e = o.decoder.write(e), o.objectMode || 0 !== e.length ? b(t, o, e, !1) : $(t, o)) : b(t, o, e, !1))) : i || (o.reading = !1));
+ return function(t) {
+ return ! t.ended && (t.needReadable || t.length < t.highWaterMark || 0 === t.length)
+ } (o)
+ }
+ function b(t, e, n, i) {
+ e.flowing && 0 === e.length && !e.sync ? (t.emit("data", n), t.read(0)) : (e.length += e.objectMode ? 1 : n.length, i ? e.buffer.unshift(n) : e.buffer.push(n), e.needReadable && S(t)),
+ $(t, e)
+ }
+ Object.defineProperty(y.prototype, "destroyed", {
+ get: function() {
+ return void 0 !== this._readableState && this._readableState.destroyed
+ },
+ set: function(t) {
+ this._readableState && (this._readableState.destroyed = t)
+ }
+ }),
+ y.prototype.destroy = p.destroy,
+ y.prototype._undestroy = p.undestroy,
+ y.prototype._destroy = function(t, e) {
+ this.push(null),
+ e(t)
+ },
+ y.prototype.push = function(t, e) {
+ var n, i = this._readableState;
+ return i.objectMode ? n = !0 : "string" == typeof t && ((e = e || i.defaultEncoding) !== i.encoding && (t = c.from(t, e), e = ""), n = !0),
+ k(this, t, e, !1, n)
+ },
+ y.prototype.unshift = function(t) {
+ return k(this, t, null, !0, !1)
+ },
+ y.prototype.isPaused = function() {
+ return ! 1 === this._readableState.flowing
+ },
+ y.prototype.setEncoding = function(t) {
+ return _ || (_ = n(56).StringDecoder),
+ this._readableState.decoder = new _(t),
+ this._readableState.encoding = t,
+ this
+ };
+ var x = 8388608;
+ function w(t, e) {
+ return t <= 0 || 0 === e.length && e.ended ? 0 : e.objectMode ? 1 : t != t ? e.flowing && e.length ? e.buffer.head.data.length: e.length: (t > e.highWaterMark && (e.highWaterMark = function(t) {
+ return t >= x ? t = x: (t--, t |= t >>> 1, t |= t >>> 2, t |= t >>> 4, t |= t >>> 8, t |= t >>> 16, t++),
+ t
+ } (t)), t <= e.length ? t: e.ended ? e.length: (e.needReadable = !0, 0))
+ }
+ function S(t) {
+ var e = t._readableState;
+ e.needReadable = !1,
+ e.emittedReadable || (f("emitReadable", e.flowing), e.emittedReadable = !0, e.sync ? r.nextTick(T, t) : T(t))
+ }
+ function T(t) {
+ f("emit readable"),
+ t.emit("readable"),
+ D(t)
+ }
+ function $(t, e) {
+ e.readingMore || (e.readingMore = !0, r.nextTick(C, t, e))
+ }
+ function C(t, e) {
+ for (var n = e.length; ! e.reading && !e.flowing && !e.ended && e.length < e.highWaterMark && (f("maybeReadMore read 0"), t.read(0), n !== e.length);) n = e.length;
+ e.readingMore = !1
+ }
+ function E(t) {
+ f("readable nexttick read 0"),
+ t.read(0)
+ }
+ function A(t, e) {
+ e.reading || (f("resume read 0"), t.read(0)),
+ e.resumeScheduled = !1,
+ e.awaitDrain = 0,
+ t.emit("resume"),
+ D(t),
+ e.flowing && !e.reading && t.read(0)
+ }
+ function D(t) {
+ var e = t._readableState;
+ for (f("flow", e.flowing); e.flowing && null !== t.read(););
+ }
+ function M(t, e) {
+ return 0 === e.length ? null: (e.objectMode ? n = e.buffer.shift() : !t || t >= e.length ? (n = e.decoder ? e.buffer.join("") : 1 === e.buffer.length ? e.buffer.head.data: e.buffer.concat(e.length), e.buffer.clear()) : n = function(t, e, n) {
+ var i;
+ t < e.head.data.length ? (i = e.head.data.slice(0, t), e.head.data = e.head.data.slice(t)) : i = t === e.head.data.length ? e.shift() : n ?
+ function(t, e) {
+ var n = e.head,
+ i = 1,
+ r = n.data;
+ t -= r.length;
+ for (; n = n.next;) {
+ var a = n.data,
+ o = t > a.length ? a.length: t;
+ if (o === a.length ? r += a: r += a.slice(0, t), 0 === (t -= o)) {
+ o === a.length ? (++i, n.next ? e.head = n.next: e.head = e.tail = null) : (e.head = n, n.data = a.slice(o));
+ break
+ }++i
+ }
+ return e.length -= i,
+ r
+ } (t, e) : function(t, e) {
+ var n = c.allocUnsafe(t),
+ i = e.head,
+ r = 1;
+ i.data.copy(n),
+ t -= i.data.length;
+ for (; i = i.next;) {
+ var a = i.data,
+ o = t > a.length ? a.length: t;
+ if (a.copy(n, n.length - t, 0, o), 0 === (t -= o)) {
+ o === a.length ? (++r, i.next ? e.head = i.next: e.head = e.tail = null) : (e.head = i, i.data = a.slice(o));
+ break
+ }++r
+ }
+ return e.length -= r,
+ n
+ } (t, e);
+ return i
+ } (t, e.buffer, e.decoder), n);
+ var n
+ }
+ function I(t) {
+ var e = t._readableState;
+ if (e.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+ e.endEmitted || (e.ended = !0, r.nextTick(P, e, t))
+ }
+ function P(t, e) {
+ t.endEmitted || 0 !== t.length || (t.endEmitted = !0, e.readable = !1, e.emit("end"))
+ }
+ function N(t, e) {
+ for (var n = 0,
+ i = t.length; n < i; n++) if (t[n] === e) return n;
+ return - 1
+ }
+ y.prototype.read = function(t) {
+ f("read", t),
+ t = parseInt(t, 10);
+ var e = this._readableState,
+ n = t;
+ if (0 !== t && (e.emittedReadable = !1), 0 === t && e.needReadable && (e.length >= e.highWaterMark || e.ended)) return f("read: emitReadable", e.length, e.ended),
+ 0 === e.length && e.ended ? I(this) : S(this),
+ null;
+ if (0 === (t = w(t, e)) && e.ended) return 0 === e.length && I(this),
+ null;
+ var i, r = e.needReadable;
+ return f("need readable", r),
+ (0 === e.length || e.length - t < e.highWaterMark) && f("length less than watermark", r = !0),
+ e.ended || e.reading ? f("reading or ended", r = !1) : r && (f("do read"), e.reading = !0, e.sync = !0, 0 === e.length && (e.needReadable = !0), this._read(e.highWaterMark), e.sync = !1, e.reading || (t = w(n, e))),
+ null === (i = t > 0 ? M(t, e) : null) ? (e.needReadable = !0, t = 0) : e.length -= t,
+ 0 === e.length && (e.ended || (e.needReadable = !0), n !== t && e.ended && I(this)),
+ null !== i && this.emit("data", i),
+ i
+ },
+ y.prototype._read = function(t) {
+ this.emit("error", new Error("_read() is not implemented"))
+ },
+ y.prototype.pipe = function(t, e) {
+ var n = this,
+ a = this._readableState;
+ switch (a.pipesCount) {
+ case 0:
+ a.pipes = t;
+ break;
+ case 1:
+ a.pipes = [a.pipes, t];
+ break;
+ default:
+ a.pipes.push(t)
+ }
+ a.pipesCount += 1,
+ f("pipe count=%d opts=%j", a.pipesCount, e);
+ var l = (!e || !1 !== e.end) && t !== i.stdout && t !== i.stderr ? u: y;
+ function c(e, i) {
+ f("onunpipe"),
+ e === n && i && !1 === i.hasUnpiped && (i.hasUnpiped = !0, f("cleanup"), t.removeListener("close", v), t.removeListener("finish", m), t.removeListener("drain", d), t.removeListener("error", p), t.removeListener("unpipe", c), n.removeListener("end", u), n.removeListener("end", y), n.removeListener("data", g), h = !0, !a.awaitDrain || t._writableState && !t._writableState.needDrain || d())
+ }
+ function u() {
+ f("onend"),
+ t.end()
+ }
+ a.endEmitted ? r.nextTick(l) : n.once("end", l),
+ t.on("unpipe", c);
+ var d = function(t) {
+ return function() {
+ var e = t._readableState;
+ f("pipeOnDrain", e.awaitDrain),
+ e.awaitDrain && e.awaitDrain--,
+ 0 === e.awaitDrain && s(t, "data") && (e.flowing = !0, D(t))
+ }
+ } (n);
+ t.on("drain", d);
+ var h = !1;
+ var _ = !1;
+ function g(e) {
+ f("ondata"),
+ _ = !1,
+ !1 !== t.write(e) || _ || ((1 === a.pipesCount && a.pipes === t || a.pipesCount > 1 && -1 !== N(a.pipes, t)) && !h && (f("false write response, pause", n._readableState.awaitDrain), n._readableState.awaitDrain++, _ = !0), n.pause())
+ }
+ function p(e) {
+ f("onerror", e),
+ y(),
+ t.removeListener("error", p),
+ 0 === s(t, "error") && t.emit("error", e)
+ }
+ function v() {
+ t.removeListener("finish", m),
+ y()
+ }
+ function m() {
+ f("onfinish"),
+ t.removeListener("close", v),
+ y()
+ }
+ function y() {
+ f("unpipe"),
+ n.unpipe(t)
+ }
+ return n.on("data", g),
+ function(t, e, n) {
+ if ("function" == typeof t.prependListener) return t.prependListener(e, n);
+ t._events && t._events[e] ? o(t._events[e]) ? t._events[e].unshift(n) : t._events[e] = [n, t._events[e]] : t.on(e, n)
+ } (t, "error", p),
+ t.once("close", v),
+ t.once("finish", m),
+ t.emit("pipe", n),
+ a.flowing || (f("pipe resume"), n.resume()),
+ t
+ },
+ y.prototype.unpipe = function(t) {
+ var e = this._readableState,
+ n = {
+ hasUnpiped: !1
+ };
+ if (0 === e.pipesCount) return this;
+ if (1 === e.pipesCount) return t && t !== e.pipes ? this: (t || (t = e.pipes), e.pipes = null, e.pipesCount = 0, e.flowing = !1, t && t.emit("unpipe", this, n), this);
+ if (!t) {
+ var i = e.pipes,
+ r = e.pipesCount;
+ e.pipes = null,
+ e.pipesCount = 0,
+ e.flowing = !1;
+ for (var a = 0; a < r; a++) i[a].emit("unpipe", this, n);
+ return this
+ }
+ var o = N(e.pipes, t);
+ return - 1 === o ? this: (e.pipes.splice(o, 1), e.pipesCount -= 1, 1 === e.pipesCount && (e.pipes = e.pipes[0]), t.emit("unpipe", this, n), this)
+ },
+ y.prototype.on = function(t, e) {
+ var n = l.prototype.on.call(this, t, e);
+ if ("data" === t) ! 1 !== this._readableState.flowing && this.resume();
+ else if ("readable" === t) {
+ var i = this._readableState;
+ i.endEmitted || i.readableListening || (i.readableListening = i.needReadable = !0, i.emittedReadable = !1, i.reading ? i.length && S(this) : r.nextTick(E, this))
+ }
+ return n
+ },
+ y.prototype.addListener = y.prototype.on,
+ y.prototype.resume = function() {
+ var t = this._readableState;
+ return t.flowing || (f("resume"), t.flowing = !0,
+ function(t, e) {
+ e.resumeScheduled || (e.resumeScheduled = !0, r.nextTick(A, t, e))
+ } (this, t)),
+ this
+ },
+ y.prototype.pause = function() {
+ return f("call pause flowing=%j", this._readableState.flowing),
+ !1 !== this._readableState.flowing && (f("pause"), this._readableState.flowing = !1, this.emit("pause")),
+ this
+ },
+ y.prototype.wrap = function(t) {
+ var e = this,
+ n = this._readableState,
+ i = !1;
+ for (var r in t.on("end",
+ function() {
+ if (f("wrapped end"), n.decoder && !n.ended) {
+ var t = n.decoder.end();
+ t && t.length && e.push(t)
+ }
+ e.push(null)
+ }), t.on("data",
+ function(r) { (f("wrapped data"), n.decoder && (r = n.decoder.write(r)), !n.objectMode || null !== r && void 0 !== r) && ((n.objectMode || r && r.length) && (e.push(r) || (i = !0, t.pause())))
+ }), t) void 0 === this[r] && "function" == typeof t[r] && (this[r] = function(e) {
+ return function() {
+ return t[e].apply(t, arguments)
+ }
+ } (r));
+ for (var a = 0; a < v.length; a++) t.on(v[a], this.emit.bind(this, v[a]));
+ return this._read = function(e) {
+ f("wrapped _read", e),
+ i && (i = !1, t.resume())
+ },
+ this
+ },
+ Object.defineProperty(y.prototype, "readableHighWaterMark", {
+ enumerable: !1,
+ get: function() {
+ return this._readableState.highWaterMark
+ }
+ }),
+ y._fromList = M
+ }).call(this, n(4), n(9))
+ },
+ function(t, e, n) { (e = t.exports = n(62)).Stream = e,
+ e.Readable = e,
+ e.Writable = n(58),
+ e.Duplex = n(12),
+ e.Transform = n(55),
+ e.PassThrough = n(282)
+ },
+ function(t, e, n) { (function(t, i, r) {
+ var a = n(65),
+ o = n(8),
+ s = n(63),
+ l = e.readyStates = {
+ UNSENT: 0,
+ OPENED: 1,
+ HEADERS_RECEIVED: 2,
+ LOADING: 3,
+ DONE: 4
+ },
+ c = e.IncomingMessage = function(e, n, o, l) {
+ var c = this;
+ if (s.Readable.call(c), c._mode = o, c.headers = {},
+ c.rawHeaders = [], c.trailers = {},
+ c.rawTrailers = [], c.on("end",
+ function() {
+ t.nextTick(function() {
+ c.emit("close")
+ })
+ }), "fetch" === o) {
+ if (c._fetchResponse = n, c.url = n.url, c.statusCode = n.status, c.statusMessage = n.statusText, n.headers.forEach(function(t, e) {
+ c.headers[e.toLowerCase()] = t,
+ c.rawHeaders.push(e, t)
+ }), a.writableStream) {
+ var u = new WritableStream({
+ write: function(t) {
+ return new Promise(function(e, n) {
+ c._destroyed ? n() : c.push(new r(t)) ? e() : c._resumeFetch = e
+ })
+ },
+ close: function() {
+ i.clearTimeout(l),
+ c._destroyed || c.push(null)
+ },
+ abort: function(t) {
+ c._destroyed || c.emit("error", t)
+ }
+ });
+ try {
+ return void n.body.pipeTo(u).
+ catch(function(t) {
+ i.clearTimeout(l),
+ c._destroyed || c.emit("error", t)
+ })
+ } catch(t) {}
+ }
+ var d = n.body.getReader(); !
+ function t() {
+ d.read().then(function(e) {
+ if (!c._destroyed) {
+ if (e.done) return i.clearTimeout(l),
+ void c.push(null);
+ c.push(new r(e.value)),
+ t()
+ }
+ }).
+ catch(function(t) {
+ i.clearTimeout(l),
+ c._destroyed || c.emit("error", t)
+ })
+ } ()
+ } else {
+ if (c._xhr = e, c._pos = 0, c.url = e.responseURL, c.statusCode = e.status, c.statusMessage = e.statusText, e.getAllResponseHeaders().split(/\r?\n/).forEach(function(t) {
+ var e = t.match(/^([^:]+):\s*(.*)/);
+ if (e) {
+ var n = e[1].toLowerCase();
+ "set-cookie" === n ? (void 0 === c.headers[n] && (c.headers[n] = []), c.headers[n].push(e[2])) : void 0 !== c.headers[n] ? c.headers[n] += ", " + e[2] : c.headers[n] = e[2],
+ c.rawHeaders.push(e[1], e[2])
+ }
+ }), c._charset = "x-user-defined", !a.overrideMimeType) {
+ var h = c.rawHeaders["mime-type"];
+ if (h) {
+ var f = h.match(/;\s*charset=([^;])(;|$)/);
+ f && (c._charset = f[1].toLowerCase())
+ }
+ c._charset || (c._charset = "utf-8")
+ }
+ }
+ };
+ o(c, s.Readable),
+ c.prototype._read = function() {
+ var t = this._resumeFetch;
+ t && (this._resumeFetch = null, t())
+ },
+ c.prototype._onXHRProgress = function() {
+ var t = this,
+ e = t._xhr,
+ n = null;
+ switch (t._mode) {
+ case "text:vbarray":
+ if (e.readyState !== l.DONE) break;
+ try {
+ n = new i.VBArray(e.responseBody).toArray()
+ } catch(t) {}
+ if (null !== n) {
+ t.push(new r(n));
+ break
+ }
+ case "text":
+ try {
+ n = e.responseText
+ } catch(e) {
+ t._mode = "text:vbarray";
+ break
+ }
+ if (n.length > t._pos) {
+ var a = n.substr(t._pos);
+ if ("x-user-defined" === t._charset) {
+ for (var o = new r(a.length), s = 0; s < a.length; s++) o[s] = 255 & a.charCodeAt(s);
+ t.push(o)
+ } else t.push(a, t._charset);
+ t._pos = n.length
+ }
+ break;
+ case "arraybuffer":
+ if (e.readyState !== l.DONE || !e.response) break;
+ n = e.response,
+ t.push(new r(new Uint8Array(n)));
+ break;
+ case "moz-chunked-arraybuffer":
+ if (n = e.response, e.readyState !== l.LOADING || !n) break;
+ t.push(new r(new Uint8Array(n)));
+ break;
+ case "ms-stream":
+ if (n = e.response, e.readyState !== l.LOADING) break;
+ var c = new i.MSStreamReader;
+ c.onprogress = function() {
+ c.result.byteLength > t._pos && (t.push(new r(new Uint8Array(c.result.slice(t._pos)))), t._pos = c.result.byteLength)
+ },
+ c.onload = function() {
+ t.push(null)
+ },
+ c.readAsArrayBuffer(n)
+ }
+ t._xhr.readyState === l.DONE && "ms-stream" !== t._mode && t.push(null)
+ }
+ }).call(this, n(9), n(4), n(13).Buffer)
+ },
+ function(t, e, n) { (function(t) {
+ e.fetch = s(t.fetch) && s(t.ReadableStream),
+ e.writableStream = s(t.WritableStream),
+ e.abortController = s(t.AbortController),
+ e.blobConstructor = !1;
+ try {
+ new Blob([new ArrayBuffer(1)]),
+ e.blobConstructor = !0
+ } catch(t) {}
+ var n;
+ function i() {
+ if (void 0 !== n) return n;
+ if (t.XMLHttpRequest) {
+ n = new t.XMLHttpRequest;
+ try {
+ n.open("GET", t.XDomainRequest ? "/": "https://example.com")
+ } catch(t) {
+ n = null
+ }
+ } else n = null;
+ return n
+ }
+ function r(t) {
+ var e = i();
+ if (!e) return ! 1;
+ try {
+ return e.responseType = t,
+ e.responseType === t
+ } catch(t) {}
+ return ! 1
+ }
+ var a = void 0 !== t.ArrayBuffer,
+ o = a && s(t.ArrayBuffer.prototype.slice);
+ function s(t) {
+ return "function" == typeof t
+ }
+ e.arraybuffer = e.fetch || a && r("arraybuffer"),
+ e.msstream = !e.fetch && o && r("ms-stream"),
+ e.mozchunkedarraybuffer = !e.fetch && a && r("moz-chunked-arraybuffer"),
+ e.overrideMimeType = e.fetch || !!i() && s(i().overrideMimeType),
+ e.vbArray = s(t.VBArray),
+ n = null
+ }).call(this, n(4))
+ },
+ function(t, e, n) { (function(t) {
+ var i = n(288),
+ r = n(64),
+ a = n(280),
+ o = n(279),
+ s = n(54),
+ l = e;
+ l.request = function(e, n) {
+ e = "string" == typeof e ? s.parse(e) : a(e);
+ var r = -1 === t.location.protocol.search(/^https?:$/) ? "http:": "",
+ o = e.protocol || r,
+ l = e.hostname || e.host,
+ c = e.port,
+ u = e.path || "/";
+ l && -1 !== l.indexOf(":") && (l = "[" + l + "]"),
+ e.url = (l ? o + "//" + l: "") + (c ? ":" + c: "") + u,
+ e.method = (e.method || "GET").toUpperCase(),
+ e.headers = e.headers || {};
+ var d = new i(e);
+ return n && d.on("response", n),
+ d
+ },
+ l.get = function(t, e) {
+ var n = l.request(t, e);
+ return n.end(),
+ n
+ },
+ l.ClientRequest = i,
+ l.IncomingMessage = r.IncomingMessage,
+ l.Agent = function() {},
+ l.Agent.defaultMaxSockets = 4,
+ l.globalAgent = new l.Agent,
+ l.STATUS_CODES = o,
+ l.METHODS = ["CHECKOUT", "CONNECT", "COPY", "DELETE", "GET", "HEAD", "LOCK", "M-SEARCH", "MERGE", "MKACTIVITY", "MKCOL", "MOVE", "NOTIFY", "OPTIONS", "PATCH", "POST", "PROPFIND", "PROPPATCH", "PURGE", "PUT", "REPORT", "SEARCH", "SUBSCRIBE", "TRACE", "UNLOCK", "UNSUBSCRIBE"]
+ }).call(this, n(4))
+ },
+ function(t, e) {
+ var n = {}.toString;
+ t.exports = Array.isArray ||
+ function(t) {
+ return "[object Array]" == n.call(t)
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = new RegExp("<(?:.|\n)*?>", "gm"),
+ n = new RegExp(" +", "gm");
+ function i(t) {
+ return (t + "").replace(e, " ").replace(n, " ")
+ }
+ var r = new RegExp("'", "gm");
+ function a(t) {
+ return (t + "").replace(r, "'")
+ }
+ for (var o in t._waiAria = {
+ getAttributeString: function(t) {
+ var e = [" "];
+ for (var n in t) {
+ var r = a(i(t[n]));
+ e.push(n + "='" + r + "'")
+ }
+ return e.push(" "),
+ e.join(" ")
+ },
+ getTimelineCellAttr: function(e) {
+ return t._waiAria.getAttributeString({
+ "aria-label": e
+ })
+ },
+ _taskCommonAttr: function(e, n) {
+ e.start_date && e.end_date && (n.setAttribute("aria-label", i(t.templates.tooltip_text(e.start_date, e.end_date, e))), e.$dataprocessor_class && n.setAttribute("aria-busy", !0))
+ },
+ setTaskBarAttr: function(e, n) {
+ this._taskCommonAttr(e, n),
+ n.setAttribute("role", "img"),
+ !t.isReadonly(e) && t.config.drag_move && (e.id != t.getState("tasksDnd").drag_id ? n.setAttribute("aria-grabbed", !1) : n.setAttribute("aria-grabbed", !0))
+ },
+ taskRowAttr: function(e, n) {
+ this._taskCommonAttr(e, n),
+ !t.isReadonly(e) && t.config.order_branch && n.setAttribute("aria-grabbed", !1),
+ n.setAttribute("role", "row"),
+ n.setAttribute("aria-selected", t.isSelectedTask(e.id) ? "true": "false"),
+ n.setAttribute("aria-level", e.$level + 1 || 1),
+ t.hasChild(e.id) && n.setAttribute("aria-expanded", e.$open ? "true": "false")
+ },
+ linkAttr: function(e, n) {
+ var r = t.config.links,
+ a = e.type == r.finish_to_start || e.type == r.start_to_start,
+ o = e.type == r.start_to_start || e.type == r.start_to_finish,
+ s = t.locale.labels.link + " " + t.templates.drag_link(e.source, o, e.target, a);
+ n.setAttribute("role", "img"),
+ n.setAttribute("aria-label", i(s)),
+ t.isReadonly(e) && n.setAttribute("aria-readonly", !0)
+ },
+ gridSeparatorAttr: function(t) {
+ t.setAttribute("role", "columnheader")
+ },
+ rowResizerAttr: function(t) {
+ t.setAttribute("role", "row")
+ },
+ lightboxHiddenAttr: function(t) {
+ t.setAttribute("aria-hidden", "true")
+ },
+ lightboxVisibleAttr: function(t) {
+ t.setAttribute("aria-hidden", "false")
+ },
+ lightboxAttr: function(t) {
+ t.setAttribute("role", "dialog"),
+ t.setAttribute("aria-hidden", "true"),
+ t.firstChild.setAttribute("role", "heading"),
+ t.firstChild.setAttribute("aria-level", "1")
+ },
+ lightboxButtonAttrString: function(e) {
+ return this.getAttributeString({
+ role: "button",
+ "aria-label": t.locale.labels[e],
+ tabindex: "0"
+ })
+ },
+ lightboxHeader: function(t, e) {
+ t.setAttribute("aria-label", e)
+ },
+ lightboxSelectAttrString: function(e) {
+ var n = "";
+ switch (e) {
+ case "%Y":
+ n = t.locale.labels.years;
+ break;
+ case "%m":
+ n = t.locale.labels.months;
+ break;
+ case "%d":
+ n = t.locale.labels.days;
+ break;
+ case "%H:%i":
+ n = t.locale.labels.hours + t.locale.labels.minutes
+ }
+ return t._waiAria.getAttributeString({
+ "aria-label": n
+ })
+ },
+ lightboxDurationInputAttrString: function(e) {
+ return this.getAttributeString({
+ "aria-label": t.locale.labels.column_duration,
+ "aria-valuemin": "0",
+ role: "spinbutton"
+ })
+ },
+ inlineEditorAttr: function(t) {
+ t.setAttribute("role", "row")
+ },
+ gridAttrString: function() {
+ return [" role='treegrid'", t.config.multiselect ? "aria-multiselectable='true'": "aria-multiselectable='false'", " "].join(" ")
+ },
+ gridScaleRowAttrString: function() {
+ return "role='row'"
+ },
+ gridScaleCellAttrString: function(e, n) {
+ var i = "";
+ if ("add" == e.name) i = this.getAttributeString({
+ role: "columnheader",
+ "aria-label": t.locale.labels.new_task
+ });
+ else {
+ var r = {
+ role: "columnheader",
+ "aria-label": n
+ };
+ t._sort && t._sort.name == e.name && ("asc" == t._sort.direction ? r["aria-sort"] = "ascending": r["aria-sort"] = "descending"),
+ i = this.getAttributeString(r)
+ }
+ return i
+ },
+ gridDataAttrString: function() {
+ return "role='rowgroup'"
+ },
+ reorderMarkerAttr: function(t) {
+ t.setAttribute("role", "grid"),
+ t.firstChild.removeAttribute("aria-level"),
+ t.firstChild.setAttribute("aria-grabbed", "true")
+ },
+ gridCellAttrString: function(e, n, i) {
+ var r = {
+ role: "gridcell",
+ "aria-label": n
+ };
+ return e.editor && !t.isReadonly(i) || (r["aria-readonly"] = !0),
+ this.getAttributeString(r)
+ },
+ gridAddButtonAttrString: function(e) {
+ return this.getAttributeString({
+ role: "button",
+ "aria-label": t.locale.labels.new_task
+ })
+ },
+ messageButtonAttrString: function(t) {
+ return "tabindex='0' role='button' aria-label='" + t + "'"
+ },
+ messageInfoAttr: function(t) {
+ t.setAttribute("role", "alert")
+ },
+ messageModalAttr: function(t, e) {
+ t.setAttribute("role", "dialog"),
+ e && t.setAttribute("aria-labelledby", e)
+ },
+ quickInfoAttr: function(t) {
+ t.setAttribute("role", "dialog")
+ },
+ quickInfoHeaderAttrString: function() {
+ return " role='heading' aria-level='1' "
+ },
+ quickInfoHeader: function(t, e) {
+ t.setAttribute("aria-label", e)
+ },
+ quickInfoButtonAttrString: function(e) {
+ return t._waiAria.getAttributeString({
+ role: "button",
+ "aria-label": e,
+ tabindex: "0"
+ })
+ },
+ tooltipAttr: function(t) {
+ t.setAttribute("role", "tooltip")
+ },
+ tooltipVisibleAttr: function(t) {
+ t.setAttribute("aria-hidden", "false")
+ },
+ tooltipHiddenAttr: function(t) {
+ t.setAttribute("aria-hidden", "true")
+ }
+ },
+ t._waiAria) t._waiAria[o] = function(e) {
+ return function() {
+ return t.config.wai_aria_attributes ? e.apply(this, arguments) : ""
+ }
+ } (t._waiAria[o])
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t._extend_to_optional = function(e) {
+ var n = e,
+ i = {
+ render: n.render,
+ focus: n.focus,
+ set_value: function(e, r, a, o) {
+ var s = t._resolve_default_mapping(o);
+ if (!a[s.start_date] || "start_date" == s.start_date && this._isAllowedUnscheduledTask(a)) {
+ i.disable(e, o);
+ var l = {};
+ for (var c in s) l[s[c]] = a[c];
+ return n.set_value.call(t, e, r, l, o)
+ }
+ return i.enable(e, o),
+ n.set_value.call(t, e, r, a, o)
+ },
+ get_value: function(e, i, r) {
+ return r.disabled ? {
+ start_date: null
+ }: n.get_value.call(t, e, i, r)
+ },
+ update_block: function(e, n) {
+ if (t.callEvent("onSectionToggle", [t._lightbox_id, n]), e.style.display = n.disabled ? "none": "block", n.button) {
+ var i = e.previousSibling.querySelector(".gantt_custom_button_label"),
+ r = t.locale.labels,
+ a = n.disabled ? r[n.name + "_enable_button"] : r[n.name + "_disable_button"];
+ i.innerHTML = a
+ }
+ t.resizeLightbox()
+ },
+ disable: function(t, e) {
+ e.disabled = !0,
+ i.update_block(t, e)
+ },
+ enable: function(t, e) {
+ e.disabled = !1,
+ i.update_block(t, e)
+ },
+ button_click: function(e, n, r, a) {
+ if (!1 !== t.callEvent("onSectionButton", [t._lightbox_id, r])) {
+ var o = t._get_typed_lightbox_config()[e];
+ o.disabled ? i.enable(a, o) : i.disable(a, o)
+ }
+ }
+ };
+ return i
+ },
+ t.form_blocks.duration_optional = t._extend_to_optional(t.form_blocks.duration),
+ t.form_blocks.time_optional = t._extend_to_optional(t.form_blocks.time)
+ }
+ },
+ function(t, e, n) {
+ var i = n(3);
+ t.exports = function(t) {
+ var e = n(18)(t);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return i(r, e),
+ r.prototype.render = function(n) {
+ var i = t.config.types,
+ r = t.locale.labels,
+ a = [],
+ o = n.filter ||
+ function(t, e) {
+ return ! i.placeholder || e !== i.placeholder
+ };
+ for (var s in i) ! 1 == !o(s, i[s]) && a.push({
+ key: i[s],
+ label: r["type_" + s]
+ });
+ n.options = a;
+ var l = n.onchange;
+ return n.onchange = function() {
+ t.changeLightboxType(this.value),
+ this.value === t.config.types.task && (t._lightbox_new_type = "task"),
+ "function" == typeof l && l.apply(this, arguments)
+ },
+ e.prototype.render.apply(this, arguments)
+ },
+ r
+ }
+ },
+ function(t, e, n) {
+ var i = n(3),
+ r = n(36);
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function a() {
+ return e.apply(this, arguments) || this
+ }
+ function o(e) {
+ return ! e || e === t.config.constraint_types.ASAP || e === t.config.constraint_types.ALAP
+ }
+ function s(t, e) {
+ for (var n = o(e), i = 0; i < t.length; i++) t[i].disabled = n
+ }
+ return i(a, e),
+ a.prototype.render = function(e) {
+ var n = (e.height || 30) + "px",
+ i = "<div class='gantt_cal_ltext gantt_section_" + e.name + "' style='height:" + n + ";'>",
+ a = [];
+ for (var o in t.config.constraint_types) a.push({
+ key: t.config.constraint_types[o],
+ label: t.locale.labels[t.config.constraint_types[o]]
+ });
+ return e.options = e.options || a,
+ i += "<span data-constraint-type-select>" + r.getHtmlSelect(e.options, [{
+ key: "data-type",
+ value: "constraint-type"
+ }]) + "</span>",
+ i += "<label data-constraint-time-select>" + (t.locale.labels.constraint_date || "Constraint date") + ": " + t.form_blocks.getTimePicker.call(this, e) + "</label>",
+ i += "</div>"
+ },
+ a.prototype.set_value = function(e, n, i, r) {
+ var a = e.querySelector("[data-constraint-type-select] select"),
+ o = e.querySelectorAll("[data-constraint-time-select] select"),
+ l = r._time_format_order,
+ c = t._resolve_default_mapping(r);
+ a._eventsInitialized || (a.addEventListener("change",
+ function(t) {
+ s(o, t.target.value)
+ }), a._eventsInitialized = !0);
+ var u = i[c.constraint_date] || new Date;
+ t.form_blocks._fill_lightbox_select(o, 0, u, l, r);
+ var d = i[c.constraint_type] || t.getConstraintType(i);
+ a.value = d,
+ s(o, d)
+ },
+ a.prototype.get_value = function(e, n, i) {
+ var r = e.querySelector("[data-constraint-type-select] select"),
+ a = e.querySelectorAll("[data-constraint-time-select] select"),
+ s = r.value,
+ l = null;
+ return o(s) || (l = t.form_blocks.getTimePickerValue(a, i)),
+ {
+ constraint_type: s,
+ constraint_date: l
+ }
+ },
+ a.prototype.focus = function(e) {
+ t._focus(e.querySelector("select"))
+ },
+ a
+ }
+ },
+ function(t, e, n) {
+ var i = n(3);
+ t.exports = function(t) {
+ var e = n(18)(t);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ function a(e, n) {
+ var i = [],
+ r = [];
+ n && (i = t.getTaskByTime(), e.allow_root && i.unshift({
+ id: t.config.root_id,
+ text: e.root_label || ""
+ }), i = function(e, n, i) {
+ var r = n.filter ||
+ function() {
+ return ! 0
+ };
+ e = e.slice(0);
+ for (var a = 0; a < e.length; a++) {
+ var o = e[a]; (o.id == i || t.isChildOf(o.id, i) || !1 === r(o.id, o)) && (e.splice(a, 1), a--)
+ }
+ return e
+ } (i, e, n), e.sort && i.sort(e.sort));
+ for (var a = e.template || t.templates.task_text,
+ o = 0; o < i.length; o++) {
+ var s = a.apply(t, [i[o].start_date, i[o].end_date, i[o]]);
+ void 0 === s && (s = ""),
+ r.push({
+ key: i[o].id,
+ label: s
+ })
+ }
+ return e.options = r,
+ e.map_to = e.map_to || "parent",
+ t.form_blocks.select.render.apply(this, arguments)
+ }
+ return i(r, e),
+ r.prototype.render = function(t) {
+ return a(t, !1)
+ },
+ r.prototype.set_value = function(e, n, i, r) {
+ 0 === n && (n = "0");
+ var o = document.createElement("div");
+ o.innerHTML = a(r, i.id);
+ var s = o.removeChild(o.firstChild);
+ return e.onselect = null,
+ e.parentNode.replaceChild(s, e),
+ t.form_blocks.select.set_value.apply(t, [s, n, i, r])
+ },
+ r
+ }
+ },
+ function(t, e, n) {
+ var i = n(3),
+ r = n(44).
+ default;
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function a() {
+ return e.apply(this, arguments) || this
+ }
+ function o(t) {
+ return t.formatter || new r
+ }
+ function s(e, n) {
+ var i = e.getElementsByTagName("select"),
+ r = n._time_format_order,
+ a = 0,
+ o = 0;
+ if (t.defined(r[3])) {
+ var s = i[r[3]],
+ l = parseInt(s.value, 10);
+ isNaN(l) && s.hasAttribute("data-value") && (l = parseInt(s.getAttribute("data-value"), 10)),
+ a = Math.floor(l / 60),
+ o = l % 60
+ }
+ return new Date(i[r[2]].value, i[r[1]].value, i[r[0]].value, a, o)
+ }
+ function l(t, e) {
+ var n = t.getElementsByTagName("input")[1];
+ return (n = o(e).parse(n.value)) && !window.isNaN(n) || (n = 1),
+ n < 0 && (n *= -1),
+ n
+ }
+ return i(a, e),
+ a.prototype.render = function(e) {
+ var n = "<div class='gantt_time_selects'>" + t.form_blocks.getTimePicker.call(this, e) + "</div>",
+ i = " " + t.locale.labels[t.config.duration_unit + "s"] + " ",
+ r = e.single_date ? " style='display:none'": "",
+ a = e.readonly ? " disabled='disabled'": "",
+ o = t._waiAria.lightboxDurationInputAttrString(e),
+ s = "gantt_duration_value";
+ e.formatter && (i = "", s += " gantt_duration_value_formatted");
+ var l = "<div class='gantt_duration' " + r + "><input type='button' class='gantt_duration_dec' value='鈭�'" + a + "><input type='text' value='5days' class='" + s + "'" + a + " " + o + "><input type='button' class='gantt_duration_inc' value='+'" + a + ">" + i + "<span></span></div>";
+ return "<div style='height:" + (e.height || 30) + "px;padding-top:0px;font-size:inherit;' class='gantt_section_time'>" + n + " " + l + "</div>"
+ },
+ a.prototype.set_value = function(e, n, i, r) {
+ var a, c, u, d, h = e.getElementsByTagName("select"),
+ f = e.getElementsByTagName("input"),
+ _ = f[1],
+ g = [f[0], f[2]],
+ p = e.getElementsByTagName("span")[0],
+ v = r._time_format_order;
+ function m() {
+ var n = s.call(t, e, r),
+ a = l.call(t, e, r),
+ o = t.calculateEndDate({
+ start_date: n,
+ duration: a,
+ task: i
+ }),
+ c = t.templates.task_end_date || t.templates.task_date;
+ p.innerHTML = c(o)
+ }
+ function y(t) {
+ var e = _.value;
+ e = o(r).parse(e),
+ window.isNaN(e) && (e = 0),
+ (e += t) < 1 && (e = 1),
+ _.value = o(r).format(e),
+ m()
+ }
+ g[0].onclick = t.bind(function() {
+ y( - 1 * t.config.duration_step)
+ },
+ this),
+ g[1].onclick = t.bind(function() {
+ y(1 * t.config.duration_step)
+ },
+ this),
+ h[0].onchange = m,
+ h[1].onchange = m,
+ h[2].onchange = m,
+ h[3] && (h[3].onchange = m),
+ _.onkeydown = t.bind(function(e) {
+ var n;
+ return (n = (e = e || window.event).charCode || e.keyCode || e.which) == t.constants.KEY_CODES.DOWN ? (y( - 1 * t.config.duration_step), !1) : n == t.constants.KEY_CODES.UP ? (y(1 * t.config.duration_step), !1) : void window.setTimeout(m, 1)
+ },
+ this),
+ _.onchange = t.bind(m, this),
+ "string" == typeof(a = t._resolve_default_mapping(r)) && (a = {
+ start_date: a
+ }),
+ c = i[a.start_date] || new Date,
+ u = i[a.end_date] || t.calculateEndDate({
+ start_date: c,
+ duration: 1,
+ task: i
+ }),
+ d = Math.round(i[a.duration]) || t.calculateDuration({
+ start_date: c,
+ end_date: u,
+ task: i
+ }),
+ d = o(r).format(d),
+ t.form_blocks._fill_lightbox_select(h, 0, c, v, r),
+ _.value = d,
+ m()
+ },
+ a.prototype.get_value = function(e, n, i) {
+ var r = s(e, i),
+ a = l(e, i),
+ o = t.calculateEndDate({
+ start_date: r,
+ duration: a,
+ task: n
+ });
+ return "string" == typeof t._resolve_default_mapping(i) ? r: {
+ start_date: r,
+ end_date: o,
+ duration: a
+ }
+ },
+ a.prototype.focus = function(e) {
+ t._focus(e.getElementsByTagName("select")[0])
+ },
+ a
+ }
+ },
+ function(t, e, n) {
+ var i = n(3);
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return i(r, e),
+ r.prototype.render = function(t) {
+ var e = "<div class='gantt_cal_ltext' style='height:" + ((t.height || "23") + "px") + ";'>";
+ if (t.options && t.options.length) for (var n = 0; n < t.options.length; n++) e += "<label><input type='radio' value='" + t.options[n].key + "' name='" + t.name + "'>" + t.options[n].label + "</label>";
+ return e += "</div>"
+ },
+ r.prototype.set_value = function(t, e, n, i) {
+ var r;
+ i.options && i.options.length && (r = t.querySelector("input[type=radio][value='" + e + "']") || t.querySelector("input[type=radio][value='" + i.default_value + "']")) && (!t._dhx_onchange && i.onchange && (t.onchange = i.onchange, t._dhx_onchange = !0), r.checked = !0)
+ },
+ r.prototype.get_value = function(t, e) {
+ var n = t.querySelector("input[type=radio]:checked");
+ return n ? n.value: ""
+ },
+ r.prototype.focus = function(e) {
+ t._focus(e.querySelector("input[type=radio]"))
+ },
+ r
+ }
+ },
+ function(t, e, n) {
+ var i = n(2),
+ r = n(3);
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function a() {
+ return e.apply(this, arguments) || this
+ }
+ return r(a, e),
+ a.prototype.render = function(t) {
+ var e = "<div class='gantt_cal_ltext' style='height:" + ((t.height || "23") + "px") + ";'>";
+ if (t.options && t.options.length) for (var n = 0; n < t.options.length; n++) e += "<label><input type='checkbox' value='" + t.options[n].key + "' name='" + t.name + "'>" + t.options[n].label + "</label>";
+ else t.single_value = !0,
+ e += "<label><input type='checkbox' name='" + t.name + "'></label>";
+ return e += "</div>"
+ },
+ a.prototype.set_value = function(t, e, n, r) {
+ var a = Array.prototype.slice.call(t.querySelectorAll("input[type=checkbox]")); (!t._dhx_onchange && r.onchange && (t.onchange = r.onchange, t._dhx_onchange = !0), r.single_value) ? a[0].checked = !!e: i.forEach(a,
+ function(t) {
+ t.checked = !!e && e.indexOf(t.value) >= 0
+ })
+ },
+ a.prototype.get_value = function(t, e, n) {
+ return n.single_value ? t.querySelector("input[type=checkbox]").checked: i.arrayMap(Array.prototype.slice.call(t.querySelectorAll("input[type=checkbox]:checked")),
+ function(t) {
+ return t.value
+ })
+ },
+ a.prototype.focus = function(e) {
+ t._focus(e.querySelector("input[type=checkbox]"))
+ },
+ a
+ }
+ },
+ function(t, e, n) {
+ var i = n(3);
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return i(r, e),
+ r.prototype.render = function(e) {
+ var n = t.form_blocks.getTimePicker.call(this, e),
+ i = "<div style='height:" + (e.height || 30) + "px;padding-top:0px;font-size:inherit;text-align:center;' class='gantt_section_time'>";
+ return i += n,
+ e.single_date ? (n = t.form_blocks.getTimePicker.call(this, e, !0), i += "<span></span>") : i += "<span style='font-weight:normal; font-size:10pt;'> – </span>",
+ i += n,
+ i += "</div>"
+ },
+ r.prototype.set_value = function(e, n, i, r) {
+ var a = r,
+ o = e.getElementsByTagName("select"),
+ s = r._time_format_order;
+ if (a.auto_end_date) for (var l = function() {
+ d = new Date(o[s[2]].value, o[s[1]].value, o[s[0]].value, 0, 0),
+ h = t.calculateEndDate({
+ start_date: d,
+ duration: 1,
+ task: i
+ }),
+ t.form_blocks._fill_lightbox_select(o, s.size, h, s, a)
+ },
+ c = 0; c < 4; c++) o[c].onchange = l;
+ var u = t._resolve_default_mapping(r);
+ "string" == typeof u && (u = {
+ start_date: u
+ });
+ var d = i[u.start_date] || new Date,
+ h = i[u.end_date] || t.calculateEndDate({
+ start_date: d,
+ duration: 1,
+ task: i
+ });
+ t.form_blocks._fill_lightbox_select(o, 0, d, s, a),
+ t.form_blocks._fill_lightbox_select(o, s.size, h, s, a)
+ },
+ r.prototype.get_value = function(e, n, i) {
+ var r, a = e.getElementsByTagName("select"),
+ o = i._time_format_order;
+ return r = t.form_blocks.getTimePickerValue(a, i),
+ "string" == typeof t._resolve_default_mapping(i) ? r: {
+ start_date: r,
+ end_date: function(e, n, r) {
+ var a = t.form_blocks.getTimePickerValue(e, i, n.size);
+ return a <= r && (!1 !== i.autofix_end || i.single_date) ? t.date.add(r, t._get_timepicker_step(), "minute") : a
+ } (a, o, r)
+ }
+ },
+ r.prototype.focus = function(e) {
+ t._focus(e.getElementsByTagName("select")[0])
+ },
+ r
+ }
+ },
+ function(t, e, n) {
+ var i = n(3);
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return i(r, e),
+ r.prototype.render = function(t) {
+ return "<div class='gantt_cal_ltext' style='height:" + ((t.height || "130") + "px") + ";'><textarea></textarea></div>"
+ },
+ r.prototype.set_value = function(e, n) {
+ t.form_blocks.textarea._get_input(e).value = n || ""
+ },
+ r.prototype.get_value = function(e) {
+ return t.form_blocks.textarea._get_input(e).value
+ },
+ r.prototype.focus = function(e) {
+ var n = t.form_blocks.textarea._get_input(e);
+ t._focus(n, !0)
+ },
+ r.prototype._get_input = function(t) {
+ return t.querySelector("textarea")
+ },
+ r
+ }
+ },
+ function(t, e, n) {
+ var i = n(3);
+ t.exports = function(t) {
+ var e = n(7)(t);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return i(r, e),
+ r.prototype.render = function(t) {
+ return "<div class='gantt_cal_ltext gantt_cal_template' style='height:" + ((t.height || "30") + "px") + ";'></div>"
+ },
+ r.prototype.set_value = function(t, e) {
+ t.innerHTML = e || ""
+ },
+ r.prototype.get_value = function(t) {
+ return t.innerHTML || ""
+ },
+ r.prototype.focus = function() {},
+ r
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ t.exports = function(t) {
+ var e = n(1),
+ r = n(2),
+ a = n(78)(t),
+ o = n(77)(t),
+ s = n(76)(t),
+ l = n(18)(t),
+ c = n(75)(t),
+ u = n(74)(t),
+ d = n(73)(t),
+ h = n(72)(t),
+ f = n(18)(t),
+ _ = n(71)(t),
+ g = n(70)(t);
+ function p(e, n) {
+ var i, r, a = "";
+ for (r = 0; r < e.length; r++) i = t.config._migrate_buttons[e[r]] ? t.config._migrate_buttons[e[r]] : e[r],
+ a += "<div " + t._waiAria.lightboxButtonAttrString(i) + " class='gantt_btn_set gantt_left_btn_set " + i + "_set'" + (n ? " style='float:right;'": "") + "><div dhx_button='1' data-dhx-button='1' class='" + i + "'></div><div>" + t.locale.labels[i] + "</div></div>";
+ return a
+ }
+ function v(e, n, i) {
+ var r, a, o, s, l, c, u = "";
+ switch (i.timeFormat[n]) {
+ case "%Y":
+ for (e._time_format_order[2] = n, e._time_format_order.size++, e.year_range && (isNaN(e.year_range) ? e.year_range.push && (o = e.year_range[0], s = e.year_range[1]) : r = e.year_range), r = r || 10, a = a || Math.floor(r / 2), o = o || i.date.getFullYear() - a, s = s || t.getState().max_date.getFullYear() + a, l = o; l < s; l++) u += "<option value='" + l + "'>" + l + "</option>";
+ break;
+ case "%m":
+ for (e._time_format_order[1] = n, e._time_format_order.size++, l = 0; l < 12; l++) u += "<option value='" + l + "'>" + t.locale.date.month_full[l] + "</option>";
+ break;
+ case "%d":
+ for (e._time_format_order[0] = n, e._time_format_order.size++, l = 1; l < 32; l++) u += "<option value='" + l + "'>" + l + "</option>";
+ break;
+ case "%H:%i":
+ for (e._time_format_order[3] = n, e._time_format_order.size++, l = i.first, c = i.date.getDate(), e._time_values = []; l < i.last;) u += "<option value='" + l + "'>" + t.templates.time_picker(i.date) + "</option>",
+ e._time_values.push(l),
+ i.date.setTime(i.date.valueOf() + 60 * t._get_timepicker_step() * 1e3),
+ l = 24 * (i.date.getDate() != c ? 1 : 0) * 60 + 60 * i.date.getHours() + i.date.getMinutes()
+ }
+ return u
+ }
+ t._lightbox_methods = {},
+ t._lightbox_template = "<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span></div><div class='gantt_cal_larea'></div>",
+ t._lightbox_root = t.$root,
+ t.$services.getService("state").registerProvider("lightbox",
+ function() {
+ return {
+ lightbox: t._lightbox_id
+ }
+ }),
+ t.showLightbox = function(t) {
+ if (this.callEvent("onBeforeLightbox", [t])) {
+ var e = this.getTask(t),
+ n = this.getLightbox(this.getTaskType(e.type));
+ this._center_lightbox(n),
+ this.showCover(),
+ this._fill_lightbox(t, n),
+ this._waiAria.lightboxVisibleAttr(n),
+ this.callEvent("onLightbox", [t])
+ }
+ },
+ t._get_timepicker_step = function() {
+ if (this.config.round_dnd_dates) {
+ var e;
+ if (function(t) {
+ var e = t.$ui.getView("timeline");
+ return ! (!e || !e.isVisible())
+ } (this)) {
+ var n = t.getScale();
+ e = r.getSecondsInUnit(n.unit) * n.step / 60
+ }
+ return (!e || e >= 1440) && (e = this.config.time_step),
+ e
+ }
+ return this.config.time_step
+ },
+ t.getLabel = function(t, e) {
+ for (var n = this._get_typed_lightbox_config(), i = 0; i < n.length; i++) if (n[i].map_to == t) for (var r = n[i].options, a = 0; a < r.length; a++) if (r[a].key == e) return r[a].label;
+ return ""
+ },
+ t.updateCollection = function(e, n) {
+ n = n.slice(0);
+ var i = t.serverList(e);
+ if (!i) return ! 1;
+ i.splice(0, i.length),
+ i.push.apply(i, n || []),
+ t.resetLightbox()
+ },
+ t.getLightboxType = function() {
+ return this.getTaskType(this._lightbox_type)
+ },
+ t.getLightbox = function(e) {
+ var n, i, r, a, o, s = "";
+ if (function() {
+ var e = !0 === t.config.csp,
+ n = !!window.Sfdc || !!window.$A || window.Aura || "$shadowResolver$" in document.body;
+ t._lightbox_root = e || n ? t.$root: document.body
+ } (), void 0 === e && (e = this.getLightboxType()), !this._lightbox || this.getLightboxType() != this.getTaskType(e)) {
+ this._lightbox_type = this.getTaskType(e),
+ n = document.createElement("div"),
+ s = "gantt_cal_light",
+ i = this._is_lightbox_timepicker(),
+ (t.config.wide_form || i) && (s += " gantt_cal_light_wide"),
+ i && (t.config.wide_form = !0, s += " gantt_cal_light_full"),
+ n.className = s,
+ n.style.visibility = "hidden",
+ r = this._lightbox_template,
+ r += p(this.config.buttons_left),
+ r += p(this.config.buttons_right, !0),
+ n.innerHTML = r,
+ t._waiAria.lightboxAttr(n),
+ t.config.drag_lightbox && (n.firstChild.onmousedown = t._ready_to_dnd, n.firstChild.onselectstart = function() {
+ return ! 1
+ },
+ n.firstChild.style.cursor = "pointer", t._init_dnd_events()),
+ this._lightbox && this.resetLightbox(),
+ t._lightbox_root.insertBefore(n, t._lightbox_root.firstChild),
+ this._lightbox = n,
+ a = this._get_typed_lightbox_config(e),
+ r = this._render_sections(a);
+ var l = (o = n.querySelector("div.gantt_cal_larea")).style.overflow;
+ o.style.overflow = "hidden",
+ o.innerHTML = r,
+ function(e) {
+ var n, i, r, a, o, s;
+ for (s = 0; s < e.length; s++) n = e[s],
+ r = t._lightbox_root.querySelector("#" + n.id),
+ n.id && r && (i = r.querySelector("label"), (a = r.nextSibling) && (o = a.querySelector("input, select, textarea")) && (o.id = o.id || "input_" + t.uid(), n.inputId = o.id, i.setAttribute("for", n.inputId)))
+ } (a),
+ this.resizeLightbox(),
+ o.style.overflow = l,
+ this._init_lightbox_events(this),
+ n.style.display = "none",
+ n.style.visibility = "visible"
+ }
+ return this._lightbox
+ },
+ t._render_sections = function(t) {
+ for (var e = "",
+ n = 0; n < t.length; n++) {
+ var i = this.form_blocks[t[n].type];
+ if (i) {
+ t[n].id = "area_" + this.uid();
+ var r = t[n].hidden ? " style='display:none'": "",
+ a = "";
+ t[n].button && (a = "<div class='gantt_custom_button' data-index='" + n + "'><div class='gantt_custom_button_" + t[n].button + "'></div><div class='gantt_custom_button_label'>" + this.locale.labels["button_" + t[n].button] + "</div></div>"),
+ this.config.wide_form && (e += "<div class='gantt_wrap_section' " + r + ">"),
+ e += "<div id='" + t[n].id + "' class='gantt_cal_lsection'><label>" + a + this.locale.labels["section_" + t[n].name] + "</label></div>" + i.render.call(this, t[n]),
+ e += "</div>"
+ }
+ }
+ return e
+ },
+ t.resizeLightbox = function() {
+ if (this._lightbox) {
+ var t = this._lightbox.querySelector(".gantt_cal_larea");
+ t.style.height = "0px",
+ t.style.height = t.scrollHeight + "px",
+ this._lightbox.style.height = t.scrollHeight + this.config.lightbox_additional_height + "px",
+ t.style.height = t.scrollHeight + "px"
+ }
+ },
+ t._center_lightbox = function(e) {
+ if (e) {
+ e.style.display = "block";
+ var n = window.pageYOffset || t._lightbox_root.scrollTop || document.documentElement.scrollTop,
+ i = window.pageXOffset || t._lightbox_root.scrollLeft || document.documentElement.scrollLeft,
+ r = window.innerHeight || document.documentElement.clientHeight;
+ e.style.top = n ? Math.round(n + Math.max((r - e.offsetHeight) / 2, 0)) + "px": Math.round(Math.max((r - e.offsetHeight) / 2, 0) + 9) + "px",
+ document.documentElement.scrollWidth > t._lightbox_root.offsetWidth ? e.style.left = Math.round(i + (t._lightbox_root.offsetWidth - e.offsetWidth) / 2) + "px": e.style.left = Math.round((t._lightbox_root.offsetWidth - e.offsetWidth) / 2) + "px"
+ }
+ },
+ t.showCover = function() {
+ this._cover || (this._cover = document.createElement("DIV"), this._cover.className = "gantt_cal_cover", (t._lightbox_root || t.$root).appendChild(this._cover))
+ },
+ t.event(window, "deviceorientation",
+ function() {
+ t.getState().lightbox && t._center_lightbox(t.getLightbox())
+ }),
+ t._init_lightbox_events = function() {
+ t.lightbox_events = {},
+ t.lightbox_events.gantt_save_btn = function() {
+ t._save_lightbox()
+ },
+ t.lightbox_events.gantt_delete_btn = function() {
+ t._lightbox_new_type = null,
+ t.callEvent("onLightboxDelete", [t._lightbox_id]) && (t.isTaskExists(t._lightbox_id) ? t.$click.buttons.delete(t._lightbox_id) : t.hideLightbox())
+ },
+ t.lightbox_events.gantt_cancel_btn = function() {
+ t._cancel_lightbox()
+ },
+ t.lightbox_events.
+ default = function(n, i) {
+ if (i.getAttribute("data-dhx-button")) t.callEvent("onLightboxButton", [i.className, i, n]);
+ else {
+ var r, a, o = e.getClassName(i);
+ if ( - 1 != o.indexOf("gantt_custom_button")) if ( - 1 != o.indexOf("gantt_custom_button_")) for (r = i.parentNode.getAttribute("data-index"), a = i; a && -1 == e.getClassName(a).indexOf("gantt_cal_lsection");) a = a.parentNode;
+ else r = i.getAttribute("data-index"),
+ a = i.parentNode,
+ i = i.firstChild;
+ var s = t._get_typed_lightbox_config();
+ r && (r *= 1, t.form_blocks[s[1 * r].type].button_click(r, i, a, a.nextSibling))
+ }
+ },
+ this.event(t.getLightbox(), "click",
+ function(n) {
+ n = n || window.event;
+ var i = e.getTargetNode(n),
+ r = e.getClassName(i);
+ return r || (i = i.previousSibling, r = e.getClassName(i)),
+ i && r && 0 === r.indexOf("gantt_btn_set") && (i = i.firstChild, r = e.getClassName(i)),
+ !(!i || !r) && (t.defined(t.lightbox_events[i.className]) ? t.lightbox_events[i.className] : t.lightbox_events.
+ default)(n, i)
+ }),
+ t.getLightbox().onkeydown = function(n) {
+ var i = n || window.event,
+ r = n.target || n.srcElement,
+ a = e.getClassName(r).indexOf("gantt_btn_set") > -1;
+ switch ((n || i).keyCode) {
+ case t.constants.KEY_CODES.SPACE:
+ if ((n || i).shiftKey) return;
+ a && r.click && r.click();
+ break;
+ case t.keys.edit_save:
+ if ((n || i).shiftKey) return;
+ a && r.click ? r.click() : t._save_lightbox();
+ break;
+ case t.keys.edit_cancel:
+ t._cancel_lightbox()
+ }
+ }
+ },
+ t._cancel_lightbox = function() {
+ var e = this.getLightboxValues();
+ this.callEvent("onLightboxCancel", [this._lightbox_id, e.$new]),
+ t.isTaskExists(e.id) && e.$new && (this.silent(function() {
+ t.$data.tasksStore.removeItem(e.id),
+ t._update_flags(e.id, null)
+ }), this.refreshData()),
+ this.hideLightbox()
+ },
+ t._save_lightbox = function() {
+ var e = this.getLightboxValues();
+ this.callEvent("onLightboxSave", [this._lightbox_id, e, !!e.$new]) && (t.$data.tasksStore._skipTaskRecalculation = "lightbox", e.$new ? (delete e.$new, this.addTask(e, e.parent, this.getTaskIndex(e.id))) : this.isTaskExists(e.id) && (this.mixin(this.getTask(e.id), e, !0), this.refreshTask(e.id), this.updateTask(e.id)), t.$data.tasksStore._skipTaskRecalculation = !1, this.refreshData(), this.hideLightbox())
+ },
+ t._resolve_default_mapping = function(t) {
+ var e = t.map_to;
+ return ! {
+ time: !0,
+ time_optional: !0,
+ duration: !0,
+ duration_optional: !0
+ } [t.type] ? "constraint" === t.type && (t.map_to && "string" != typeof t.map_to || (e = {
+ constraint_type: "constraint_type",
+ constraint_date: "constraint_date"
+ })) : "auto" == t.map_to ? e = {
+ start_date: "start_date",
+ end_date: "end_date",
+ duration: "duration"
+ }: "string" == typeof t.map_to && (e = {
+ start_date: t.map_to
+ }),
+ e
+ },
+ t.getLightboxValues = function() {
+ var e = {};
+ t.isTaskExists(this._lightbox_id) && (e = this.mixin({},
+ this.getTask(this._lightbox_id)));
+ for (var n = this._get_typed_lightbox_config(), r = 0; r < n.length; r++) {
+ var a = t._lightbox_root.querySelector("#" + n[r].id);
+ a = a ? a.nextSibling: a;
+ var o = this.form_blocks[n[r].type];
+ if (o) {
+ var s = o.get_value.call(this, a, e, n[r]),
+ l = t._resolve_default_mapping(n[r]);
+ if ("string" == typeof l && "auto" != l) e[l] = s;
+ else if ("object" == i(l)) for (var c in l) l[c] && (e[l[c]] = s[c])
+ }
+ }
+ return "task" == t._lightbox_new_type && (e.type = t.config.types.task, t._lightbox_new_type = null),
+ e
+ },
+ t.hideLightbox = function() {
+ var t = this.getLightbox();
+ t && (t.style.display = "none"),
+ this._waiAria.lightboxHiddenAttr(t),
+ this._lightbox_id = null,
+ this.hideCover(),
+ this.callEvent("onAfterLightbox", [])
+ },
+ t.hideCover = function() {
+ this._cover && this._cover.parentNode.removeChild(this._cover),
+ this._cover = null
+ },
+ t.resetLightbox = function() {
+ t._lightbox && !t._custom_lightbox && t._lightbox.parentNode.removeChild(t._lightbox),
+ t._lightbox = null,
+ t.hideCover()
+ },
+ t._set_lightbox_values = function(e, n) {
+ var i = e,
+ r = n.getElementsByTagName("span"),
+ a = [];
+ t.templates.lightbox_header ? (a.push(""), a.push(t.templates.lightbox_header(i.start_date, i.end_date, i)), r[1].innerHTML = "", r[2].innerHTML = t.templates.lightbox_header(i.start_date, i.end_date, i)) : (a.push(this.templates.task_time(i.start_date, i.end_date, i)), a.push(String(this.templates.task_text(i.start_date, i.end_date, i) || "").substr(0, 70)), r[1].innerHTML = this.templates.task_time(i.start_date, i.end_date, i), r[2].innerHTML = String(this.templates.task_text(i.start_date, i.end_date, i) || "").substr(0, 70)),
+ r[1].innerHTML = a[0],
+ r[2].innerHTML = a[1],
+ t._waiAria.lightboxHeader(n, a.join(" "));
+ for (var o = this._get_typed_lightbox_config(this.getLightboxType()), s = 0; s < o.length; s++) {
+ var l = o[s];
+ if (this.form_blocks[l.type]) {
+ var c = t._lightbox_root.querySelector("#" + l.id).nextSibling,
+ u = this.form_blocks[l.type],
+ d = t._resolve_default_mapping(o[s]),
+ h = this.defined(i[d]) ? i[d] : l.default_value;
+ u.set_value.call(t, c, h, i, l),
+ l.focus && u.focus.call(t, c)
+ }
+ }
+ t.isTaskExists(e.id) && (t._lightbox_id = e.id)
+ },
+ t._fill_lightbox = function(t, e) {
+ var n = this.getTask(t);
+ this._set_lightbox_values(n, e)
+ },
+ t.getLightboxSection = function(e) {
+ for (var n = this._get_typed_lightbox_config(), i = 0; i < n.length && n[i].name != e; i++);
+ var r = n[i];
+ if (!r) return null;
+ this._lightbox || this.getLightbox();
+ var a = t._lightbox_root.querySelector("#" + r.id),
+ o = a.nextSibling,
+ s = {
+ section: r,
+ header: a,
+ node: o,
+ getValue: function(e) {
+ return t.form_blocks[r.type].get_value.call(t, o, e || {},
+ r)
+ },
+ setValue: function(e, n) {
+ return t.form_blocks[r.type].set_value.call(t, o, e, n || {},
+ r)
+ }
+ },
+ l = this._lightbox_methods["get_" + r.type + "_control"];
+ return l ? l(s) : s
+ },
+ t._lightbox_methods.get_template_control = function(t) {
+ return t.control = t.node,
+ t
+ },
+ t._lightbox_methods.get_select_control = function(t) {
+ return t.control = t.node.getElementsByTagName("select")[0],
+ t
+ },
+ t._lightbox_methods.get_textarea_control = function(t) {
+ return t.control = t.node.getElementsByTagName("textarea")[0],
+ t
+ },
+ t._lightbox_methods.get_time_control = function(t) {
+ return t.control = t.node.getElementsByTagName("select"),
+ t
+ },
+ t._init_dnd_events = function() {
+ var e = t._lightbox_root;
+ this.event(e, "mousemove", t._move_while_dnd),
+ this.event(e, "mouseup", t._finish_dnd)
+ },
+ t._move_while_dnd = function(e) {
+ if (t._dnd_start_lb) {
+ document.gantt_unselectable || (t._lightbox_root.className += " gantt_unselectable", document.gantt_unselectable = !0);
+ var n = t.getLightbox(),
+ i = [e.pageX, e.pageY];
+ n.style.top = t._lb_start[1] + i[1] - t._dnd_start_lb[1] + "px",
+ n.style.left = t._lb_start[0] + i[0] - t._dnd_start_lb[0] + "px"
+ }
+ },
+ t._ready_to_dnd = function(e) {
+ var n = t.getLightbox();
+ t._lb_start = [parseInt(n.style.left, 10), parseInt(n.style.top, 10)],
+ t._dnd_start_lb = [e.pageX, e.pageY]
+ },
+ t._finish_dnd = function() {
+ t._lb_start && (t._lb_start = t._dnd_start_lb = !1, t._lightbox_root.className = t._lightbox_root.className.replace(" gantt_unselectable", ""), document.gantt_unselectable = !1)
+ },
+ t._focus = function(e, n) {
+ if (e && e.focus) if (t.config.touch);
+ else try {
+ n && e.select && e.select(),
+ e.focus()
+ } catch(t) {}
+ },
+ t.form_blocks = {
+ getTimePicker: function(e, n) {
+ var i, a, o, s = "",
+ l = this.config,
+ c = {
+ first: 0,
+ last: 1440,
+ date: this.date.date_part(new Date(t._min_date.valueOf())),
+ timeFormat: function(e) {
+ var n, i, a;
+ if (e.time_format) return e.time_format;
+ a = ["%d", "%m", "%Y"],
+ n = t.getScale(),
+ i = n ? n.unit: t.config.duration_unit,
+ r.getSecondsInUnit(i) < r.getSecondsInUnit("day") && a.push("%H:%i");
+ return a
+ } (e)
+ };
+ for (e._time_format_order = {
+ size: 0
+ },
+ t.config.limit_time_select && (c.first = 60 * l.first_hour, c.last = 60 * l.last_hour + 1, c.date.setHours(l.first_hour)), i = 0; i < c.timeFormat.length; i++) i > 0 && (s += " "),
+ (a = v(e, i, c)) && (o = t._waiAria.lightboxSelectAttrString(c.timeFormat[i]), s += "<select " + (e.readonly ? "disabled='disabled'": "") + (n ? " style='display:none' ": "") + o + ">" + a + "</select>");
+ return s
+ },
+ getTimePickerValue: function(e, n, i) {
+ var r, a = n._time_format_order,
+ o = t.defined(a[3]),
+ s = 0,
+ l = 0,
+ c = i || 0;
+ return o && (r = parseInt(e[a[3] + c].value, 10), s = Math.floor(r / 60), l = r % 60),
+ new Date(e[a[2] + c].value, e[a[1] + c].value, e[a[0] + c].value, s, l)
+ },
+ _fill_lightbox_select: function(e, n, i, r) {
+ if (e[n + r[0]].value = i.getDate(), e[n + r[1]].value = i.getMonth(), e[n + r[2]].value = i.getFullYear(), t.defined(r[3])) {
+ var a = 60 * i.getHours() + i.getMinutes();
+ a = Math.round(a / t._get_timepicker_step()) * t._get_timepicker_step();
+ var o = e[n + r[3]];
+ o.value = a,
+ o.setAttribute("data-value", a)
+ }
+ },
+ template: new a,
+ textarea: new o,
+ select: new l,
+ time: new s,
+ duration: new d,
+ parent: new h,
+ radio: new u,
+ checkbox: new c,
+ resources: new f,
+ constraint: new _,
+ typeselect: new g
+ },
+ t._is_lightbox_timepicker = function() {
+ for (var t = this._get_typed_lightbox_config(), e = 0; e < t.length; e++) if ("time" == t[e].name && "time" == t[e].type) return ! 0;
+ return ! 1
+ },
+ t._simple_confirm = function(e, n, i, r) {
+ if (!e) return i();
+ var a = {
+ text: e
+ };
+ n && (a.title = n),
+ r && (a.ok = r),
+ i && (a.callback = function(t) {
+ t && i()
+ }),
+ t.confirm(a)
+ },
+ t._get_typed_lightbox_config = function(e) {
+ void 0 === e && (e = this.getLightboxType());
+ var n = function(t) {
+ for (var e in this.config.types) if (this.config.types[e] == t) return e;
+ return "task"
+ }.call(this, e);
+ return t.config.lightbox[n + "_sections"] ? t.config.lightbox[n + "_sections"] : t.config.lightbox.sections
+ },
+ t._silent_redraw_lightbox = function(t) {
+ var e = this.getLightboxType();
+ if (this.getState().lightbox) {
+ var n = this.getState().lightbox,
+ i = this.getLightboxValues(),
+ r = this.copy(this.getTask(n));
+ this.resetLightbox();
+ var a = this.mixin(r, i, !0),
+ o = this.getLightbox(t || void 0);
+ this._center_lightbox(this.getLightbox()),
+ this._set_lightbox_values(a, o),
+ this.showCover()
+ } else this.resetLightbox(),
+ this.getLightbox(t || void 0);
+ this.callEvent("onLightboxChange", [e, this.getLightboxType()])
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ function e(e) {
+ var n = e.$config.scrollX ? t.$ui.getView(e.$config.scrollX) : null,
+ i = e.$config.scrollY ? t.$ui.getView(e.$config.scrollY) : null,
+ r = {
+ x: null,
+ y: null
+ };
+ n && (n.getScrollState().visible && (r.x = n.$view.scrollLeft));
+ i && (i.getScrollState().visible && (r.y = i.$view.scrollTop));
+ return r
+ }
+ function n() {
+ var e;
+ return t.$ui.getView("timeline") && (e = t.$ui.getView("timeline")._tasks_dnd),
+ e
+ }
+ t.config.touch_drag = 500,
+ t.config.touch = !0,
+ t.config.touch_feedback = !0,
+ t.config.touch_feedback_duration = 1,
+ t._prevent_touch_scroll = !1,
+ t._touch_feedback = function() {
+ t.config.touch_feedback && navigator.vibrate && navigator.vibrate(t.config.touch_feedback_duration)
+ },
+ t.attachEvent("onGanttReady", t.bind(function() {
+ if ("force" != this.config.touch && (this.config.touch = this.config.touch && ( - 1 != navigator.userAgent.indexOf("Mobile") || -1 != navigator.userAgent.indexOf("iPad") || -1 != navigator.userAgent.indexOf("Android") || -1 != navigator.userAgent.indexOf("Touch")) || "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1), this.config.touch) {
+ var t = !0;
+ try {
+ document.createEvent("TouchEvent")
+ } catch(e) {
+ t = !1
+ }
+ t ? this._touch_events(["touchmove", "touchstart", "touchend"],
+ function(t) {
+ return t.touches && t.touches.length > 1 ? null: t.touches[0] ? {
+ target: t.target,
+ pageX: t.touches[0].pageX,
+ pageY: t.touches[0].pageY,
+ clientX: t.touches[0].clientX,
+ clientY: t.touches[0].clientY
+ }: t
+ },
+ function() {
+ return ! 1
+ }) : window.navigator.pointerEnabled ? this._touch_events(["pointermove", "pointerdown", "pointerup"],
+ function(t) {
+ return "mouse" == t.pointerType ? null: t
+ },
+ function(t) {
+ return ! t || "mouse" == t.pointerType
+ }) : window.navigator.msPointerEnabled && this._touch_events(["MSPointerMove", "MSPointerDown", "MSPointerUp"],
+ function(t) {
+ return t.pointerType == t.MSPOINTER_TYPE_MOUSE ? null: t
+ },
+ function(t) {
+ return ! t || t.pointerType == t.MSPOINTER_TYPE_MOUSE
+ })
+ }
+ },
+ t));
+ var i = [];
+ t._touch_events = function(r, a, o) {
+ for (var s, l = 0,
+ c = !1,
+ u = !1,
+ d = null,
+ h = null,
+ f = null,
+ _ = [], g = null, p = 0; p < i.length; p++) t.eventRemove(i[p][0], i[p][1], i[p][2]); (i = []).push([t.$container, r[0],
+ function(i) {
+ var r = n();
+ if (!o(i) && c) {
+ h && clearTimeout(h);
+ var f = a(i);
+ if (r && (r.drag.id || r.drag.start_drag)) return r.on_mouse_move(f),
+ i.preventDefault && i.preventDefault(),
+ i.cancelBubble = !0,
+ !1;
+ if (!t._prevent_touch_scroll) {
+ if (f && d) {
+ var _ = d.pageX - f.pageX,
+ p = d.pageY - f.pageY;
+ if (!u && (Math.abs(_) > 5 || Math.abs(p) > 5) && (u = !0, l = 0, s = g ? e(g) : t.getScrollState()), u) {
+ var m, y = s.x + _,
+ k = s.y + p;
+ if (g ? (!
+ function(e, n, i) {
+ var r = e.$config.scrollX ? t.$ui.getView(e.$config.scrollX) : null,
+ a = e.$config.scrollY ? t.$ui.getView(e.$config.scrollY) : null;
+ r && r.scrollTo(n, null),
+ a && a.scrollTo(null, i)
+ } (g, y, k), m = e(g)) : (t.scrollTo(y, k), m = t.getScrollState()), s.x != m.x && p > 2 * _ || s.y != m.y && _ > 2 * p) return v(i)
+ }
+ }
+ return v(i)
+ }
+ return ! 0
+ }
+ }]),
+ i.push([this.$container, "contextmenu",
+ function(t) {
+ if (c) return v(t)
+ }]),
+ i.push([this.$container, r[1],
+ function(e) {
+ if (document && document.body && document.body.classList.add("gantt_touch_active"), !o(e)) if (e.touches && e.touches.length > 1) c = !1;
+ else {
+ d = a(e),
+ g = function(e) {
+ for (var n = t.$layout.getCellsByType("viewCell"), i = 0; i < n.length; i++) {
+ var r = n[i].$view.getBoundingClientRect();
+ if (e.clientX >= r.left && e.clientX <= r.right && e.clientY <= r.bottom && e.clientY >= r.top) return n[i]
+ }
+ } (d),
+ t._locate_css(d, "gantt_hor_scroll") || t._locate_css(d, "gantt_ver_scroll") || (c = !0);
+ var i = n();
+ h = setTimeout(function() {
+ var e = t.locate(d);
+ i && e && !t._locate_css(d, "gantt_link_control") && !t._locate_css(d, "gantt_grid_data") && (i.on_mouse_down(d), i.drag && i.drag.start_drag && (!
+ function(e) {
+ var n = t._getTaskLayers(),
+ i = t.getTask(e);
+ if (i && t.isTaskVisible(e)) {
+ f = e;
+ for (var r = 0; r < n.length; r++) if ((i = n[r].rendered[e]) && i.getAttribute(t.config.task_attribute) && i.getAttribute(t.config.task_attribute) == e) {
+ var a = i.cloneNode(!0);
+ _.push(i),
+ n[r].rendered[e] = a,
+ i.style.display = "none",
+ a.className += " gantt_drag_move ",
+ i.parentNode.appendChild(a)
+ }
+ }
+ } (e), i._start_dnd(d), t._touch_drag = !0, t.refreshTask(e), t._touch_feedback())),
+ h = null
+ },
+ t.config.touch_drag)
+ }
+ }]),
+ i.push([this.$container, r[2],
+ function(e) {
+ if (document && document.body && document.body.classList.remove("gantt_touch_active"), !o(e)) {
+ h && clearTimeout(h),
+ t._touch_drag = !1,
+ c = !1;
+ var i = a(e),
+ r = n();
+ if (r && r.on_mouse_up(i), f && t.isTaskExists(f) && (t.refreshTask(f), _.length && (_.forEach(function(t) {
+ t.parentNode && t.parentNode.removeChild(t)
+ }), t._touch_feedback())), c = u = !1, _ = [], f = null, d && l) {
+ var s = new Date;
+ if (s - l < 500) t.$services.getService("mouseEvents").onDoubleClick(d),
+ v(e);
+ else l = s
+ } else l = new Date
+ }
+ }]);
+ for (p = 0; p < i.length; p++) t.event(i[p][0], i[p][1], i[p][2]);
+ function v(t) {
+ return t && t.preventDefault && t.preventDefault(),
+ t.cancelBubble = !0,
+ !1
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(11),
+ r = n(5),
+ a = ["ctrlKey", "altKey", "shiftKey", "metaKey"],
+ o = [[{
+ unit: "month",
+ date: "%M",
+ step: 1
+ },
+ {
+ unit: "day",
+ date: "%d",
+ step: 1
+ }], [{
+ unit: "day",
+ date: "%d %M",
+ step: 1
+ }], [{
+ unit: "day",
+ date: "%d %M",
+ step: 1
+ },
+ {
+ unit: "hour",
+ date: "%H:00",
+ step: 8
+ }], [{
+ unit: "day",
+ date: "%d %M",
+ step: 1
+ },
+ {
+ unit: "hour",
+ date: "%H:00",
+ step: 1
+ }]],
+ s = function() {
+ function t(t) {
+ var e = this;
+ this.zoomIn = function() {
+ var t = e.getCurrentLevel() - 1;
+ t < 0 || e.setLevel(t)
+ },
+ this.zoomOut = function() {
+ var t = e.getCurrentLevel() + 1;
+ t > e._levels.length - 1 || e.setLevel(t)
+ },
+ this.getCurrentLevel = function() {
+ return e._activeLevelIndex
+ },
+ this.getLevels = function() {
+ return e._levels
+ },
+ this.setLevel = function(t) {
+ var n = e._getZoomIndexByName(t); - 1 === n && e.$gantt.assert( - 1 !== n, "Invalid zoom level for gantt.ext.zoom.setLevel. " + t + " is not an expected value."),
+ e._setLevel(n, 0)
+ },
+ this._getZoomIndexByName = function(t) {
+ var n = -1;
+ if ("string" == typeof t) {
+ if (!isNaN(Number(t)) && e._levels[Number(t)]) n = Number(t);
+ else for (var i = 0; i < e._levels.length; i++) if (e._levels[i].name === t) {
+ n = i;
+ break
+ }
+ } else n = t;
+ return n
+ },
+ this._getVisibleDate = function() {
+ if (!e.$gantt.$task) return null;
+ var t = e.$gantt.getScrollState().x,
+ n = e.$gantt.$task.offsetWidth;
+ e._visibleDate = e.$gantt.dateFromPos(t + n / 2)
+ },
+ this._setLevel = function(t, n) {
+ e._activeLevelIndex = t;
+ var i = e.$gantt,
+ r = i.copy(e._levels[e._activeLevelIndex]),
+ a = i.copy(r);
+ if (delete a.name, i.mixin(i.config, a, !0), !!i.$root && !!i.$task) {
+ if (n) {
+ var o = e.$gantt.dateFromPos(n + e.$gantt.getScrollState().x);
+ e.$gantt.render();
+ var s = e.$gantt.posFromDate(o);
+ e.$gantt.scrollTo(s - n)
+ } else {
+ var l = e.$gantt.$task.offsetWidth;
+ e._visibleDate || e._getVisibleDate();
+ var c = e._visibleDate;
+ e.$gantt.render();
+ s = e.$gantt.posFromDate(c);
+ e.$gantt.scrollTo(s - l / 2)
+ }
+ e.callEvent("onAfterZoom", [e._activeLevelIndex, r])
+ }
+ },
+ this._attachWheelEvent = function(t) {
+ var n, r = i.isFF ? "wheel": "mousewheel"; (n = "function" == typeof t.element ? t.element() : t.element) && e._domEvents.attach(n, r, e.$gantt.bind(function(t) {
+ if (this._useKey) {
+ if (a.indexOf(this._useKey) < 0) return ! 1;
+ if (!t[this._useKey]) return ! 1
+ }
+ if ("function" == typeof this._handler) return this._handler.apply(this, [t]),
+ !0
+ },
+ e), {
+ passive: !1
+ })
+ },
+ this._defaultHandler = function(t) {
+ var n = e.$gantt.$task.getBoundingClientRect().x,
+ i = t.clientX - n,
+ r = !1; (e.$gantt.env.isFF ? -40 * t.deltaY: t.wheelDelta) > 0 && (r = !0),
+ t.preventDefault(),
+ t.stopPropagation(),
+ e._setScaleSettings(r, i)
+ },
+ this._setScaleDates = function() {
+ e._initialStartDate && e._initialEndDate && (e.$gantt.config.start_date = e._initialStartDate, e.$gantt.config.end_date = e._initialEndDate)
+ },
+ this.$gantt = t,
+ this._domEvents = this.$gantt._createDomEventScope()
+ }
+ return t.prototype.init = function(t) {
+ var e = this;
+ this.$gantt.env.isNode || (this._initialStartDate = t.startDate, this._initialEndDate = t.endDate, this._activeLevelIndex = t.activeLevelIndex ? t.activeLevelIndex: 0, this._levels = this._mapScales(t.levels || o), this._handler = t.handler || this._defaultHandler, this._minColumnWidth = t.minColumnWidth || 60, this._maxColumnWidth = t.maxColumnWidth || 240, this._widthStep = t.widthStep || 3 / 8 * t.minColumnWidth, this._useKey = t.useKey, this._initialized || (r(this), this.$gantt.attachEvent("onGanttScroll",
+ function() {
+ e._getVisibleDate()
+ })), this._domEvents.detachAll(), "wheel" === t.trigger && (this.$gantt.$root ? this._attachWheelEvent(t) : this.$gantt.attachEvent("onGanttReady",
+ function() {
+ e._attachWheelEvent(t)
+ })), this._initialized = !0, this.setLevel(this._activeLevelIndex))
+ },
+ t.prototype._mapScales = function(t) {
+ return t.map(function(t) {
+ return Array.isArray(t) ? {
+ scales: t
+ }: t
+ })
+ },
+ t.prototype._setScaleSettings = function(t, e) {
+ t ? this._stepUp(e) : this._stepDown(e)
+ },
+ t.prototype._stepUp = function(t) {
+ if (! (this._activeLevelIndex >= this._levels.length - 1)) {
+ var e = this._activeLevelIndex;
+ if (this._setScaleDates(), this._widthStep) {
+ var n = this.$gantt.config.min_column_width + this._widthStep;
+ n > this._maxColumnWidth && (n = this._minColumnWidth, e++),
+ this.$gantt.config.min_column_width = n
+ } else e++;
+ this._setLevel(e, t)
+ }
+ },
+ t.prototype._stepDown = function(t) {
+ if (! (this._activeLevelIndex < 1)) {
+ var e = this._activeLevelIndex;
+ if (this._setScaleDates(), this._widthStep) {
+ var n = this.$gantt.config.min_column_width - this._widthStep;
+ n < this._minColumnWidth && (n = this._maxColumnWidth, e--),
+ this.$gantt.config.min_column_width = n
+ } else e--;
+ this._setLevel(e, t)
+ }
+ },
+ t
+ } ();
+ e.
+ default = s
+ },
+ function(t, e) {
+ window.dhtmlx && (window.dhtmlx.attaches || (window.dhtmlx.attaches = {}), window.dhtmlx.attaches.attachGantt = function(t, e, n) {
+ var i = document.createElement("DIV");
+ n = n || window.gantt,
+ i.id = "gantt_" + n.uid(),
+ i.style.width = "100%",
+ i.style.height = "100%",
+ i.cmp = "grid",
+ document.body.appendChild(i),
+ this.attachObject(i.id),
+ this.dataType = "gantt",
+ this.dataObj = n;
+ var r = this.vs[this.av];
+ r.grid = n,
+ n.init(i.id, t, e),
+ i.firstChild.style.border = "none",
+ r.gridId = i.id,
+ r.gridObj = i;
+ return this.vs[this._viewRestore()].grid
+ }),
+ void 0 !== window.dhtmlXCellObject && (window.dhtmlXCellObject.prototype.attachGantt = function(t, e, n) {
+ n = n || window.gantt;
+ var i = document.createElement("DIV");
+ return i.id = "gantt_" + n.uid(),
+ i.style.width = "100%",
+ i.style.height = "100%",
+ i.cmp = "grid",
+ document.body.appendChild(i),
+ this.attachObject(i.id),
+ this.dataType = "gantt",
+ this.dataObj = n,
+ n.init(i.id, t, e),
+ i.firstChild.style.border = "none",
+ i = null,
+ this.callEvent("_onContentAttach", []),
+ this.dataObj
+ }),
+ t.exports = null
+ },
+ function(t, e) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ window.jQuery &&
+ function(t) {
+ var e = [];
+ t.fn.dhx_gantt = function(i) {
+ if ("string" != typeof(i = i || {})) {
+ var r = [];
+ return this.each(function() {
+ if (this && this.getAttribute) if (this.gantt || window.gantt.$root == this) r.push("object" == n(this.gantt) ? this.gantt: window.gantt);
+ else {
+ var t = window.gantt.$container && window.Gantt ? window.Gantt.getGanttInstance() : window.gantt;
+ for (var e in i)"data" != e && (t.config[e] = i[e]);
+ t.init(this),
+ i.data && t.parse(i.data),
+ r.push(t)
+ }
+ }),
+ 1 === r.length ? r[0] : r
+ }
+ if (e[i]) return e[i].apply(this, []);
+ t.error("Method " + i + " does not exist on jQuery.dhx_gantt")
+ }
+ } (window.jQuery),
+ t.exports = null
+ },
+ function(t, e, n) {
+ var i = n(1),
+ r = n(15);
+ t.exports = function(t) {
+ var e = 50,
+ n = 30,
+ a = 10,
+ o = 50,
+ s = null,
+ l = !1,
+ c = null,
+ u = {
+ started: !1
+ },
+ d = {};
+ function h(e) {
+ return e && i.isChildOf(e, t.$root) && e.offsetHeight
+ }
+ function f() {
+ var e = !!document.querySelector(".gantt_drag_marker"),
+ n = !!document.querySelector(".gantt_drag_marker.gantt_grid_resize_area") || !!document.querySelector(".gantt_drag_marker.gantt_row_grid_resize_area"),
+ i = !!document.querySelector(".gantt_link_direction"),
+ r = t.getState(),
+ a = r.autoscroll;
+ return l = e && !n && !i,
+ !(!r.drag_mode && !e || n) || a
+ }
+ function _(e) {
+ if (c && (clearTimeout(c), c = null), e) {
+ var n = t.config.autoscroll_speed;
+ n && n < 10 && (n = 10),
+ c = setTimeout(function() {
+ s = setInterval(v, n || o)
+ },
+ t.config.autoscroll_delay || a)
+ }
+ }
+ function g(t) {
+ t ? (_(!0), u.started || (u.x = d.x, u.y = d.y, u.started = !0)) : (s && (clearInterval(s), s = null), _(!1), u.started = !1)
+ }
+ function p(e) {
+ var n = f();
+ if (!s && !c || n || g(!1), !t.config.autoscroll || !n) return ! 1;
+ d = {
+ x: e.clientX,
+ y: e.clientY
+ },
+ "touchmove" == e.type && (d.x = e.targetTouches[0].clientX, d.y = e.targetTouches[0].clientY),
+ !s && n && g(!0)
+ }
+ function v() {
+ if (!f()) return g(!1),
+ !1;
+ var e = h(t.$task) ? t.$task: h(t.$grid) ? t.$grid: t.$root;
+ if (e) {
+ var r = !1; [".gantt_drag_marker.gantt_grid_resize_area", ".gantt_drag_marker .gantt_row.gantt_row_task", ".gantt_drag_marker.gantt_grid_dnd_marker"].forEach(function(t) {
+ r = r || !!document.querySelector(t)
+ }),
+ r && (e = t.$grid);
+ var a = i.getNodePosition(e),
+ o = d.x - a.x,
+ s = d.y - a.y + window.scrollY,
+ c = l ? 0 : m(o, a.width, u.x - a.x),
+ _ = m(s, a.height, u.y - a.y + window.scrollY),
+ p = t.getScrollState(),
+ v = p.y,
+ y = p.inner_height,
+ k = p.height,
+ b = p.x,
+ x = p.inner_width,
+ w = p.width;
+ _ && !y ? _ = 0 : _ < 0 && !v ? _ = 0 : _ > 0 && v + y >= k + 2 && (_ = 0),
+ c && !x ? c = 0 : c < 0 && !b ? c = 0 : c > 0 && b + x >= w && (c = 0);
+ var S = t.config.autoscroll_step;
+ S && S < 2 && (S = 2),
+ c *= S || n,
+ _ *= S || n,
+ (c || _) &&
+ function(e, n) {
+ var i = t.getScrollState(),
+ r = null,
+ a = null;
+ e && (r = i.x + e, r = Math.min(i.width, r), r = Math.max(0, r));
+ n && (a = i.y + n, a = Math.min(i.height, a), a = Math.max(0, a));
+ t.scrollTo(r, a)
+ } (c, _)
+ }
+ }
+ function m(t, n, i) {
+ return t - e < 0 && t < i ? -1 : t > n - e && t > i ? 1 : 0
+ }
+ t.attachEvent("onGanttReady",
+ function() {
+ if (!r(t)) {
+ var e = i.getRootNode(t.$root) || document.body;
+ t.eventRemove(e, "mousemove", p),
+ t.event(e, "mousemove", p),
+ t.eventRemove(e, "touchmove", p),
+ t.event(e, "touchmove", p),
+ t.eventRemove(e, "pointermove", p),
+ t.event(e, "pointermove", p)
+ }
+ }),
+ t.attachEvent("onDestroy",
+ function() {
+ g(!1)
+ })
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ t.ext || (t.ext = {});
+ for (var e = [n(84), n(83), n(82)], i = 0; i < e.length; i++) e[i] && e[i](t);
+ var r = n(81).
+ default;
+ t.ext.zoom = new r(t)
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.skins.contrast_white = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 100,
+ _third_column_width: 80
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.skins.contrast_black = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 100,
+ _third_column_width: 80
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.skins.material = {
+ config: {
+ grid_width: 411,
+ row_height: 34,
+ task_height_offset: 6,
+ scale_height: 36,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 80
+ },
+ _second_column_width: 110,
+ _third_column_width: 75,
+ _redefine_lightbox_buttons: {
+ buttons_left: ["dhx_delete_btn"],
+ buttons_right: ["dhx_save_btn", "dhx_cancel_btn"]
+ }
+ },
+ t.attachEvent("onAfterTaskDrag",
+ function(e) {
+ var n = t.getTaskNode(e);
+ n && (n.className += " gantt_drag_animation", setTimeout(function() {
+ var t = n.className.indexOf(" gantt_drag_animation");
+ t > -1 && (n.className = n.className.slice(0, t))
+ },
+ 200))
+ })
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.skins.broadway = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 1,
+ link_arrow_size: 7,
+ lightbox_additional_height: 86
+ },
+ _second_column_width: 90,
+ _third_column_width: 80,
+ _lightbox_template: "<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span><div class='gantt_cancel_btn'></div></div><div class='gantt_cal_larea'></div>",
+ _config_buttons_left: {},
+ _config_buttons_right: {
+ gantt_delete_btn: "icon_delete",
+ gantt_save_btn: "icon_save"
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.skins.terrace = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 90,
+ _third_column_width: 70
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.skins.meadow = {
+ config: {
+ grid_width: 350,
+ row_height: 27,
+ scale_height: 30,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 72
+ },
+ _second_column_width: 95,
+ _third_column_width: 80
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.skins.skyblue = {
+ config: {
+ grid_width: 350,
+ row_height: 27,
+ scale_height: 27,
+ link_line_width: 1,
+ link_arrow_size: 8,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 95,
+ _third_column_width: 80
+ }
+ }
+ },
+ function(t, e) {
+ function n(t, e) {
+ var n = e.skin;
+ if (!n || t) for (var i = document.getElementsByTagName("link"), r = 0; r < i.length; r++) {
+ var a = i[r].href.match("dhtmlxgantt_([a-z_]+).css");
+ if (a && (e.skins[a[1]] || !n)) {
+ n = a[1];
+ break
+ }
+ }
+ e.skin = n || "terrace";
+ var o = e.skins[e.skin] || e.skins.terrace; !
+ function(t, e, n) {
+ for (var i in e)(void 0 === t[i] || n) && (t[i] = e[i])
+ } (e.config, o.config, t);
+ var s = e.getGridColumns();
+ s[1] && !e.defined(s[1].width) && (s[1].width = o._second_column_width),
+ s[2] && !e.defined(s[2].width) && (s[2].width = o._third_column_width);
+ for (r = 0; r < s.length; r++) {
+ var l = s[r];
+ "add" == l.name && (l.width || (l.width = 44), e.defined(l.min_width) && e.defined(l.max_width) || (l.min_width = l.min_width || l.width, l.max_width = l.max_width || l.width), l.min_width && (l.min_width = +l.min_width), l.max_width && (l.max_width = +l.max_width), l.width && (l.width = +l.width, l.width = l.min_width && l.min_width > l.width ? l.min_width: l.width, l.width = l.max_width && l.max_width < l.width ? l.max_width: l.width))
+ }
+ o.config.task_height && (e.config.task_height = o.config.task_height || "full"),
+ o.config.bar_height && (e.config.bar_height = o.config.bar_height || "full"),
+ o._lightbox_template && (e._lightbox_template = o._lightbox_template),
+ o._redefine_lightbox_buttons && (e.config.buttons_right = o._redefine_lightbox_buttons.buttons_right, e.config.buttons_left = o._redefine_lightbox_buttons.buttons_left),
+ e.resetLightbox()
+ }
+ t.exports = function(t) {
+ t.resetSkin || (t.resetSkin = function() {
+ this.skin = "",
+ n(!0, this)
+ },
+ t.skins = {},
+ t.attachEvent("onGanttLayoutReady",
+ function() {
+ n(!1, this)
+ }))
+ }
+ },
+ function(t, e) {
+ t.exports = function() {
+ function t(t) {
+ return t.$ui.getView("timeline")
+ }
+ function e(t) {
+ return t.$ui.getView("grid")
+ }
+ function n(n) {
+ var i = t(n);
+ if (i && !i.$config.hidden) return i;
+ var r = e(n);
+ return r && !r.$config.hidden ? r: null
+ }
+ function i(t) {
+ var i = null,
+ r = !1;
+ return [".gantt_drag_marker.gantt_grid_resize_area", ".gantt_drag_marker .gantt_row.gantt_row_task", ".gantt_drag_marker.gantt_grid_dnd_marker"].forEach(function(t) {
+ r = r || !!document.querySelector(t)
+ }),
+ (i = r ? e(t) : n(t)) ? a(t, i, "scrollY") : null
+ }
+ function r(t) {
+ var e = n(t);
+ return e && "grid" != e.id ? a(t, e, "scrollX") : null
+ }
+ function a(t, e, n) {
+ var i = e.$config[n];
+ return t.$ui.getView(i)
+ }
+ var o = "DEFAULT_VALUE";
+ function s(t, e, n, i) {
+ var r = t(this);
+ return r && r.isVisible() ? r[e].apply(r, n) : i ? i() : o
+ }
+ return {
+ getColumnIndex: function(t) {
+ var n = s.call(this, e, "getColumnIndex", [t]);
+ return n === o ? 0 : n
+ },
+ dateFromPos: function(e) {
+ var n = s.call(this, t, "dateFromPos", Array.prototype.slice.call(arguments));
+ return n === o ? this.getState().min_date: n
+ },
+ posFromDate: function(e) {
+ var n = s.call(this, t, "posFromDate", [e]);
+ return n === o ? 0 : n
+ },
+ getRowTop: function(n) {
+ var i = this,
+ r = s.call(i, t, "getRowTop", [n],
+ function() {
+ return s.call(i, e, "getRowTop", [n])
+ });
+ return r === o ? 0 : r
+ },
+ getTaskTop: function(n) {
+ var i = this,
+ r = s.call(i, t, "getItemTop", [n],
+ function() {
+ return s.call(i, e, "getItemTop", [n])
+ });
+ return r === o ? 0 : r
+ },
+ getTaskPosition: function(e, n, i) {
+ var r = s.call(this, t, "getItemPosition", [e, n, i]);
+ return r === o ? {
+ left: 0,
+ top: this.getTaskTop(e.id),
+ height: this.getTaskBarHeight(e.id),
+ width: 0
+ }: r
+ },
+ getTaskBarHeight: function(n, i) {
+ var r = this,
+ a = s.call(r, t, "getBarHeight", [n, i],
+ function() {
+ return s.call(r, e, "getItemHeight", [n])
+ });
+ return a === o ? 0 : a
+ },
+ getTaskHeight: function(n) {
+ var i = this,
+ r = s.call(i, t, "getItemHeight", [n],
+ function() {
+ return s.call(i, e, "getItemHeight", [n])
+ });
+ return r === o ? 0 : r
+ },
+ columnIndexByDate: function(e) {
+ var n = s.call(this, t, "columnIndexByDate", [e]);
+ return n === o ? 0 : n
+ },
+ roundTaskDates: function() {
+ s.call(this, t, "roundTaskDates", [])
+ },
+ getScale: function() {
+ var e = s.call(this, t, "getScale", []);
+ return e === o ? null: e
+ },
+ getTaskNode: function(e) {
+ var n = t(this);
+ if (n && n.isVisible()) {
+ var i = n._taskRenderer.rendered[e];
+ if (!i) {
+ var r = n.$config.item_attribute;
+ i = n.$task_bars.querySelector("[" + r + "='" + e + "']")
+ }
+ return i || null
+ }
+ return null
+ },
+ getLinkNode: function(e) {
+ var n = t(this);
+ return n.isVisible() ? n._linkRenderer.rendered[e] : null
+ },
+ scrollTo: function(t, e) {
+ var n = i(this),
+ a = r(this),
+ o = {
+ position: 0
+ },
+ s = {
+ position: 0
+ };
+ n && (s = n.getScrollState()),
+ a && (o = a.getScrollState());
+ var l = a && 1 * t == t,
+ c = n && 1 * e == e;
+ if (l && c) for (var u = n._getLinkedViews(), d = a._getLinkedViews(), h = [], f = 0; f < u.length; f++) for (var _ = 0; _ < d.length; _++) u[f].$config.id && d[_].$config.id && u[f].$config.id === d[_].$config.id && h.push(u[f].$config.id);
+ l && (h && h.forEach(function(t) {
+ this.$ui.getView(t).$config.$skipSmartRenderOnScroll = !0
+ }.bind(this)), a.scroll(t), h && h.forEach(function(t) {
+ this.$ui.getView(t).$config.$skipSmartRenderOnScroll = !1
+ }.bind(this))),
+ c && n.scroll(e);
+ var g = {
+ position: 0
+ },
+ p = {
+ position: 0
+ };
+ n && (g = n.getScrollState()),
+ a && (p = a.getScrollState()),
+ this.callEvent("onGanttScroll", [o.position, s.position, p.position, g.position])
+ },
+ showDate: function(t) {
+ var e = this.posFromDate(t),
+ n = Math.max(e - this.config.task_scroll_offset, 0);
+ this.scrollTo(n)
+ },
+ showTask: function(n) {
+ var i = this.getTaskPosition(this.getTask(n)),
+ r = i.left;
+ this.config.rtl && (r = i.left + i.width);
+ var o, s = Math.max(r - this.config.task_scroll_offset, 0),
+ l = this._scroll_state().y;
+ o = l ? i.top - (l - this.getTaskBarHeight(n)) / 2 : i.top,
+ this.scrollTo(s, o);
+ var c = e(this),
+ u = t(this);
+ c && u && c.$config.scrollY != u.$config.scrollY && a(this, c, "scrollY").scrollTo(null, o)
+ },
+ _scroll_state: function() {
+ var t = {
+ x: !1,
+ y: !1,
+ x_pos: 0,
+ y_pos: 0,
+ scroll_size: this.config.scroll_size + 1,
+ x_inner: 0,
+ y_inner: 0
+ },
+ e = i(this),
+ n = r(this);
+ if (n) {
+ var a = n.getScrollState();
+ a.visible && (t.x = a.size, t.x_inner = a.scrollSize),
+ t.x_pos = a.position || 0
+ }
+ if (e) {
+ var o = e.getScrollState();
+ o.visible && (t.y = o.size, t.y_inner = o.scrollSize),
+ t.y_pos = o.position || 0
+ }
+ return t
+ },
+ getScrollState: function() {
+ var t = this._scroll_state();
+ return {
+ x: t.x_pos,
+ y: t.y_pos,
+ inner_width: t.x,
+ inner_height: t.y,
+ width: t.x_inner,
+ height: t.y_inner
+ }
+ },
+ getLayoutView: function(t) {
+ return this.$ui.getView(t)
+ },
+ scrollLayoutCell: function(t, e, n) {
+ var i = this.$ui.getView(t);
+ if (!i) return ! 1;
+ if (null !== e) {
+ var r = this.$ui.getView(i.$config.scrollX);
+ r && r.scrollTo(e, null)
+ }
+ if (null !== n) {
+ var a = this.$ui.getView(i.$config.scrollY);
+ a && a.scrollTo(null, n)
+ }
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ delete t.addTaskLayer,
+ delete t.addLinkLayer
+ }
+ },
+ function(t, e, n) {
+ var i = n(1),
+ r = function(t) {
+ return {
+ getVerticalScrollbar: function() {
+ return t.$ui.getView("scrollVer")
+ },
+ getHorizontalScrollbar: function() {
+ return t.$ui.getView("scrollHor")
+ },
+ _legacyGridResizerClass: function(t) {
+ for (var e = t.getCellsByType("resizer"), n = 0; n < e.length; n++) {
+ var i = e[n],
+ r = !1,
+ a = i.$parent.getPrevSibling(i.$id);
+ if (a && a.$config && "grid" === a.$config.id) r = !0;
+ else {
+ var o = i.$parent.getNextSibling(i.$id);
+ o && o.$config && "grid" === o.$config.id && (r = !0)
+ }
+ r && (i.$config.css = (i.$config.css ? i.$config.css + " ": "") + "gantt_grid_resize_wrap")
+ }
+ },
+ onCreated: function(e) {
+ var n = !0;
+ this._legacyGridResizerClass(e),
+ e.attachEvent("onBeforeResize",
+ function() {
+ var r = t.$ui.getView("timeline");
+ r && (r.$config.hidden = r.$parent.$config.hidden = !t.config.show_chart);
+ var a = t.$ui.getView("grid");
+ if (a) {
+ var o = a._getColsTotalWidth(),
+ s = !t.config.show_grid || !t.config.grid_width || 0 === o;
+ if (n && !s && !1 !== o && (t.config.grid_width = o), a.$config.hidden = a.$parent.$config.hidden = s, !a.$config.hidden) {
+ var l = a._getGridWidthLimits();
+ if (l[0] && t.config.grid_width < l[0] && (t.config.grid_width = l[0]), l[1] && t.config.grid_width > l[1] && (t.config.grid_width = l[1]), r && t.config.show_chart) {
+ if (a.$config.width = t.config.grid_width - 1, !a.$config.scrollable && a.$config.scrollY && t.$root.offsetWidth) {
+ var c = a.$gantt.$layout.$container.offsetWidth,
+ u = t.$ui.getView(a.$config.scrollY).$config.width,
+ d = c - (a.$config.width + u);
+ d < 0 && (a.$config.width += d, t.config.grid_width += d)
+ }
+ if (n) a.$parent.$config.width = t.config.grid_width,
+ a.$parent.$config.group && t.$layout._syncCellSizes(a.$parent.$config.group, {
+ value: a.$parent.$config.width,
+ isGravity: !1
+ });
+ else if (r && !i.isChildOf(r.$task, e.$view)) {
+ if (!a.$config.original_grid_width) {
+ var h = t.skins[t.skin];
+ h && h.config && h.config.grid_width ? a.$config.original_grid_width = h.config.grid_width: a.$config.original_grid_width = 0
+ }
+ t.config.grid_width = a.$config.original_grid_width,
+ a.$parent.$config.width = t.config.grid_width
+ } else a.$parent._setContentSize(a.$config.width, null),
+ t.$layout._syncCellSizes(a.$parent.$config.group, {
+ value: t.config.grid_width,
+ isGravity: !1
+ })
+ } else r && i.isChildOf(r.$task, e.$view) && (a.$config.original_grid_width = t.config.grid_width),
+ n || (a.$parent.$config.width = 0)
+ }
+ n = !1
+ }
+ }),
+ this._initScrollStateEvents(e)
+ },
+ _initScrollStateEvents: function(e) {
+ t._getVerticalScrollbar = this.getVerticalScrollbar,
+ t._getHorizontalScrollbar = this.getHorizontalScrollbar;
+ var n = this.getVerticalScrollbar(),
+ i = this.getHorizontalScrollbar();
+ n && n.attachEvent("onScroll",
+ function(e, n, i) {
+ var r = t.getScrollState();
+ t.callEvent("onGanttScroll", [r.x, e, r.x, n])
+ }),
+ i && i.attachEvent("onScroll",
+ function(e, n, i) {
+ var r = t.getScrollState();
+ t.callEvent("onGanttScroll", [e, r.y, n, r.y]);
+ var a = t.$ui.getView("grid");
+ a && a.$grid_data && !a.$config.scrollable && (a.$grid_data.style.left = a.$grid.scrollLeft + "px", a.$grid_data.scrollLeft = a.$grid.scrollLeft)
+ }),
+ e.attachEvent("onResize",
+ function() {
+ n && !t.$scroll_ver && (t.$scroll_ver = n.$scroll_ver),
+ i && !t.$scroll_hor && (t.$scroll_hor = i.$scroll_hor)
+ })
+ },
+ _findGridResizer: function(t, e) {
+ for (var n, i = t.getCellsByType("resizer"), r = !0, a = 0; a < i.length; a++) {
+ var o = i[a];
+ o._getSiblings();
+ var s = o._behind,
+ l = o._front;
+ if (s && s.$content === e || s.isChild && s.isChild(e)) {
+ n = o,
+ r = !0;
+ break
+ }
+ if (l && l.$content === e || l.isChild && l.isChild(e)) {
+ n = o,
+ r = !1;
+ break
+ }
+ }
+ return {
+ resizer: n,
+ gridFirst: r
+ }
+ },
+ onInitialized: function(e) {
+ var n = t.$ui.getView("grid"),
+ i = this._findGridResizer(e, n);
+ if (i.resizer) {
+ var r, a = i.gridFirst,
+ o = i.resizer;
+ if ("x" !== o.$config.mode) return;
+ o.attachEvent("onResizeStart",
+ function(e, n) {
+ var i = t.$ui.getView("grid"),
+ o = i ? i.$parent: null;
+ if (o) {
+ var s = i._getGridWidthLimits();
+ i.$config.scrollable || (o.$config.minWidth = s[0]),
+ o.$config.maxWidth = s[1]
+ }
+ return r = a ? e: n,
+ t.callEvent("onGridResizeStart", [r])
+ }),
+ o.attachEvent("onResize",
+ function(e, n) {
+ var i = a ? e: n;
+ return t.callEvent("onGridResize", [r, i])
+ }),
+ o.attachEvent("onResizeEnd",
+ function(e, n, i, r) {
+ var o = a ? e: n,
+ s = a ? i: r,
+ l = t.$ui.getView("grid"),
+ c = l ? l.$parent: null;
+ c && (c.$config.minWidth = void 0);
+ var u = t.callEvent("onGridResizeEnd", [o, s]);
+ return u && 0 !== s && (t.config.grid_width = s),
+ u
+ })
+ }
+ },
+ onDestroyed: function(t) {}
+ }
+ };
+ t.exports = r
+ },
+ function(t, e, n) {
+ var i = n(1),
+ r = function(t, e) {
+ var n, r, a, o, s, l = 10,
+ c = 18;
+ function u() {
+ return {
+ link_source_id: o,
+ link_target_id: r,
+ link_from_start: s,
+ link_to_start: a,
+ link_landing_area: n
+ }
+ }
+ var d = e.$services,
+ h = d.getService("state"),
+ f = d.getService("dnd");
+ h.registerProvider("linksDnD", u);
+ var _ = new f(t.$task_bars, {
+ sensitivity: 0,
+ updates_per_second: 60,
+ mousemoveContainer: e.$root,
+ selector: ".gantt_link_point",
+ preventDefault: !0
+ });
+ function g(n, i, r, a, o) {
+ var s = function(n, i, r) {
+ var a = i(n),
+ o = {
+ x: a.left,
+ y: a.top,
+ width: a.width,
+ height: a.height
+ };
+ r.rtl ? (o.xEnd = o.x, o.x = o.xEnd + o.width) : o.xEnd = o.x + o.width;
+ if (o.yEnd = o.y + o.height, e.getTaskType(n.type) == e.config.types.milestone) {
+ var s = function(e) {
+ var n = t.getBarHeight(e, !0);
+ return Math.round(Math.sqrt(2 * n * n)) - 2
+ } (n.id);
+ o.x += (r.rtl ? 1 : -1) * (s / 2),
+ o.xEnd += (r.rtl ? -1 : 1) * (s / 2),
+ o.width = a.xEnd - a.x
+ }
+ return o
+ } (n,
+ function(t) {
+ return e.getTaskPosition(t)
+ },
+ a),
+ l = {
+ x: s.x,
+ y: s.y
+ };
+ i || (l.x = s.xEnd),
+ l.y += e.getTaskHeight(n.id) / 2;
+ var c = function(t) {
+ return e.getTaskType(t.type) == e.config.types.milestone
+ } (n) && o ? 2 : 0;
+ return r = r || 0,
+ a.rtl && (r *= -1),
+ l.x += (i ? -1 : 1) * r - c,
+ l
+ }
+ function p(t, n) {
+ var i = _.getPosition(t),
+ r = function(t) {
+ var e = 0,
+ n = 0;
+ return t && (e = t.offsetWidth || 0, n = t.offsetHeight || 0),
+ {
+ width: e,
+ height: n
+ }
+ } (n),
+ a = function() {
+ var t = e.$root;
+ return {
+ right: t.offsetWidth,
+ bottom: t.offsetHeight
+ }
+ } (),
+ o = e.config.tooltip_offset_x || l,
+ s = e.config.tooltip_offset_y || l,
+ u = e.config.scroll_size || c,
+ d = e.$container.getBoundingClientRect().y + window.scrollY,
+ h = {
+ y: i.y + s,
+ x: i.x + o,
+ bottom: i.y + r.height + s + u,
+ right: i.x + r.width + o + u
+ };
+ return h.bottom > a.bottom + d && (h.y = a.bottom + d - r.height - s),
+ h.right > a.right && (h.x = a.right - r.width - o),
+ h
+ }
+ function v(t) {
+ var n = u(),
+ i = ["gantt_link_tooltip"];
+ n.link_source_id && n.link_target_id && (e.isLinkAllowed(n.link_source_id, n.link_target_id, n.link_from_start, n.link_to_start) ? i.push("gantt_allowed_link") : i.push("gantt_invalid_link"));
+ var r = e.templates.drag_link_class(n.link_source_id, n.link_from_start, n.link_target_id, n.link_to_start);
+ r && i.push(r);
+ var a = "<div class='" + r + "'>" + e.templates.drag_link(n.link_source_id, n.link_from_start, n.link_target_id, n.link_to_start) + "</div>";
+ t.innerHTML = a
+ }
+ function m() {
+ o = s = r = null,
+ a = !0
+ }
+ function y(n, i, r, a) {
+ var o = function() {
+ _._direction && _._direction.parentNode || (_._direction = document.createElement("div"), t.$task_links.appendChild(_._direction));
+ return _._direction
+ } (),
+ s = u(),
+ l = ["gantt_link_direction"];
+ e.templates.link_direction_class && l.push(e.templates.link_direction_class(s.link_source_id, s.link_from_start, s.link_target_id, s.link_to_start));
+ var c = Math.sqrt(Math.pow(r - n, 2) + Math.pow(a - i, 2));
+ if (c = Math.max(0, c - 3)) {
+ o.className = l.join(" ");
+ var d = (a - i) / (r - n),
+ h = Math.atan(d);
+ 2 == k(n, r, i, a) ? h += Math.PI: 3 == k(n, r, i, a) && (h -= Math.PI);
+ var f = Math.sin(h),
+ g = Math.cos(h),
+ p = Math.round(i),
+ v = Math.round(n),
+ m = ["-webkit-transform: rotate(" + h + "rad)", "-moz-transform: rotate(" + h + "rad)", "-ms-transform: rotate(" + h + "rad)", "-o-transform: rotate(" + h + "rad)", "transform: rotate(" + h + "rad)", "width:" + Math.round(c) + "px"];
+ if ( - 1 != window.navigator.userAgent.indexOf("MSIE 8.0")) {
+ m.push('-ms-filter: "' +
+ function(t, e) {
+ return "progid:DXImageTransform.Microsoft.Matrix(M11 = " + e + ",M12 = -" + t + ",M21 = " + t + ",M22 = " + e + ",SizingMethod = 'auto expand')"
+ } (f, g) + '"');
+ var y = Math.abs(Math.round(n - r)),
+ b = Math.abs(Math.round(a - i));
+ switch (k(n, r, i, a)) {
+ case 1:
+ p -= b;
+ break;
+ case 2:
+ v -= y,
+ p -= b;
+ break;
+ case 3:
+ v -= y
+ }
+ }
+ m.push("top:" + p + "px"),
+ m.push("left:" + v + "px"),
+ o.style.cssText = m.join(";")
+ }
+ }
+ function k(t, e, n, i) {
+ return e >= t ? i <= n ? 1 : 4 : i <= n ? 2 : 3
+ }
+ _.attachEvent("onBeforeDragStart", e.bind(function(n, r) {
+ var a = r.target || r.srcElement;
+ if (m(), e.getState("tasksDnd").drag_id) return ! 1;
+ if (i.locateClassName(a, "gantt_link_point")) {
+ i.locateClassName(a, "task_start_date") && (s = !0);
+ var l = e.locate(r);
+ o = l;
+ var c = e.getTask(l);
+ if (e.isReadonly(c)) return m(),
+ !1;
+ return this._dir_start = g(c, !!s, 0, t.$getConfig(), !0),
+ !0
+ }
+ return ! 1
+ },
+ this)),
+ _.attachEvent("onAfterDragStart", e.bind(function(t, n) {
+ e.config.touch && e.refreshData(),
+ v(_.config.marker)
+ },
+ this)),
+ _.attachEvent("onDragMove", e.bind(function(o, s) {
+ var l = _.config,
+ c = p(s, l.marker); !
+ function(t, e) {
+ t.style.left = e.x + "px",
+ t.style.top = e.y + "px"
+ } (l.marker, c);
+ var u = !!i.locateClassName(s, "gantt_link_control"),
+ d = r,
+ h = n,
+ f = a,
+ m = e.locate(s),
+ k = !0,
+ b = i.getTargetNode(s);
+ if (i.isChildOf(b, e.$root) || (u = !1, m = null), u && (k = !i.locateClassName(s, "task_end_date"), u = !!m), r = m, n = u, a = k, u) {
+ var x = e.getTask(m),
+ w = t.$getConfig(),
+ S = i.locateClassName(s, "gantt_link_control"),
+ T = 0;
+ S && (T = Math.floor(S.offsetWidth / 2)),
+ this._dir_end = g(x, !!a, T, w)
+ } else this._dir_end = i.getRelativeEventPosition(s, t.$task_data),
+ e.env.isEdge && (this._dir_end.y += window.scrollY);
+ var $ = !(h == u && d == m && f == k);
+ return $ && (d && e.refreshTask(d, !1), m && e.refreshTask(m, !1)),
+ $ && v(l.marker),
+ y(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y),
+ !0
+ },
+ this)),
+ _.attachEvent("onDragEnd", e.bind(function() {
+ var t = u();
+ if (t.link_source_id && t.link_target_id && t.link_source_id != t.link_target_id) {
+ var n = e._get_link_type(t.link_from_start, t.link_to_start),
+ i = {
+ source: t.link_source_id,
+ target: t.link_target_id,
+ type: n
+ };
+ i.type && e.isLinkAllowed(i) && e.callEvent("onLinkCreated", [i]) && e.addLink(i)
+ }
+ m(),
+ e.config.touch ? e.refreshData() : (t.link_source_id && e.refreshTask(t.link_source_id, !1), t.link_target_id && e.refreshTask(t.link_target_id, !1)),
+ _._direction && (_._direction.parentNode && _._direction.parentNode.removeChild(_._direction), _._direction = null)
+ },
+ this)),
+ e.attachEvent("onGanttRender", e.bind(function() {
+ _._direction && y(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y)
+ },
+ this))
+ };
+ t.exports = {
+ createLinkDND: function() {
+ return {
+ init: r
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(1),
+ r = n(0),
+ a = n(50),
+ o = n(2);
+ t.exports = {
+ createTaskDND: function() {
+ var t;
+ return {
+ extend: function(e) {
+ e.roundTaskDates = function(e) {
+ t.round_task_dates(e)
+ }
+ },
+ init: function(e, n) {
+ return t = function(t, e) {
+ var n = e.$services;
+ return {
+ drag: null,
+ dragMultiple: {},
+ _events: {
+ before_start: {},
+ before_finish: {},
+ after_finish: {}
+ },
+ _handlers: {},
+ init: function() {
+ this._domEvents = e._createDomEventScope(),
+ this.clear_drag_state();
+ var t = e.config.drag_mode;
+ this.set_actions(),
+ n.getService("state").registerProvider("tasksDnd", r.bind(function() {
+ return {
+ drag_id: this.drag ? this.drag.id: void 0,
+ drag_mode: this.drag ? this.drag.mode: void 0,
+ drag_from_start: this.drag ? this.drag.left: void 0
+ }
+ },
+ this));
+ var i = {
+ before_start: "onBeforeTaskDrag",
+ before_finish: "onBeforeTaskChanged",
+ after_finish: "onAfterTaskDrag"
+ };
+ for (var a in this._events) for (var o in t) this._events[a][o] = i[a];
+ this._handlers[t.move] = this._move,
+ this._handlers[t.resize] = this._resize,
+ this._handlers[t.progress] = this._resize_progress
+ },
+ set_actions: function() {
+ var n = t.$task_data;
+ this._domEvents.attach(n, "mousemove", e.bind(function(t) {
+ this.on_mouse_move(t)
+ },
+ this)),
+ this._domEvents.attach(n, "mousedown", e.bind(function(t) {
+ this.on_mouse_down(t)
+ },
+ this)),
+ this._domEvents.attach(document.body, "mouseup", e.bind(function(t) {
+ this.on_mouse_up(t)
+ },
+ this))
+ },
+ clear_drag_state: function() {
+ this.drag = {
+ id: null,
+ mode: null,
+ pos: null,
+ start_x: null,
+ start_y: null,
+ obj: null,
+ left: null
+ },
+ this.dragMultiple = {}
+ },
+ _resize: function(n, i, r) {
+ var a = t.$getConfig(),
+ o = this._drag_task_coords(n, r);
+ r.left ? (n.start_date = e.dateFromPos(o.start + i), n.start_date || (n.start_date = new Date(e.getState().min_date))) : (n.end_date = e.dateFromPos(o.end + i), n.end_date || (n.end_date = new Date(e.getState().max_date)));
+ var s = this._calculateMinDuration(a.min_duration, a.duration_unit);
+ n.end_date - n.start_date < a.min_duration && (r.left ? n.start_date = e.calculateEndDate(n.end_date, -s, a.duration_unit, n) : n.end_date = e.calculateEndDate(n.start_date, s, a.duration_unit, n)),
+ e._init_task_timing(n)
+ },
+ _calculateMinDuration: function(t, e) {
+ return Math.ceil(t / {
+ minute: 6e4,
+ hour: 36e5,
+ day: 864e5,
+ week: 6048e5,
+ month: 24192e5,
+ year: 31356e6
+ } [e])
+ },
+ _resize_progress: function(e, n, i) {
+ var r = this._drag_task_coords(e, i),
+ a = t.$getConfig().rtl ? r.start - i.pos.x: i.pos.x - r.start,
+ o = Math.max(0, a);
+ e.progress = Math.min(1, o / Math.abs(r.end - r.start))
+ },
+ _find_max_shift: function(t, n) {
+ var i;
+ for (var r in t) {
+ var a = t[r],
+ o = e.getTask(a.id),
+ s = this._drag_task_coords(o, a),
+ l = e.posFromDate(new Date(e.getState().min_date)),
+ c = e.posFromDate(new Date(e.getState().max_date));
+ if (s.end + n > c) {
+ var u = c - s.end; (u < i || void 0 === i) && (i = u)
+ } else if (s.start + n < l) {
+ var d = l - s.start; (d > i || void 0 === i) && (i = d)
+ }
+ }
+ return i
+ },
+ _move: function(t, n, i, r) {
+ var a = this._drag_task_coords(t, i),
+ o = null,
+ s = null;
+ r ? (o = new Date( + i.obj.start_date + r), s = new Date( + i.obj.end_date + r)) : (o = e.dateFromPos(a.start + n), s = e.dateFromPos(a.end + n)),
+ o ? s ? (t.start_date = o, t.end_date = s) : (t.end_date = new Date(e.getState().max_date), t.start_date = e.dateFromPos(e.posFromDate(t.end_date) - (a.end - a.start))) : (t.start_date = new Date(e.getState().min_date), t.end_date = e.dateFromPos(e.posFromDate(t.start_date) + (a.end - a.start)))
+ },
+ _drag_task_coords: function(t, n) {
+ return {
+ start: n.obj_s_x = n.obj_s_x || e.posFromDate(t.start_date),
+ end: n.obj_e_x = n.obj_e_x || e.posFromDate(t.end_date)
+ }
+ },
+ _mouse_position_change: function(t, e) {
+ var n = t.x - e.x,
+ i = t.y - e.y;
+ return Math.sqrt(n * n + i * i)
+ },
+ _is_number: function(t) {
+ return ! isNaN(parseFloat(t)) && isFinite(t)
+ },
+ on_mouse_move: function(t) {
+ if (this.drag.start_drag) {
+ var n = i.getRelativeEventPosition(t, e.$task_data),
+ r = this.drag.start_drag.start_x,
+ o = this.drag.start_drag.start_y; (Date.now() - this.drag.timestamp > 50 || this._is_number(r) && this._is_number(o) && this._mouse_position_change({
+ x: r,
+ y: o
+ },
+ n) > 20) && this._start_dnd(t)
+ }
+ if (this.drag.mode) {
+ if (!a(this, 40)) return;
+ this._update_on_move(t)
+ }
+ },
+ _update_item_on_move: function(t, n, i, r, a, o) {
+ var s = e.getTask(n),
+ l = e.mixin({},
+ s),
+ c = e.mixin({},
+ s);
+ this._handlers[i].apply(this, [c, t, r, o]),
+ e.mixin(s, c, !0),
+ e.callEvent("onTaskDrag", [s.id, i, c, l, a]),
+ e.mixin(s, c, !0),
+ e.refreshTask(n)
+ },
+ _update_on_move: function(n) {
+ var a = this.drag,
+ o = t.$getConfig();
+ if (a.mode) {
+ var s = i.getRelativeEventPosition(n, t.$task_data);
+ if (a.pos && a.pos.x == s.x) return;
+ a.pos = s;
+ var l = e.dateFromPos(s.x);
+ if (!l || isNaN(l.getTime())) return;
+ var c = s.x - a.start_x,
+ u = e.getTask(a.id);
+ if (this._handlers[a.mode]) {
+ if (a.mode === o.drag_mode.move) {
+ var d = {};
+ this._isMultiselect() && e.getSelectedTasks().indexOf(a.id) >= 0 && (d = this.dragMultiple);
+ var h = !1;
+ if (e.isSummaryTask(u) && e.config.drag_project) {
+ var f = {};
+ f[a.id] = r.copy(a),
+ h = !0,
+ d = r.mixin(f, this.dragMultiple)
+ }
+ var _ = this._find_max_shift(d, c);
+ for (var g in void 0 !== _ && (c = _), this._update_item_on_move(c, a.id, a.mode, a, n), d) {
+ var p = d[g];
+ if (h && p.id != a.id && (e._bulk_dnd = !0), void 0 === _ && (h || Object.keys(d).length > 1)) var v = l - e.dateFromPos(a.start_x);
+ this._update_item_on_move(c, p.id, p.mode, p, n, v)
+ }
+ e._bulk_dnd = !1
+ } else this._update_item_on_move(c, a.id, a.mode, a, n);
+ e._update_parents(a.id)
+ }
+ }
+ },
+ on_mouse_down: function(n, r) {
+ if (2 != n.button || void 0 === n.button) {
+ var a = t.$getConfig(),
+ o = e.locate(n),
+ s = null;
+ if (e.isTaskExists(o) && (s = e.getTask(o)), !e.isReadonly(s) && !this.drag.mode) {
+ this.clear_drag_state(),
+ r = r || n.target || n.srcElement;
+ var l = i.getClassName(r),
+ c = this._get_drag_mode(l, r);
+ if (!l || !c) return r.parentNode ? this.on_mouse_down(n, r.parentNode) : void 0;
+ if (c) if (c.mode && c.mode != a.drag_mode.ignore && a["drag_" + c.mode]) {
+ if (o = e.locate(r), s = e.copy(e.getTask(o) || {}), e.isReadonly(s)) return this.clear_drag_state(),
+ !1;
+ if (e.isSummaryTask(s) && !a.drag_project && c.mode != a.drag_mode.progress) return void this.clear_drag_state();
+ c.id = o;
+ var u = i.getRelativeEventPosition(n, e.$task_data);
+ c.start_x = u.x,
+ c.start_y = u.y,
+ c.obj = s,
+ this.drag.start_drag = c,
+ this.drag.timestamp = Date.now()
+ } else this.clear_drag_state();
+ else if (e.checkEvent("onMouseDown") && e.callEvent("onMouseDown", [l.split(" ")[0]]) && r.parentNode) return this.on_mouse_down(n, r.parentNode)
+ }
+ }
+ },
+ _fix_dnd_scale_time: function(n, i) {
+ var r = t.$getConfig(),
+ a = e.getScale().unit,
+ o = e.getScale().step;
+ function s(n) {
+ if (e.config.correct_work_time) {
+ var i = t.$getConfig();
+ e.isWorkTime(n.start_date, void 0, n) || (n.start_date = e.calculateEndDate({
+ start_date: n.start_date,
+ duration: -1,
+ unit: i.duration_unit,
+ task: n
+ }))
+ }
+ }
+ r.round_dnd_dates || (a = "minute", o = r.time_step),
+ i.mode == r.drag_mode.resize ? i.left ? (n.start_date = e.roundDate({
+ date: n.start_date,
+ unit: a,
+ step: o
+ }), s(n)) : (n.end_date = e.roundDate({
+ date: n.end_date,
+ unit: a,
+ step: o
+ }),
+ function(n) {
+ if (e.config.correct_work_time) {
+ var i = t.$getConfig();
+ e.isWorkTime(new Date(n.end_date - 1), void 0, n) || (n.end_date = e.calculateEndDate({
+ start_date: n.end_date,
+ duration: 1,
+ unit: i.duration_unit,
+ task: n
+ }))
+ }
+ } (n)) : i.mode == r.drag_mode.move && (n.start_date = e.roundDate({
+ date: n.start_date,
+ unit: a,
+ step: o
+ }), s(n), n.end_date = e.calculateEndDate(n))
+ },
+ _fix_working_times: function(n, i) {
+ var r = t.$getConfig(); (i = i || {
+ mode: r.drag_mode.move
+ }).mode == r.drag_mode.resize ? i.left ? n.start_date = e.getClosestWorkTime({
+ date: n.start_date,
+ dir: "future",
+ task: n
+ }) : n.end_date = e.getClosestWorkTime({
+ date: n.end_date,
+ dir: "past",
+ task: n
+ }) : i.mode == r.drag_mode.move && e.correctTaskWorkTime(n)
+ },
+ _finalize_mouse_up: function(t, n, i, r) {
+ var a = e.getTask(t);
+ if (n.work_time && n.correct_work_time && this._fix_working_times(a, i), this._fix_dnd_scale_time(a, i), this._fireEvent("before_finish", i.mode, [t, i.mode, e.copy(i.obj), r])) {
+ var o = t;
+ e._init_task_timing(a),
+ this.clear_drag_state(),
+ e.updateTask(a.id),
+ this._fireEvent("after_finish", i.mode, [o, i.mode, r])
+ } else this.clear_drag_state(),
+ t == i.id && (i.obj._dhx_changed = !1, e.mixin(a, i.obj, !0)),
+ e.refreshTask(a.id)
+ },
+ on_mouse_up: function(n) {
+ var i = this.drag;
+ if (i.mode && i.id) {
+ var r = t.$getConfig(),
+ a = e.getTask(i.id),
+ o = this.dragMultiple,
+ s = !1,
+ l = 0;
+ i.mode === r.drag_mode.move && (e.isSummaryTask(a) && r.drag_project || this._isMultiselect()) && (s = !0, l = Object.keys(o).length);
+ var c = function() {
+ if (s) for (var t in o) this._finalize_mouse_up(o[t].id, r, o[t], n);
+ this._finalize_mouse_up(i.id, r, i, n)
+ };
+ s && l > 10 ? e.batchUpdate(function() {
+ c.call(this)
+ }.bind(this)) : c.call(this)
+ }
+ this.clear_drag_state()
+ },
+ _get_drag_mode: function(e, n) {
+ var i = t.$getConfig().drag_mode,
+ r = {
+ mode: null,
+ left: null
+ };
+ switch ((e || "").split(" ")[0]) {
+ case "gantt_task_line":
+ case "gantt_task_content":
+ r.mode = i.move;
+ break;
+ case "gantt_task_drag":
+ r.mode = i.resize;
+ var a = n.getAttribute("data-bind-property");
+ r.left = "start_date" == a;
+ break;
+ case "gantt_task_progress_drag":
+ r.mode = i.progress;
+ break;
+ case "gantt_link_control":
+ case "gantt_link_point":
+ r.mode = i.ignore;
+ break;
+ default:
+ r = null
+ }
+ return r
+ },
+ _start_dnd: function(n) {
+ var i = this.drag = this.drag.start_drag;
+ delete i.start_drag;
+ var r = t.$getConfig(),
+ a = i.id;
+ if (r["drag_" + i.mode] && e.callEvent("onBeforeDrag", [a, i.mode, n]) && this._fireEvent("before_start", i.mode, [a, i.mode, n])) {
+ delete i.start_drag;
+ var s = e.getTask(a);
+ if (e.isReadonly(s)) return void this.clear_drag_state();
+ if (this._isMultiselect()) {
+ var l = e.getSelectedTasks();
+ l.indexOf(i.id) >= 0 && o.forEach(l, e.bind(function(t) {
+ var n = e.getTask(t);
+ e.isSummaryTask(n) && e.config.drag_project && i.mode == r.drag_mode.move && this._addSubtasksToDragMultiple(n.id),
+ this.dragMultiple[t] = e.mixin({
+ id: n.id,
+ obj: e.copy(n)
+ },
+ this.drag)
+ },
+ this))
+ }
+ e.isSummaryTask(s) && e.config.drag_project && i.mode == r.drag_mode.move && this._addSubtasksToDragMultiple(s.id),
+ e.callEvent("onTaskDragStart", [])
+ } else this.clear_drag_state()
+ },
+ _fireEvent: function(t, n, i) {
+ e.assert(this._events[t], "Invalid stage:{" + t + "}");
+ var r = this._events[t][n];
+ return e.assert(r, "Unknown after drop mode:{" + n + "}"),
+ e.assert(i, "Invalid event arguments"),
+ !e.checkEvent(r) || e.callEvent(r, i)
+ },
+ round_task_dates: function(e) {
+ var n = this.drag,
+ i = t.$getConfig();
+ n || (n = {
+ mode: i.drag_mode.move
+ }),
+ this._fix_dnd_scale_time(e, n)
+ },
+ destructor: function() {
+ this._domEvents.detachAll()
+ },
+ _isMultiselect: function() {
+ return e.config.drag_multiple && !!(e.getSelectedTasks && e.getSelectedTasks().length > 0)
+ },
+ _addSubtasksToDragMultiple: function(t) {
+ e.eachTask(function(t) {
+ this.dragMultiple[t.id] = e.mixin({
+ id: t.id,
+ obj: e.copy(t)
+ },
+ this.drag)
+ },
+ t, this)
+ }
+ }
+ } (e, n),
+ e._tasks_dnd = t,
+ t.init(n)
+ },
+ destructor: function() {
+ t && (t.destructor(), t = null)
+ }
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(98),
+ a = n(97),
+ o = n(1),
+ s = function(t) {
+ var e = t.$services;
+ return {
+ onCreated: function(e) {
+ var o = e.$config;
+ o.bind = i.defined(o.bind) ? o.bind: "task",
+ o.bindLinks = i.defined(o.bindLinks) ? o.bindLinks: "link",
+ e._linksDnD = a.createLinkDND(),
+ e._tasksDnD = r.createTaskDND(),
+ e._tasksDnD.extend(e),
+ this._mouseDelegates = n(31)(t)
+ },
+ onInitialized: function(e) {
+ this._attachDomEvents(t),
+ this._attachStateProvider(t, e),
+ e._tasksDnD.init(e, t),
+ e._linksDnD.init(e, t),
+ "timeline" == e.$config.id && this.extendDom(e)
+ },
+ onDestroyed: function(e) {
+ this._clearDomEvents(t),
+ this._clearStateProvider(t),
+ e._tasksDnD && e._tasksDnD.destructor()
+ },
+ extendDom: function(e) {
+ t.$task = e.$task,
+ t.$task_scale = e.$task_scale,
+ t.$task_data = e.$task_data,
+ t.$task_bg = e.$task_bg,
+ t.$task_links = e.$task_links,
+ t.$task_bars = e.$task_bars
+ },
+ _clearDomEvents: function() {
+ this._mouseDelegates.destructor(),
+ this._mouseDelegates = null
+ },
+ _attachDomEvents: function(t) {
+ function e(e, n) {
+ if (e && this.callEvent("onLinkDblClick", [e, n])) {
+ var i = this.getLink(e);
+ if (this.isReadonly(i)) return;
+ var r = this.locale.labels.link + " " + this.templates.link_description(this.getLink(e)) + " " + this.locale.labels.confirm_link_deleting;
+ window.setTimeout(function() {
+ t._simple_confirm(r, "",
+ function() {
+ t.deleteLink(e)
+ })
+ },
+ this.config.touch ? 300 : 1)
+ }
+ }
+ this._mouseDelegates.delegate("click", "gantt_task_link", t.bind(function(t, e) {
+ var n = this.locate(t, this.config.link_attribute);
+ n && this.callEvent("onLinkClick", [n, t])
+ },
+ t), this.$task),
+ this._mouseDelegates.delegate("click", "gantt_scale_cell", t.bind(function(e, n) {
+ var i = o.getRelativeEventPosition(e, t.$task_data),
+ r = t.dateFromPos(i.x),
+ a = Math.floor(t.columnIndexByDate(r)),
+ s = t.getScale().trace_x[a];
+ t.callEvent("onScaleClick", [e, s])
+ },
+ t), this.$task),
+ this._mouseDelegates.delegate("doubleclick", "gantt_task_link", t.bind(function(n, i, r) {
+ i = this.locate(n, t.config.link_attribute),
+ e.call(this, i, n)
+ },
+ t), this.$task),
+ this._mouseDelegates.delegate("doubleclick", "gantt_link_point", t.bind(function(t, n, i) {
+ n = this.locate(t);
+ var r = this.getTask(n),
+ a = null;
+ return i.parentNode && o.getClassName(i.parentNode) && (a = o.getClassName(i.parentNode).indexOf("_left") > -1 ? r.$target[0] : r.$source[0]),
+ a && e.call(this, a, t),
+ !1
+ },
+ t), this.$task)
+ },
+ _attachStateProvider: function(t, n) {
+ var i = n;
+ e.getService("state").registerProvider("tasksTimeline",
+ function() {
+ return {
+ scale_unit: i._tasks ? i._tasks.unit: void 0,
+ scale_step: i._tasks ? i._tasks.step: void 0
+ }
+ })
+ },
+ _clearStateProvider: function() {
+ e.getService("state").unregisterProvider("tasksTimeline")
+ }
+ }
+ };
+ t.exports = s
+ },
+ function(t, e, n) {
+ var i = n(1);
+ function r(t, e) {
+ var n = i.getNodePosition(e.$grid_data);
+ return t.x += n.x + e.$grid.scrollLeft,
+ t.y += n.y - e.$grid_data.scrollTop,
+ t
+ }
+ function a(t, e) {
+ var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0,
+ r = i.getNodePosition(t.$root);
+ return e > r.width && (e = r.width - n - 2),
+ e
+ }
+ t.exports = {
+ removeLineHighlight: function(t) {
+ t.markerLine && t.markerLine.parentNode && t.markerLine.parentNode.removeChild(t.markerLine),
+ t.markerLine = null
+ },
+ highlightPosition: function(t, e, n) {
+ var o = function(t, e) {
+ var n = i.getNodePosition(e.$grid_data),
+ r = i.getRelativeEventPosition(t, e.$grid_data),
+ o = n.x + e.$grid.scrollLeft,
+ s = r.y - 10,
+ l = e.getItemHeight(t.targetId);
+ s < n.y && (s = n.y);
+ var c = e.getTotalHeight();
+ return s > n.y + c - l && (s = n.y + c - l),
+ n.x = o,
+ n.y = s,
+ n.width = a(e.$gantt, n.width, 9),
+ n
+ } (t, n);
+ e.marker.style.left = o.x + 9 + "px",
+ e.marker.style.width = o.width + "px",
+ e.marker.style.overflow = "hidden";
+ var s = e.markerLine;
+ s || ((s = document.createElement("div")).className = "gantt_drag_marker gantt_grid_dnd_marker", s.innerHTML = "<div class='gantt_grid_dnd_marker_line'></div>", s.style.pointerEvents = "none"),
+ t.child ?
+ function(t, e, n) {
+ var i = t.targetParent,
+ o = r({
+ x: 0,
+ y: n.getItemTop(i)
+ },
+ n),
+ s = n.$grid_data.getBoundingClientRect().bottom + window.scrollY,
+ l = a(n.$gantt, n.$grid_data.offsetWidth);
+ e.innerHTML = "<div class='gantt_grid_dnd_marker_folder'></div>",
+ e.style.width = l + "px",
+ e.style.top = o.y + "px",
+ e.style.left = o.x + "px",
+ e.style.height = n.getItemHeight(i) + "px",
+ o.y > s && (e.style.top = s + "px")
+ } (t, s, n) : function(t, e, n) {
+ var i = function(t, e) {
+ var n = e.$config.rowStore,
+ i = {
+ x: 0,
+ y: 0
+ },
+ o = e.$grid_data.querySelector(".gantt_tree_indent"),
+ s = 15,
+ l = 0;
+ if (o && (s = o.offsetWidth), t.targetId !== n.$getRootId()) {
+ var c = e.getItemTop(t.targetId),
+ u = e.getItemHeight(t.targetId);
+ if (l = n.exists(t.targetId) ? n.calculateItemLevel(n.getItem(t.targetId)) : 0, t.prevSibling) i.y = c;
+ else if (t.nextSibling) {
+ var d = 0;
+ n.eachItem(function(t) { - 1 !== n.getIndexById(t.id) && d++
+ },
+ t.targetId),
+ i.y = c + u + d * u
+ } else i.y = c + u,
+ l += 1
+ }
+ return i.x = 40 + l * s,
+ i.width = a(e.$gantt, Math.max(e.$grid_data.offsetWidth - i.x, 0), i.x),
+ r(i, e)
+ } (t, n),
+ o = n.$grid_data.getBoundingClientRect().bottom + window.scrollY;
+ e.innerHTML = "<div class='gantt_grid_dnd_marker_line'></div>",
+ e.style.left = i.x + "px",
+ e.style.height = "4px";
+ var s = i.y - 2;
+ e.style.top = s + "px",
+ e.style.width = i.width + "px",
+ s > o && (e.style.top = o + "px")
+ } (t, s, n),
+ e.markerLine || (document.body.appendChild(s), e.markerLine = s)
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(24);
+ t.exports = function(t, e, n, r, a) {
+ var o;
+ if (e !== a.$getRootId()) o = n < .25 ? i.prevSiblingTarget(t, e, a) : !(n > .6) || a.hasChild(e) && a.getItem(e).$open ? i.firstChildTarget(t, e, a) : i.nextSiblingTarget(t, e, a);
+ else {
+ var s = a.$getRootId();
+ o = a.hasChild(s) && r >= 0 ? i.lastChildTarget(t, s, a) : i.firstChildTarget(t, s, a)
+ }
+ return o
+ }
+ },
+ function(t, e, n) {
+ var i = n(24);
+ function r(t, e, n, r, a) {
+ for (var o = e; r.exists(o);) {
+ var s = r.calculateItemLevel(r.getItem(o));
+ if ((s === n || s === n - 1) && r.getBranchIndex(o) > -1) break;
+ o = a ? r.getPrev(o) : r.getNext(o)
+ }
+ return r.exists(o) ? r.calculateItemLevel(r.getItem(o)) === n ? a ? i.nextSiblingTarget(t, o, r) : i.prevSiblingTarget(t, o, r) : i.firstChildTarget(t, o, r) : null
+ }
+ function a(t, e, n, i) {
+ return r(t, e, n, i, !0)
+ }
+ function o(t, e, n, i) {
+ return r(t, e, n, i, !1)
+ }
+ t.exports = function(t, e, n, r, s, l) {
+ var c;
+ if (e !== s.$getRootId()) {
+ var u = s.getItem(e),
+ d = s.calculateItemLevel(u);
+ if (d === l) {
+ var h = s.getPrevSibling(e);
+ n < .5 && !h ? c = i.prevSiblingTarget(t, e, s) : (n < .5 && (e = h), c = i.nextSiblingTarget(t, e, s))
+ } else if (d > l) s.eachParent(function(t) {
+ s.calculateItemLevel(t) === l && (e = t.id)
+ },
+ u),
+ c = a(t, e, l, s);
+ else {
+ var f = a(t, e, l, s),
+ _ = o(t, e, l, s);
+ c = n < .5 ? f: _
+ }
+ } else {
+ var g = s.$getRootId(),
+ p = s.getChildren(g);
+ c = i.createDropTargetObject(),
+ c = p.length && r >= 0 ? a(t,
+ function(t) {
+ for (var e = t.getNext(); t.exists(e);) {
+ var n = t.getNext(e);
+ if (!t.exists(n)) return e;
+ e = n
+ }
+ return null
+ } (s), l, s) : o(t, g, l, s)
+ }
+ return c
+ }
+ },
+ function(t, e, n) {
+ var i = n(1),
+ r = n(24),
+ a = n(102),
+ o = n(101),
+ s = n(100),
+ l = n(16);
+ t.exports = {
+ init: function(t, e) {
+ var n = t.$services.getService("dnd");
+ if (e.$config.bind && t.getDatastore(e.$config.bind)) {
+ var c = new n(e.$grid_data, {
+ updates_per_second: 60
+ });
+ t.defined(e.$getConfig().dnd_sensitivity) && (c.config.sensitivity = e.$getConfig().dnd_sensitivity),
+ c.attachEvent("onBeforeDragStart", t.bind(function(n, r) {
+ var a = u(r);
+ if (!a) return ! 1;
+ if (t.hideQuickInfo && t._hideQuickInfo(), i.closest(r.target, ".gantt_grid_editor_placeholder")) return ! 1;
+ var o = a.getAttribute(e.$config.item_attribute),
+ s = e.$config.rowStore.getItem(o);
+ return ! t.isReadonly(s) && !d(o) && (c.config.initial_open_state = s.$open, !!t.callEvent("onRowDragStart", [o, r.target || r.srcElement, r]) && void 0)
+ },
+ t)),
+ c.attachEvent("onAfterDragStart", t.bind(function(t, n) {
+ var i = u(n);
+ c.config.marker.innerHTML = i.outerHTML;
+ var a = c.config.marker.firstChild;
+ a && (c.config.marker.style.opacity = .4, a.style.position = "static", a.style.pointerEvents = "none"),
+ c.config.id = i.getAttribute(e.$config.item_attribute);
+ var o = e.$config.rowStore,
+ s = o.getItem(c.config.id);
+ c.config.level = o.calculateItemLevel(s),
+ c.config.drop_target = r.createDropTargetObject({
+ targetParent: o.getParent(s.id),
+ targetIndex: o.getBranchIndex(s.id),
+ targetId: s.id,
+ nextSibling: !0
+ }),
+ s.$open = !1,
+ s.$transparent = !0,
+ this.refreshData()
+ },
+ t)),
+ c.attachEvent("onDragMove", t.bind(function(n, i) {
+ var a = h(i);
+ return a && !1 !== t.callEvent("onBeforeRowDragMove", [c.config.id, a.targetParent, a.targetIndex]) || (a = r.createDropTargetObject(c.config.drop_target)),
+ s.highlightPosition(a, c.config, e),
+ c.config.drop_target = a,
+ t._waiAria.reorderMarkerAttr(c.config.marker),
+ this.callEvent("onRowDragMove", [c.config.id, a.targetParent, a.targetIndex]),
+ !0
+ },
+ t)),
+ c.attachEvent("onDragEnd", t.bind(function() {
+ var n = e.$config.rowStore,
+ i = n.getItem(c.config.id);
+ s.removeLineHighlight(c.config),
+ i.$transparent = !1,
+ i.$open = c.config.initial_open_state;
+ var r = c.config.drop_target; ! 1 === this.callEvent("onBeforeRowDragEnd", [c.config.id, r.targetParent, r.targetIndex]) ? i.$drop_target = null: (n.move(c.config.id, r.targetIndex, r.targetParent), t.render(), this.callEvent("onRowDragEnd", [c.config.id, r.targetParent, r.targetIndex])),
+ n.refresh(i.id)
+ },
+ t))
+ }
+ function u(t) {
+ return i.locateAttribute(t, e.$config.item_attribute)
+ }
+ function d(n) {
+ return l(n, t, t.getDatastore(e.$config.bind))
+ }
+ function h(n) {
+ var r, s = function(n) {
+ var r = i.getRelativeEventPosition(n, e.$grid_data).y,
+ a = e.$config.rowStore;
+ document.doctype || (r += window.scrollY),
+ r = r || 0;
+ var o = e.$state.scrollTop || 0,
+ s = t.$grid_data.getBoundingClientRect().height + o + window.scrollY,
+ l = o,
+ u = e.getItemIndexByTopPosition(e.$state.scrollTop);
+ if (a.exists(u) || (u = a.countVisible() - 1), u < 0) return a.$getRootId();
+ var h = a.getIdByIndex(u),
+ f = e.$state.scrollTop / e.getItemHeight(h),
+ _ = f - Math.floor(f);
+ _ > .1 && _ < .9 && (s -= e.getItemHeight(h) * _, l += e.getItemHeight(h) * (1 - _));
+ var g = i.getNodePosition(e.$grid_data),
+ p = g.y + g.height,
+ v = c.config.marker.offsetHeight;
+ r + v + window.scrollY >= s && (c.config.marker.style.top = p - v + "px"),
+ r >= s ? r = s: r <= l && (r = l, c.config.marker.style.top = g.y + "px");
+ var m = e.getItemIndexByTopPosition(r);
+ if (m > a.countVisible() - 1 || m < 0) return a.$getRootId();
+ var y = a.getIdByIndex(m);
+ return d(y) ? a.getPrevSibling(y) : a.getIdByIndex(m)
+ } (n),
+ l = null,
+ u = e.$config.rowStore,
+ h = !e.$getConfig().order_branch_free,
+ f = i.getRelativeEventPosition(n, e.$grid_data).y;
+ return document.doctype || (f += window.scrollY),
+ s !== u.$getRootId() && (l = (f - e.getItemTop(s)) / e.getItemHeight(s)),
+ h ? (r = a(c.config.id, s, l, f, u, c.config.level)) && r.targetParent && d(r.targetParent) && (s = u.getPrevSibling(r.targetParent), r = a(c.config.id, s, l, f, u, c.config.level)) : r = o(c.config.id, s, l, f, u),
+ r
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(1),
+ r = n(16);
+ t.exports = {
+ init: function(t, e) {
+ var n = t.$services.getService("dnd");
+ if (e.$config.bind && t.getDatastore(e.$config.bind)) {
+ var a = new n(e.$grid_data, {
+ updates_per_second: 60
+ });
+ t.defined(e.$getConfig().dnd_sensitivity) && (a.config.sensitivity = e.$getConfig().dnd_sensitivity),
+ a.attachEvent("onBeforeDragStart", t.bind(function(n, r) {
+ var c = o(r);
+ if (!c) return ! 1;
+ if (t.hideQuickInfo && t._hideQuickInfo(), i.closest(r.target, ".gantt_grid_editor_placeholder")) return ! 1;
+ var u = c.getAttribute(e.$config.item_attribute);
+ if (l(u)) return ! 1;
+ var d = s().getItem(u);
+ return ! t.isReadonly(d) && (a.config.initial_open_state = d.$open, !!t.callEvent("onRowDragStart", [u, r.target || r.srcElement, r]) && void 0)
+ },
+ t)),
+ a.attachEvent("onAfterDragStart", t.bind(function(t, n) {
+ var i = o(n);
+ a.config.marker.innerHTML = i.outerHTML;
+ var r = a.config.marker.firstChild;
+ r && (r.style.position = "static"),
+ a.config.id = i.getAttribute(e.$config.item_attribute);
+ var l = s(),
+ c = l.getItem(a.config.id);
+ a.config.index = l.getBranchIndex(a.config.id),
+ a.config.parent = c.parent,
+ c.$open = !1,
+ c.$transparent = !0,
+ this.refreshData()
+ },
+ t)),
+ a.lastTaskOfLevel = function(t) {
+ for (var e = null,
+ n = s().getItems(), i = 0, r = n.length; i < r; i++) n[i].$level == t && (e = n[i]);
+ return e ? e.id: null
+ },
+ a._getGridPos = t.bind(function(t) {
+ var n = i.getNodePosition(e.$grid_data),
+ r = n.x + e.$grid.scrollLeft,
+ o = t.pos.y - 10,
+ s = e.getItemHeight(a.config.id);
+ o < n.y && (o = n.y);
+ var l = e.getTotalHeight();
+ o > n.y + l - s && (o = n.y + l - s);
+ var c = n.y + n.height;
+ return o > c - s && (o = c - s),
+ n.x = r,
+ n.y = o,
+ n
+ },
+ t),
+ a._getTargetY = t.bind(function(n) {
+ var r = i.getNodePosition(e.$grid_data),
+ a = e.$state.scrollTop || 0,
+ o = t.$grid_data.getBoundingClientRect().height + a,
+ s = n.pageY - r.y + a;
+ return s > o ? s = o: s < a && (s = a),
+ s
+ },
+ t),
+ a._getTaskByY = t.bind(function(t, n) {
+ var i = s();
+ t = t || 0;
+ var r = e.getItemIndexByTopPosition(t);
+ return (r = n < r ? r - 1 : r) > i.countVisible() - 1 ? null: i.getIdByIndex(r)
+ },
+ t),
+ a.attachEvent("onDragMove", t.bind(function(n, r) {
+ var o = t.$grid_data.getBoundingClientRect(),
+ c = o.height + o.y + (e.$state.scrollTop || 0) + window.scrollY,
+ u = a.config,
+ d = a._getGridPos(r);
+ t._waiAria.reorderMarkerAttr(u.marker);
+ var h = e.$getConfig(),
+ f = s();
+ d.y < c ? u.marker.style.top = d.y + "px": u.marker.style.top = c + "px",
+ u.marker.style.left = d.x + 10 + "px";
+ var _ = i.getNodePosition(t.$root);
+ d.width > _.width && (u.marker.style.width = _.width - 10 - 2 + "px", u.marker.style.overflow = "hidden");
+ var g = f.getItem(a.config.id),
+ p = a._getTargetY(r),
+ v = a._getTaskByY(p, f.getIndexById(g.id));
+ function m(t, e) {
+ return ! f.isChildOf(y.id, e.id) && (t.$level == e.$level || h.order_branch_free)
+ }
+ if (f.exists(v) || (v = a.lastTaskOfLevel(h.order_branch_free ? g.$level: 0)) == a.config.id && (v = null), f.exists(v)) {
+ var y = f.getItem(v),
+ k = e.getItemTop(y.id),
+ b = e.getItemHeight(y.id);
+ if (k + b / 2 < p) {
+ var x = f.getIndexById(y.id),
+ w = f.getNext(y.id),
+ S = f.getItem(w);
+ if (l(w)) {
+ var T = f.getPrev(S.id);
+ S = f.getItem(T)
+ }
+ if (S) {
+ if (S.id == g.id) return h.order_branch_free && f.isChildOf(g.id, y.id) && 1 == f.getChildren(y.id).length ? void f.move(g.id, f.getBranchIndex(y.id) + 1, f.getParent(y.id)) : void 0;
+ y = S
+ } else if (w = f.getIdByIndex(x), S = f.getItem(w), l(w) && (T = f.getPrev(S.id), S = f.getItem(T)), m(S, g) && S.id != g.id) return void f.move(g.id, -1, f.getParent(S.id))
+ } else if (h.order_branch_free && y.id != g.id && m(y, g) && !l(y.id)) {
+ if (!f.hasChild(y.id)) return y.$open = !0,
+ void f.move(g.id, -1, y.id);
+ if (f.getIndexById(y.id) || b / 3 < p) return
+ }
+ x = f.getIndexById(y.id),
+ T = f.getIdByIndex(x - 1);
+ for (var $ = f.getItem(T), C = 1; (!$ || $.id == y.id) && x - C >= 0;) T = f.getIdByIndex(x - C),
+ $ = f.getItem(T),
+ C++;
+ if (g.id == y.id || l(y.id)) return;
+ m(y, g) && g.id != y.id ? f.move(g.id, 0, 0, y.id) : y.$level != g.$level - 1 || f.getChildren(y.id).length ? $ && m($, g) && g.id != $.id && f.move(g.id, -1, f.getParent($.id)) : f.move(g.id, 0, y.id)
+ }
+ return ! 0
+ },
+ t)),
+ a.attachEvent("onDragEnd", t.bind(function() {
+ var e = s(),
+ n = e.getItem(a.config.id);
+ n.$transparent = !1,
+ n.$open = a.config.initial_open_state,
+ !1 === this.callEvent("onBeforeRowDragEnd", [a.config.id, a.config.parent, a.config.index]) ? (e.move(a.config.id, a.config.index, a.config.parent), n.$drop_target = null) : this.callEvent("onRowDragEnd", [a.config.id, n.$drop_target]),
+ t.render(),
+ this.refreshData()
+ },
+ t))
+ }
+ function o(t) {
+ return i.locateAttribute(t, e.$config.item_attribute)
+ }
+ function s() {
+ return t.getDatastore(e.$config.bind)
+ }
+ function l(e) {
+ return r(e, t, s())
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(104),
+ a = n(103),
+ o = function(t) {
+ return {
+ onCreated: function(e) {
+ e.$config = i.mixin(e.$config, {
+ bind: "task"
+ }),
+ "grid" == e.$config.id && (this.extendGantt(e), t.ext.inlineEditors = t.ext._inlineEditors.createEditors(e), t.ext.inlineEditors.init()),
+ this._mouseDelegates = n(31)(t)
+ },
+ onInitialized: function(e) {
+ var n = e.$getConfig();
+ n.order_branch && ("marker" == n.order_branch ? a.init(e.$gantt, e) : r.init(e.$gantt, e)),
+ this.initEvents(e, t),
+ "grid" == e.$config.id && this.extendDom(e)
+ },
+ onDestroyed: function(e) {
+ "grid" == e.$config.id && t.ext.inlineEditors.destructor(),
+ this.clearEvents(e, t)
+ },
+ initEvents: function(t, e) {
+ this._mouseDelegates.delegate("click", "gantt_row", e.bind(function(n, i, r) {
+ var a = t.$getConfig();
+ if (null !== i) {
+ var o = this.getTask(i);
+ a.scroll_on_click && !e._is_icon_open_click(n) && this.showDate(o.start_date),
+ e.callEvent("onTaskRowClick", [i, r])
+ }
+ },
+ e), t.$grid),
+ this._mouseDelegates.delegate("click", "gantt_grid_head_cell", e.bind(function(n, i, r) {
+ var a = r.getAttribute("data-column-id");
+ if (e.callEvent("onGridHeaderClick", [a, n])) {
+ var o = t.$getConfig();
+ if ("add" != a) {
+ if (o.sort && a) {
+ for (var s, l = a,
+ c = 0; c < o.columns.length; c++) if (o.columns[c].name == a) {
+ s = o.columns[c];
+ break
+ }
+ if (s && void 0 !== s.sort && !0 !== s.sort && !(l = s.sort)) return;
+ var u = this._sort && this._sort.direction && this._sort.name == a ? this._sort.direction: "desc";
+ u = "desc" == u ? "asc": "desc",
+ this._sort = {
+ name: a,
+ direction: u
+ },
+ this.sort(l, "desc" == u)
+ }
+ } else e.$services.getService("mouseEvents").callHandler("click", "gantt_add", t.$grid, [n, o.root_id])
+ }
+ },
+ e), t.$grid),
+ this._mouseDelegates.delegate("click", "gantt_add", e.bind(function(n, i, r) {
+ if (!t.$getConfig().readonly) return this.createTask({},
+ i || e.config.root_id),
+ !1
+ },
+ e), t.$grid)
+ },
+ clearEvents: function(t, e) {
+ this._mouseDelegates.destructor(),
+ this._mouseDelegates = null
+ },
+ extendDom: function(e) {
+ t.$grid = e.$grid,
+ t.$grid_scale = e.$grid_scale,
+ t.$grid_data = e.$grid_data
+ },
+ extendGantt: function(e) {
+ t.getGridColumns = t.bind(e.getGridColumns, e),
+ e.attachEvent("onColumnResizeStart",
+ function() {
+ return t.callEvent("onColumnResizeStart", arguments)
+ }),
+ e.attachEvent("onColumnResize",
+ function() {
+ return t.callEvent("onColumnResize", arguments)
+ }),
+ e.attachEvent("onColumnResizeEnd",
+ function() {
+ return t.callEvent("onColumnResizeEnd", arguments)
+ }),
+ e.attachEvent("onColumnResizeComplete",
+ function(e, n) {
+ t.config.grid_width = n
+ }),
+ e.attachEvent("onBeforeRowResize",
+ function() {
+ return t.callEvent("onBeforeRowResize", arguments)
+ }),
+ e.attachEvent("onRowResize",
+ function() {
+ return t.callEvent("onRowResize", arguments)
+ }),
+ e.attachEvent("onBeforeRowResizeEnd",
+ function() {
+ return t.callEvent("onBeforeRowResizeEnd", arguments)
+ }),
+ e.attachEvent("onAfterRowResize",
+ function() {
+ return t.callEvent("onAfterRowResize", arguments)
+ })
+ }
+ }
+ };
+ t.exports = o
+ },
+ function(t, e, n) {
+ var i = n(30),
+ r = n(6);
+ t.exports = function(t) {
+ return {
+ render: function(e, n, i) {
+ var r = n.$getConfig(),
+ a = document.createElement("div");
+ return a.className = "gantt_task_grid_row_resize_wrap",
+ a.style.top = n.getItemTop(e.id) + n.getItemHeight(e.id) + "px",
+ a.innerHTML = "<div class='gantt_task_grid_row_resize' role='cell'></div>",
+ a.setAttribute(r.task_grid_row_resizer_attribute, e.id),
+ t._waiAria.rowResizerAttr(a),
+ a
+ },
+ update: null,
+ getRectangle: i,
+ getVisibleRange: r
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(27),
+ r = n(6),
+ a = n(26),
+ o = n(25),
+ s = n(37);
+ function l(t, e, n, i) {
+ var r = 100 * (1 - (1 * t || 0)),
+ a = i.posFromDate(e),
+ o = i.posFromDate(n),
+ s = document.createElement("div");
+ return s.className = "gantt_histogram_hor_bar",
+ s.style.top = r + "%",
+ s.style.left = a + "px",
+ s.style.width = o - a + 1 + "px",
+ s
+ }
+ function c(t, e, n) {
+ if (t === e) return null;
+ var i = 1 - Math.max(t, e),
+ r = Math.abs(t - e),
+ a = document.createElement("div");
+ return a.className = "gantt_histogram_vert_bar",
+ a.style.top = 100 * i + "%",
+ a.style.height = 100 * r + "%",
+ a.style.left = n + "px",
+ a
+ }
+ t.exports = function(t) {
+ var e = s(t),
+ n = {},
+ u = {},
+ d = {};
+ function h(t, e) {
+ var i = n[t];
+ i && i[e] && i[e].parentNode && i[e].parentNode.removeChild(i[e])
+ }
+ function f(e, n, i, r, o, s, u) {
+ var h = d[e.id];
+ h && h.parentNode && h.parentNode.removeChild(h);
+ var f = function(e, n, i, r) {
+ for (var o = n.getScale(), s = document.createElement("div"), u = a(o, r), d = u.start; d <= u.end; d++) {
+ var h = o.trace_x[d],
+ f = o.trace_x[d + 1] || t.date.add(h, o.step, o.unit),
+ _ = o.trace_x[d].valueOf(),
+ g = Math.min(e[_] / i, 1) || 0;
+ if (g < 0) return null;
+ var p = Math.min(e[f.valueOf()] / i, 1) || 0,
+ v = l(g, h, f, n);
+ v && s.appendChild(v);
+ var m = c(g, p, n.posFromDate(f));
+ m && s.appendChild(m)
+ }
+ return s
+ } (i, o, s, u);
+ return f && n && (f.setAttribute("data-resource-id", e.id), f.setAttribute(o.$config.item_attribute, e.id), f.style.position = "absolute", f.style.top = n.top + 1 + "px", f.style.height = o.getItemHeight(e.id) - 1 + "px", f.style.left = 0),
+ f
+ }
+ function _(t, e, n, i, r, a, o) {
+ var s = r.histogram_cell_class(a.start_date, a.end_date, t, a.tasks, a.assignments),
+ l = r.histogram_cell_label(a.start_date, a.end_date, t, a.tasks, a.assignments),
+ c = r.histogram_cell_allocated(a.start_date, a.end_date, t, a.tasks, a.assignments),
+ u = o.getItemHeight(t.id) - 1;
+ if (s || l) {
+ var d = document.createElement("div");
+ return d.className = ["gantt_histogram_cell", s].join(" "),
+ d.setAttribute(o.$config.item_attribute, t.id),
+ d.style.cssText = ["left:" + e.left + "px", "width:" + e.width + "px", "height:" + u + "px", "line-height:" + u + "px", "top:" + (e.top + 1) + "px"].join(";"),
+ l && (l = "<div class='gantt_histogram_label'>" + l + "</div>"),
+ c && (l = "<div class='gantt_histogram_fill' style='height:" + 100 * Math.min(c / n || 0, 1) + "%;'></div>" + l),
+ l && (d.innerHTML = l),
+ d
+ }
+ return null
+ }
+ return {
+ render: function(i, r, s, l) {
+ var c = r.$getTemplates(),
+ h = r.getScale(),
+ g = e(i, s.resource_property, h, r),
+ p = [],
+ v = {},
+ m = i.capacity || r.$config.capacity || 24;
+ n[i.id] = {},
+ u[i.id] = null,
+ d[i.id] = null;
+ for (var y = !!l,
+ k = a(h, l), b = k.start; b <= k.end; b++) {
+ var x = g[b];
+ if (x && (!y || o(b, h, l, t))) {
+ var w = c.histogram_cell_capacity(x.start_date, x.end_date, i, x.tasks, x.assignments);
+ v[x.start_date.valueOf()] = w || 0;
+ var S = r.getItemPosition(i, x.start_date, x.end_date),
+ T = _(i, S, m, 0, c, x, r);
+ T && (p.push(T), n[i.id][b] = T)
+ }
+ }
+ var $ = null;
+ if (p.length) {
+ $ = document.createElement("div");
+ for (var C = 0; C < p.length; C++) $.appendChild(p[C]);
+ var E = f(i, S, v, 0, r, m, l);
+ E && ($.appendChild(E), d[i.id] = E),
+ u[i.id] = $
+ }
+ return $
+ },
+ update: function(i, r, s, l, c) {
+ var u = s.$getTemplates(),
+ g = s.getScale(),
+ p = e(i, l.resource_property, g, s),
+ v = i.capacity || s.$config.capacity || 24,
+ m = {},
+ y = !!c,
+ k = a(g, c),
+ b = {};
+ if (n && n[i.id]) for (var x in n[i.id]) b[x] = x;
+ for (var w = k.start; w <= k.end; w++) {
+ var S = p[w];
+ if (b[w] = !1, S) {
+ var T = u.histogram_cell_capacity(S.start_date, S.end_date, i, S.tasks, S.assignments);
+ m[S.start_date.valueOf()] = T || 0;
+ var $ = s.getItemPosition(i, S.start_date, S.end_date);
+ if (!y || o(w, g, c, t)) {
+ var C = n[i.id];
+ if (C && C[w]) C && C[w] && !C[w].parentNode && r.appendChild(C[w]);
+ else {
+ var E = _(i, $, v, 0, u, S, s);
+ E && (r.appendChild(E), n[i.id][w] = E)
+ }
+ } else h(i.id, w)
+ }
+ }
+ for (var x in b) ! 1 !== b[x] && h(i.id, x);
+ var A = f(i, $, m, 0, s, v, c);
+ A && (r.appendChild(A), d[i.id] = A)
+ },
+ getRectangle: i,
+ getVisibleRange: r
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(27),
+ r = n(6),
+ a = n(26),
+ o = n(25),
+ s = n(37);
+ t.exports = function(t) {
+ var e = s(t),
+ n = {};
+ function l(t, e, n, i, r) {
+ var a = n.resource_cell_class(e.start_date, e.end_date, t, e.tasks, e.assignments),
+ o = n.resource_cell_value(e.start_date, e.end_date, t, e.tasks, e.assignments),
+ s = r.getItemHeight(t.id) - 1;
+ if (a || o) {
+ var l = r.getItemPosition(t, e.start_date, e.end_date),
+ c = document.createElement("div");
+ return c.setAttribute(r.$config.item_attribute, t.id),
+ c.className = ["gantt_resource_marker", a].join(" "),
+ c.style.cssText = ["left:" + l.left + "px", "width:" + l.width + "px", "height:" + s + "px", "line-height:" + s + "px", "top:" + l.top + "px"].join(";"),
+ o && (c.innerHTML = o),
+ c
+ }
+ return null
+ }
+ function c(t, e) {
+ n[t] && n[t][e] && n[t][e].parentNode && n[t][e].parentNode.removeChild(n[t][e])
+ }
+ return {
+ render: function(i, r, s, c) {
+ var u = r.$getTemplates(),
+ d = r.getScale(),
+ h = e(i, s.resource_property, r.getScale(), r),
+ f = !!c,
+ _ = [];
+ n[i.id] = {};
+ for (var g = a(d, c), p = g.start; p <= g.end; p++) {
+ var v = h[p];
+ if (v && (!f || o(p, d, c, t))) {
+ var m = l(i, v, u, 0, r);
+ m && (_.push(m), n[i.id][p] = m)
+ }
+ }
+ var y = null;
+ if (_.length) {
+ y = document.createElement("div");
+ for (var k = 0; k < _.length; k++) y.appendChild(_[k])
+ }
+ return y
+ },
+ update: function(i, r, s, u, d) {
+ var h = s.$getTemplates(),
+ f = s.getScale(),
+ _ = e(i, u.resource_property, s.getScale(), s),
+ g = a(f, d),
+ p = {};
+ if (n && n[i.id]) for (var v in n[i.id]) p[v] = v;
+ for (var m = g.start; m <= g.end; m++) {
+ var y = _[m];
+ if (p[m] = !1, y) if (o(m, f, d, t)) if (n[i.id] && n[i.id][m]) n[i.id] && n[i.id][m] && !n[i.id][m].parentNode && r.appendChild(n[i.id][m]);
+ else {
+ var k = l(i, y, h, 0, s);
+ k && (r.appendChild(k), n[i.id][m] = k)
+ } else c(i.id, m)
+ }
+ for (var v in p) ! 1 !== p[v] && c(i.id, v)
+ },
+ getRectangle: i,
+ getVisibleRange: r
+ }
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(2),
+ a = n(30),
+ o = n(6);
+ t.exports = function(t) {
+ return {
+ render: function(e, n, i, a) {
+ for (var o = n.getGridColumns(), s = n.$getTemplates(), l = n.$config.rowStore, c = [], u = 0; u < o.length; u++) {
+ var d, h, f, _ = u == o.length - 1,
+ g = o[u];
+ "add" == g.name ? (h = "<div " + (b = t._waiAria.gridAddButtonAttrString(g)) + " class='gantt_add'></div>", f = "") : (h = g.template ? g.template(e) : e[g.name], r.isDate(h) && (h = s.date_grid(h, e, g.name)), null !== h && void 0 !== h || (h = ""), f = h, h = "<div class='gantt_tree_content'>" + h + "</div>");
+ var p = "gantt_cell" + (_ ? " gantt_last_cell": ""),
+ v = [];
+ if (g.tree) {
+ p += " gantt_cell_tree";
+ for (var m = 0; m < e.$level; m++) v.push(s.grid_indent(e)); ! l.hasChild(e.id) || t.isSplitTask(e) && !t.config.open_split_tasks ? (v.push(s.grid_blank(e)), v.push(s.grid_file(e))) : (v.push(s.grid_open(e)), v.push(s.grid_folder(e)))
+ }
+ var y = "width:" + (g.width - (_ ? 1 : 0)) + "px;";
+ if (this.defined(g.align)) {
+ var k = {
+ right: "flex-end",
+ left: "flex-start",
+ center: "center"
+ } [g.align];
+ y += "text-align:" + g.align + ";justify-content:" + k + ";"
+ }
+ var b = t._waiAria.gridCellAttrString(g, f, e);
+ v.push(h),
+ d = "<div class='" + p + "' data-column-index='" + u + "' data-column-name='" + g.name + "' style='" + y + "' " + b + ">" + v.join("") + "</div>",
+ c.push(d)
+ }
+ switch (p = "", l.$config.name) {
+ case "task":
+ p = t.getGlobalTaskIndex(e.id) % 2 == 0 ? "": " odd";
+ break;
+ case "resource":
+ p = l.visibleOrder.indexOf(e.id) % 2 == 0 ? "": " odd"
+ }
+ if (p += e.$transparent ? " gantt_transparent": "", p += e.$dataprocessor_class ? " " + e.$dataprocessor_class: "", s.grid_row_class) {
+ var x = s.grid_row_class.call(t, e.start_date, e.end_date, e);
+ x && (p += " " + x)
+ }
+ l.isSelected(e.id) && (p += " gantt_selected");
+ var w = document.createElement("div");
+ w.className = "gantt_row" + p + " gantt_row_" + t.getTaskType(e.type);
+ var S = n.getItemHeight(e.id);
+ return w.style.height = S + "px",
+ w.style.lineHeight = S + "px",
+ i.smart_rendering && (w.style.position = "absolute", w.style.left = "0px", w.style.top = n.getItemTop(e.id) + "px"),
+ n.$config.item_attribute && (w.setAttribute(n.$config.item_attribute, e.id), w.setAttribute(n.$config.bind + "_id", e.id)),
+ t._waiAria.taskRowAttr(e, w),
+ w.innerHTML = c.join(""),
+ w
+ },
+ update: null,
+ getRectangle: a,
+ getVisibleRange: o,
+ onrender: function(e, n, r) {
+ for (var a = r.getGridColumns(), o = 0; o < a.length; o++) {
+ var s = a[o];
+ if (s.onrender) {
+ var l = n.querySelector("[data-column-name=" + s.name + "]");
+ if (l) {
+ var c = s.onrender(e, l);
+ if (c && "string" == typeof c) l.innerHTML = c;
+ else if (c && "object" === i(c) && t.config.external_render) {
+ var u = t.config.external_render;
+ u.isElement(c) && u.renderElement(c, l)
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(39),
+ r = n(40);
+ t.exports = function(t) {
+ var e = {
+ current_pos: null,
+ dirs: {
+ left: "left",
+ right: "right",
+ up: "up",
+ down: "down"
+ },
+ path: [],
+ clear: function() {
+ this.current_pos = null,
+ this.path = []
+ },
+ point: function(e) {
+ this.current_pos = t.copy(e)
+ },
+ get_lines: function(t) {
+ this.clear(),
+ this.point(t[0]);
+ for (var e = 1; e < t.length; e++) this.line_to(t[e]);
+ return this.get_path()
+ },
+ line_to: function(e) {
+ var n = t.copy(e),
+ i = this.current_pos,
+ r = this._get_line(i, n);
+ this.path.push(r),
+ this.current_pos = n
+ },
+ get_path: function() {
+ return this.path
+ },
+ get_wrapper_sizes: function(t, e, n) {
+ var i, r = e.$getConfig().link_wrapper_width,
+ a = t.y - r / 2;
+ switch (t.direction) {
+ case this.dirs.left:
+ i = {
+ top: a,
+ height: r,
+ lineHeight: r,
+ left: t.x - t.size - r / 2,
+ width: t.size + r
+ };
+ break;
+ case this.dirs.right:
+ i = {
+ top: a,
+ lineHeight: r,
+ height: r,
+ left: t.x - r / 2,
+ width: t.size + r
+ };
+ break;
+ case this.dirs.up:
+ i = {
+ top: a - t.size,
+ lineHeight: t.size + r,
+ height: t.size + r,
+ left: t.x - r / 2,
+ width: r
+ };
+ break;
+ case this.dirs.down:
+ i = {
+ top: a,
+ lineHeight: t.size + r,
+ height: t.size + r,
+ left: t.x - r / 2,
+ width: r
+ }
+ }
+ return i
+ },
+ get_line_sizes: function(t, e) {
+ var n, i = e.$getConfig(),
+ r = i.link_line_width,
+ a = i.link_wrapper_width,
+ o = t.size + r;
+ switch (t.direction) {
+ case this.dirs.left:
+ case this.dirs.right:
+ n = {
+ height: r,
+ width: o,
+ marginTop: (a - r) / 2,
+ marginLeft: (a - r) / 2
+ };
+ break;
+ case this.dirs.up:
+ case this.dirs.down:
+ n = {
+ height: o,
+ width: r,
+ marginTop: (a - r) / 2,
+ marginLeft: (a - r) / 2
+ }
+ }
+ return n
+ },
+ render_line: function(t, e, n, i) {
+ var r = this.get_wrapper_sizes(t, n, i),
+ a = document.createElement("div");
+ a.style.cssText = ["top:" + r.top + "px", "left:" + r.left + "px", "height:" + r.height + "px", "width:" + r.width + "px"].join(";"),
+ a.className = "gantt_line_wrapper";
+ var o = this.get_line_sizes(t, n),
+ s = document.createElement("div");
+ return s.style.cssText = ["height:" + o.height + "px", "width:" + o.width + "px", "margin-top:" + o.marginTop + "px", "margin-left:" + o.marginLeft + "px"].join(";"),
+ s.className = "gantt_link_line_" + t.direction,
+ a.appendChild(s),
+ a
+ },
+ _get_line: function(t, e) {
+ var n = this.get_direction(t, e),
+ i = {
+ x: t.x,
+ y: t.y,
+ direction: this.get_direction(t, e)
+ };
+ return n == this.dirs.left || n == this.dirs.right ? i.size = Math.abs(t.x - e.x) : i.size = Math.abs(t.y - e.y),
+ i
+ },
+ get_direction: function(t, e) {
+ return e.x < t.x ? this.dirs.left: e.x > t.x ? this.dirs.right: e.y > t.y ? this.dirs.down: this.dirs.up
+ }
+ },
+ n = {
+ path: [],
+ clear: function() {
+ this.path = []
+ },
+ current: function() {
+ return this.path[this.path.length - 1]
+ },
+ point: function(e) {
+ return e ? (this.path.push(t.copy(e)), e) : this.current()
+ },
+ point_to: function(n, i, r) {
+ r = r ? {
+ x: r.x,
+ y: r.y
+ }: t.copy(this.point());
+ var a = e.dirs;
+ switch (n) {
+ case a.left:
+ r.x -= i;
+ break;
+ case a.right:
+ r.x += i;
+ break;
+ case a.up:
+ r.y -= i;
+ break;
+ case a.down:
+ r.y += i
+ }
+ return this.point(r)
+ },
+ get_points: function(n, i, r, a) {
+ var o = this.get_endpoint(n, i, r, a),
+ s = t.config,
+ l = o.e_y - o.y,
+ c = o.e_x - o.x,
+ u = e.dirs,
+ d = i.getItemHeight(n.source);
+ this.clear(),
+ this.point({
+ x: o.x,
+ y: o.y
+ });
+ var h = 2 * s.link_arrow_size,
+ f = this.get_line_type(n, i.$getConfig()),
+ _ = o.e_x > o.x;
+ if (f.from_start && f.to_start) this.point_to(u.left, h),
+ _ ? (this.point_to(u.down, l), this.point_to(u.right, c)) : (this.point_to(u.right, c), this.point_to(u.down, l)),
+ this.point_to(u.right, h);
+ else if (!f.from_start && f.to_start) if (_ = o.e_x > o.x + 2 * h, this.point_to(u.right, h), _) c -= h,
+ this.point_to(u.down, l),
+ this.point_to(u.right, c);
+ else {
+ c -= 2 * h;
+ var g = l > 0 ? 1 : -1;
+ this.point_to(u.down, g * (d / 2)),
+ this.point_to(u.right, c),
+ this.point_to(u.down, g * (Math.abs(l) - d / 2)),
+ this.point_to(u.right, h)
+ } else f.from_start || f.to_start ? f.from_start && !f.to_start && (_ = o.e_x > o.x - 2 * h, this.point_to(u.left, h), _ ? (c += 2 * h, g = l > 0 ? 1 : -1, this.point_to(u.down, g * (d / 2)), this.point_to(u.right, c), this.point_to(u.down, g * (Math.abs(l) - d / 2)), this.point_to(u.left, h)) : (c += h, this.point_to(u.down, l), this.point_to(u.right, c))) : (this.point_to(u.right, h), _ ? (this.point_to(u.right, c), this.point_to(u.down, l)) : (this.point_to(u.down, l), this.point_to(u.right, c)), this.point_to(u.left, h));
+ return this.path
+ },
+ get_line_type: function(e, n) {
+ var i = n.links,
+ r = !1,
+ a = !1;
+ return e.type == i.start_to_start ? r = a = !0 : e.type == i.finish_to_finish ? r = a = !1 : e.type == i.finish_to_start ? (r = !1, a = !0) : e.type == i.start_to_finish ? (r = !0, a = !1) : t.assert(!1, "Invalid link type"),
+ n.rtl && (r = !r, a = !a),
+ {
+ from_start: r,
+ to_start: a
+ }
+ },
+ get_endpoint: function(t, e, n, i) {
+ var r = e.$getConfig(),
+ o = this.get_line_type(t, r),
+ s = o.from_start,
+ l = o.to_start,
+ c = a(n, e, r),
+ u = a(i, e, r);
+ return {
+ x: s ? c.left: c.left + c.width,
+ e_x: l ? u.left: u.left + u.width,
+ y: c.top + c.rowHeight / 2 - 1,
+ e_y: u.top + u.rowHeight / 2 - 1
+ }
+ }
+ };
+ function a(e, n, i) {
+ var r = n.getItemPosition(e);
+ if (t.getTaskType(e.type) == i.types.milestone) {
+ var a = n.getBarHeight(e.id, !0),
+ o = Math.sqrt(2 * a * a);
+ r.left -= o / 2,
+ r.width = o
+ }
+ return r
+ }
+ return {
+ render: function(i, r, a) {
+ var o = t.getTask(i.source);
+ if (!o.hide_bar) {
+ var s = t.getTask(i.target);
+ if (!s.hide_bar) {
+ var l = n.get_endpoint(i, r, o, s),
+ c = l.e_y - l.y;
+ if (! (l.e_x - l.x || c)) return null;
+ var u = n.get_points(i, r, o, s),
+ d = e.get_lines(u, r),
+ h = document.createElement("div"),
+ f = "gantt_task_link";
+ i.color && (f += " gantt_link_inline_color");
+ var _ = t.templates.link_class ? t.templates.link_class(i) : "";
+ _ && (f += " " + _),
+ a.highlight_critical_path && t.isCriticalLink && t.isCriticalLink(i) && (f += " gantt_critical_link"),
+ h.className = f,
+ r.$config.link_attribute && (h.setAttribute(r.$config.link_attribute, i.id), h.setAttribute("link_id", i.id));
+ for (var g = 0; g < d.length; g++) {
+ g == d.length - 1 && (d[g].size -= a.link_arrow_size);
+ var p = e.render_line(d[g], d[g + 1], r, i.source);
+ i.color && (p.firstChild.style.backgroundColor = i.color),
+ h.appendChild(p)
+ }
+ var v = d[d.length - 1].direction,
+ m = function(t, n, i, r) {
+ var a = i.$getConfig(),
+ o = document.createElement("div"),
+ s = t.y,
+ l = t.x,
+ c = a.link_arrow_size,
+ u = "gantt_link_arrow gantt_link_arrow_" + n;
+ switch (n) {
+ case e.dirs.right:
+ s -= c / 2,
+ l -= c;
+ break;
+ case e.dirs.left:
+ s -= c / 2;
+ break;
+ case e.dirs.up:
+ l -= c;
+ break;
+ case e.dirs.down:
+ s += 2 * c,
+ l -= c
+ }
+ return o.style.cssText = ["top:" + s + "px", "left:" + l + "px"].join(";"),
+ o.className = u,
+ o
+ } (u[u.length - 1], v, r, i.source);
+ return i.color && (m.style.borderColor = i.color),
+ h.appendChild(m),
+ t._waiAria.linkAttr(i, h),
+ h
+ }
+ }
+ },
+ update: null,
+ isInViewPort: i,
+ getVisibleRange: r()
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e) {
+ var n = e.config.timeline_placeholder;
+ if (t = t || [], n && 0 === t.filter(function(t) {
+ return "timeline_placeholder_task" === t.id
+ }).length) {
+ var i = e.getState(),
+ r = null,
+ a = i.min_date,
+ o = i.max_date;
+ t.length && (r = t[t.length - 1].id);
+ var s = {
+ start_date: a,
+ end_date: o,
+ row_height: n.height || 0,
+ id: "timeline_placeholder_task",
+ unscheduled: !0,
+ lastTaskId: r,
+ calendar_id: n.calendar || "global",
+ $source: [],
+ $target: []
+ };
+ t.push(s)
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(27),
+ r = n(20),
+ a = n(6),
+ o = n(26),
+ s = n(25),
+ l = n(111);
+ t.exports = function(t) {
+ var e = {},
+ n = {};
+ function c(t, n) {
+ return ! (!e[t.id][n] || !e[t.id][n].parentNode)
+ }
+ function u(t, n) {
+ e[t] && e[t][n] && e[t][n].parentNode && e[t][n].parentNode.removeChild(e[t][n])
+ }
+ function d(t) {
+ var e, n = t.$getTemplates();
+ return void 0 !== n.task_cell_class ? (e = n.task_cell_class, (console.warn || console.log)("gantt.templates.task_cell_class template is deprecated and will be removed soon. Please use gantt.templates.timeline_cell_class instead.")) : e = n.timeline_cell_class,
+ e
+ }
+ function h(t) {
+ return t.$getTemplates().timeline_cell_content
+ }
+ function f(i, r, a, o, l, c, u, d) {
+ var h = i.width[r],
+ f = "";
+ if (s(r, i, o, t)) {
+ var _ = c(a, i.trace_x[r]),
+ g = "";
+ if (u && (g = u(a, i.trace_x[r])), d.static_background) {
+ var p = !(!_ && !g);
+ if (!d.static_background_cells || !p) return null
+ }
+ if (e[a.id][r]) return n[a.id][r] = r,
+ e[a.id][r];
+ var v = document.createElement("div");
+ return v.style.width = h + "px",
+ f = "gantt_task_cell" + (r == l - 1 ? " gantt_last_cell": ""),
+ _ && (f += " " + _),
+ v.className = f,
+ g && (v.innerHTML = g),
+ v.style.position = "absolute",
+ v.style.left = i.left[r] + "px",
+ e[a.id][r] = v,
+ n[a.id][r] = r,
+ v
+ }
+ return null
+ }
+ return {
+ render: function(i, a, s, l) {
+ var c = a.$getTemplates(),
+ u = a.getScale(),
+ _ = u.count;
+ if (s.static_background && !s.static_background_cells) return null;
+ var g, p = document.createElement("div"),
+ v = d(a),
+ m = h(a);
+ if (g = l && s.smart_rendering && !r(t) ? o(u, l.x) : {
+ start: 0,
+ end: _ - 1
+ },
+ s.show_task_cells) {
+ e[i.id] = {},
+ n[i.id] = {};
+ for (var y = g.start; y <= g.end; y++) {
+ var k = f(u, y, i, l, _, v, m, s);
+ k && p.appendChild(k)
+ }
+ }
+ var b = a.$config.rowStore,
+ x = b.getIndexById(i.id) % 2 != 0,
+ w = c.task_row_class(i.start_date, i.end_date, i),
+ S = "gantt_task_row" + (x ? " odd": "") + (w ? " " + w: "");
+ if (b.isSelected(i.id) && (S += " gantt_selected"), p.className = S, s.smart_rendering ? (p.style.position = "absolute", p.style.top = a.getItemTop(i.id) + "px", p.style.width = "100%") : p.style.position = "relative", p.style.height = a.getItemHeight(i.id) + "px", "timeline_placeholder_task" == i.id) {
+ var T = 0;
+ i.lastTaskId && (T = a.getItemTop(i.lastTaskId) + a.getItemHeight(i.lastTaskId));
+ var $ = (i.row_height || a.$task_data.offsetHeight) - T;
+ $ < 0 && ($ = 0),
+ s.smart_rendering && (p.style.top = T + "px"),
+ p.style.height = $ + "px"
+ }
+ return a.$config.item_attribute && (p.setAttribute(a.$config.item_attribute, i.id), p.setAttribute(a.$config.bind + "_id", i.id)),
+ p
+ },
+ update: function(t, i, r, a, s) {
+ var l = r.getScale(),
+ _ = l.count,
+ g = d(r),
+ p = h(r);
+ if (a.show_task_cells) {
+ e[t.id] || (e[t.id] = {}),
+ n[t.id] || (n[t.id] = {});
+ var v = o(l, s);
+ for (var m in n[t.id]) {
+ var y = n[t.id][m]; (Number(y) < v.start || Number(y) > v.end) && u(t.id, y)
+ }
+ n[t.id] = {};
+ for (var k = v.start; k <= v.end; k++) {
+ var b = f(l, k, t, s, _, g, p, a); ! b && c(t, k) ? u(t.id, k) : b && !b.parentNode && i.appendChild(b)
+ }
+ }
+ },
+ getRectangle: i,
+ getVisibleRange: a,
+ prepareData: l
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(28),
+ r = n(19),
+ a = n(6);
+ t.exports = function(t) {
+ var e = i(t),
+ n = {};
+ function o(t, e, n, i, a) {
+ var o = !0;
+ return i.smart_rendering && (o = r(t, e, n, i, a)),
+ o
+ }
+ function s(n, i, r, a) {
+ var o = t.copy(t.getTask(i.id));
+ if (o.$rendered_at = n.id, !1 !== t.callEvent("onBeforeRollupTaskDisplay", [o.id, o, n.id])) {
+ var s = e(o, r);
+ if (s) {
+ var l = r.getBarHeight(n.id, i.type == t.config.types.milestone),
+ c = Math.floor((r.getItemHeight(n.id) - l) / 2);
+ return s.style.top = a.top + c + "px",
+ s.classList.add("gantt_rollup_child"),
+ s.setAttribute("data-rollup-parent-id", n.id),
+ s
+ }
+ }
+ }
+ function l(t, e) {
+ return t + "_" + e
+ }
+ return {
+ render: function(e, i, r, a) {
+ if (!1 !== e.rollup && e.$rollup && e.$rollup.length) {
+ var c = document.createElement("div"),
+ u = t.getTaskPosition(e);
+ return a.y = 0,
+ a.y_end = t.$task_bg.scrollHeight,
+ e.$rollup.forEach(function(d) {
+ if (t.isTaskExists(d)) {
+ var h = t.getTask(d);
+ if (o(h, a, i, r, t)) {
+ var f = s(e, h, i, u);
+ f ? (n[l(h.id, e.id)] = f, c.appendChild(f)) : n[l(h.id, e.id)] = !1
+ }
+ }
+ }),
+ c
+ }
+ return ! 1
+ },
+ update: function(e, i, r, a, c) {
+ var u = document.createElement("div"),
+ d = t.getTaskPosition(e);
+ c.y = 0,
+ c.y_end = t.$task_bg.scrollHeight,
+ e.$rollup.forEach(function(h) {
+ var f = t.getTask(h),
+ _ = l(f.id, e.id),
+ g = o(f, c, r, a, t);
+ if (g !== !!n[_]) if (g) {
+ var p = s(e, f, r, d);
+ n[_] = p || !1
+ } else n[_] = !1;
+ n[_] && u.appendChild(n[_]),
+ i.innerHTML = "",
+ i.appendChild(u)
+ })
+ },
+ isInViewPort: r,
+ getVisibleRange: a
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(19);
+ t.exports = function(t, e, n, r, a) {
+ if (!a.isSplitTask(t)) return ! 1;
+ var o = a.getSubtaskDates(t.id);
+ return i({
+ id: t.id,
+ start_date: o.start_date,
+ end_date: o.end_date,
+ parent: t.parent
+ },
+ e, n, a)
+ }
+ },
+ function(t, e, n) {
+ var i = n(28),
+ r = n(6),
+ a = n(114),
+ o = n(19);
+ t.exports = function(t) {
+ var e = i(t),
+ n = {};
+ function s(t, e, n, i, r) {
+ var a = !t.hide_bar;
+ return i.smart_rendering && a && (a = o(t, e, n, i, r)),
+ a
+ }
+ function l(n, i, r, a) {
+ if (!i.hide_bar) {
+ var o = t.isSummaryTask(i);
+ o && t.resetProjectDates(i);
+ var s = t.copy(t.getTask(i.id));
+ if (s.$rendered_at = n.id, !1 !== t.callEvent("onBeforeSplitTaskDisplay", [s.id, s, n.id])) {
+ var l = e(s, r);
+ if (l) {
+ var c = r.getBarHeight(n.id, i.type == t.config.types.milestone),
+ u = Math.floor((r.getItemHeight(n.id) - c) / 2);
+ return l.style.top = a.top + u + "px",
+ l.classList.add("gantt_split_child"),
+ o && l.classList.add("gantt_split_subproject"),
+ l
+ }
+ }
+ }
+ }
+ function c(t, e) {
+ return t + "_" + e
+ }
+ function u(e, n) {
+ return t.isSplitTask(e) && (n.open_split_tasks && !e.$open || !n.open_split_tasks) && t.hasChild(e.id)
+ }
+ return {
+ render: function(e, i, r, a) {
+ if (u(e, r)) {
+ var o = document.createElement("div"),
+ d = t.getTaskPosition(e);
+ return t.hasChild(e.id) && t.eachTask(function(u) {
+ if (s(u, a, i, r, t)) {
+ var h = l(e, u, i, d);
+ h ? (n[c(u.id, e.id)] = h, o.appendChild(h)) : n[c(u.id, e.id)] = !1
+ }
+ },
+ e.id),
+ o
+ }
+ return ! 1
+ },
+ update: function(e, i, r, a, o) {
+ if (u(e, a)) {
+ var d = document.createElement("div"),
+ h = t.getTaskPosition(e);
+ t.eachTask(function(u) {
+ var f = c(u.id, e.id),
+ _ = s(u, o, r, a, t);
+ if (_ !== !!n[f]) if (_) {
+ var g = l(e, u, r, h);
+ n[f] = g || !1
+ } else n[f] = !1;
+ n[f] && d.appendChild(n[f]),
+ i.innerHTML = "",
+ i.appendChild(d)
+ },
+ e.id)
+ }
+ },
+ isInViewPort: a,
+ getVisibleRange: r
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(19),
+ r = n(6),
+ a = n(28);
+ t.exports = function(t) {
+ return {
+ render: a(t),
+ update: null,
+ isInViewPort: i,
+ getVisibleRange: r
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ return function(n, i, r) {
+ "keepDates" == r ?
+ function(e, n) {
+ "duration" == n ? e.end_date = t.calculateEndDate(e) : "end_date" != n && "start_date" != n || (e.duration = t.calculateDuration(e))
+ } (n, i) : "keepDuration" == r ?
+ function(n, i) {
+ "end_date" == i ? n.start_date = e(n) : "start_date" != i && "duration" != i || (n.end_date = t.calculateEndDate(n))
+ } (n, i) : function(n, i) {
+ t.config.schedule_from_end ? "end_date" == i || "duration" == i ? n.start_date = e(n) : "start_date" == i && (n.duration = t.calculateDuration(n)) : "start_date" == i || "duration" == i ? n.end_date = t.calculateEndDate(n) : "end_date" == i && (n.duration = t.calculateDuration(n))
+ } (n, i)
+ };
+ function e(e) {
+ return t.calculateEndDate({
+ start_date: e.end_date,
+ duration: -e.duration,
+ task: e
+ })
+ }
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(10)(t),
+ i = n(0);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ function a(e) {
+ return e.formatter || t.ext.formatters.durationFormatter()
+ }
+ return n(3)(r, e),
+ i.mixin(r.prototype, {
+ show: function(t, e, n, i) {
+ var r = "<div role='cell'><input type='text' name='".concat(e.name, "' title='").concat(e.name, "'></div>");
+ i.innerHTML = r
+ },
+ set_value: function(t, e, n, i) {
+ this.get_input(i).value = a(n.editor).format(t)
+ },
+ get_value: function(t, e, n) {
+ return a(e.editor).parse(this.get_input(n).value || "")
+ }
+ },
+ !0),
+ r
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(10)(t),
+ i = n(0);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ function a(e) {
+ return e.formatter || t.ext.formatters.linkFormatter()
+ }
+ function o(t, e) {
+ for (var n = (t || "").split(e.delimiter || ","), i = 0; i < n.length; i++) {
+ var r = n[i].trim();
+ r ? n[i] = r: (n.splice(i, 1), i--)
+ }
+ return n.sort(),
+ n
+ }
+ function s(t, e, n) {
+ for (var i = t.$target,
+ r = [], o = 0; o < i.length; o++) {
+ var s = n.getLink(i[o]);
+ r.push(a(e).format(s))
+ }
+ return r.join((e.delimiter || ",") + " ")
+ }
+ function l(t) {
+ return t.source + "_" + t.target + "_" + t.type + "_" + (t.lag || 0)
+ }
+ function c(e, n, i) {
+ var r = function(e, n, i) {
+ var r = [];
+ return n.forEach(function(n) {
+ var o = a(i).parse(n);
+ o && (o.target = e, o.id = "predecessor_generated", t.isLinkAllowed(o) && (o.id = void 0, r.push(o)))
+ }),
+ r
+ } (e.id, n, i),
+ o = {};
+ e.$target.forEach(function(e) {
+ var n = t.getLink(e);
+ o[l(n)] = n.id
+ });
+ var s = [];
+ r.forEach(function(t) {
+ var e = l(t);
+ o[e] ? delete o[e] : s.push(t)
+ });
+ var c = [];
+ for (var u in o) c.push(o[u]);
+ return {
+ add: s,
+ remove: c
+ }
+ }
+ return n(3)(r, e),
+ i.mixin(r.prototype, {
+ show: function(t, e, n, i) {
+ var r = "<div role='cell'><input type='text' name='".concat(e.name, "' title='").concat(e.name, "'></div>");
+ i.innerHTML = r
+ },
+ hide: function() {},
+ set_value: function(e, n, i, r) {
+ this.get_input(r).value = s(e, i.editor, t)
+ },
+ get_value: function(t, e, n) {
+ return o(this.get_input(n).value || "", e.editor)
+ },
+ save: function(e, n, i) {
+ var r = c(t.getTask(e), this.get_value(e, n, i), n.editor); (r.add.length || r.remove.length) && t.batchUpdate(function() {
+ r.add.forEach(function(e) {
+ t.addLink(e)
+ }),
+ r.remove.forEach(function(e) {
+ t.deleteLink(e)
+ }),
+ t.autoSchedule && t.autoSchedule()
+ })
+ },
+ is_changed: function(e, n, i, r) {
+ var a = this.get_value(n, i, r),
+ l = o(s(e, i.editor, t), i.editor);
+ return a.join() !== l.join()
+ }
+ },
+ !0),
+ r
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(10)(t),
+ i = n(0),
+ r = "%Y-%m-%d",
+ a = null,
+ o = null;
+ function s() {
+ return e.apply(this, arguments) || this
+ }
+ return n(3)(s, e),
+ i.mixin(s.prototype, {
+ show: function(e, n, i, s) {
+ a || (a = t.date.date_to_str(r)),
+ o || (o = t.date.str_to_date(r));
+ var l = null,
+ c = null;
+ l = "function" == typeof i.min ? i.min(e, n) : i.min,
+ c = "function" == typeof i.max ? i.max(e, n) : i.max;
+ var u = l ? " min='" + a(l) + "' ": "",
+ d = c ? " max='" + a(c) + "' ": "",
+ h = "<div style='width:140px' role='cell'><input type='date' ".concat(u, " ").concat(d, " name='").concat(n.name, "' title='").concat(n.name, "'></div>");
+ s.innerHTML = h
+ },
+ set_value: function(t, e, n, i) {
+ t && t.getFullYear ? this.get_input(i).value = a(t) : this.get_input(i).value = t
+ },
+ is_valid: function(t, e, n, i) {
+ return ! (!t || isNaN(t.getTime()))
+ },
+ get_value: function(t, e, n) {
+ var i;
+ try {
+ i = o(this.get_input(n).value || "")
+ } catch(t) {
+ i = null
+ }
+ return i
+ }
+ },
+ !0),
+ s
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(10)(t),
+ i = n(0);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return n(3)(r, e),
+ i.mixin(r.prototype, {
+ show: function(t, e, n, i) {
+ for (var r = "<div role='cell'><select name='".concat(e.name, "' title='").concat(e.name, "'>"), a = [], o = n.options || [], s = 0; s < o.length; s++) a.push("<option value='" + n.options[s].key + "'>" + o[s].label + "</option>");
+ r += a.join("") + "</select></div>",
+ i.innerHTML = r
+ },
+ get_input: function(t) {
+ return t.querySelector("select")
+ }
+ },
+ !0),
+ r
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(10)(t),
+ i = n(0);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return n(3)(r, e),
+ i.mixin(r.prototype, {
+ show: function(t, e, n, i) {
+ var r = n.min || 0,
+ a = n.max || 100,
+ o = "<div role='cell'><input type='number' min='".concat(r, "' max='").concat(a, "' name='").concat(e.name, "' title='").concat(e.name, "'></div>");
+ i.innerHTML = o
+ },
+ get_value: function(t, e, n) {
+ return this.get_input(n).value || ""
+ },
+ is_valid: function(t, e, n, i) {
+ return ! isNaN(parseInt(t, 10))
+ }
+ },
+ !0),
+ r
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(10)(t),
+ i = n(0);
+ function r() {
+ return e.apply(this, arguments) || this
+ }
+ return n(3)(r, e),
+ i.mixin(r.prototype, {
+ show: function(t, e, n, i) {
+ var r = "<div role='cell'><input type='text' name='".concat(e.name, "' title='").concat(e.name, "'></div>");
+ i.innerHTML = r
+ }
+ },
+ !0),
+ r
+ }
+ },
+ function(t, e) {
+ t.exports = {
+ init: function(t, e) {
+ var n = t,
+ i = e.$gantt,
+ r = null,
+ a = i.ext.keyboardNavigation;
+ a.attachEvent("onBeforeFocus",
+ function(e) {
+ var i = t.locateCell(e);
+ if (clearTimeout(r), i) {
+ var a = i.columnName,
+ o = i.id,
+ s = n.getState();
+ if (n.isVisible() && s.id == o && s.columnName === a) return ! 1
+ }
+ return ! 0
+ }),
+ a.attachEvent("onFocus",
+ function(e) {
+ var i = t.locateCell(e),
+ a = t.getState();
+ return clearTimeout(r),
+ !i || i.id == a.id && i.columnName == a.columnName || n.isVisible() && n.save(),
+ !0
+ }),
+ t.attachEvent("onHide",
+ function() {
+ clearTimeout(r)
+ }),
+ a.attachEvent("onBlur",
+ function() {
+ return r = setTimeout(function() {
+ n.save()
+ }),
+ !0
+ }),
+ i.attachEvent("onTaskDblClick",
+ function(e, n) {
+ var i = t.getState(),
+ r = t.locateCell(n.target);
+ return ! r || !t.isVisible() || r.columnName != i.columnName
+ }),
+ i.attachEvent("onTaskClick",
+ function(e, n) {
+ if (i._is_icon_open_click(n)) return ! 0;
+ var r = t.getState(),
+ a = t.locateCell(n.target);
+ return ! a || !t.getEditorConfig(a.columnName) || (t.isVisible() && r.id == a.id && r.columnName == a.columnName || t.startEdit(a.id, a.columnName), !1)
+ }),
+ i.attachEvent("onEmptyClick",
+ function() {
+ return n.save(),
+ !0
+ }),
+ a.attachEvent("onKeyDown",
+ function(e, r) {
+ var o = t.locateCell(r.target),
+ s = !!o && t.getEditorConfig(o.columnName),
+ l = t.getState(),
+ c = i.constants.KEY_CODES,
+ u = r.keyCode,
+ d = !1;
+ switch (u) {
+ case c.ENTER:
+ t.isVisible() ? (t.save(), r.preventDefault(), d = !0) : s && !(r.ctrlKey || r.metaKey || r.shiftKey) && (n.startEdit(o.id, o.columnName), r.preventDefault(), d = !0);
+ break;
+ case c.ESC:
+ t.isVisible() && (t.hide(), r.preventDefault(), d = !0);
+ break;
+ case c.UP:
+ case c.DOWN:
+ break;
+ case c.LEFT:
+ case c.RIGHT:
+ (s && t.isVisible() || "date" === l.editorType) && (d = !0);
+ break;
+ case c.SPACE:
+ t.isVisible() && (d = !0),
+ s && !t.isVisible() && (n.startEdit(o.id, o.columnName), r.preventDefault(), d = !0);
+ break;
+ case c.DELETE:
+ s && !t.isVisible() ? (n.startEdit(o.id, o.columnName), d = !0) : s && t.isVisible() && (d = !0);
+ break;
+ case c.TAB:
+ if (t.isVisible()) {
+ r.shiftKey ? t.editPrevCell(!0) : t.editNextCell(!0);
+ var h = t.getState();
+ h.id && a.focus({
+ type: "taskCell",
+ id: h.id,
+ column: h.columnName
+ }),
+ r.preventDefault(),
+ d = !0
+ }
+ break;
+ default:
+ if (t.isVisible()) d = !0;
+ else if (u >= 48 && u <= 57 || u > 95 && u < 112 || u >= 64 && u <= 91 || u > 185 && u < 193 || u > 218 && u < 223) {
+ var f = e.modifiers,
+ _ = f.alt || f.ctrl || f.meta || f.shift;
+ f.alt || _ && a.getCommandHandler(e, "taskCell") || s && !t.isVisible() && (n.startEdit(o.id, o.columnName), d = !0)
+ }
+ }
+ return ! d
+ })
+ },
+ onShow: function(t, e, n) {},
+ onHide: function(t, e, n) {
+ n.$gantt.focus()
+ },
+ destroy: function() {}
+ }
+ },
+ function(t, e) {
+ t.exports = {
+ init: function(t, e) {
+ var n = e.$gantt;
+ n.attachEvent("onTaskClick",
+ function(e, i) {
+ if (n._is_icon_open_click(i)) return ! 0;
+ var r = t.getState(),
+ a = t.locateCell(i.target);
+ return ! a || !t.getEditorConfig(a.columnName) || (t.isVisible() && r.id == a.id && r.columnName == a.columnName || t.startEdit(a.id, a.columnName), !1)
+ }),
+ n.attachEvent("onEmptyClick",
+ function() {
+ return t.isVisible() && t.isChanged() ? t.save() : t.hide(),
+ !0
+ }),
+ n.attachEvent("onTaskDblClick",
+ function(e, n) {
+ var i = t.getState(),
+ r = t.locateCell(n.target);
+ return ! r || !t.isVisible() || r.columnName != i.columnName
+ })
+ },
+ onShow: function(t, e, n) {
+ var i = n.$gantt;
+ i.ext && i.ext.keyboardNavigation && i.ext.keyboardNavigation.attachEvent("onKeyDown",
+ function(e, n) {
+ var r = i.constants.KEY_CODES,
+ a = !1;
+ switch (n.keyCode) {
+ case r.SPACE:
+ t.isVisible() && (a = !0)
+ }
+ return ! a
+ });
+ e.onkeydown = function(e) {
+ e = e || window.event;
+ var n = i.constants.KEY_CODES;
+ if (! (e.defaultPrevented || e.shiftKey && e.keyCode != n.TAB)) {
+ var r = !0;
+ switch (e.keyCode) {
+ case i.keys.edit_save:
+ t.save();
+ break;
+ case i.keys.edit_cancel:
+ t.hide();
+ break;
+ case n.UP:
+ case n.DOWN:
+ t.isVisible() && (t.hide(), r = !1);
+ break;
+ case n.TAB:
+ e.shiftKey ? t.editPrevCell(!0) : t.editNextCell(!0);
+ break;
+ default:
+ r = !1
+ }
+ r && e.preventDefault()
+ }
+ }
+ },
+ onHide: function() {},
+ destroy: function() {}
+ }
+ },
+ function(t, e, n) {
+ var i = n(125),
+ r = n(124);
+ t.exports = function(t) {
+ var e = null;
+ return {
+ setMapping: function(t) {
+ e = t
+ },
+ getMapping: function() {
+ return e || (t.config.keyboard_navigation_cells && t.ext.keyboardNavigation ? r: i)
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(126),
+ r = n(123),
+ a = n(122),
+ o = n(121),
+ s = n(120),
+ l = n(119),
+ c = n(118),
+ u = n(0),
+ d = n(1),
+ h = n(5),
+ f = n(117);
+ function _(t) {
+ t.config.editor_types = {
+ text: new(r(t)),
+ number: new(a(t)),
+ select: new(o(t)),
+ date: new(s(t)),
+ predecessor: new(l(t)),
+ duration: new(c(t))
+ }
+ }
+ t.exports = function(t) {
+ var e = i(t),
+ n = {};
+ h(n);
+ var r = {
+ init: _,
+ createEditors: function(i) {
+ function r(e, n) {
+ var r = i.$getConfig(),
+ a = function(t, e) {
+ for (var n = i.$getConfig(), r = i.getItemTop(t), a = i.getItemHeight(t), o = i.getGridColumns(), s = 0, l = 0, c = 0, u = 0; u < o.length; u++) {
+ if (o[u].name == e) {
+ c = o[u].width;
+ break
+ }
+ n.rtl ? l += o[u].width: s += o[u].width
+ }
+ return n.rtl ? {
+ top: r,
+ right: l,
+ height: a,
+ width: c
+ }: {
+ top: r,
+ left: s,
+ height: a,
+ width: c
+ }
+ } (e, n),
+ o = document.createElement("div");
+ o.className = "gantt_grid_editor_placeholder",
+ o.setAttribute(i.$config.item_attribute, e),
+ o.setAttribute(i.$config.bind + "_id", e),
+ o.setAttribute("data-column-name", n);
+ var s = function(t, e) {
+ for (var n = t.getGridColumns(), i = 0; i < n.length; i++) if (n[i].name == e) return i;
+ return 0
+ } (i, n);
+ return o.setAttribute("data-column-index", s),
+ t._waiAria.inlineEditorAttr(o),
+ r.rtl ? o.style.cssText = ["top:" + a.top + "px", "right:" + a.right + "px", "width:" + a.width + "px", "height:" + a.height + "px"].join(";") : o.style.cssText = ["top:" + a.top + "px", "left:" + a.left + "px", "width:" + a.width + "px", "height:" + a.height + "px"].join(";"),
+ o
+ }
+ var a = f(t),
+ o = [],
+ s = [],
+ l = null,
+ c = {
+ _itemId: null,
+ _columnName: null,
+ _editor: null,
+ _editorType: null,
+ _placeholder: null,
+ locateCell: function(t) {
+ if (!d.isChildOf(t, i.$grid)) return null;
+ var e = d.locateAttribute(t, i.$config.item_attribute),
+ n = d.locateAttribute(t, "data-column-name");
+ if (e && n) {
+ var r = n.getAttribute("data-column-name");
+ return {
+ id: e.getAttribute(i.$config.item_attribute),
+ columnName: r
+ }
+ }
+ return null
+ },
+ getEditorConfig: function(t) {
+ return i.getColumn(t).editor
+ },
+ init: function() {
+ var n = e.getMapping();
+ n.init && n.init(this, i),
+ l = i.$gantt.getDatastore(i.$config.bind);
+ var r = this;
+ o.push(l.attachEvent("onIdChange",
+ function(t, e) {
+ r._itemId == t && (r._itemId = e)
+ })),
+ o.push(l.attachEvent("onStoreUpdated",
+ function() {
+ i.$gantt.getState("batchUpdate").batch_update || r.isVisible() && !l.isVisible(r._itemId) && r.hide()
+ })),
+ s.push(t.attachEvent("onDataRender",
+ function() {
+ r._editor && r._placeholder && !d.isChildOf(r._placeholder, t.$root) && i.$grid_data.appendChild(r._placeholder)
+ })),
+ this.init = function() {}
+ },
+ getState: function() {
+ return {
+ editor: this._editor,
+ editorType: this._editorType,
+ placeholder: this._placeholder,
+ id: this._itemId,
+ columnName: this._columnName
+ }
+ },
+ startEdit: function(e, n) {
+ if (this.isVisible() && this.save(), l.exists(e)) {
+ var i = {
+ id: e,
+ columnName: n
+ };
+ t.isReadonly(l.getItem(e)) ? this.callEvent("onEditPrevent", [i]) : !1 !== this.callEvent("onBeforeEditStart", [i]) ? (this.show(i.id, i.columnName), this.setValue(), this.callEvent("onEditStart", [i])) : this.callEvent("onEditPrevent", [i])
+ }
+ },
+ isVisible: function() {
+ return ! (!this._editor || !d.isChildOf(this._placeholder, t.$root))
+ },
+ show: function(t, n) {
+ this.isVisible() && this.save();
+ var a = {
+ id: t,
+ columnName: n
+ },
+ o = i.getColumn(a.columnName),
+ s = this.getEditorConfig(o.name);
+ if (s) {
+ var l = i.$getConfig().editor_types[s.type],
+ c = r(a.id, a.columnName);
+ i.$grid_data.appendChild(c),
+ l.show(a.id, o, s, c),
+ this._editor = l,
+ this._placeholder = c,
+ this._itemId = a.id,
+ this._columnName = a.columnName,
+ this._editorType = s.type;
+ var u = e.getMapping();
+ u.onShow && u.onShow(this, c, i)
+ }
+ },
+ setValue: function() {
+ var t = this.getState(),
+ e = t.id,
+ n = t.columnName,
+ r = i.getColumn(n),
+ a = l.getItem(e),
+ o = this.getEditorConfig(n);
+ if (o) {
+ var s = a[o.map_to];
+ "auto" == o.map_to && (s = l.getItem(e)),
+ this._editor.set_value(s, e, r, this._placeholder),
+ this.focus()
+ }
+ },
+ focus: function() {
+ this._editor.focus(this._placeholder)
+ },
+ getValue: function() {
+ var t = i.getColumn(this._columnName);
+ return this._editor.get_value(this._itemId, t, this._placeholder)
+ },
+ _getItemValue: function() {
+ var e = this.getEditorConfig(this._columnName);
+ if (e) {
+ var n = t.getTask(this._itemId)[e.map_to];
+ return "auto" == e.map_to && (n = l.getItem(this._itemId)),
+ n
+ }
+ },
+ isChanged: function() {
+ var t = i.getColumn(this._columnName),
+ e = this._getItemValue();
+ return this._editor.is_changed(e, this._itemId, t, this._placeholder)
+ },
+ hide: function() {
+ if (this._itemId) {
+ var t = this._itemId,
+ n = this._columnName,
+ r = e.getMapping();
+ r.onHide && r.onHide(this, this._placeholder, i),
+ this._itemId = null,
+ this._columnName = null,
+ this._editorType = null,
+ this._placeholder && (this._editor && this._editor.hide && this._editor.hide(this._placeholder), this._editor = null, this._placeholder.parentNode && this._placeholder.parentNode.removeChild(this._placeholder), this._placeholder = null, this.callEvent("onEditEnd", [{
+ id: t,
+ columnName: n
+ }]))
+ }
+ },
+ save: function() {
+ if (this.isVisible() && l.exists(this._itemId) && this.isChanged()) {
+ var e = this._itemId,
+ n = this._columnName;
+ if (l.exists(e)) {
+ var r = l.getItem(e),
+ o = this.getEditorConfig(n),
+ s = {
+ id: e,
+ columnName: n,
+ newValue: this.getValue(),
+ oldValue: this._getItemValue()
+ };
+ if (!1 !== this.callEvent("onBeforeSave", [s]) && (!this._editor.is_valid || this._editor.is_valid(s.newValue, s.id, i.getColumn(n), this._placeholder))) {
+ var c = o.map_to,
+ u = s.newValue;
+ "auto" != c ? (r[c] = u, a(r, c, t.config.inline_editors_date_processing), l.updateItem(e)) : this._editor.save(e, i.getColumn(n), this._placeholder),
+ this.callEvent("onSave", [s])
+ }
+ this.hide()
+ }
+ } else this.hide()
+ },
+ _findEditableCell: function(t, e) {
+ var n = t,
+ r = i.getGridColumns()[n],
+ a = r ? r.name: null;
+ if (a) {
+ for (; a && !this.getEditorConfig(a);) a = this._findEditableCell(t + e, e);
+ return a
+ }
+ return null
+ },
+ getNextCell: function(t) {
+ return this._findEditableCell(i.getColumnIndex(this._columnName, !0) + t, t)
+ },
+ getFirstCell: function() {
+ return this._findEditableCell(0, 1)
+ },
+ getLastCell: function() {
+ return this._findEditableCell(i.getGridColumns().length - 1, -1)
+ },
+ editNextCell: function(t) {
+ var e = this.getNextCell(1);
+ if (e) {
+ var n = this.getNextCell(1);
+ n && this.getEditorConfig(n) && this.startEdit(this._itemId, n)
+ } else if (t && this.moveRow(1)) {
+ var i = this.moveRow(1); (e = this.getFirstCell()) && this.getEditorConfig(e) && this.startEdit(i, e)
+ }
+ },
+ editPrevCell: function(t) {
+ var e = this.getNextCell( - 1);
+ if (e) {
+ var n = this.getNextCell( - 1);
+ n && this.getEditorConfig(n) && this.startEdit(this._itemId, n)
+ } else if (t && this.moveRow( - 1)) {
+ var i = this.moveRow( - 1); (e = this.getLastCell()) && this.getEditorConfig(e) && this.startEdit(i, e)
+ }
+ },
+ moveRow: function(e) {
+ for (var n = e > 0 ? t.getNext: t.getPrev, i = (n = t.bind(n, t))(this._itemId); t.isTaskExists(i) && t.isReadonly(t.getTask(i));) i = n(i);
+ return i
+ },
+ editNextRow: function(e) {
+ var n = this.getState().id;
+ if (t.isTaskExists(n)) {
+ var i = null;
+ i = e ? this.moveRow(1) : t.getNext(n),
+ t.isTaskExists(i) && this.startEdit(i, this._columnName)
+ }
+ },
+ editPrevRow: function(e) {
+ var n = this.getState().id;
+ if (t.isTaskExists(n)) {
+ var i = null;
+ i = e ? this.moveRow( - 1) : t.getPrev(n),
+ t.isTaskExists(i) && this.startEdit(i, this._columnName)
+ }
+ },
+ destructor: function() {
+ o.forEach(function(t) {
+ l.detachEvent(t)
+ }),
+ s.forEach(function(e) {
+ t.detachEvent(e)
+ }),
+ o = [],
+ s = [],
+ l = null,
+ this.hide(),
+ this.detachAllEvents()
+ }
+ };
+ return u.mixin(c, e),
+ u.mixin(c, n),
+ c
+ }
+ };
+ return u.mixin(r, e),
+ u.mixin(r, n),
+ r
+ }
+ },
+ function(t, e) {
+ t.exports = {
+ create: function() {
+ return {
+ render: function() {},
+ destroy: function() {}
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(3),
+ r = n(1),
+ a = n(0),
+ o = n(11),
+ s = function(t) {
+ "use strict";
+ var e = ["altKey", "shiftKey", "metaKey"];
+ function n(e, n, i, r) {
+ var o = t.apply(this, arguments) || this;
+ this.$config = a.mixin(n, {
+ scroll: "x"
+ }),
+ o._scrollHorizontalHandler = a.bind(o._scrollHorizontalHandler, o),
+ o._scrollVerticalHandler = a.bind(o._scrollVerticalHandler, o),
+ o._outerScrollVerticalHandler = a.bind(o._outerScrollVerticalHandler, o),
+ o._outerScrollHorizontalHandler = a.bind(o._outerScrollHorizontalHandler, o),
+ o._mouseWheelHandler = a.bind(o._mouseWheelHandler, o),
+ this.$config.hidden = !0;
+ var s = r.config.scroll_size;
+ return r.env.isIE && (s += 1),
+ this._isHorizontal() ? (o.$config.height = s, o.$parent.$config.height = s) : (o.$config.width = s, o.$parent.$config.width = s),
+ this.$config.scrollPosition = 0,
+ o.$name = "scroller",
+ o
+ }
+ return i(n, t),
+ n.prototype.init = function(t) {
+ t.innerHTML = this.$toHTML(),
+ this.$view = t.firstChild,
+ this.$view || this.init(),
+ this._isVertical() ? this._initVertical() : this._initHorizontal(),
+ this._initMouseWheel(),
+ this._initLinkedViews()
+ },
+ n.prototype.$toHTML = function() {
+ return "<div class='gantt_layout_cell " + (this._isHorizontal() ? "gantt_hor_scroll": "gantt_ver_scroll") + "'><div style='" + (this._isHorizontal() ? "width:2000px": "height:2000px") + "'></div></div>"
+ },
+ n.prototype._getRootParent = function() {
+ for (var t = this.$parent; t && t.$parent;) t = t.$parent;
+ if (t) return t
+ },
+ n.prototype._eachView = function() {
+ var t = [];
+ return function t(e, n) {
+ if (n.push(e), e.$cells) for (var i = 0; i < e.$cells.length; i++) t(e.$cells[i], n)
+ } (this._getRootParent(), t),
+ t
+ },
+ n.prototype._getLinkedViews = function() {
+ for (var t = this._eachView(), e = [], n = 0; n < t.length; n++) t[n].$config && (this._isVertical() && t[n].$config.scrollY == this.$id || this._isHorizontal() && t[n].$config.scrollX == this.$id) && e.push(t[n]);
+ return e
+ },
+ n.prototype._initHorizontal = function() {
+ this.$scroll_hor = this.$view,
+ this.$domEvents.attach(this.$view, "scroll", this._scrollHorizontalHandler)
+ },
+ n.prototype._initLinkedViews = function() {
+ for (var t = this._getLinkedViews(), e = this._isVertical() ? "gantt_layout_outer_scroll gantt_layout_outer_scroll_vertical": "gantt_layout_outer_scroll gantt_layout_outer_scroll_horizontal", n = 0; n < t.length; n++) r.addClassName(t[n].$view || t[n].getNode(), e)
+ },
+ n.prototype._initVertical = function() {
+ this.$scroll_ver = this.$view,
+ this.$domEvents.attach(this.$view, "scroll", this._scrollVerticalHandler)
+ },
+ n.prototype._updateLinkedViews = function() {},
+ n.prototype._initMouseWheel = function() {
+ o.isFF ? this.$domEvents.attach(this._getRootParent().$view, "wheel", this._mouseWheelHandler, {
+ passive: !1
+ }) : this.$domEvents.attach(this._getRootParent().$view, "mousewheel", this._mouseWheelHandler, {
+ passive: !1
+ })
+ },
+ n.prototype.scrollHorizontally = function(t) {
+ if (!this._scrolling) {
+ this._scrolling = !0,
+ this.$scroll_hor.scrollLeft = t,
+ this.$config.codeScrollLeft = t,
+ t = this.$scroll_hor.scrollLeft;
+ for (var e = this._getLinkedViews(), n = 0; n < e.length; n++) e[n].scrollTo && e[n].scrollTo(t, void 0);
+ var i = this.$config.scrollPosition;
+ this.$config.scrollPosition = t,
+ this.callEvent("onScroll", [i, t, this.$config.scroll]),
+ this._scrolling = !1
+ }
+ },
+ n.prototype.scrollVertically = function(t) {
+ if (!this._scrolling) {
+ this._scrolling = !0,
+ this.$scroll_ver.scrollTop = t,
+ t = this.$scroll_ver.scrollTop;
+ for (var e = this._getLinkedViews(), n = 0; n < e.length; n++) e[n].scrollTo && e[n].scrollTo(void 0, t);
+ var i = this.$config.scrollPosition;
+ this.$config.scrollPosition = t,
+ this.callEvent("onScroll", [i, t, this.$config.scroll]),
+ this._scrolling = !1
+ }
+ },
+ n.prototype._isVertical = function() {
+ return "y" == this.$config.scroll
+ },
+ n.prototype._isHorizontal = function() {
+ return "x" == this.$config.scroll
+ },
+ n.prototype._scrollHorizontalHandler = function(t) {
+ if (!this._isVertical() && !this._scrolling) {
+ if (new Date - (this._wheel_time || 0) < 100) return ! 0;
+ var e = this.$scroll_hor.scrollLeft;
+ this.scrollHorizontally(e),
+ this._oldLeft = this.$scroll_hor.scrollLeft
+ }
+ },
+ n.prototype._outerScrollHorizontalHandler = function(t) {
+ this._isVertical()
+ },
+ n.prototype.show = function() {
+ this.$parent.show()
+ },
+ n.prototype.hide = function() {
+ this.$parent.hide()
+ },
+ n.prototype._getScrollSize = function() {
+ for (var t, e = 0,
+ n = 0,
+ i = this._isHorizontal(), r = this._getLinkedViews(), a = i ? "scrollWidth": "scrollHeight", o = i ? "contentX": "contentY", s = i ? "x": "y", l = this._getScrollOffset(), c = 0; c < r.length; c++) if ((t = r[c]) && t.$content && t.$content.getSize && !t.$config.hidden) {
+ var u, d = t.$content.getSize();
+ if (u = d.hasOwnProperty(a) ? d[a] : d[o], l) d[o] > d[s] && d[o] > e && u > d[s] - l + 2 && (e = u + (i ? 0 : 2), n = d[s]);
+ else {
+ var h = Math.max(d[o] - u, 0); (u += h) > Math.max(d[s] - h, 0) && u > e && (e = u, n = d[s])
+ }
+ }
+ return {
+ outerScroll: n,
+ innerScroll: e
+ }
+ },
+ n.prototype.scroll = function(t) {
+ this._isHorizontal() ? this.scrollHorizontally(t) : this.scrollVertically(t)
+ },
+ n.prototype.getScrollState = function() {
+ return {
+ visible: this.isVisible(),
+ direction: this.$config.scroll,
+ size: this.$config.outerSize,
+ scrollSize: this.$config.scrollSize || 0,
+ position: this.$config.scrollPosition || 0
+ }
+ },
+ n.prototype.setSize = function(e, n) {
+ t.prototype.setSize.apply(this, arguments);
+ var i = this._getScrollSize(),
+ r = (this._isVertical() ? n: e) - this._getScrollOffset() + (this._isHorizontal() ? 1 : 0);
+ i.innerScroll && r > i.outerScroll && (i.innerScroll += r - i.outerScroll),
+ this.$config.scrollSize = i.innerScroll,
+ this.$config.width = e,
+ this.$config.height = n,
+ this._setScrollSize(i.innerScroll)
+ },
+ n.prototype.isVisible = function() {
+ return ! (!this.$parent || !this.$parent.$view.parentNode)
+ },
+ n.prototype.shouldShow = function() {
+ var t = this._getScrollSize();
+ return ! (!t.innerScroll && this.$parent && this.$parent.$view.parentNode) && !(!t.innerScroll || this.$parent && this.$parent.$view.parentNode)
+ },
+ n.prototype.shouldHide = function() {
+ return ! (this._getScrollSize().innerScroll || !this.$parent || !this.$parent.$view.parentNode)
+ },
+ n.prototype.toggleVisibility = function() {
+ this.shouldHide() ? this.hide() : this.shouldShow() && this.show()
+ },
+ n.prototype._getScaleOffset = function(t) {
+ var e = 0;
+ return ! t || "timeline" != t.$config.view && "grid" != t.$config.view || (e = t.$content.$getConfig().scale_height),
+ e
+ },
+ n.prototype._getScrollOffset = function() {
+ var t = 0;
+ if (this._isVertical()) {
+ var e = this.$parent.$parent;
+ t = Math.max(this._getScaleOffset(e.getPrevSibling(this.$parent.$id)), this._getScaleOffset(e.getNextSibling(this.$parent.$id)))
+ } else for (var n = this._getLinkedViews(), i = 0; i < n.length; i++) {
+ var r = n[i].$parent.$cells,
+ a = r[r.length - 1];
+ if (a && "scrollbar" == a.$config.view && !1 === a.$config.hidden) {
+ t = a.$config.width;
+ break
+ }
+ }
+ return t || 0
+ },
+ n.prototype._setScrollSize = function(t) {
+ var e = this._isHorizontal() ? "width": "height",
+ n = this._isHorizontal() ? this.$scroll_hor: this.$scroll_ver,
+ i = this._getScrollOffset(),
+ a = n.firstChild;
+ i ? this._isVertical() ? (this.$config.outerSize = this.$config.height - i + 3, n.style.height = this.$config.outerSize + "px", n.style.top = i - 1 + "px", r.addClassName(n, this.$parent._borders.top), r.addClassName(n.parentNode, "gantt_task_vscroll")) : (this.$config.outerSize = this.$config.width - i + 1, n.style.width = this.$config.outerSize + "px") : (n.style.top = "auto", r.removeClassName(n, this.$parent._borders.top), r.removeClassName(n.parentNode, "gantt_task_vscroll"), this.$config.outerSize = this.$config.height),
+ a.style[e] = t + "px"
+ },
+ n.prototype._scrollVerticalHandler = function(t) {
+ if (!this._scrollHorizontalHandler() && !this._scrolling) {
+ var e = this.$scroll_ver.scrollTop;
+ e != this._oldTop && (this.scrollVertically(e), this._oldTop = this.$scroll_ver.scrollTop)
+ }
+ },
+ n.prototype._outerScrollVerticalHandler = function(t) {
+ this._scrollHorizontalHandler()
+ },
+ n.prototype._checkWheelTarget = function(t) {
+ for (var e = this._getLinkedViews().concat(this), n = 0; n < e.length; n++) {
+ var i = e[n].$view;
+ if (r.isChildOf(t, i)) return ! 0
+ }
+ return ! 1
+ },
+ n.prototype._mouseWheelHandler = function(t) {
+ var n = t.target || t.srcElement;
+ if (this._checkWheelTarget(n)) {
+ this._wheel_time = new Date;
+ var i = {},
+ r = {
+ x: 1,
+ y: 1
+ },
+ a = this.$gantt.config.wheel_scroll_sensitivity;
+ "number" == typeof a && a ? r = {
+ x: a,
+ y: a
+ }: "[object Object]" == {}.toString.apply(a) && (r = {
+ x: a.x,
+ y: a.y
+ });
+ var s = o.isFF,
+ l = s ? t.deltaX: t.wheelDeltaX,
+ c = s ? t.deltaY: t.wheelDelta,
+ u = -20;
+ s && (u = 0 !== t.deltaMode ? -40 : -10);
+ var d = s ? l * u * r.x: 2 * l * r.x,
+ h = s ? c * u * r.y: c * r.y,
+ f = this.$gantt.config.horizontal_scroll_key;
+ if (!1 !== f && e.indexOf(f) >= 0 && (!t[f] || t.deltaX || t.wheelDeltaX || (d = 2 * h, h = 0)), d && Math.abs(d) > Math.abs(h)) {
+ if (this._isVertical()) return;
+ if (i.x) return ! 0;
+ if (!this.$scroll_hor || !this.$scroll_hor.offsetWidth) return ! 0;
+ var _ = d / -40,
+ g = this._oldLeft,
+ p = g + 30 * _;
+ if (this.scrollHorizontally(p), this.$scroll_hor.scrollLeft = p, g == this.$scroll_hor.scrollLeft) return ! 0;
+ this._oldLeft = this.$scroll_hor.scrollLeft
+ } else {
+ if (this._isHorizontal()) return;
+ if (i.y) return ! 0;
+ if (!this.$scroll_ver || !this.$scroll_ver.offsetHeight) return ! 0;
+ _ = h / -40;
+ void 0 === h && (_ = t.detail);
+ var v = this._oldTop,
+ m = this.$scroll_ver.scrollTop + 30 * _;
+ if (this.scrollVertically(m), this.$scroll_ver.scrollTop = m, v == this.$scroll_ver.scrollTop) return ! 0;
+ this._oldTop = this.$scroll_ver.scrollTop
+ }
+ return t.preventDefault && t.preventDefault(),
+ t.cancelBubble = !0,
+ !1
+ }
+ },
+ n
+ } (n(14));
+ t.exports = s
+ },
+ function(t, e) {
+ t.exports = null
+ },
+ function(t, e, n) {
+ var i = n(3),
+ r = n(0),
+ a = function(t) {
+ "use strict";
+ function e(e, n, i) {
+ var a = t.apply(this, arguments) || this;
+ if (n.view) {
+ n.id && (this.$id = r.uid());
+ var o = r.copy(n);
+ if (delete o.config, delete o.templates, this.$content = this.$factory.createView(n.view, this, o, this), !this.$content) return ! 1
+ }
+ return a.$name = "viewCell",
+ a
+ }
+ return i(e, t),
+ e.prototype.destructor = function() {
+ this.clear(),
+ t.prototype.destructor.call(this)
+ },
+ e.prototype.clear = function() {
+ if (this.$initialized = !1, this.$content) {
+ var e = this.$content.unload || this.$content.destructor;
+ e && e.call(this.$content)
+ }
+ t.prototype.clear.call(this)
+ },
+ e.prototype.scrollTo = function(e, n) {
+ this.$content && this.$content.scrollTo ? this.$content.scrollTo(e, n) : t.prototype.scrollTo.call(this, e, n)
+ },
+ e.prototype._setContentSize = function(t, e) {
+ var n = this._getBorderSizes();
+ if ("number" == typeof t) {
+ var i = t + n.horizontal;
+ this.$config.width = i
+ }
+ if ("number" == typeof e) {
+ var r = e + n.vertical;
+ this.$config.height = r
+ }
+ },
+ e.prototype.setSize = function(e, n) {
+ if (t.prototype.setSize.call(this, e, n), !this.$preResize && this.$content && !this.$initialized) {
+ this.$initialized = !0;
+ var i = this.$view.childNodes[0],
+ r = this.$view.childNodes[1];
+ r || (r = i),
+ this.$content.init(r)
+ }
+ },
+ e.prototype.setContentSize = function() { ! this.$preResize && this.$content && this.$initialized && this.$content.setSize(this.$lastSize.contentX, this.$lastSize.contentY)
+ },
+ e.prototype.getContentSize = function() {
+ var e = t.prototype.getContentSize.call(this);
+ if (this.$content && this.$initialized) {
+ var n = this.$content.getSize();
+ e.width = void 0 === n.contentX ? n.width: n.contentX,
+ e.height = void 0 === n.contentY ? n.height: n.contentY
+ }
+ var i = this._getBorderSizes();
+ return e.width += i.horizontal,
+ e.height += i.vertical,
+ e
+ },
+ e
+ } (n(14));
+ t.exports = a
+ },
+ function(t, e, n) {
+ var i = n(3),
+ r = n(38),
+ a = n(14),
+ o = function(t) {
+ "use strict";
+ function e(e, n, i) {
+ for (var r = t.apply(this, arguments) || this, a = 0; a < r.$cells.length; a++) r.$cells[a].$config.hidden = 0 !== a;
+ return r.$cell = r.$cells[0],
+ r.$name = "viewLayout",
+ r
+ }
+ return i(e, t),
+ e.prototype.cell = function(e) {
+ var n = t.prototype.cell.call(this, e);
+ return n.$view || this.$fill(null, this),
+ n
+ },
+ e.prototype.moveView = function(t) {
+ var e = this.$view;
+ this.$cell && (this.$cell.$config.hidden = !0, e.removeChild(this.$cell.$view)),
+ this.$cell = t,
+ e.appendChild(t.$view)
+ },
+ e.prototype.setSize = function(t, e) {
+ a.prototype.setSize.call(this, t, e)
+ },
+ e.prototype.setContentSize = function() {
+ var t = this.$lastSize;
+ this.$cell.setSize(t.contentX, t.contentY)
+ },
+ e.prototype.getSize = function() {
+ var e = t.prototype.getSize.call(this);
+ if (this.$cell) {
+ var n = this.$cell.getSize();
+ if (this.$config.byMaxSize) for (var i = 0; i < this.$cells.length; i++) {
+ var r = this.$cells[i].getSize();
+ for (var a in n) n[a] = Math.max(n[a], r[a])
+ }
+ for (var o in e) e[o] = e[o] || n[o];
+ e.gravity = Math.max(e.gravity, n.gravity)
+ }
+ return e
+ },
+ e
+ } (r);
+ t.exports = o
+ },
+ function(t, e) {
+ t.exports = function(t, e, n) {
+ if (!t.start_date || !t.end_date) return null;
+ var i = e.posFromDate(t.start_date),
+ r = e.posFromDate(t.end_date),
+ a = Math.min(i, r) - 200,
+ o = Math.max(i, r) + 200;
+ return {
+ top: e.getItemTop(t.id),
+ height: e.getItemHeight(t.id),
+ left: a,
+ width: o - a
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(133);
+ t.exports = function(t, e, n, r) {
+ if (!r.isTaskExists(t.source)) return null;
+ if (!r.isTaskExists(t.target)) return null;
+ var a = i(r.getTask(t.source), e, r),
+ o = i(r.getTask(t.target), e, r);
+ if (!a || !o) return null;
+ var s = Math.min(a.left, o.left) - 100,
+ l = Math.max(a.left + a.width, o.left + o.width) + 100,
+ c = Math.min(a.top, o.top) - 100,
+ u = Math.max(a.top + a.height, o.top + o.height) + 100;
+ return {
+ top: c,
+ height: u - c,
+ bottom: u,
+ left: s,
+ width: l - s,
+ right: l
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e) {
+ return !! e && (!(e.left > t.x_end || e.left + e.width < t.x) && !(e.top > t.y_end || e.top + e.height < t.y))
+ }
+ },
+ function(t, e, n) {
+ var i = n(135),
+ r = n(20),
+ a = n(30),
+ o = n(6);
+ t.exports = function(t) {
+ var e = {},
+ n = {};
+ function s(e) {
+ var n = null;
+ return "string" == typeof e.view ? n = t.$ui.getView(e.view) : e.view && (n = e.view),
+ n
+ }
+ function l(l, c, u) {
+ if (n[l]) return n[l];
+ c.renderer || t.assert(!1, "Invalid renderer call");
+ var d = null,
+ h = null,
+ f = null,
+ _ = null,
+ g = null;
+ "function" == typeof c.renderer ? (d = c.renderer, f = a) : (d = c.renderer.render, h = c.renderer.update, _ = c.renderer.onrender, c.renderer.isInViewPort ? g = c.renderer.isInViewPort: f = c.renderer.getRectangle, f || null === f || (f = a));
+ var p = c.filter;
+ return u && u.setAttribute(t.config.layer_attribute, !0),
+ n[l] = {
+ render_item: function(e, n, a, o, l) {
+ if (n = n || u, !p || p(e)) {
+ var h = o || s(c),
+ v = l || (h ? h.$getConfig() : null),
+ m = a; ! m && v && v.smart_rendering && (m = h.getViewPort());
+ var y = null; ! r(t) && (f || g) && m ? (g ? g(e, m, h, v, t) : i(m, f(e, h, v, t))) && (y = d.call(t, e, h, v, m)) : y = d.call(t, e, h, v, m),
+ this.append(e, y, n);
+ var k = 11 == n.nodeType;
+ _ && !k && y && _.call(t, e, y, h)
+ } else this.remove_item(e.id)
+ },
+ clear: function(t) {
+ this.rendered = e[l] = {},
+ c.append || this.clear_container(t)
+ },
+ clear_container: function(t) { (t = t || u) && (t.innerHTML = "")
+ },
+ get_visible_range: function(e) {
+ var n, i, r = s(c),
+ a = r ? r.$getConfig() : null;
+ return a && a.smart_rendering && (n = r.getViewPort()),
+ r && n && ("function" == typeof c.renderer ? i = o(t, r, a, e, n) : c.renderer && c.renderer.getVisibleRange && (i = c.renderer.getVisibleRange(t, r, a, e, n))),
+ i || (i = {
+ start: 0,
+ end: e.count()
+ }),
+ i
+ },
+ prepare_data: function(e) {
+ if (c.renderer && c.renderer.prepareData) return c.renderer.prepareData(e, t, c)
+ },
+ render_items: function(e, n) {
+ n = n || u;
+ var i = document.createDocumentFragment();
+ this.clear(n);
+ var r = null,
+ a = s(c),
+ o = a ? a.$getConfig() : null;
+ o && o.smart_rendering && (r = a.getViewPort());
+ for (var l = 0,
+ d = e.length; l < d; l++) this.render_item(e[l], i, r, a, o);
+ n.appendChild(i, n);
+ var h = {};
+ e.forEach(function(t) {
+ h[t.id] = t
+ });
+ var f = {};
+ if (_) {
+ var g = {};
+ for (var l in this.rendered) f[l] || (g[l] = this.rendered[l], _.call(t, h[l], this.rendered[l], a))
+ }
+ },
+ update_items: function(e, n) {
+ var a = s(c),
+ o = a ? a.$getConfig() : null;
+ if (a && a.$getConfig().smart_rendering && !r(t) && this.rendered && (f || g)) {
+ n = n || u;
+ var l = document.createDocumentFragment(),
+ d = null;
+ a && (d = a.getViewPort());
+ var p = {};
+ e.forEach(function(t) {
+ p[t.id] = t
+ });
+ var v = {},
+ m = {};
+ for (var y in this.rendered) m[y] = !0,
+ v[y] = !0;
+ for (var k = {},
+ b = (y = 0, e.length); y < b; y++) {
+ var x = e[y],
+ w = this.rendered[x.id];
+ m[x.id] = !1,
+ w && w.parentNode ? (g ? g(x, d, a, o, t) : i(d, f(x, a, o, t))) ? (h && h.call(t, x, w, a, o, d), this.restore(x, l)) : m[x.id] = !0 : (k[e[y].id] = !0, this.render_item(e[y], l, d, a, o))
+ }
+ for (var y in m) m[y] && this.hide(y);
+ if (l.childNodes.length && n.appendChild(l, n), _) {
+ var S = {};
+ for (var y in this.rendered) v[y] && !k[y] || (S[y] = this.rendered[y], _.call(t, p[y], this.rendered[y], a))
+ }
+ }
+ },
+ append: function(t, e, n) {
+ this.rendered && (e ? (this.rendered[t.id] && this.rendered[t.id].parentNode ? this.replace_item(t.id, e) : n.appendChild(e), this.rendered[t.id] = e) : this.rendered[t.id] && this.remove_item(t.id))
+ },
+ replace_item: function(t, e) {
+ var n = this.rendered[t];
+ n && n.parentNode && n.parentNode.replaceChild(e, n),
+ this.rendered[t] = e
+ },
+ remove_item: function(t) {
+ this.hide(t),
+ delete this.rendered[t]
+ },
+ hide: function(t) {
+ var e = this.rendered[t];
+ e && e.parentNode && e.parentNode.removeChild(e)
+ },
+ restore: function(t, e) {
+ var n = this.rendered[t.id];
+ n ? n.parentNode || this.append(t, n, e || u) : this.render_item(t, e || u)
+ },
+ change_id: function(t, e) {
+ this.rendered[e] = this.rendered[t],
+ delete this.rendered[t]
+ },
+ rendered: e[l],
+ node: u,
+ destructor: function() {
+ this.clear(),
+ delete n[l],
+ delete e[l]
+ }
+ },
+ n[l]
+ }
+ return {
+ getRenderer: l,
+ clearRenderers: function() {
+ for (var t in n) l(t).destructor()
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(136),
+ r = n(0),
+ a = n(1),
+ o = n(20);
+ function s(t) {
+ return t instanceof Array || (t = Array.prototype.slice.call(arguments, 0)),
+ function(e) {
+ for (var n = !0,
+ i = 0,
+ r = t.length; i < r; i++) {
+ var a = t[i];
+ a && (n = n && !1 !== a(e.id, e))
+ }
+ return n
+ }
+ }
+ t.exports = function(t) {
+ var e = i(t);
+ return {
+ createGroup: function(n, i, l, c) {
+ var u = {
+ tempCollection: [],
+ renderers: {},
+ container: n,
+ filters: [],
+ getLayers: function() {
+ this._add();
+ var t = [];
+ for (var e in this.renderers) t.push(this.renderers[e]);
+ return t
+ },
+ getLayer: function(t) {
+ return this.renderers[t]
+ },
+ _add: function(n) {
+ n && (n.id = n.id || r.uid(), this.tempCollection.push(n));
+ for (var o = this.container(), s = this.tempCollection, l = 0; l < s.length; l++) if (n = s[l], this.container() || n && n.container && a.isChildOf(n.container, document.body)) {
+ var u = n.container,
+ d = n.id,
+ h = n.topmost;
+ if (!u.parentNode) if (h) o.appendChild(u);
+ else {
+ var f = i ? i() : o.firstChild;
+ f && f.parentNode == o ? o.insertBefore(u, f) : o.appendChild(u)
+ }
+ this.renderers[d] = e.getRenderer(d, n, u),
+ c && c(n, t),
+ this.tempCollection.splice(l, 1),
+ l--
+ }
+ },
+ addLayer: function(e) {
+ if (e) {
+ "function" == typeof e && (e = {
+ renderer: e
+ }),
+ void 0 === e.filter ? e.filter = s(l || []) : e.filter instanceof Array && (e.filter.push(l), e.filter = s(e.filter)),
+ e.container || (e.container = document.createElement("div"));
+ var n = this;
+ e.requestUpdate = function() {
+ t.config.smart_rendering && !o(t) && n.renderers[e.id] && n.onUpdateRequest(n.renderers[e.id])
+ }
+ }
+ return this._add(e),
+ e ? e.id: void 0
+ },
+ onUpdateRequest: function(t) {},
+ eachLayer: function(t) {
+ for (var e in this.renderers) t(this.renderers[e])
+ },
+ removeLayer: function(t) {
+ this.renderers[t] && (this.renderers[t].destructor(), delete this.renderers[t])
+ },
+ clear: function() {
+ for (var t in this.renderers) this.renderers[t].destructor();
+ this.renderers = {}
+ }
+ };
+ return t.attachEvent("onDestroy",
+ function() {
+ u.clear(),
+ u = null
+ }),
+ u
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(137),
+ r = n(6),
+ a = n(40),
+ o = n(39);
+ function s(t, e) {
+ if (t.view) {
+ var n = t.view;
+ "string" == typeof n && (n = e.$ui.getView(n)),
+ n && n.attachEvent && n.attachEvent("onScroll",
+ function() {
+ e.$services.getService("state").getState("batchUpdate").batch_update || n.$config.$skipSmartRenderOnScroll || t.requestUpdate && t.requestUpdate()
+ })
+ }
+ }
+ t.exports = function(t) {
+ var e = i(t);
+ return {
+ getDataRender: function(e) {
+ return t.$services.getService("layer:" + e) || null
+ },
+ createDataRender: function(n) {
+ var i = n.name,
+ r = n.defaultContainer,
+ a = n.defaultContainerSibling,
+ o = e.createGroup(r, a,
+ function(t, e) {
+ if (!o.filters) return ! 0;
+ for (var n = 0; n < o.filters.length; n++) if (!1 === o.filters[n](t, e)) return ! 1
+ },
+ s);
+ return t.$services.setService("layer:" + i,
+ function() {
+ return o
+ }),
+ t.attachEvent("onGanttReady",
+ function() {
+ o.addLayer()
+ }),
+ o
+ },
+ init: function() {
+ var e = this.createDataRender({
+ name: "task",
+ defaultContainer: function() {
+ return t.$task_data ? t.$task_data: t.$ui.getView("timeline") ? t.$ui.getView("timeline").$task_data: void 0
+ },
+ defaultContainerSibling: function() {
+ return t.$task_links ? t.$task_links: t.$ui.getView("timeline") ? t.$ui.getView("timeline").$task_links: void 0
+ },
+ filter: function(t) {}
+ },
+ t),
+ n = this.createDataRender({
+ name: "link",
+ defaultContainer: function() {
+ return t.$task_data ? t.$task_data: t.$ui.getView("timeline") ? t.$ui.getView("timeline").$task_data: void 0
+ }
+ },
+ t);
+ return {
+ addTaskLayer: function(t) {
+ var n = r;
+ return "function" == typeof t ? t = {
+ renderer: {
+ render: t,
+ getVisibleRange: n
+ }
+ }: t.renderer && !t.renderer.getVisibleRange && (t.renderer.getVisibleRange = n),
+ t.view = "timeline",
+ e.addLayer(t)
+ },
+ _getTaskLayers: function() {
+ return e.getLayers()
+ },
+ removeTaskLayer: function(t) {
+ e.removeLayer(t)
+ },
+ _clearTaskLayers: function() {
+ e.clear()
+ },
+ addLinkLayer: function(t) {
+ var e = a();
+ return "function" == typeof t ? t = {
+ renderer: {
+ render: t,
+ getVisibleRange: e
+ }
+ }: t.renderer && !t.renderer.getVisibleRange && (t.renderer.getVisibleRange = e),
+ t.view = "timeline",
+ t && t.renderer && (t.renderer.getRectangle || t.renderer.isInViewPort || (t.renderer.isInViewPort = o)),
+ n.addLayer(t)
+ },
+ _getLinkLayers: function() {
+ return n.getLayers()
+ },
+ removeLinkLayer: function(t) {
+ n.removeLayer(t)
+ },
+ _clearLinkLayers: function() {
+ n.clear()
+ }
+ }
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = function(t) {
+ return function(e) {
+ var n = {
+ click: {},
+ doubleclick: {},
+ contextMenu: {}
+ };
+ function i(t, e, i, r) {
+ n[t][e] || (n[t][e] = []),
+ n[t][e].push({
+ handler: i,
+ root: r
+ })
+ }
+ function r(t) {
+ t = t || window.event;
+ var i = e.locate(t),
+ r = o(t, n.click),
+ a = !0;
+ if (null !== i ? a = !e.checkEvent("onTaskClick") || e.callEvent("onTaskClick", [i, t]) : e.callEvent("onEmptyClick", [t]), a) {
+ if (!s(r, t, i)) return;
+ switch (t.target.nodeName) {
+ case "SELECT":
+ case "INPUT":
+ return
+ }
+ i && e.getTask(i) && !e._multiselect && e.config.select_task && e.selectTask(i)
+ }
+ }
+ function a(t) {
+ var n = (t = t || window.event).target || t.srcElement,
+ i = e.locate(n),
+ r = e.locate(n, e.config.link_attribute),
+ a = !e.checkEvent("onContextMenu") || e.callEvent("onContextMenu", [i, r, t]);
+ return a || (t.preventDefault ? t.preventDefault() : t.returnValue = !1),
+ a
+ }
+ function o(e, n) {
+ for (var i = e.target || e.srcElement,
+ r = []; i;) {
+ var a = t.getClassName(i);
+ if (a) {
+ a = a.split(" ");
+ for (var o = 0; o < a.length; o++) if (a[o] && n[a[o]]) for (var s = n[a[o]], l = 0; l < s.length; l++) s[l].root && !t.isChildOf(i, s[l].root) || r.push(s[l].handler)
+ }
+ i = i.parentNode
+ }
+ return r
+ }
+ function s(t, n, i) {
+ for (var r = !0,
+ a = 0; a < t.length; a++) {
+ var o = t[a].call(e, n, i, n.target || n.srcElement);
+ r = r && !(void 0 !== o && !0 !== o)
+ }
+ return r
+ }
+ function l(t) {
+ t = t || window.event;
+ var i = e.locate(t),
+ r = o(t, n.doubleclick),
+ a = !e.checkEvent("onTaskDblClick") || null === i || e.callEvent("onTaskDblClick", [i, t]);
+ if (a) {
+ if (!s(r, t, i)) return;
+ null !== i && e.getTask(i) && a && e.config.details_on_dblclick && !e.isReadonly(i) && e.showLightbox(i)
+ }
+ }
+ function c(t) {
+ if (e.checkEvent("onMouseMove")) {
+ var n = e.locate(t);
+ e._last_move_event = t,
+ e.callEvent("onMouseMove", [n, t])
+ }
+ }
+ var u = e._createDomEventScope();
+ function d(t) {
+ u.detachAll(),
+ t && (u.attach(t, "click", r), u.attach(t, "dblclick", l), u.attach(t, "mousemove", c), u.attach(t, "contextmenu", a))
+ }
+ return {
+ reset: d,
+ global: function(t, e, n) {
+ i(t, e, n, null)
+ },
+ delegate: i,
+ detach: function(t, e, i, r) {
+ if (n[t] && n[t][e]) {
+ for (var a = n[t], o = a[e], s = 0; s < o.length; s++) o[s].root == r && (o.splice(s, 1), s--);
+ o.length || delete a[e]
+ }
+ },
+ callHandler: function(t, e, i, r) {
+ var a = n[t][e];
+ if (a) for (var o = 0; o < a.length; o++)(i || a[o].root) && a[o].root !== i || a[o].handler.apply(this, r)
+ },
+ onDoubleClick: l,
+ onMouseMove: c,
+ onContextMenu: a,
+ onClick: r,
+ destructor: function() {
+ d(),
+ n = null,
+ u = null
+ }
+ }
+ }
+ } (n(1));
+ t.exports = {
+ init: i
+ }
+ },
+ function(t, e, n) {
+ var i = n(0);
+ function r(t, e) {
+ var n = this.$config[t];
+ return n ? (n.$extendedConfig || (n.$extendedConfig = !0, Object.setPrototypeOf(n, e)), n) : e
+ }
+ t.exports = function(t, e) {
+ i.mixin(t,
+ function(t) {
+ var e, n;
+ return {
+ $getConfig: function() {
+ return e || (e = t ? t.$getConfig() : this.$gantt.config),
+ this.$config.config ? r.call(this, "config", e) : e
+ },
+ $getTemplates: function() {
+ return n || (n = t ? t.$getTemplates() : this.$gantt.templates),
+ this.$config.templates ? r.call(this, "templates", n) : n
+ }
+ }
+ } (e))
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(0),
+ a = n(140);
+ t.exports = {
+ createFactory: function(t) {
+ var e = {};
+ var n = {};
+ function o(o, s, l, c) {
+ var u = e[o];
+ if (!u || !u.create) return ! 1;
+ "resizer" != o || l.mode || (c.$config.cols ? l.mode = "x": l.mode = "y"),
+ "viewcell" != o || "scrollbar" != l.view || l.scroll || (c.$config.cols ? l.scroll = "y": l.scroll = "x"),
+ (l = r.copy(l)).id || n[l.view] || (l.id = l.view),
+ l.id && !l.css && (l.css = l.id + "_cell");
+ var d = new u.create(s, l, this, t);
+ return u.configure && u.configure(d),
+ a(d, c),
+ d.$id || (d.$id = l.id || t.uid()),
+ d.$parent || "object" != i(s) || (d.$parent = s),
+ d.$config || (d.$config = l),
+ n[d.$id] && (d.$id = t.uid()),
+ n[d.$id] = d,
+ d
+ }
+ return {
+ initUI: function(t, e) {
+ var n = "cell";
+ return t.view ? n = "viewcell": t.resizer ? n = "resizer": t.rows || t.cols ? n = "layout": t.views && (n = "multiview"),
+ o.call(this, n, null, t, e)
+ },
+ reset: function() {
+ n = {}
+ },
+ registerView: function(t, n, i) {
+ e[t] = {
+ create: n,
+ configure: i
+ }
+ },
+ createView: o,
+ getView: function(t) {
+ return n[t]
+ }
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(141),
+ r = n(139),
+ a = n(138),
+ o = n(14),
+ s = n(38),
+ l = n(132),
+ c = n(131),
+ u = n(130),
+ d = n(129),
+ h = n(29),
+ f = n(32),
+ _ = n(32),
+ g = n(29),
+ p = n(29),
+ v = n(127),
+ m = n(116),
+ y = n(115),
+ k = n(113),
+ b = n(112),
+ x = n(110),
+ w = n(109),
+ S = n(108),
+ T = n(107),
+ $ = n(106),
+ C = n(105),
+ E = n(99),
+ A = n(96);
+ t.exports = {
+ init: function(t) {
+ function e(e, n) {
+ var i = n(t);
+ i.onCreated && i.onCreated(e),
+ e.attachEvent("onReady",
+ function() {
+ i.onInitialized && i.onInitialized(e)
+ }),
+ e.attachEvent("onDestroy",
+ function() {
+ i.onDestroyed && i.onDestroyed(e)
+ })
+ }
+ var n = i.createFactory(t);
+ n.registerView("cell", o),
+ n.registerView("resizer", u),
+ n.registerView("scrollbar", d),
+ n.registerView("layout", s,
+ function(t) {
+ "main" === (t.$config ? t.$config.id: null) && e(t, A)
+ }),
+ n.registerView("viewcell", c),
+ n.registerView("multiview", l),
+ n.registerView("timeline", h,
+ function(t) {
+ "timeline" !== (t.$config ? t.$config.id: null) && "task" != t.$config.bind || e(t, E)
+ }),
+ n.registerView("grid", f,
+ function(t) {
+ "grid" !== (t.$config ? t.$config.id: null) && "task" != t.$config.bind || e(t, C)
+ }),
+ n.registerView("resourceGrid", _),
+ n.registerView("resourceTimeline", g),
+ n.registerView("resourceHistogram", p);
+ var D = a(t),
+ M = v(t);
+ return t.ext.inlineEditors = M,
+ t.ext._inlineEditors = M,
+ M.init(t),
+ {
+ factory: n,
+ mouseEvents: r.init(t),
+ layersApi: D.init(),
+ render: {
+ gridLine: function() {
+ return w(t)
+ },
+ taskBg: function() {
+ return b(t)
+ },
+ taskBar: function() {
+ return m(t)
+ },
+ taskRollupBar: function() {
+ return k(t)
+ },
+ taskSplitBar: function() {
+ return y(t)
+ },
+ link: function() {
+ return x(t)
+ },
+ resourceRow: function() {
+ return S(t)
+ },
+ resourceHistogram: function() {
+ return T(t)
+ },
+ gridTaskRowResizer: function() {
+ return $(t)
+ }
+ },
+ layersService: {
+ getDataRender: function(e) {
+ return D.getDataRender(e, t)
+ },
+ createDataRender: function(e) {
+ return D.createDataRender(e, t)
+ }
+ }
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(0),
+ a = n(1);
+ t.exports = function(t) {
+ var e = "data-dhxbox",
+ n = null;
+ function o(t, e) {
+ var i = t.callback;
+ y.hide(t.box),
+ n = t.box = null,
+ i && i(e)
+ }
+ function s(t) {
+ if (n) {
+ var e = t.which || t.keyCode,
+ i = !1;
+ if (k.keyboard) {
+ if (13 == e || 32 == e) {
+ var r = t.target || t.srcElement;
+ a.getClassName(r).indexOf("gantt_popup_button") > -1 && r.click ? r.click() : (o(n, !0), i = !0)
+ }
+ 27 == e && (o(n, !1), i = !0)
+ }
+ return i ? (t.preventDefault && t.preventDefault(), !(t.cancelBubble = !0)) : void 0
+ }
+ }
+ var l = a.getRootNode(t.$root) || document;
+ function c(t) {
+ c.cover || (c.cover = document.createElement("div"), c.cover.onkeydown = s, c.cover.className = "dhx_modal_cover", document.body.appendChild(c.cover)),
+ c.cover.style.display = t ? "inline-block": "none"
+ }
+ function u(e, n, i) {
+ return "<div " + t._waiAria.messageButtonAttrString(e) + " class='gantt_popup_button " + ("gantt_" + n.toLowerCase().replace(/ /g, "_") + "_button") + "' data-result='" + i + "' result='" + i + "' ><div>" + e + "</div></div>"
+ }
+ function d(e) {
+ k.area || (k.area = document.createElement("div"), k.area.className = "gantt_message_area", k.area.style[k.position] = "5px", document.body.appendChild(k.area)),
+ k.hide(e.id);
+ var n = document.createElement("div");
+ return n.innerHTML = "<div>" + e.text + "</div>",
+ n.className = "gantt-info gantt-" + e.type,
+ n.onclick = function() {
+ k.hide(e.id),
+ e = null
+ },
+ t._waiAria.messageInfoAttr(n),
+ "bottom" == k.position && k.area.firstChild ? k.area.insertBefore(n, k.area.firstChild) : k.area.appendChild(n),
+ e.expire > 0 && (k.timers[e.id] = window.setTimeout(function() {
+ k && k.hide(e.id)
+ },
+ e.expire)),
+ k.pull[e.id] = n,
+ n = null,
+ e.id
+ }
+ function h() {
+ for (var t = [].slice.apply(arguments, [0]), e = 0; e < t.length; e++) if (t[e]) return t[e]
+ }
+ function f(l, d, f) {
+ var _ = l.tagName ? l: function(s, l, c) {
+ var d = document.createElement("div"),
+ f = r.uid();
+ t._waiAria.messageModalAttr(d, f),
+ d.className = " gantt_modal_box gantt-" + s.type,
+ d.setAttribute(e, 1);
+ var _ = "";
+ if (s.width && (d.style.width = s.width), s.height && (d.style.height = s.height), s.title && (_ += '<div class="gantt_popup_title">' + s.title + "</div>"), _ += '<div class="gantt_popup_text" id="' + f + '"><span>' + (s.content ? "": s.text) + '</span></div><div class="gantt_popup_controls">', l && (_ += u(h(s.ok, t.locale.labels.message_ok, "OK"), "ok", !0)), c && (_ += u(h(s.cancel, t.locale.labels.message_cancel, "Cancel"), "cancel", !1)), s.buttons) for (var g = 0; g < s.buttons.length; g++) {
+ var p = s.buttons[g];
+ "object" == i(p) ? _ += u(p.label, p.css || "gantt_" + p.label.toLowerCase() + "_button", p.value || g) : _ += u(p, p, g)
+ }
+ if (_ += "</div>", d.innerHTML = _, s.content) {
+ var v = s.content;
+ "string" == typeof v && (v = document.getElementById(v)),
+ "none" == v.style.display && (v.style.display = ""),
+ d.childNodes[s.title ? 1 : 0].appendChild(v)
+ }
+ return d.onclick = function(t) {
+ var e = t.target || t.srcElement;
+ if (e.className || (e = e.parentNode), a.closest(e, ".gantt_popup_button")) {
+ var n = e.getAttribute("data-result");
+ o(s, n = "true" == n || "false" != n && n)
+ }
+ },
+ s.box = d,
+ (l || c) && (n = s),
+ d
+ } (l, d, f);
+ l.hidden || c(!0),
+ document.body.appendChild(_);
+ var g = Math.abs(Math.floor(((window.innerWidth || document.documentElement.offsetWidth) - _.offsetWidth) / 2)),
+ p = Math.abs(Math.floor(((window.innerHeight || document.documentElement.offsetHeight) - _.offsetHeight) / 2));
+ return "top" == l.position ? _.style.top = "-3px": _.style.top = p + "px",
+ _.style.left = g + "px",
+ _.onkeydown = s,
+ y.focus(_),
+ l.hidden && y.hide(_),
+ t.callEvent("onMessagePopup", [_]),
+ _
+ }
+ function _(t) {
+ return f(t, !0, !1)
+ }
+ function g(t) {
+ return f(t, !0, !0)
+ }
+ function p(t) {
+ return f(t)
+ }
+ function v(t, e, n) {
+ return "object" != i(t) && ("function" == typeof e && (n = e, e = ""), t = {
+ text: t,
+ type: e,
+ callback: n
+ }),
+ t
+ }
+ function m(t, e, n, a) {
+ return "object" != i(t) && (t = {
+ text: t,
+ type: e,
+ expire: n,
+ id: a
+ }),
+ t.id = t.id || r.uid(),
+ t.expire = t.expire || k.expire,
+ t
+ }
+ t.event(l, "keydown", s, !0);
+ var y = function() {
+ var t = v.apply(this, arguments);
+ return t.type = t.type || "alert",
+ p(t)
+ };
+ y.hide = function(n) {
+ for (; n && n.getAttribute && !n.getAttribute(e);) n = n.parentNode;
+ n && (n.parentNode.removeChild(n), c(!1), t.callEvent("onAfterMessagePopup", [n]))
+ },
+ y.focus = function(t) {
+ setTimeout(function() {
+ var e = a.getFocusableNodes(t);
+ e.length && e[0].focus && e[0].focus()
+ },
+ 1)
+ };
+ var k = function(t, e, n, i) {
+ switch ((t = m.apply(this, arguments)).type = t.type || "info", t.type.split("-")[0]) {
+ case "alert":
+ return _(t);
+ case "confirm":
+ return g(t);
+ case "modalbox":
+ return p(t);
+ default:
+ return d(t)
+ }
+ };
+ k.seed = (new Date).valueOf(),
+ k.uid = r.uid,
+ k.expire = 4e3,
+ k.keyboard = !0,
+ k.position = "top",
+ k.pull = {},
+ k.timers = {},
+ k.hideAll = function() {
+ for (var t in k.pull) k.hide(t)
+ },
+ k.hide = function(t) {
+ var e = k.pull[t];
+ e && e.parentNode && (window.setTimeout(function() {
+ e.parentNode.removeChild(e),
+ e = null
+ },
+ 2e3), e.className += " hidden", k.timers[t] && window.clearTimeout(k.timers[t]), delete k.pull[t])
+ };
+ var b = [];
+ return t.attachEvent("onMessagePopup",
+ function(t) {
+ b.push(t)
+ }),
+ t.attachEvent("onAfterMessagePopup",
+ function(t) {
+ for (var e = 0; e < b.length; e++) b[e] === t && (b.splice(e, 1), e--)
+ }),
+ t.attachEvent("onDestroy",
+ function() {
+ c.cover && c.cover.parentNode && c.cover.parentNode.removeChild(c.cover);
+ for (var t = 0; t < b.length; t++) b[t].parentNode && b[t].parentNode.removeChild(b[t]);
+ b = null,
+ k.area && k.area.parentNode && k.area.parentNode.removeChild(k.area),
+ k = null
+ }),
+ {
+ alert: function() {
+ var t = v.apply(this, arguments);
+ return t.type = t.type || "confirm",
+ _(t)
+ },
+ confirm: function() {
+ var t = v.apply(this, arguments);
+ return t.type = t.type || "alert",
+ g(t)
+ },
+ message: k,
+ modalbox: y
+ }
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(0),
+ i = n(11),
+ r = n(15);
+ if (!i.isNode) {
+ var a = n(1),
+ o = n(2);
+ t.utils = {
+ arrayFind: o.arrayFind,
+ dom: a
+ };
+ var s = n(51)();
+ t.event = s.attach,
+ t.eventRemove = s.detach,
+ t._eventRemoveAll = s.detachAll,
+ t._createDomEventScope = s.extend,
+ e.mixin(t, n(143)(t));
+ var l = n(142).init(t);
+ t.$ui = l.factory,
+ t.$ui.layers = l.render,
+ t.$mouseEvents = l.mouseEvents,
+ t.$services.setService("mouseEvents",
+ function() {
+ return t.$mouseEvents
+ }),
+ t.mixin(t, l.layersApi),
+ n(95)(t),
+ t.$services.setService("layers",
+ function() {
+ return l.layersService
+ });
+ var c = n(94);
+ t.mixin(t, c()),
+ n(93)(t),
+ n(92)(t),
+ n(91)(t),
+ n(90)(t),
+ n(89)(t),
+ n(88)(t),
+ n(87)(t),
+ n(86)(t),
+ n(85)(t),
+ n(80)(t),
+ n(79)(t),
+ n(69)(t),
+ n(68)(t),
+ t.locate = function(t) {
+ var e = a.getTargetNode(t);
+ if (a.closest(e, ".gantt_task_row")) return null;
+ var n = arguments[1] || this.config.task_attribute,
+ i = a.locateAttribute(e, n);
+ return i ? i.getAttribute(n) : null
+ },
+ t._locate_css = function(t, e, n) {
+ return a.locateClassName(t, e, n)
+ },
+ t._locateHTML = function(t, e) {
+ return a.locateAttribute(t, e || this.config.task_attribute)
+ }
+ }
+ t.attachEvent("onParse",
+ function() {
+ r(t) || t.attachEvent("onGanttRender",
+ function() {
+ if (t.config.initial_scroll) {
+ var e = t.getTaskByIndex(0),
+ n = e ? e.id: t.config.root_id;
+ t.isTaskExists(n) && t.$task && t.utils.dom.isChildOf(t.$task, t.$container) && t.showTask(n)
+ }
+ },
+ {
+ once: !0
+ })
+ }),
+ t.attachEvent("onBeforeGanttReady",
+ function() {
+ this.config.scroll_size || (this.config.scroll_size = a.getScrollSize() || 1),
+ r(t) || (this._eventRemoveAll(), this.$mouseEvents.reset(), this.resetLightbox())
+ }),
+ t.attachEvent("onGanttReady",
+ function() { ! r(t) && t.config.rtl && t.$layout.getCellsByType("viewCell").forEach(function(e) {
+ var n = e.$config.scrollX;
+ if (n) {
+ var i = t.$ui.getView(n);
+ i && i.scrollTo(i.$config.scrollSize, 0)
+ }
+ })
+ }),
+ t.attachEvent("onGanttReady",
+ function() {
+ if (!r(t)) {
+ var e = t.plugins(),
+ n = {
+ auto_scheduling: t.autoSchedule,
+ click_drag: t.ext.clickDrag,
+ critical_path: t.isCriticalTask,
+ drag_timeline: t.ext.dragTimeline,
+ export_api: t.exportToPDF,
+ fullscreen: t.ext.fullscreen,
+ grouping: t.groupBy,
+ keyboard_navigation: t.ext.keyboardNavigation,
+ marker: t.addMarker,
+ multiselect: t.eachSelectedTask,
+ overlay: t.ext.overlay,
+ quick_info: t.templates.quick_info_content,
+ tooltip: t.ext.tooltips,
+ undo: t.undo
+ };
+ for (var i in n) n[i] && !e[i] && console.warn("You connected the '".concat(i, "' extension via an obsolete file. \nTo fix it, you need to remove the obsolete file and connect the extension via the plugins method: https://docs.dhtmlx.com/gantt/api__gantt_plugins.html"))
+ }
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["小褨褔械薪褜", "袥褞褌懈泄", "袘械褉械蟹械薪褜", "袣胁褨褌械薪褜", "孝褉邪胁械薪褜", "效械褉胁械薪褜", "袥懈锌械薪褜", "小械褉锌械薪褜", "袙械褉械褋械薪褜", "袞芯胁褌械薪褜", "袥懈褋褌芯锌邪写", "袚褉褍写械薪褜"],
+ month_short: ["小褨褔", "袥褞褌", "袘械褉", "袣胁褨", "孝褉邪", "效械褉", "袥懈锌", "小械褉", "袙械褉", "袞芯胁", "袥懈褋", "袚褉褍"],
+ day_full: ["袧械写褨谢褟", "袩芯薪械写褨谢芯泻", "袙褨胁褌芯褉芯泻", "小械褉械写邪", "效械褌胁械褉", "袩'褟褌薪懈褑褟", "小褍斜芯褌邪"],
+ day_short: ["袧械写", "袩芯薪", "袙褨胁", "小械褉", "效械褌", "袩褌薪", "小褍斜"]
+ },
+ labels: {
+ new_task: "袧芯胁械 蟹邪胁写邪薪薪褟",
+ icon_save: "袟斜械褉械谐褌懈",
+ icon_cancel: "袙褨写屑褨薪邪",
+ icon_details: "袛械褌邪谢褨",
+ icon_edit: "袪械写邪谐褍胁邪褌懈",
+ icon_delete: "袙懈谢褍褔懈褌懈",
+ confirm_closing: "",
+ confirm_deleting: "袩芯写褨褟 胁懈谢褍褔懈褌褜褋褟 薪邪蟹邪胁卸写懈. 袙懈 胁锌械胁薪械薪褨?",
+ section_description: "袨锌懈褋",
+ section_time: "效邪褋芯胁懈泄 锌褉芯屑褨卸芯泻",
+ section_type: "孝懈锌",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "袙褨写屑褨薪邪",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Ocak", "艦ubat", "Mart", "Nisan", "May谋s", "Haziran", "Temmuz", "A臒ustos", "Eyl眉l", "Ekim", "Kas谋m", "Aral谋k"],
+ month_short: ["Oca", "艦ub", "Mar", "Nis", "May", "Haz", "Tem", "A臒u", "Eyl", "Eki", "Kas", "Ara"],
+ day_full: ["Pazar", "Pazartesi", "Sal谋", "脟ar艧amba", "Per艧embe", "Cuma", "Cumartesi"],
+ day_short: ["Paz", "Pzt", "Sal", "脟ar", "Per", "Cum", "Cmt"]
+ },
+ labels: {
+ new_task: "Yeni g枚rev",
+ icon_save: "Kaydet",
+ icon_cancel: "陌ptal",
+ icon_details: "Detaylar",
+ icon_edit: "D眉zenle",
+ icon_delete: "Sil",
+ confirm_closing: "",
+ confirm_deleting: "G枚rev silinecek, emin misiniz?",
+ section_description: "A莽谋klama",
+ section_time: "Zaman Aral谋臒谋",
+ section_type: "Tip",
+ column_wbs: "WBS",
+ column_text: "G枚rev Ad谋",
+ column_start_date: "Ba艧lang谋莽",
+ column_duration: "S眉re",
+ column_add: "",
+ link: "Ba臒lant谋",
+ confirm_link_deleting: "silinecek",
+ link_start: " (ba艧lang谋莽)",
+ link_end: " (biti艧)",
+ type_task: "G枚rev",
+ type_project: "Proje",
+ type_milestone: "Kilometreta艧谋",
+ minutes: "Dakika",
+ hours: "Saat",
+ days: "G眉n",
+ weeks: "Hafta",
+ months: "Ay",
+ years: "Y谋l",
+ message_ok: "OK",
+ message_cancel: "脻ptal",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["S枚ndag", "M氓ndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "L枚rdag"],
+ day_short: ["S枚n", "M氓n", "Tis", "Ons", "Tor", "Fre", "L枚r"]
+ },
+ labels: {
+ new_task: "Ny uppgift",
+ icon_save: "Spara",
+ icon_cancel: "Avbryt",
+ icon_details: "Detajer",
+ icon_edit: "脛ndra",
+ icon_delete: "Ta bort",
+ confirm_closing: "",
+ confirm_deleting: "脛r du s盲ker p氓 att du vill ta bort h盲ndelsen permanent?",
+ section_description: "Beskrivning",
+ section_time: "Tid",
+ section_type: "Typ",
+ column_wbs: "WBS",
+ column_text: "Uppgiftsnamn",
+ column_start_date: "Starttid",
+ column_duration: "Varaktighet",
+ column_add: "",
+ link: "L盲nk",
+ confirm_link_deleting: "kommer tas bort",
+ link_start: " (start)",
+ link_end: " (slut)",
+ type_task: "Uppgift",
+ type_project: "Projekt",
+ type_milestone: "Milstolpe",
+ minutes: "Minuter",
+ hours: "Timmar",
+ days: "Dagar",
+ weeks: "Veckor",
+ months: "M氓nader",
+ years: "脜r",
+ message_ok: "OK",
+ message_cancel: "Avbryt",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Janu谩r", "Febru谩r", "Marec", "Apr铆l", "M谩j", "J煤n", "J煤l", "August", "September", "Okt贸ber", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "M谩j", "J煤n", "J煤l", "Aug", "Sept", "Okt", "Nov", "Dec"],
+ day_full: ["Nede木a", "Pondelok", "Utorok", "Streda", "艩tvrtok", "Piatok", "Sobota"],
+ day_short: ["Ne", "Po", "Ut", "St", "艩t", "Pi", "So"]
+ },
+ labels: {
+ new_task: "Nov谩 煤loha",
+ icon_save: "Ulo啪i钮",
+ icon_cancel: "Sp盲钮",
+ icon_details: "Detail",
+ icon_edit: "Edituj",
+ icon_delete: "Zmaza钮",
+ confirm_closing: "Va拧e zmeny nebud煤 ulo啪en茅. Skuto膷ne?",
+ confirm_deleting: "Udalos钮 bude natrvalo vymazan谩. Skuto膷ne?",
+ section_description: "Pozn谩mky",
+ section_time: "Doba platnosti",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Sp盲钮",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "膶etrtek", "Petek", "Sobota"],
+ day_short: ["Ned", "Pon", "Tor", "Sre", "膶et", "Pet", "Sob"]
+ },
+ labels: {
+ new_task: "Nova naloga",
+ icon_save: "Shrani",
+ icon_cancel: "Prekli膷i",
+ icon_details: "Podrobnosti",
+ icon_edit: "Uredi",
+ icon_delete: "Izbri拧i",
+ confirm_closing: "",
+ confirm_deleting: "Dogodek bo izbrisan. 沤elite nadaljevati?",
+ section_description: "Opis",
+ section_time: "膶asovni okvir",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Prekli膷i",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["携薪胁邪褉褜", "肖械胁褉邪谢褜", "袦邪褉褌", "袗锌褉械谢褜", "Ma泄", "袠褞薪褜", "袠褞谢褜", "袗胁谐褍褋褌", "小械薪褌褟斜褉褜", "O泻褌褟斜褉褜", "袧芯褟斜褉褜", "袛械泻邪斜褉褜"],
+ month_short: ["携薪胁", "肖械胁", "Ma褉", "A锌褉", "Ma泄", "袠褞薪", "袠褞谢", "A胁谐", "小械薪", "袨泻褌", "袧芯褟", "袛械泻"],
+ day_full: ["袙芯褋泻褉械褋械薪褜械", "袩芯薪械写械谢褜薪懈泻", "袙褌芯褉薪懈泻", "小褉械写邪", "效械褌胁械褉谐", "袩褟褌薪懈褑邪", "小褍斜斜芯褌邪"],
+ day_short: ["袙褋", "袩薪", "袙褌", "小褉", "效褌", "袩褌", "小斜"]
+ },
+ labels: {
+ new_task: "袧芯胁芯械 蟹邪写邪薪懈械",
+ icon_save: "小芯褏褉邪薪懈褌褜",
+ icon_cancel: "袨褌屑械薪懈褌褜",
+ icon_details: "袛械褌邪谢懈",
+ icon_edit: "袠蟹屑械薪懈褌褜",
+ icon_delete: "校写邪谢懈褌褜",
+ confirm_closing: "",
+ confirm_deleting: "小芯斜褘褌懈械 斜褍写械褌 褍写邪谢械薪芯 斜械蟹胁芯蟹胁褉邪褌薪芯, 锌褉芯写芯谢卸懈褌褜?",
+ section_description: "袨锌懈褋邪薪懈械",
+ section_time: "袩械褉懈芯写 胁褉械屑械薪懈",
+ section_type: "孝懈锌",
+ column_wbs: "袠小袪",
+ column_text: "袟邪写邪褔邪",
+ column_start_date: "袧邪褔邪谢芯",
+ column_duration: "袛谢懈褌械谢褜薪芯褋褌褜",
+ column_add: "",
+ link: "小胁褟蟹褜",
+ confirm_link_deleting: "斜褍写械褌 褍写邪谢械薪邪",
+ link_start: " (薪邪褔邪谢芯)",
+ link_end: " (泻芯薪械褑)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "袦懈薪褍褌邪",
+ hours: "效邪褋",
+ days: "袛械薪褜",
+ weeks: "袧械写械谢褟",
+ months: "袦械褋褟褑",
+ years: "袚芯写",
+ message_ok: "OK",
+ message_cancel: "袨褌屑械薪懈褌褜",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "薪邪褔薪懈褌械 胁胁芯写懈褌褜 褋谢芯胁芯 写谢褟 褎懈谢褜褌褉邪褑懈懈",
+ resources_filter_label: "褋锌褉褟褌邪褌褜 薪械 褍褋褌邪薪芯胁谢械薪薪褘械",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "November", "December"],
+ month_short: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ day_full: ["Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata"],
+ day_short: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sa"]
+ },
+ labels: {
+ new_task: "Sarcina noua",
+ icon_save: "Salveaza",
+ icon_cancel: "Anuleaza",
+ icon_details: "Detalii",
+ icon_edit: "Editeaza",
+ icon_delete: "Sterge",
+ confirm_closing: "Schimbarile nu vor fi salvate, esti sigur?",
+ confirm_deleting: "Evenimentul va fi sters permanent, esti sigur?",
+ section_description: "Descriere",
+ section_time: "Interval",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Anuleaza",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Janeiro", "Fevereiro", "Mar莽o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
+ month_short: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
+ day_full: ["Domingo", "Segunda", "Ter莽a", "Quarta", "Quinta", "Sexta", "S谩bado"],
+ day_short: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"]
+ },
+ labels: {
+ new_task: "Nova tarefa",
+ icon_save: "Salvar",
+ icon_cancel: "Cancelar",
+ icon_details: "Detalhes",
+ icon_edit: "Editar",
+ icon_delete: "Excluir",
+ confirm_closing: "",
+ confirm_deleting: "As tarefas ser茫o excluidas permanentemente, confirme?",
+ section_description: "Descri莽茫o",
+ section_time: "Per铆odo",
+ section_type: "Tipo",
+ column_wbs: "EAP",
+ column_text: "Nome tarefa",
+ column_start_date: "Data in铆cio",
+ column_duration: "Dura莽茫o",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "Ser谩 exclu铆do!",
+ link_start: " (in铆cio)",
+ link_end: " (fim)",
+ type_task: "Task",
+ type_project: "Projeto",
+ type_milestone: "Marco",
+ minutes: "Minutos",
+ hours: "Horas",
+ days: "Dias",
+ weeks: "Semanas",
+ months: "Meses",
+ years: "Anos",
+ message_ok: "OK",
+ message_cancel: "Cancelar",
+ section_constraint: "Restri莽茫o",
+ constraint_type: "Tipo Restri莽茫o",
+ constraint_date: "Data restri莽茫o",
+ asap: "Mais breve poss铆vel",
+ alap: "Mais tarde poss铆vel",
+ snet: "N茫o come莽ar antes de",
+ snlt: "N茫o come莽ar depois de",
+ fnet: "N茫o terminar antes de",
+ fnlt: "N茫o terminar depois de",
+ mso: "Precisa come莽ar em",
+ mfo: "Precisa terminar em",
+ resources_filter_placeholder: "Tipo de filtros",
+ resources_filter_label: "Ocultar vazios",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Stycze艅", "Luty", "Marzec", "Kwiecie艅", "Maj", "Czerwiec", "Lipiec", "Sierpie艅", "Wrzesie艅", "Pa藕dziernik", "Listopad", "Grudzie艅"],
+ month_short: ["Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Pa藕", "Lis", "Gru"],
+ day_full: ["Niedziela", "Poniedzia艂ek", "Wtorek", "艢roda", "Czwartek", "Pi膮tek", "Sobota"],
+ day_short: ["Nie", "Pon", "Wto", "艢ro", "Czw", "Pi膮", "Sob"]
+ },
+ labels: {
+ new_task: "Nowe zadanie",
+ icon_save: "Zapisz",
+ icon_cancel: "Anuluj",
+ icon_details: "Szczeg贸艂y",
+ icon_edit: "Edytuj",
+ icon_delete: "Usu艅",
+ confirm_closing: "",
+ confirm_deleting: "Zdarzenie zostanie usuni臋te na zawsze, kontynuowa膰?",
+ section_description: "Opis",
+ section_time: "Okres czasu",
+ section_type: "Typ",
+ column_wbs: "WBS",
+ column_text: "Nazwa zadania",
+ column_start_date: "Pocz膮tek",
+ column_duration: "Czas trwania",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "zostanie usuni臋ty",
+ link_start: " (pocz膮tek)",
+ link_end: " (koniec)",
+ type_task: "Zadanie",
+ type_project: "Projekt",
+ type_milestone: "Milestone",
+ minutes: "Minuty",
+ hours: "Godziny",
+ days: "Dni",
+ weeks: "Tydzie艅",
+ months: "Miesi膮ce",
+ years: "Lata",
+ message_ok: "OK",
+ message_cancel: "Anuluj",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
+ day_full: ["S酶ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L酶rdag"],
+ day_short: ["S酶n", "Man", "Tir", "Ons", "Tor", "Fre", "L酶r"]
+ },
+ labels: {
+ new_task: "Ny oppgave",
+ icon_save: "Lagre",
+ icon_cancel: "Avbryt",
+ icon_details: "Detaljer",
+ icon_edit: "Endre",
+ icon_delete: "Slett",
+ confirm_closing: "Endringer blir ikke lagret, er du sikker?",
+ confirm_deleting: "Oppf酶ringen vil bli slettet, er du sikker?",
+ section_description: "Beskrivelse",
+ section_time: "Tidsperiode",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Avbryt",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"],
+ day_short: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"]
+ },
+ labels: {
+ new_task: "Nieuwe taak",
+ icon_save: "Opslaan",
+ icon_cancel: "Annuleren",
+ icon_details: "Details",
+ icon_edit: "Bewerken",
+ icon_delete: "Verwijderen",
+ confirm_closing: "",
+ confirm_deleting: "Item zal permanent worden verwijderd, doorgaan?",
+ section_description: "Beschrijving",
+ section_time: "Tijd periode",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Taak omschrijving",
+ column_start_date: "Startdatum",
+ column_duration: "Duur",
+ column_add: "",
+ link: "Koppeling",
+ confirm_link_deleting: "zal worden verwijderd",
+ link_start: " (start)",
+ link_end: " (eind)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "minuten",
+ hours: "uren",
+ days: "dagen",
+ weeks: "weken",
+ months: "maanden",
+ years: "jaren",
+ message_ok: "OK",
+ message_cancel: "Annuleren",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
+ day_full: ["S酶ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L酶rdag"],
+ day_short: ["S酶n", "Mon", "Tir", "Ons", "Tor", "Fre", "L酶r"]
+ },
+ labels: {
+ new_task: "Ny oppgave",
+ icon_save: "Lagre",
+ icon_cancel: "Avbryt",
+ icon_details: "Detaljer",
+ icon_edit: "Rediger",
+ icon_delete: "Slett",
+ confirm_closing: "",
+ confirm_deleting: "Hendelsen vil bli slettet permanent. Er du sikker?",
+ section_description: "Beskrivelse",
+ section_time: "Tidsperiode",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Avbryt",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ return function(t) {
+ var e = this;
+ for (var n in this.addLocale = function(t, n) {
+ e._locales[t] = n
+ },
+ this.getLocale = function(t) {
+ return e._locales[t]
+ },
+ this._locales = {},
+ t) this._locales[n] = t[n]
+ }
+ } ();
+ e.
+ default = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["1鞗�", "2鞗�", "3鞗�", "4鞗�", "5鞗�", "6鞗�", "7鞗�", "8鞗�", "9鞗�", "10鞗�", "11鞗�", "12鞗�"],
+ month_short: ["1鞗�", "2鞗�", "3鞗�", "4鞗�", "5鞗�", "6鞗�", "7鞗�", "8鞗�", "9鞗�", "10鞗�", "11鞗�", "12鞗�"],
+ day_full: ["鞚检殧鞚�", "鞗旍殧鞚�", "頇旍殧鞚�", "靾橃殧鞚�", "氇╈殧鞚�", "旮堨殧鞚�", "韱犾殧鞚�"],
+ day_short: ["鞚�", "鞗�", "頇�", "靾�", "氇�", "旮�", "韱�"]
+ },
+ labels: {
+ new_task: "鞚措鞐嗠姅 鞛戩梾",
+ icon_save: "鞝�鞛�",
+ icon_cancel: "旆唽",
+ icon_details: "靹鸽秬 靷暛",
+ icon_edit: "靾橃爼",
+ icon_delete: "靷牅",
+ confirm_closing: "",
+ confirm_deleting: "鞛戩梾鞚� 靷牅頃橃嫓瓴犾姷雼堦箤?",
+ section_description: "靹る獏",
+ section_time: "旮瓣皠",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "鞛戩梾氇�",
+ column_start_date: "鞁滌瀾鞚�",
+ column_duration: "旮瓣皠",
+ column_add: "",
+ link: "鞝勳牅",
+ confirm_link_deleting: "靷牅 頃橃嫓瓴犾姷雼堦箤?",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "鞛戩梾",
+ type_project: "頂勲鞝濏姼",
+ type_milestone: "毵堨澕鞀ろ啢",
+ minutes: "攵�",
+ hours: "鞁滉皠",
+ days: "鞚�",
+ weeks: "欤�",
+ months: "雼�",
+ years: "雲�",
+ message_ok: "OK",
+ message_cancel: "旆唽",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["1鏈�", "2鏈�", "3鏈�", "4鏈�", "5鏈�", "6鏈�", "7鏈�", "8鏈�", "9鏈�", "10鏈�", "11鏈�", "12鏈�"],
+ month_short: ["1鏈�", "2鏈�", "3鏈�", "4鏈�", "5鏈�", "6鏈�", "7鏈�", "8鏈�", "9鏈�", "10鏈�", "11鏈�", "12鏈�"],
+ day_full: ["鏃ユ洔鏃�", "鏈堟洔鏃�", "鐏洔鏃�", "姘存洔鏃�", "鏈ㄦ洔鏃�", "閲戞洔鏃�", "鍦熸洔鏃�"],
+ day_short: ["鏃�", "鏈�", "鐏�", "姘�", "鏈�", "閲�", "鍦�"]
+ },
+ labels: {
+ new_task: "鏂般仐銇勪粫浜�",
+ icon_save: "淇濆瓨",
+ icon_cancel: "銈儯銉炽偦銉�",
+ icon_details: "瑭崇窗",
+ icon_edit: "绶ㄩ泦",
+ icon_delete: "鍓婇櫎",
+ confirm_closing: "",
+ confirm_deleting: "銈ゃ儥銉炽儓瀹屽叏銇墛闄ゃ仌銈屻伨銇欍�佸疁銇椼亜銇с仚銇嬶紵",
+ section_description: "銉囥偣銈儶銉椼偡銉с兂",
+ section_time: "鏈熼枔",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "銈儯銉炽偦銉�",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
+ month_short: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
+ day_full: ["Domenica", "Luned矛", "Marted矛", "Mercoled矛", "Gioved矛", "Venerd矛", "Sabato"],
+ day_short: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"]
+ },
+ labels: {
+ new_task: "Nuovo compito",
+ icon_save: "Salva",
+ icon_cancel: "Chiudi",
+ icon_details: "Dettagli",
+ icon_edit: "Modifica",
+ icon_delete: "Elimina",
+ confirm_closing: "",
+ confirm_deleting: "Sei sicuro di confermare l'eliminazione?",
+ section_description: "Descrizione",
+ section_time: "Periodo di tempo",
+ section_type: "Tipo",
+ column_wbs: "WBS",
+ column_text: "Nome Attivit脿",
+ column_start_date: "Inizio",
+ column_duration: "Durata",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "sar脿 eliminato",
+ link_start: " (inizio)",
+ link_end: " (fine)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minuti",
+ hours: "Ore",
+ days: "Giorni",
+ weeks: "Settimane",
+ months: "Mesi",
+ years: "Anni",
+ message_ok: "OK",
+ message_cancel: "Chiudi",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"],
+ day_full: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"],
+ day_short: ["Ming", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"]
+ },
+ labels: {
+ new_task: "Tugas baru",
+ icon_save: "Simpan",
+ icon_cancel: "Batal",
+ icon_details: "Detail",
+ icon_edit: "Edit",
+ icon_delete: "Hapus",
+ confirm_closing: "",
+ confirm_deleting: "Acara akan dihapus",
+ section_description: "Keterangan",
+ section_time: "Periode",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Batal",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Janu谩r", "Febru谩r", "M谩rcius", "脕prilis", "M谩jus", "J煤nius", "J煤lius", "Augusztus", "Szeptember", "Okt贸ber", "November", "December"],
+ month_short: ["Jan", "Feb", "M谩r", "脕pr", "M谩j", "J煤n", "J煤l", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["Vas谩rnap", "H茅tf玫", "Kedd", "Szerda", "Cs眉t枚rt枚k", "P茅ntek", "szombat"],
+ day_short: ["Va", "H茅", "Ke", "Sze", "Cs眉", "P茅", "Szo"]
+ },
+ labels: {
+ new_task: "脷j feladat",
+ icon_save: "Ment茅s",
+ icon_cancel: "M茅gse",
+ icon_details: "R茅szletek",
+ icon_edit: "Szerkeszt茅s",
+ icon_delete: "T枚rl茅s",
+ confirm_closing: "",
+ confirm_deleting: "Az esem茅ny t枚r枚lve lesz, biztosan folytatja?",
+ section_description: "Le铆r谩s",
+ section_time: "Id玫szak",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "M茅gse",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Sije膷anj", "Velja膷a", "O啪ujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"],
+ month_short: ["Sij", "Velj", "O啪u", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"],
+ day_full: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "膶etvrtak", "Petak", "Subota"],
+ day_short: ["Ned", "Pon", "Uto", "Sri", "膶et", "Pet", "Sub"]
+ },
+ labels: {
+ new_task: "Novi Zadatak",
+ icon_save: "Spremi",
+ icon_cancel: "Odustani",
+ icon_details: "Detalji",
+ icon_edit: "Izmjeni",
+ icon_delete: "Obri拧i",
+ confirm_closing: "",
+ confirm_deleting: "Zadatak 膰e biti trajno izbrisan, jeste li sigurni?",
+ section_description: "Opis",
+ section_time: "Vremenski Period",
+ section_type: "Tip",
+ column_wbs: "WBS",
+ column_text: "Naziv Zadatka",
+ column_start_date: "Po膷etno Vrijeme",
+ column_duration: "Trajanje",
+ column_add: "",
+ link: "Poveznica",
+ confirm_link_deleting: "膰e biti izbrisan",
+ link_start: " (po膷etak)",
+ link_end: " (kraj)",
+ type_task: "Zadatak",
+ type_project: "Projekt",
+ type_milestone: "Milestone",
+ minutes: "Minute",
+ hours: "Sati",
+ days: "Dani",
+ weeks: "Tjedni",
+ months: "Mjeseci",
+ years: "Godine",
+ message_ok: "OK",
+ message_cancel: "Odustani",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["讬谞讜讗专", "驻讘专讜讗专", "诪专抓", "讗驻专讬诇", "诪讗讬", "讬讜谞讬", "讬讜诇讬", "讗讜讙讜住讟", "住驻讟诪讘专", "讗讜拽讟讜讘专", "谞讜讘诪讘专", "讚爪诪讘专"],
+ month_short: ["讬谞讜", "驻讘专", "诪专抓", "讗驻专", "诪讗讬", "讬讜谞", "讬讜诇", "讗讜讙", "住驻讟", "讗讜拽", "谞讜讘", "讚爪诪"],
+ day_full: ["专讗砖讜谉", "砖谞讬", "砖诇讬砖讬", "专讘讬注讬", "讞诪讬砖讬", "砖讬砖讬", "砖讘转"],
+ day_short: ["讗", "讘", "讙", "讚", "讛", "讜", "砖"]
+ },
+ labels: {
+ new_task: "诪砖讬诪讛 讞讚砖",
+ icon_save: "砖诪讜专",
+ icon_cancel: "讘讟诇",
+ icon_details: "驻专讟讬诐",
+ icon_edit: "注专讜讱",
+ icon_delete: "诪讞拽",
+ confirm_closing: "",
+ confirm_deleting: "讗专讜注 讬诪讞拽 住讜驻讬转.诇讛诪砖讬讱?",
+ section_description: "讛住讘专",
+ section_time: "转拽讜驻讛",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "讘讟诇",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Janvier", "F茅vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao没t", "Septembre", "Octobre", "Novembre", "D茅cembre"],
+ month_short: ["Jan", "F茅v", "Mar", "Avr", "Mai", "Juin", "Juil", "Ao没", "Sep", "Oct", "Nov", "D茅c"],
+ day_full: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
+ day_short: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"]
+ },
+ labels: {
+ new_task: "Nouvelle t芒che",
+ icon_save: "Enregistrer",
+ icon_cancel: "Annuler",
+ icon_details: "D茅tails",
+ icon_edit: "Modifier",
+ icon_delete: "Effacer",
+ confirm_closing: "",
+ confirm_deleting: "L'茅v茅nement sera effac茅 sans appel, 锚tes-vous s没r ?",
+ section_description: "Description",
+ section_time: "P茅riode",
+ section_type: "Type",
+ column_wbs: "OTP",
+ column_text: "Nom de la t芒che",
+ column_start_date: "Date initiale",
+ column_duration: "Dur茅e",
+ column_add: "",
+ link: "Le lien",
+ confirm_link_deleting: "sera supprim茅",
+ link_start: "(d茅but)",
+ link_end: "(fin)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Heures",
+ days: "Jours",
+ weeks: "Semaines",
+ months: "Mois",
+ years: "Ann茅es",
+ message_ok: "OK",
+ message_cancel: "Annuler",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"],
+ month_short: ["Tam", "Hel", "Maa", "Huh", "Tou", "Kes", "Hei", "Elo", "Syy", "Lok", "Mar", "Jou"],
+ day_full: ["Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai"],
+ day_short: ["Su", "Ma", "Ti", "Ke", "To", "Pe", "La"]
+ },
+ labels: {
+ new_task: "Uusi teht盲v盲",
+ icon_save: "Tallenna",
+ icon_cancel: "Peru",
+ icon_details: "Tiedot",
+ icon_edit: "Muokkaa",
+ icon_delete: "Poista",
+ confirm_closing: "",
+ confirm_deleting: "Haluatko varmasti poistaa tapahtuman?",
+ section_description: "Kuvaus",
+ section_time: "Aikajakso",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Peru",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["跇丕賳賵蹖賴", "賮賵乇蹖賴", "賲丕乇爻", "丌賵乇蹖賱", "賲賴", "跇賵卅賳", "跇賵卅蹖賴", "丕賵鬲", "爻倬鬲丕賲亘乇", "丕讴鬲亘乇", "賳賵丕賲亘乇", "丿爻丕賲亘乇"],
+ month_short: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
+ day_full: ["賷讴卮賳亘賴", "丿賵卮賳亘賴", "爻賴鈥屫促嗀ㄙ�", "趩賴丕乇卮賳亘賴", "倬賳噩卮賳亘賴", "噩賲毓賴", "卮賳亘賴"],
+ day_short: ["蹖", "丿", "爻", "趩", "倬", "噩", "卮"]
+ },
+ labels: {
+ new_task: "賵馗蹖賮賴 噩丿蹖丿",
+ icon_save: "匕禺蹖乇賴",
+ icon_cancel: "賱睾賵",
+ icon_details: "噩夭蹖蹖丕鬲",
+ icon_edit: "賵蹖乇丕蹖卮",
+ icon_delete: "丨匕賮",
+ confirm_closing: "鬲睾蹖蹖乇丕鬲 卮賲丕 丕夭丿爻鬲 禺賵丕賴丿 乇賮鬲貙 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿責",
+ confirm_deleting: "丕蹖賳 賲賵乇丿 亘乇丕蹖 賴賲蹖卮賴 丨匕賮 禺賵丕賴丿 卮丿貙 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿責",
+ section_description: "鬲賵囟蹖丨丕鬲",
+ section_time: "賲丿鬲 夭賲丕賳",
+ section_type: "賳賵毓",
+ column_wbs: "WBS",
+ column_text: "毓賳賵丕賳",
+ column_start_date: "夭賲丕賳 卮乇賵毓",
+ column_duration: "賲丿鬲",
+ column_add: "",
+ link: "丕乇鬲亘丕胤",
+ confirm_link_deleting: "丨匕賮 禺賵丕賴丿 卮丿",
+ link_start: " (丌睾丕夭)",
+ link_end: " (倬丕蹖丕賳)",
+ type_task: "賵馗蹖賮賴",
+ type_project: "倬乇賵跇賴",
+ type_milestone: "賳诏丕乇卮",
+ minutes: "丿賯丕蹖賯",
+ hours: "爻丕毓丕鬲",
+ days: "乇賵夭賴丕",
+ weeks: "賴賮鬲賴",
+ months: "賲丕賴鈥屬囏�",
+ years: "爻丕賱鈥屬囏�",
+ message_ok: "鬲丕蹖蹖丿",
+ message_cancel: "賱睾賵",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
+ month_short: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
+ day_full: ["Domingo", "Lunes", "Martes", "Mi茅rcoles", "Jueves", "Viernes", "S谩bado"],
+ day_short: ["Dom", "Lun", "Mar", "Mi茅", "Jue", "Vie", "S谩b"]
+ },
+ labels: {
+ new_task: "Nueva tarea",
+ icon_save: "Guardar",
+ icon_cancel: "Cancelar",
+ icon_details: "Detalles",
+ icon_edit: "Editar",
+ icon_delete: "Eliminar",
+ confirm_closing: "",
+ confirm_deleting: "El evento se borrar谩 definitivamente, 驴continuar?",
+ section_description: "Descripci贸n",
+ section_time: "Per铆odo",
+ section_type: "Tipo",
+ column_wbs: "EDT",
+ column_text: "Tarea",
+ column_start_date: "Inicio",
+ column_duration: "Duraci贸n",
+ column_add: "",
+ link: "Enlace",
+ confirm_link_deleting: "ser谩 borrada",
+ link_start: " (inicio)",
+ link_end: " (fin)",
+ type_task: "Tarea",
+ type_project: "Proyecto",
+ type_milestone: "Hito",
+ minutes: "Minutos",
+ hours: "Horas",
+ days: "D铆as",
+ weeks: "Semanas",
+ months: "Meses",
+ years: "A帽os",
+ message_ok: "OK",
+ message_cancel: "Cancelar",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ day_full: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ day_short: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
+ },
+ labels: {
+ new_task: "New task",
+ icon_save: "Save",
+ icon_cancel: "Cancel",
+ icon_details: "Details",
+ icon_edit: "Edit",
+ icon_delete: "Delete",
+ confirm_closing: "",
+ confirm_deleting: "Task will be deleted permanently, are you sure?",
+ section_description: "Description",
+ section_time: "Time period",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Cancel",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["螜伪谓慰蠀维蟻喂慰蟼", "桅蔚尾蟻慰蠀维蟻喂慰蟼", "螠维蟻蟿喂慰蟼", "螒蟺蟻委位喂慰蟼", "螠维蠆慰蟼", "螜慰蠉谓喂慰蟼", "螜慰蠉位喂慰蟼", "螒蠉纬慰蠀蟽蟿慰蟼", "危蔚蟺蟿苇渭尾蟻喂慰蟼", "螣魏蟿蠋尾蟻喂慰蟼", "螡慰苇渭尾蟻喂慰蟼", "螖蔚魏苇渭尾蟻喂慰蟼"],
+ month_short: ["螜螒螡", "桅螘螔", "螠螒巍", "螒螤巍", "螠螒螜", "螜螣违螡", "螜螣违螞", "螒违螕", "危螘螤", "螣螝韦", "螡螣螘", "螖螘螝"],
+ day_full: ["螝蠀蟻喂伪魏萎", "螖蔚蠀蟿苇蟻伪", "韦蟻委蟿畏", "韦蔚蟿维蟻蟿畏", "螤苇渭蟺蟿畏", "螤伪蟻伪蟽魏蔚蠀萎", "螝蠀蟻喂伪魏萎"],
+ day_short: ["螝违", "螖螘", "韦巍", "韦螘", "螤螘", "螤螒", "危螒"]
+ },
+ labels: {
+ new_task: "螡苇伪 蔚蟻纬伪蟽委伪",
+ icon_save: "螒蟺慰胃萎魏蔚蠀蟽畏",
+ icon_cancel: "螁魏蠀蟻慰",
+ icon_details: "螞蔚蟺蟿慰渭苇蟻蔚喂蔚蟼",
+ icon_edit: "螘蟺蔚尉蔚蟻纬伪蟽委伪",
+ icon_delete: "螖喂伪纬蟻伪蠁萎",
+ confirm_closing: "",
+ confirm_deleting: "韦慰 苇蟻纬慰 胃伪 未喂伪纬蟻伪蠁蔚委 慰蟻喂蟽蟿喂魏维. 螛苇位蔚蟿蔚 谓伪 蟽蠀谓蔚蠂委蟽蔚蟿蔚;",
+ section_description: "螤蔚蟻喂纬蟻伪蠁萎",
+ section_time: "围蟻慰谓喂魏萎 蟺蔚蟻委慰未慰蟼",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "螁魏蠀蟻慰",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: [" Januar", " Februar", " M盲rz ", " April", " Mai", " Juni", " Juli", " August", " September ", " Oktober", " November ", " Dezember"],
+ month_short: ["Jan", "Feb", "M盲r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
+ day_full: ["Sonntag", "Montag", "Dienstag", " Mittwoch", " Donnerstag", "Freitag", "Samstag"],
+ day_short: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]
+ },
+ labels: {
+ new_task: "Neue Aufgabe",
+ icon_save: "Speichern",
+ icon_cancel: "Abbrechen",
+ icon_details: "Details",
+ icon_edit: "脛ndern",
+ icon_delete: "L枚schen",
+ confirm_closing: "",
+ confirm_deleting: "Der Eintrag wird gel枚scht",
+ section_description: "Beschreibung",
+ section_time: "Zeitspanne",
+ section_type: "Type",
+ column_wbs: "PSP",
+ column_text: "Task-Namen",
+ column_start_date: "Startzeit",
+ column_duration: "Dauer",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "werden gel枚scht",
+ link_start: "(starten)",
+ link_end: "(ende)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minuten",
+ hours: "Stunden",
+ days: "Tage",
+ weeks: "Wochen",
+ months: "Monate",
+ years: "Jahre",
+ message_ok: "OK",
+ message_cancel: "Abbrechen",
+ section_constraint: "Regel",
+ constraint_type: "Regel",
+ constraint_date: "Regel - Datum",
+ asap: "So bald wie m枚glich",
+ alap: "So sp盲t wie m枚glich",
+ snet: "Beginn nicht vor",
+ snlt: "Beginn nicht sp盲ter als",
+ fnet: "Fertigstellung nicht vor",
+ fnlt: "Fertigstellung nicht sp盲ter als",
+ mso: "Muss beginnen am",
+ mfo: "Muss fertig sein am",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["S酶ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L酶rdag"],
+ day_short: ["S酶n", "Man", "Tir", "Ons", "Tor", "Fre", "L酶r"]
+ },
+ labels: {
+ new_task: "Ny opgave",
+ icon_save: "Gem",
+ icon_cancel: "Fortryd",
+ icon_details: "Detaljer",
+ icon_edit: "Tilret",
+ icon_delete: "Slet",
+ confirm_closing: "Dine rettelser vil g氓 tabt.. Er dy sikker?",
+ confirm_deleting: "Bigivenheden vil blive slettet permanent. Er du sikker?",
+ section_description: "Beskrivelse",
+ section_time: "Tidsperiode",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Fortryd",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Leden", "脷nor", "B艡ezen", "Duben", "Kv臎ten", "膶erven", "膶ervenec", "Srpen", "Z谩艡铆", "艠铆jen", "Listopad", "Prosinec"],
+ month_short: ["Led", "脷n", "B艡e", "Dub", "Kv臎", "膶er", "膶ec", "Srp", "Z谩艡铆", "艠铆j", "List", "Pro"],
+ day_full: ["Ned臎le", "Pond臎l铆", "脷ter媒", "St艡eda", "膶tvrtek", "P谩tek", "Sobota"],
+ day_short: ["Ne", "Po", "脷t", "St", "膶t", "P谩", "So"]
+ },
+ labels: {
+ new_task: "Nov谩 pr谩ce",
+ icon_save: "Ulo啪it",
+ icon_cancel: "Zp臎t",
+ icon_details: "Detail",
+ icon_edit: "Edituj",
+ icon_delete: "Smazat",
+ confirm_closing: "",
+ confirm_deleting: "Ud谩lost bude trvale smaz谩na, opravdu?",
+ section_description: "Pozn谩mky",
+ section_time: "Doba platnosti",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Zp臎t",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀", "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"],
+ month_short: ["1鏈�", "2鏈�", "3鏈�", "4鏈�", "5鏈�", "6鏈�", "7鏈�", "8鏈�", "9鏈�", "10鏈�", "11鏈�", "12鏈�"],
+ day_full: ["鏄熸湡鏃�", "鏄熸湡涓�", "鏄熸湡浜�", "鏄熸湡涓�", "鏄熸湡鍥�", "鏄熸湡浜�", "鏄熸湡鍏�"],
+ day_short: ["鏃�", "涓�", "浜�", "涓�", "鍥�", "浜�", "鍏�"]
+ },
+ labels: {
+ new_task: "鏂颁换鍕�",
+ icon_save: "淇濆瓨",
+ icon_cancel: "鍏抽棴",
+ icon_details: "璇︾粏",
+ icon_edit: "缂栬緫",
+ icon_delete: "鍒犻櫎",
+ confirm_closing: "璇风‘璁ゆ槸鍚︽挙閿�淇敼!",
+ confirm_deleting: "鏄惁鍒犻櫎鏃ョ▼?",
+ section_description: "鎻忚堪",
+ section_time: "鏃堕棿鑼冨洿",
+ section_type: "绫诲瀷",
+ column_wbs: "宸ヤ綔鍒嗚В缁撴瀯",
+ column_text: "浠诲姟鍚�",
+ column_start_date: "寮�濮嬫椂闂�",
+ column_duration: "鎸佺画鏃堕棿",
+ column_add: "",
+ link: "鍏宠仈",
+ confirm_link_deleting: "灏嗚鍒犻櫎",
+ link_start: " (寮�濮�)",
+ link_end: " (缁撴潫)",
+ type_task: "浠诲姟",
+ type_project: "椤圭洰",
+ type_milestone: "閲岀▼纰�",
+ minutes: "鍒嗛挓",
+ hours: "灏忔椂",
+ days: "澶�",
+ weeks: "鍛�",
+ months: "鏈�",
+ years: "骞�",
+ message_ok: "OK",
+ message_cancel: "鍏抽棴",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["Gener", "Febrer", "Mar莽", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"],
+ month_short: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"],
+ day_full: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"],
+ day_short: ["Dg", "Dl", "Dm", "Dc", "Dj", "Dv", "Ds"]
+ },
+ labels: {
+ new_task: "Nova tasca",
+ icon_save: "Guardar",
+ icon_cancel: "Cancel路lar",
+ icon_details: "Detalls",
+ icon_edit: "Editar",
+ icon_delete: "Esborrar",
+ confirm_closing: "",
+ confirm_deleting: "L'esdeveniment s'esborrar脿 definitivament, continuar ?",
+ section_description: "Descripci贸",
+ section_time: "Periode de temps",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "Cancel路lar",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["小褌褍写蟹械薪褜", "袥褞褌褘", "小邪泻邪胁褨泻", "袣褉邪褋邪胁褨泻", "Ma泄", "效褝褉胁械薪褜", "袥褨锌械薪褜", "袞薪褨胁械薪褜", "袙械褉邪褋械薪褜", "袣邪褋褌褉褘褔薪褨泻", "袥褨褋褌邪锌邪写", "小薪械卸邪薪褜"],
+ month_short: ["小褌褍写蟹", "袥褞褌", "小邪泻", "袣褉邪褋", "Ma泄", "效褝褉", "袥褨锌", "袞薪褨胁", "袙械褉", "袣邪褋褌", "袥褨褋褌", "小薪械卸"],
+ day_full: ["袧褟写蟹械谢褟", "袩邪薪褟写蟹械谢邪泻", "袗褳褌芯褉邪泻", "小械褉邪写邪", "效邪褑胁械褉", "袩褟褌薪褨褑邪", "小褍斜芯褌邪"],
+ day_short: ["袧写", "袩薪", "袗褳褌", "小褉", "效褑胁", "袩褌", "小斜"]
+ },
+ labels: {
+ new_task: "袧芯胁邪械 蟹邪写邪薪薪械",
+ icon_save: "袟邪褏邪胁邪褑褜",
+ icon_cancel: "袗写屑褟薪褨褑褜",
+ icon_details: "袛褝褌邪谢褨",
+ icon_edit: "袟屑褟薪褨褑褜",
+ icon_delete: "袙褘写邪谢褨褑褜",
+ confirm_closing: "",
+ confirm_deleting: "袩邪写蟹械褟 斜褍写蟹械 胁褘写邪谢械薪邪 薪械蟹胁邪褉芯褌薪邪, 锌褉邪褑褟谐薪褍褑褜?",
+ section_description: "袗锌褨褋邪薪薪械",
+ section_time: "袩械褉褘褟写 褔邪褋褍",
+ section_type: "孝褘锌",
+ column_wbs: "袉小袪",
+ column_text: "袟邪写邪褔邪",
+ column_start_date: "袩邪褔邪褌邪泻",
+ column_duration: "袩褉邪褑褟谐",
+ column_add: "",
+ link: "小褍胁褟蟹褜",
+ confirm_link_deleting: "斜褍写蟹械 胁褘写邪谢械薪邪",
+ link_start: "(锌邪褔邪褌邪泻)",
+ link_end: "(泻邪薪械褑)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "啸胁i谢i薪邪",
+ hours: "袚邪写蟹i薪邪",
+ days: "袛蟹械薪褜",
+ weeks: "孝褘写蟹械薪褜",
+ months: "袦械褋褟褑",
+ years: "袚芯写",
+ message_ok: "OK",
+ message_cancel: "袗写屑褟薪褨褑褜",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ e.
+ default = {
+ date: {
+ month_full: ["賰丕賳賵賳 丕賱孬丕賳賷", "卮亘丕胤", "丌匕丕乇", "賳賷爻丕賳", "兀賷丕乇", "丨夭賷乇丕賳", "鬲賲賵夭", "丌亘", "兀賷賱賵賱", "鬲卮乇賷賳 丕賱兀賵賱", "鬲卮乇賷賳 丕賱孬丕賳賷", "賰丕賳賵賳 丕賱兀賵賱"],
+ month_short: ["賷賳丕賷乇", "賮亘乇丕賷乇", "賲丕乇爻", "兀亘乇賷賱", "賲丕賷賵", "賷賵賳賷賵", "賷賵賱賷賵", "兀睾爻胤爻", "爻亘鬲賲亘乇", "兀賰鬲賵亘乇", "賳賵賮賲亘乇", "丿賷爻賲亘乇"],
+ day_full: ["丕賱兀丨丿", "丕賱兀孬賳賷賳", "兀賱孬賱丕孬丕亍", "丕賱兀乇亘毓丕亍", "兀賱丨賲賷爻", "兀賱噩賲毓丞", "丕賱爻亘鬲"],
+ day_short: ["丕丨丿", "丕孬賳賷賳", "孬賱丕孬丕亍", "丕乇亘毓丕亍", "禺賲賷爻", "噩賲毓丞", "爻亘鬲"]
+ },
+ labels: {
+ new_task: "賲賴賲丞 噩丿賷丿",
+ icon_save: "丕禺夭賳",
+ icon_cancel: "丕賱睾丕亍",
+ icon_details: "鬲賮丕氐賷賱",
+ icon_edit: "鬲丨乇賷乇",
+ icon_delete: "丨匕賮",
+ confirm_closing: "丕賱鬲睾賷賷乇丕鬲 爻賵賮 鬲囟賷毓, 賴賱 丕賳鬲 賲鬲兀賰丿責",
+ confirm_deleting: "丕賱丨丿孬 爻賷鬲賲 丨匕賮賴丕 賳賴丕卅賷丕 貙 賴賱 兀賳鬲 賲鬲兀賰丿責",
+ section_description: "丕賱賵氐賮",
+ section_time: "丕賱賮鬲乇丞 丕賱夭賲賳賷丞",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ message_ok: "OK",
+ message_cancel: "丕賱睾丕亍",
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(177),
+ r = n(176),
+ a = n(175),
+ o = n(174),
+ s = n(173),
+ l = n(172),
+ c = n(171),
+ u = n(170),
+ d = n(169),
+ h = n(168),
+ f = n(167),
+ _ = n(166),
+ g = n(165),
+ p = n(164),
+ v = n(163),
+ m = n(162),
+ y = n(161),
+ k = n(160),
+ b = n(159),
+ x = n(158),
+ w = n(157),
+ S = n(156),
+ T = n(155),
+ $ = n(154),
+ C = n(153),
+ E = n(152),
+ A = n(151),
+ D = n(150),
+ M = n(149),
+ I = n(148),
+ P = n(147),
+ N = n(146),
+ O = n(145);
+ e.
+ default = function() {
+ return new w.
+ default({
+ en:
+ d.
+ default,
+ ar: i.
+ default,
+ be: r.
+ default,
+ ca: a.
+ default,
+ cn: o.
+ default,
+ cs: s.
+ default,
+ da: l.
+ default,
+ de: c.
+ default,
+ el: u.
+ default,
+ es: h.
+ default,
+ fa: f.
+ default,
+ fi: _.
+ default,
+ fr: g.
+ default,
+ he: p.
+ default,
+ hr: v.
+ default,
+ hu: m.
+ default,
+ id: y.
+ default,
+ it: k.
+ default,
+ jp: b.
+ default,
+ kr: x.
+ default,
+ nb: S.
+ default,
+ nl: T.
+ default,
+ no: $.
+ default,
+ pl: C.
+ default,
+ pt: E.
+ default,
+ ro: A.
+ default,
+ ru: D.
+ default,
+ si: M.
+ default,
+ sk: I.
+ default,
+ sv: P.
+ default,
+ tr: N.
+ default,
+ ua: O.
+ default
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ e.
+ default = function() {}
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.destructor = function() {
+ for (var t in this.clearAll(), this.callEvent("onDestroy", []), this.$root && delete this.$root.gantt, this._eventRemoveAll && this._eventRemoveAll(), this.$layout && this.$layout.destructor(), this.resetLightbox && this.resetLightbox(), this._dp && this._dp.destructor && this._dp.destructor(), this.$services.destructor(), this.detachAllEvents(), this) 0 === t.indexOf("$") && delete this[t];
+ this.$destroyed = !0
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ return function(e, n) {
+ e || t.config.show_errors && !1 !== t.callEvent("onError", [n]) && (t.message ? t.message({
+ type: "error",
+ text: n,
+ expire: -1
+ }) : console.log(n))
+ }
+ }
+ },
+ function(t, e) {
+ function n(t, e) {
+ var n, i = t.config.container_resize_timeout || 20;
+ if ("timeout" == t.config.container_resize_method) s();
+ else try {
+ t.event(e, "resize",
+ function() {
+ t.$scrollbarRepaint ? t.$scrollbarRepaint = null: r()
+ })
+ } catch(t) {
+ s()
+ }
+ function r() {
+ clearTimeout(n),
+ n = setTimeout(function() {
+ t.$destroyed || t.render()
+ },
+ i)
+ }
+ var a = t.$root.offsetHeight,
+ o = t.$root.offsetWidth;
+ function s() {
+ t.$root.offsetHeight == a && t.$root.offsetWidth == o || r(),
+ a = t.$root.offsetHeight,
+ o = t.$root.offsetWidth,
+ setTimeout(s, i)
+ }
+ }
+ t.exports = function(t) {
+ "static" == window.getComputedStyle(t.$root).getPropertyValue("position") && (t.$root.style.position = "relative");
+ var e = document.createElement("iframe");
+ e.className = "gantt_container_resize_watcher",
+ e.tabIndex = -1,
+ t.config.wai_aria_attributes && (e.setAttribute("role", "none"), e.setAttribute("aria-hidden", !0)),
+ ( !! window.Sfdc || !!window.$A || window.Aura) && (t.config.container_resize_method = "timeout"),
+ t.$root.appendChild(e),
+ e.contentWindow ? n(t, e.contentWindow) : (t.$root.removeChild(e), n(t, window))
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(1),
+ a = n(2),
+ o = n(15),
+ s = n(182);
+ t.exports = function(t) {
+ var e = n(46);
+ t.assert = n(181)(t);
+ var l = "Invalid value of the first argument of `gantt.init`. Supported values: HTMLElement, String (element id).This error means that either invalid object is passed into `gantt.init` or that the element with the specified ID doesn't exist on the page when `gantt.init` is called.";
+ function c(e) {
+ if (!e || "string" == typeof e && document.getElementById(e)) return ! 0;
+ if (function(t) {
+ try {
+ t.cloneNode(!1)
+ } catch(t) {
+ return ! 1
+ }
+ return ! 0
+ } (e)) return ! 0;
+ throw t.assert(!1, l),
+ new Error(l)
+ }
+ t.init = function(e, n, i) {
+ t.env.isNode ? e = null: c(e),
+ n && i && (this.config.start_date = this._min_date = new Date(n), this.config.end_date = this._max_date = new Date(i)),
+ this.date.init(),
+ this.init = function(e) {
+ t.env.isNode ? e = null: c(e),
+ this.$container && this.$container.parentNode && (this.$container.parentNode.removeChild(this.$container), this.$container = null),
+ this.$layout && this.$layout.clear(),
+ this._reinit(e)
+ },
+ this._reinit(e)
+ },
+ t._quickRefresh = function(t) {
+ for (var e = this._getDatastores.call(this), n = 0; n < e.length; n++) e[n]._quick_refresh = !0;
+ t();
+ for (n = 0; n < e.length; n++) e[n]._quick_refresh = !1
+ };
+ var u = function() {
+ this._clearTaskLayers && this._clearTaskLayers(),
+ this._clearLinkLayers && this._clearLinkLayers(),
+ this.$layout && (this.$layout.destructor(), this.$layout = null, this.$ui.reset())
+ }.bind(t),
+ d = function() {
+ o(t) || (this.$root.innerHTML = "", this.$root.gantt = this, e(this), this.config.layout.id = "main", this.$layout = this.$ui.createView("layout", this.$root, this.config.layout), this.$layout.attachEvent("onBeforeResize",
+ function() {
+ for (var e = t.$services.getService("datastores"), n = 0; n < e.length; n++) t.getDatastore(e[n]).filter(),
+ t.$data.tasksStore._skipTaskRecalculation ? "lightbox" != t.$data.tasksStore._skipTaskRecalculation && (t.$data.tasksStore._skipTaskRecalculation = !1) : t.getDatastore(e[n]).callEvent("onBeforeRefreshAll", [])
+ }), this.$layout.attachEvent("onResize",
+ function() {
+ t._quickRefresh(function() {
+ t.refreshData()
+ })
+ }), this.callEvent("onGanttLayoutReady", []), this.$layout.render(), this.$container = this.$layout.$container.firstChild, s(this))
+ }.bind(t);
+ t.resetLayout = function() {
+ u(),
+ d(),
+ this.render()
+ },
+ t._reinit = function(t) {
+ this.callEvent("onBeforeGanttReady", []),
+ this._update_flags(),
+ this.$services.getService("templateLoader").initTemplates(this),
+ u(),
+ this.$root = null,
+ t && (this.$root = r.toNode(t), d(), this.$mouseEvents.reset(this.$root)),
+ this.callEvent("onTemplatesReady", []),
+ this.callEvent("onGanttReady", []),
+ this.render()
+ },
+ t.$click = {
+ buttons: {
+ edit: function(e) {
+ t.isReadonly(t.getTask(e)) || t.showLightbox(e)
+ },
+ delete: function(e) {
+ var n = t.getTask(e);
+ if (!t.isReadonly(n)) {
+ var i = t.locale.labels.confirm_deleting,
+ r = t.locale.labels.confirm_deleting_title;
+ t._simple_confirm(i, r,
+ function() {
+ t.isTaskExists(e) ? (n.$new ? (t.$data.tasksStore._skipTaskRecalculation = "lightbox", t.silent(function() {
+ t.deleteTask(e, !0)
+ }), t.$data.tasksStore._skipTaskRecalculation = !1, t.refreshData()) : (t.$data.tasksStore._skipTaskRecalculation = !0, t.deleteTask(e)), t.hideLightbox()) : t.hideLightbox()
+ })
+ }
+ }
+ }
+ },
+ t.render = function() {
+ var n;
+ if (this.callEvent("onBeforeGanttRender", []), !o(t)) { ! this.config.sort && this._sort && (this._sort = void 0),
+ this.$root && (this.config.rtl ? (this.$root.classList.add("gantt_rtl"), this.$root.firstChild.classList.add("gantt_rtl")) : (this.$root.classList.remove("gantt_rtl"), this.$root.firstChild.classList.remove("gantt_rtl")));
+ var i = this.getScrollState(),
+ r = i ? i.x: 0;
+ if (this._getHorizontalScrollbar()) r = this._getHorizontalScrollbar().$config.codeScrollLeft || r || 0;
+ n = null,
+ r && (n = t.dateFromPos(r + this.config.task_scroll_offset))
+ }
+ if (e(this), o(t)) t.refreshData();
+ else {
+ this.$layout.$config.autosize = this.config.autosize;
+ var a = this.config.preserve_scroll;
+ if (this.config.preserve_scroll = !1, this.$layout.resize(), this.config.preserve_scroll = a, this.config.preserve_scroll && i) {
+ if (r || i.y) {
+ var s = t.getScrollState();
+ if ( + n != +t.dateFromPos(s.x) || s.y != i.y) {
+ r = null;
+ var l = null;
+ if (n) r = Math.max(t.posFromDate(n) - t.config.task_scroll_offset, 0);
+ i.y && (l = i.y),
+ t.scrollTo(r, l)
+ }
+ }
+ var c = t.$ui.getView("grid");
+ if (c) {
+ var u = c.$config.scrollY,
+ d = t.$ui.getView(u);
+ if (d) t.utils.dom.isChildOf(d.$view, t.$container) || c.scrollTo(void 0, 0)
+ }
+ }
+ }
+ this.callEvent("onGanttRender", [])
+ },
+ t.setSizes = t.render,
+ t.getTaskRowNode = function(t) {
+ for (var e = this.$grid_data.childNodes,
+ n = this.config.task_attribute,
+ i = 0; i < e.length; i++) {
+ if (e[i].getAttribute) if (e[i].getAttribute(n) == t) return e[i]
+ }
+ return null
+ },
+ t.changeLightboxType = function(e) {
+ if (this.getLightboxType() == e) return ! 0;
+ t._silent_redraw_lightbox(e)
+ },
+ t._get_link_type = function(e, n) {
+ var i = null;
+ return e && n ? i = t.config.links.start_to_start: !e && n ? i = t.config.links.finish_to_start: e || n ? e && !n && (i = t.config.links.start_to_finish) : i = t.config.links.finish_to_finish,
+ i
+ },
+ t.isLinkAllowed = function(t, e, n, r) {
+ var a = null;
+ if (! (a = "object" == i(t) ? t: {
+ source: t,
+ target: e,
+ type: this._get_link_type(n, r)
+ })) return ! 1;
+ if (! (a.source && a.target && a.type)) return ! 1;
+ if (a.source == a.target) return ! 1;
+ var o = !0;
+ return this.checkEvent("onLinkValidation") && (o = this.callEvent("onLinkValidation", [a])),
+ o
+ },
+ t._correct_dst_change = function(e, n, i, r) {
+ var o = a.getSecondsInUnit(r) * i;
+ if (o > 3600 && o < 86400) {
+ var s = e.getTimezoneOffset() - n;
+ s && (e = t.date.add(e, s, "minute"))
+ }
+ return e
+ },
+ t.isSplitTask = function(e) {
+ return t.assert(e && e instanceof Object, "Invalid argument <b>task</b>=" + e + " of gantt.isSplitTask. Task object was expected"),
+ this.$data.tasksStore._isSplitItem(e)
+ },
+ t._is_icon_open_click = function(t) {
+ if (!t) return ! 1;
+ var e = t.target || t.srcElement;
+ if (!e || !e.className) return ! 1;
+ var n = r.getClassName(e);
+ return - 1 !== n.indexOf("gantt_tree_icon") && ( - 1 !== n.indexOf("gantt_close") || -1 !== n.indexOf("gantt_open"))
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ function e() {
+ return t._cached_functions.update_if_changed(t),
+ t._cached_functions.active || t._cached_functions.activate(),
+ !0
+ }
+ t._cached_functions = {
+ cache: {},
+ mode: !1,
+ critical_path_mode: !1,
+ wrap_methods: function(t, e) {
+ if (e._prefetch_originals) for (var n in e._prefetch_originals) e[n] = e._prefetch_originals[n];
+ e._prefetch_originals = {};
+ for (n = 0; n < t.length; n++) this.prefetch(t[n], e)
+ },
+ prefetch: function(t, e) {
+ var n = e[t];
+ if (n) {
+ var i = this;
+ e._prefetch_originals[t] = n,
+ e[t] = function() {
+ for (var e = new Array(arguments.length), r = 0, a = arguments.length; r < a; r++) e[r] = arguments[r];
+ if (i.active) {
+ var o = i.get_arguments_hash(Array.prototype.slice.call(e));
+ i.cache[t] || (i.cache[t] = {});
+ var s = i.cache[t];
+ if (i.has_cached_value(s, o)) return i.get_cached_value(s, o);
+ var l = n.apply(this, e);
+ return i.cache_value(s, o, l),
+ l
+ }
+ return n.apply(this, e)
+ }
+ }
+ return n
+ },
+ cache_value: function(t, e, n) {
+ this.is_date(n) && (n = new Date(n)),
+ t[e] = n
+ },
+ has_cached_value: function(t, e) {
+ return t.hasOwnProperty(e)
+ },
+ get_cached_value: function(t, e) {
+ var n = t[e];
+ return this.is_date(n) && (n = new Date(n)),
+ n
+ },
+ is_date: function(t) {
+ return t && t.getUTCDate
+ },
+ get_arguments_hash: function(t) {
+ for (var e = [], n = 0; n < t.length; n++) e.push(this.stringify_argument(t[n]));
+ return "(" + e.join(";") + ")"
+ },
+ stringify_argument: function(t) {
+ return (t.id ? t.id: this.is_date(t) ? t.valueOf() : t) + ""
+ },
+ activate: function() {
+ this.clear(),
+ this.active = !0
+ },
+ deactivate: function() {
+ this.clear(),
+ this.active = !1
+ },
+ clear: function() {
+ this.cache = {}
+ },
+ setup: function(t) {
+ var e = [],
+ n = ["_isProjectEnd", "_getProjectEnd", "_getSlack"];
+ "auto" == this.mode ? t.config.highlight_critical_path && (e = n) : !0 === this.mode && (e = n),
+ this.wrap_methods(e, t)
+ },
+ update_if_changed: function(t) { (this.critical_path_mode != t.config.highlight_critical_path || this.mode !== t.config.optimize_render) && (this.critical_path_mode = t.config.highlight_critical_path, this.mode = t.config.optimize_render, this.setup(t))
+ }
+ },
+ t.attachEvent("onBeforeGanttRender", e),
+ t.attachEvent("onBeforeDataRender", e),
+ t.attachEvent("onBeforeSmartRender",
+ function() {
+ e()
+ }),
+ t.attachEvent("onBeforeParse", e),
+ t.attachEvent("onDataRender",
+ function() {
+ t._cached_functions.deactivate()
+ });
+ var n = null;
+ t.attachEvent("onSmartRender",
+ function() {
+ n && clearTimeout(n),
+ n = setTimeout(function() {
+ t._cached_functions.deactivate()
+ },
+ 1e3)
+ }),
+ t.attachEvent("onBeforeGanttReady",
+ function() {
+ return t._cached_functions.update_if_changed(t),
+ !0
+ })
+ }
+ },
+ function(t, e) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ t.exports = function(t) {
+ t.getTaskType = function(e) {
+ var i = e;
+ for (var r in e && "object" == n(e) && (i = e.type), this.config.types) if (this.config.types[r] == i) return i;
+ return t.config.types.task
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ e.
+ default = function() {}
+ },
+ function(t, e, n) {
+ var i = n(2);
+ t.exports = function(t) {
+ t.isUnscheduledTask = function(e) {
+ return t.assert(e && e instanceof Object, "Invalid argument <b>task</b>=" + e + " of gantt.isUnscheduledTask. Task object was expected"),
+ !!e.unscheduled || !e.start_date
+ },
+ t._isAllowedUnscheduledTask = function(e) {
+ return ! (!e.unscheduled || !t.config.show_unscheduled)
+ },
+ t._isTaskInTimelineLimits = function(t) {
+ var e = t.start_date ? t.start_date.valueOf() : null,
+ n = t.end_date ? t.end_date.valueOf() : null;
+ return !! (e && n && e <= this._max_date.valueOf() && n >= this._min_date.valueOf())
+ },
+ t.isTaskVisible = function(t) {
+ if (!this.isTaskExists(t)) return ! 1;
+ var e = this.getTask(t);
+ return ! (!this._isAllowedUnscheduledTask(e) && !this._isTaskInTimelineLimits(e)) && !!(this.getGlobalTaskIndex(t) >= 0)
+ },
+ t._getProjectEnd = function() {
+ if (t.config.project_end) return t.config.project_end;
+ var e = t.getTaskByTime();
+ return (e = e.sort(function(t, e) {
+ return + t.end_date > +e.end_date ? 1 : -1
+ })).length ? e[e.length - 1].end_date: null
+ },
+ t._getProjectStart = function() {
+ if (t.config.project_start) return t.config.project_start;
+ if (t.config.start_date) return t.config.start_date;
+ if (t.getState().min_date) return t.getState().min_date;
+ var e = t.getTaskByTime();
+ return (e = e.sort(function(t, e) {
+ return + t.start_date > +e.start_date ? 1 : -1
+ })).length ? e[0].start_date: null
+ };
+ var e = function(e, n) {
+ var i = !!(n && n != t.config.root_id && t.isTaskExists(n)) && t.getTask(n),
+ r = null;
+ if (i) r = t.config.schedule_from_end ? t.calculateEndDate({
+ start_date: i.end_date,
+ duration: -t.config.duration_step,
+ task: e
+ }) : i.start_date;
+ else if (t.config.schedule_from_end) r = t.calculateEndDate({
+ start_date: t._getProjectEnd(),
+ duration: -t.config.duration_step,
+ task: e
+ });
+ else {
+ var a = t.getTaskByIndex(0);
+ r = a ? a.start_date ? a.start_date: a.end_date ? t.calculateEndDate({
+ start_date: a.end_date,
+ duration: -t.config.duration_step,
+ task: e
+ }) : null: t.config.start_date || t.getState().min_date
+ }
+ return t.assert(r, "Invalid dates"),
+ new Date(r)
+ };
+ t._set_default_task_timing = function(n) {
+ n.start_date = n.start_date || e(n, t.getParent(n)),
+ n.duration = n.duration || t.config.duration_step,
+ n.end_date = n.end_date || t.calculateEndDate(n)
+ },
+ t.createTask = function(n, i, r) { (n = n || {},
+ t.defined(n.id) || (n.id = t.uid()), n.start_date || (n.start_date = e(n, i)), void 0 === n.text && (n.text = t.locale.labels.new_task), void 0 === n.duration && (n.duration = 1), this.isTaskExists(i)) && (this.setParent(n, i, !0), this.getTask(i).$open = !0);
+ if (!this.callEvent("onTaskCreated", [n])) return null;
+ if (this.config.details_on_create) {
+ if (t.isTaskExists(n.id)) t.getTask(n.id).$index != n.$index && (n.start_date && "string" == typeof n.start_date && (n.start_date = this.date.parseDate(n.start_date, "parse_date")), n.end_date && "string" == typeof n.end_date && (n.end_date = this.date.parseDate(n.end_date, "parse_date")), this.$data.tasksStore.updateItem(n.id, n));
+ else n.$new = !0,
+ this.silent(function() {
+ t.$data.tasksStore.addItem(n, r)
+ });
+ this.selectTask(n.id),
+ this.refreshData(),
+ this.showLightbox(n.id)
+ } else this.addTask(n, i, r) && (this.showTask(n.id), this.selectTask(n.id));
+ return n.id
+ },
+ t._update_flags = function(e, n) {
+ var i = t.$data.tasksStore;
+ void 0 === e ? (this._lightbox_id = null, i.silent(function() {
+ i.unselect()
+ }), this.getSelectedTasks && this._multiselect.reset(), this._tasks_dnd && this._tasks_dnd.drag && (this._tasks_dnd.drag.id = null)) : (this._lightbox_id == e && (this._lightbox_id = n), i.getSelectedId() == e && i.silent(function() {
+ i.unselect(e),
+ i.select(n)
+ }), this._tasks_dnd && this._tasks_dnd.drag && this._tasks_dnd.drag.id == e && (this._tasks_dnd.drag.id = n))
+ };
+ var n = function(e, n) {
+ var i = t.getTaskType(e.type),
+ r = {
+ type: i,
+ $no_start: !1,
+ $no_end: !1
+ };
+ return n || i != e.$rendered_type ? (i == t.config.types.project ? r.$no_end = r.$no_start = !0 : i != t.config.types.milestone && (r.$no_end = !(e.end_date || e.duration), r.$no_start = !e.start_date, t._isAllowedUnscheduledTask(e) && (r.$no_end = r.$no_start = !1)), r) : (r.$no_start = e.$no_start, r.$no_end = e.$no_end, r)
+ };
+ function r(e) {
+ e.$effective_calendar = t.getTaskCalendar(e).id,
+ e.start_date = t.getClosestWorkTime({
+ dir: "future",
+ date: e.start_date,
+ unit: t.config.duration_unit,
+ task: e
+ }),
+ e.end_date = t.calculateEndDate(e)
+ }
+ function a(e) {
+ var n = null,
+ i = null,
+ r = void 0 !== e ? e: t.config.root_id,
+ a = [];
+ return t.eachTask(function(e) {
+ t.getTaskType(e.type) == t.config.types.project || t.isUnscheduledTask(e) || (e.rollup && a.push(e.id), e.start_date && !e.$no_start && (!n || n > e.start_date.valueOf()) && (n = e.start_date.valueOf()), e.end_date && !e.$no_end && (!i || i < e.end_date.valueOf()) && (i = e.end_date.valueOf()))
+ },
+ r),
+ {
+ start_date: n ? new Date(n) : null,
+ end_date: i ? new Date(i) : null,
+ rollup: a
+ }
+ }
+ t._init_task_timing = function(t) {
+ var e = n(t, !0),
+ i = t.$rendered_type != e.type,
+ a = e.type;
+ i && (t.$no_start = e.$no_start, t.$no_end = e.$no_end, t.$rendered_type = e.type),
+ i && a != this.config.types.milestone && a == this.config.types.project && (this._set_default_task_timing(t), t.$calculate_duration = !1),
+ a == this.config.types.milestone && (t.end_date = t.start_date),
+ t.start_date && t.end_date && !1 !== t.$calculate_duration && (t.duration = this.calculateDuration(t)),
+ t.$calculate_duration || (t.$calculate_duration = !0),
+ t.end_date || (t.end_date = t.start_date),
+ t.duration = t.duration || 0,
+ 0 === this.config.min_duration && 0 === t.duration && (t.$no_end = !1);
+ var o = this.getTaskCalendar(t);
+ t.$effective_calendar && t.$effective_calendar !== o.id && (r(t), this.config.inherit_calendar && this.isSummaryTask(t) && this.eachTask(function(t) {
+ r(t)
+ },
+ t.id)),
+ t.$effective_calendar = o.id
+ },
+ t.isSummaryTask = function(e) {
+ t.assert(e && e instanceof Object, "Invalid argument <b>task</b>=" + e + " of gantt.isSummaryTask. Task object was expected");
+ var i = n(e);
+ return ! (!i.$no_end && !i.$no_start)
+ },
+ t.resetProjectDates = function(t) {
+ var i = n(t);
+ if (i.$no_end || i.$no_start) {
+ var r = a(t.id); (function(t, n, i, r) {
+ n.$no_start && (t.start_date = i ? new Date(i) : e(t, this.getParent(t)));
+ n.$no_end && (t.end_date = r ? new Date(r) : this.calculateEndDate({
+ start_date: t.start_date,
+ duration: this.config.duration_step,
+ task: t
+ })); (n.$no_start || n.$no_end) && this._init_task_timing(t)
+ }).call(this, t, i, r.start_date, r.end_date),
+ t.$rollup = r.rollup
+ }
+ },
+ t.getSubtaskDuration = function(e) {
+ var n = 0,
+ i = void 0 !== e ? e: t.config.root_id;
+ return this.eachTask(function(e) {
+ this.getTaskType(e.type) == t.config.types.project || this.isUnscheduledTask(e) || (n += e.duration)
+ },
+ i),
+ n
+ },
+ t.getSubtaskDates = function(t) {
+ var e = a(t);
+ return {
+ start_date: e.start_date,
+ end_date: e.end_date
+ }
+ },
+ t._update_parents = function(e, i, r) {
+ if (e) {
+ var a = this.getTask(e);
+ a.rollup && (r = !0);
+ var o = this.getParent(a),
+ s = n(a),
+ l = !0;
+ if (r || a.start_date && a.end_date && (s.$no_start || s.$no_end)) {
+ var c = a.start_date.valueOf(),
+ u = a.end_date.valueOf();
+ t.resetProjectDates(a),
+ r || c != a.start_date.valueOf() || u != a.end_date.valueOf() || (l = !1),
+ l && !i && this.refreshTask(a.id, !0)
+ }
+ l && o && this.isTaskExists(o) && this._update_parents(o, i, r)
+ }
+ },
+ t.roundDate = function(e) {
+ var n = t.getScale();
+ i.isDate(e) && (e = {
+ date: e,
+ unit: n ? n.unit: t.config.duration_unit,
+ step: n ? n.step: t.config.duration_step
+ });
+ var r, a, o, s = e.date,
+ l = e.step,
+ c = e.unit;
+ if (!n) return s;
+ if (c == n.unit && l == n.step && +s >= +n.min_date && +s <= +n.max_date) o = Math.floor(t.columnIndexByDate(s)),
+ n.trace_x[o] || (o -= 1, n.rtl && (o = 0)),
+ a = new Date(n.trace_x[o]),
+ r = t.date.add(a, l, c);
+ else {
+ for (o = Math.floor(t.columnIndexByDate(s)), r = t.date[c + "_start"](new Date(n.min_date)), n.trace_x[o] && (r = t.date[c + "_start"](n.trace_x[o])); + r < +s;) {
+ var u = (r = t.date[c + "_start"](t.date.add(r, l, c))).getTimezoneOffset();
+ r = t._correct_dst_change(r, u, r, c),
+ t.date[c + "_start"] && (r = t.date[c + "_start"](r))
+ }
+ a = t.date.add(r, -1 * l, c)
+ }
+ return e.dir && "future" == e.dir ? r: e.dir && "past" == e.dir ? a: Math.abs(s - a) < Math.abs(r - s) ? a: r
+ },
+ t.correctTaskWorkTime = function(e) {
+ t.config.work_time && t.config.correct_work_time && (this.isWorkTime(e.start_date, void 0, e) ? this.isWorkTime(new Date( + e.end_date - 1), void 0, e) || (e.end_date = this.calculateEndDate(e)) : (e.start_date = this.getClosestWorkTime({
+ date: e.start_date,
+ dir: "future",
+ task: e
+ }), e.end_date = this.calculateEndDate(e)))
+ },
+ t.attachEvent("onBeforeTaskUpdate",
+ function(e, n) {
+ return t._init_task_timing(n),
+ !0
+ }),
+ t.attachEvent("onBeforeTaskAdd",
+ function(e, n) {
+ return t._init_task_timing(n),
+ !0
+ }),
+ t.attachEvent("onAfterTaskMove",
+ function(e, n, i) {
+ return t._init_task_timing(t.getTask(e)),
+ !0
+ })
+ }
+ },
+ function(t, e, n) {
+ var i = n(0);
+ t.exports = {
+ create: function(t, e) {
+ return {
+ getWorkHours: function(t) {
+ return e.getWorkHours(t)
+ },
+ setWorkTime: function(t) {
+ return e.setWorkTime(t)
+ },
+ unsetWorkTime: function(t) {
+ e.unsetWorkTime(t)
+ },
+ isWorkTime: function(t, n, i) {
+ return e.isWorkTime(t, n, i)
+ },
+ getClosestWorkTime: function(t) {
+ return e.getClosestWorkTime(t)
+ },
+ calculateDuration: function(t, n, i) {
+ return e.calculateDuration(t, n, i)
+ },
+ _hasDuration: function(t, n, i) {
+ return e.hasDuration(t, n, i)
+ },
+ calculateEndDate: function(t, n, i, r) {
+ return e.calculateEndDate(t, n, i, r)
+ },
+ mergeCalendars: i.bind(t.mergeCalendars, t),
+ createCalendar: i.bind(t.createCalendar, t),
+ addCalendar: i.bind(t.addCalendar, t),
+ getCalendar: i.bind(t.getCalendar, t),
+ getCalendars: i.bind(t.getCalendars, t),
+ getResourceCalendar: i.bind(t.getResourceCalendar, t),
+ getTaskCalendar: i.bind(t.getTaskCalendar, t),
+ deleteCalendar: i.bind(t.deleteCalendar, t)
+ }
+ }
+ }
+ },
+ function(t, e) {
+ function n(t, e) {
+ this.argumentsHelper = e,
+ this.$gantt = t
+ }
+ n.prototype = {
+ getWorkHours: function() {
+ return [0, 24]
+ },
+ setWorkTime: function() {
+ return ! 0
+ },
+ unsetWorkTime: function() {
+ return ! 0
+ },
+ isWorkTime: function() {
+ return ! 0
+ },
+ getClosestWorkTime: function(t) {
+ return this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments).date
+ },
+ calculateDuration: function() {
+ var t = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments),
+ e = t.start_date,
+ n = t.end_date,
+ i = t.unit,
+ r = t.step;
+ return this._calculateDuration(e, n, i, r)
+ },
+ _calculateDuration: function(t, e, n, i) {
+ var r = this.$gantt.date,
+ a = {
+ week: 6048e5,
+ day: 864e5,
+ hour: 36e5,
+ minute: 6e4
+ },
+ o = 0;
+ if (a[n]) o = Math.round((e - t) / (i * a[n]));
+ else {
+ for (var s = new Date(t), l = new Date(e); s.valueOf() < l.valueOf();) o += 1,
+ s = r.add(s, i, n);
+ s.valueOf() != e.valueOf() && (o += (l - s) / (r.add(s, i, n) - s))
+ }
+ return Math.round(o)
+ },
+ hasDuration: function() {
+ var t = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments),
+ e = t.start_date,
+ n = t.end_date;
+ return !! t.unit && (e = new Date(e), n = new Date(n), e.valueOf() < n.valueOf())
+ },
+ hasWorkTime: function() {
+ return ! 0
+ },
+ equals: function(t) {
+ return t instanceof n
+ },
+ calculateEndDate: function() {
+ var t = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments),
+ e = t.start_date,
+ n = t.duration,
+ i = t.unit,
+ r = t.step;
+ return this.$gantt.date.add(e, r * n, i)
+ }
+ },
+ t.exports = n
+ },
+ function(t, e, n) {
+ var i = n(42),
+ r = n(189);
+ function a(t) {
+ this.$gantt = t.$gantt,
+ this.argumentsHelper = i(this.$gantt),
+ this.calendarManager = t,
+ this.$disabledCalendar = new r(this.$gantt, this.argumentsHelper)
+ }
+ a.prototype = {
+ _getCalendar: function(t) {
+ var e;
+ if (this.$gantt.config.work_time) {
+ var n = this.calendarManager;
+ t.task ? e = n.getTaskCalendar(t.task) : t.id ? e = n.getTaskCalendar(t) : t.calendar && (e = t.calendar),
+ e || (e = n.getTaskCalendar())
+ } else e = this.$disabledCalendar;
+ return e
+ },
+ getWorkHours: function(t) {
+ return t = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments),
+ this._getCalendar(t).getWorkHours(t.date)
+ },
+ setWorkTime: function(t, e) {
+ return t = this.argumentsHelper.setWorkTimeArguments.apply(this.argumentsHelper, arguments),
+ e || (e = this.calendarManager.getCalendar()),
+ e.setWorkTime(t)
+ },
+ unsetWorkTime: function(t, e) {
+ return t = this.argumentsHelper.unsetWorkTimeArguments.apply(this.argumentsHelper, arguments),
+ e || (e = this.calendarManager.getCalendar()),
+ e.unsetWorkTime(t)
+ },
+ isWorkTime: function(t, e, n, i) {
+ var r = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ return this._getCalendar(r).isWorkTime(r)
+ },
+ getClosestWorkTime: function(t) {
+ return t = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments),
+ this._getCalendar(t).getClosestWorkTime(t)
+ },
+ calculateDuration: function() {
+ var t = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);
+ return this._getCalendar(t).calculateDuration(t)
+ },
+ hasDuration: function() {
+ var t = this.argumentsHelper.hasDurationArguments.apply(this.argumentsHelper, arguments);
+ return this._getCalendar(t).hasDuration(t)
+ },
+ calculateEndDate: function(t) {
+ t = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);
+ return this._getCalendar(t).calculateEndDate(t)
+ }
+ },
+ t.exports = a
+ },
+ function(t, e) {
+ t.exports = function() {
+ var t = {};
+ return {
+ getCalendarIdFromMultipleResources: function(e, n) {
+ var i = function(t) {
+ return t.map(function(t) {
+ return t && t.resource_id ? t.resource_id: t
+ }).sort().join("-")
+ } (e);
+ if (e.length) {
+ if (1 === e.length) return n.getResourceCalendar(i).id;
+ if (t[i]) return t[i].id;
+ var r = function(t, e) {
+ return e.mergeCalendars(t.map(function(t) {
+ var n = t && t.resource_id ? t.resource_id: t;
+ return e.getResourceCalendar(n)
+ }))
+ } (e, n);
+ return t[i] = r,
+ n.addCalendar(r)
+ }
+ return null
+ }
+ }
+ }
+ },
+ function(t, e) {
+ function n(t) {
+ "@babel/helpers - typeof";
+ return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ t.exports = {
+ isLegacyResourceCalendarFormat: function(t) {
+ if (!t) return ! 1;
+ for (var e in t) if (t[e] && "object" === n(t[e])) return ! 0;
+ return ! 1
+ },
+ getResourceProperty: function(t) {
+ var e = t.resource_calendars,
+ n = t.resource_property;
+ if (this.isLegacyResourceCalendarFormat(e)) for (var i in t) {
+ n = i;
+ break
+ }
+ return n
+ },
+ getCalendarIdFromLegacyConfig: function(t, e) {
+ if (e) for (var n in e) {
+ var i = e[n];
+ if (t[n]) {
+ var r = i[t[n]];
+ if (r) return r
+ }
+ }
+ return null
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t() {
+ this.clear()
+ }
+ return t.prototype._getCacheObject = function(t, e, n) {
+ var i = this._cache;
+ i[e] || (i[e] = []);
+ var r = i[e];
+ r || (r = i[e] = {});
+ var a = r[n];
+ a || (a = r[n] = {});
+ var o = t.getFullYear(),
+ s = a[o];
+ return s || (s = a[o] = {
+ durations: {},
+ endDates: {}
+ }),
+ s
+ },
+ t.prototype._endDateCacheKey = function(t, e) {
+ return String(t) + "-" + String(e)
+ },
+ t.prototype._durationCacheKey = function(t, e) {
+ return String(t) + "-" + String(e)
+ },
+ t.prototype.getEndDate = function(t, e, n, i, r) {
+ var a, o = this._getCacheObject(t, n, i),
+ s = t.valueOf(),
+ l = this._endDateCacheKey(s, e);
+ if (void 0 === o.endDates[l]) {
+ var c = r(),
+ u = c.valueOf();
+ o.endDates[l] = u,
+ o.durations[this._durationCacheKey(s, u)] = e,
+ a = c
+ } else a = new Date(o.endDates[l]);
+ return a
+ },
+ t.prototype.getDuration = function(t, e, n, i, r) {
+ var a, o = this._getCacheObject(t, n, i),
+ s = t.valueOf(),
+ l = e.valueOf(),
+ c = this._durationCacheKey(s, l);
+ if (void 0 === o.durations[c]) {
+ var u = r();
+ o.durations[c] = u.valueOf(),
+ a = u
+ } else a = o.durations[c];
+ return a
+ },
+ t.prototype.clear = function() {
+ this._cache = {}
+ },
+ t
+ } ();
+ e.DateDurationCache = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ return function(t) {
+ var e = this;
+ this.getMinutesPerWeek = function(t) {
+ var n = t.valueOf();
+ if (e._weekCache.has(n)) return e._weekCache.get(n);
+ for (var i = e._calendar,
+ r = e._calendar.$gantt,
+ a = 0,
+ o = r.date.week_start(new Date(t)), s = 0; s < 7; s++) a += 60 * i.getHoursPerDay(o),
+ o = r.date.add(o, 1, "day");
+ return e._weekCache.set(n, a),
+ a
+ },
+ this.getMinutesPerMonth = function(t) {
+ var n = t.valueOf();
+ if (e._monthCache.has(n)) return e._monthCache.get(n);
+ for (var i = e._calendar,
+ r = e._calendar.$gantt,
+ a = 0,
+ o = r.date.week_start(new Date(t)), s = r.date.add(o, 1, "month").valueOf(); o.valueOf() < s;) a += 60 * i.getHoursPerDay(o),
+ o = r.date.add(o, 1, "day");
+ return e._monthCache.set(n, a),
+ a
+ },
+ this.clear = function() {
+ e._weekCache = new Map,
+ e._monthCache = new Map
+ },
+ this.clear(),
+ this._calendar = t
+ }
+ } ();
+ e.LargerUnitsCache = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t() {
+ this.clear()
+ }
+ return t.prototype.getItem = function(t, e, n) {
+ var i = this._cache;
+ if (i && i[t]) {
+ var r = i[t];
+ if (void 0 === r) return - 1;
+ var a = r[n.getFullYear()];
+ if (a && void 0 !== a[e]) return a[e]
+ }
+ return - 1
+ },
+ t.prototype.setItem = function(t, e, n, i) {
+ if (t && e) {
+ var r = this._cache;
+ if (r) {
+ r[t] || (r[t] = []);
+ var a = r[t],
+ o = i.getFullYear(),
+ s = a[o];
+ s || (s = a[o] = {}),
+ s[e] = n
+ }
+ }
+ },
+ t.prototype.clear = function() {
+ this._cache = {}
+ },
+ t
+ } ();
+ e.WorkUnitsObjectCache = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t() {
+ this.clear()
+ }
+ return t.prototype.getItem = function(t, e, n) {
+ if (this._cache.has(t)) {
+ var i = this._cache.get(t)[n.getFullYear()];
+ if (i && i.has(e)) return i.get(e)
+ }
+ return - 1
+ },
+ t.prototype.setItem = function(t, e, n, i) {
+ if (t && e) {
+ var r, a = this._cache,
+ o = i.getFullYear();
+ a.has(t) ? r = a.get(t) : (r = [], a.set(t, r));
+ var s = r[o];
+ s || (s = r[o] = new Map),
+ s.set(e, n)
+ }
+ },
+ t.prototype.clear = function() {
+ this._cache = new Map
+ },
+ t
+ } ();
+ e.WorkUnitsMapCache = i
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(41).createCacheObject,
+ a = n(41).LargerUnitsCache,
+ o = n(0),
+ s = n(193).DateDurationCache;
+ function l(t, e) {
+ this.argumentsHelper = e,
+ this.$gantt = t,
+ this._workingUnitsCache = r(),
+ this._largeUnitsCache = new a(this),
+ this._dateDurationCache = new s,
+ this._worktime = null,
+ this._cached_timestamps = {},
+ this._cached_timestamps_count = 0
+ }
+ l.prototype = {
+ units: ["year", "month", "week", "day", "hour", "minute"],
+ _clearCaches: function() {
+ this._workingUnitsCache.clear(),
+ this._largeUnitsCache.clear(),
+ this._dateDurationCache.clear()
+ },
+ _getUnitOrder: function(t) {
+ for (var e = 0,
+ n = this.units.length; e < n; e++) if (this.units[e] == t) return e
+ },
+ _resetTimestampCache: function() {
+ this._cached_timestamps = {},
+ this._cached_timestamps_count = 0
+ },
+ _timestamp: function(t) {
+ this._cached_timestamps_count > 1e6 && this._resetTimestampCache();
+ var e = null;
+ if (t.day || 0 === t.day) e = t.day;
+ else if (t.date) {
+ var n = String(t.date.valueOf());
+ this._cached_timestamps[n] ? e = this._cached_timestamps[n] : (e = Date.UTC(t.date.getFullYear(), t.date.getMonth(), t.date.getDate()), this._cached_timestamps[n] = e, this._cached_timestamps_count++)
+ }
+ return e
+ },
+ _checkIfWorkingUnit: function(t, e) {
+ if (!this["_is_work_" + e]) {
+ var n = this.$gantt.date["".concat(e, "_start")](new Date(t)),
+ i = this.$gantt.date.add(n, 1, e);
+ return this.hasDuration(n, i)
+ }
+ return this["_is_work_" + e](t)
+ },
+ _is_work_day: function(t) {
+ var e = this._getWorkHours(t);
+ return !! Array.isArray(e) && e.length > 0
+ },
+ _is_work_hour: function(t) {
+ for (var e = this._getWorkHours(t), n = t.getHours(), i = 0; i < e.length; i++) if (n >= e[i].startHour && n < e[i].endHour) return ! 0;
+ return ! 1
+ },
+ _getTimeOfDayStamp: function(t, e) {
+ var n = t.getHours();
+ return t.getHours() || t.getMinutes() || !e || (n = 24),
+ 60 * n * 60 + 60 * t.getMinutes()
+ },
+ _is_work_minute: function(t) {
+ for (var e = this._getWorkHours(t), n = this._getTimeOfDayStamp(t), i = 0; i < e.length; i++) if (n >= e[i].start && n < e[i].end) return ! 0;
+ return ! 1
+ },
+ _nextDate: function(t, e, n) {
+ return this.$gantt.date.add(t, n, e)
+ },
+ _getWorkUnitsBetweenGeneric: function(t, e, n, i) {
+ var r = this.$gantt.date,
+ a = new Date(t),
+ o = new Date(e);
+ i = i || 1;
+ var s, l, c = 0,
+ u = null,
+ d = !1; (s = r[n + "_start"](new Date(a))).valueOf() != a.valueOf() && (d = !0);
+ var h = !1; (l = r[n + "_start"](new Date(e))).valueOf() != e.valueOf() && (h = !0);
+ for (var f = !1; a.valueOf() < o.valueOf();) {
+ if (f = (u = this._nextDate(a, n, i)).valueOf() > o.valueOf(), this._isWorkTime(a, n))(d || h && f) && (s = r[n + "_start"](new Date(a)), l = r.add(s, i, n)),
+ d ? (d = !1, u = this._nextDate(s, n, i), c += (l.valueOf() - a.valueOf()) / (l.valueOf() - s.valueOf())) : h && f ? (h = !1, c += (o.valueOf() - a.valueOf()) / (l.valueOf() - s.valueOf())) : c++;
+ else {
+ var _ = this._getUnitOrder(n),
+ g = this.units[_ - 1];
+ g && !this._isWorkTime(a, g) && (u = this._getClosestWorkTimeFuture(a, g))
+ }
+ a = u
+ }
+ return c
+ },
+ _getMinutesPerHour: function(t) {
+ var e = this._getTimeOfDayStamp(t),
+ n = this._getTimeOfDayStamp(this._nextDate(t, "hour", 1));
+ 0 === n && (n = 86400);
+ for (var i = this._getWorkHours(t), r = 0; r < i.length; r++) {
+ var a = i[r];
+ if (e >= a.start && n <= a.end) return 60;
+ if (e < a.end && n > a.start) return (Math.min(n, a.end) - Math.max(e, a.start)) / 60
+ }
+ return 0
+ },
+ _getMinutesPerDay: function(t) {
+ var e = 0;
+ return this._getWorkHours(t).forEach(function(t) {
+ e += t.durationMinutes
+ }),
+ e
+ },
+ getHoursPerDay: function(t) {
+ var e = 0;
+ return this._getWorkHours(t).forEach(function(t) {
+ e += t.durationHours
+ }),
+ e
+ },
+ _getWorkUnitsForRange: function(t, e, n, i) {
+ var r, a = 0,
+ s = new Date(t),
+ l = new Date(e);
+ for (r = "minute" == n ? o.bind(this._getMinutesPerDay, this) : o.bind(this.getHoursPerDay, this); s.valueOf() < l.valueOf();) if (l - s > 27648e5 && 0 === s.getDate()) {
+ var c = this._largeUnitsCache.getMinutesPerMonth(s);
+ "hour" == n && (c /= 60),
+ a += c,
+ s = this.$gantt.date.add(s, 1, "month")
+ } else {
+ if (l - s > 13824e5) {
+ var u = this.$gantt.date.week_start(new Date(s));
+ if (s.valueOf() === u.valueOf()) {
+ c = this._largeUnitsCache.getMinutesPerWeek(s);
+ "hour" == n && (c /= 60),
+ a += c,
+ s = this.$gantt.date.add(s, 7, "day");
+ continue
+ }
+ }
+ a += r(s),
+ s = this._nextDate(s, "day", 1)
+ }
+ return a / i
+ },
+ _getMinutesBetweenSingleDay: function(t, e) {
+ for (var n = this._getIntervalTimestamp(t, e), i = this._getWorkHours(t), r = 0, a = 0; a < i.length; a++) {
+ var o = i[a];
+ if (n.end >= o.start && n.start <= o.end) {
+ var s = Math.max(o.start, n.start),
+ l = Math.min(o.end, n.end);
+ r += (l - s) / 60,
+ n.start = l
+ }
+ }
+ return Math.floor(r)
+ },
+ _getMinutesBetween: function(t, e, n, i) {
+ var r = new Date(t),
+ a = new Date(e);
+ i = i || 1;
+ var o = new Date(r),
+ s = this.$gantt.date.add(this.$gantt.date.day_start(new Date(r)), 1, "day");
+ if (a.valueOf() <= s.valueOf()) return this._getMinutesBetweenSingleDay(t, e);
+ var l = this.$gantt.date.day_start(new Date(a)),
+ c = a,
+ u = this._getMinutesBetweenSingleDay(o, s),
+ d = this._getMinutesBetweenSingleDay(l, c);
+ return u + this._getWorkUnitsForRange(s, l, n, i) + d
+ },
+ _getHoursBetween: function(t, e, n, i) {
+ var r = new Date(t),
+ a = new Date(e);
+ i = i || 1;
+ var o = new Date(r),
+ s = this.$gantt.date.add(this.$gantt.date.day_start(new Date(r)), 1, "day");
+ if (a.valueOf() <= s.valueOf()) return Math.round(this._getMinutesBetweenSingleDay(t, e) / 60);
+ var l = this.$gantt.date.day_start(new Date(a)),
+ c = a,
+ u = this._getMinutesBetweenSingleDay(o, s, n, i) / 60,
+ d = this._getMinutesBetweenSingleDay(l, c, n, i) / 60,
+ h = u + this._getWorkUnitsForRange(s, l, n, i) + d;
+ return Math.round(h)
+ },
+ getConfig: function() {
+ return this._worktime
+ },
+ _setConfig: function(t) {
+ this._worktime = t,
+ this._parseSettings(),
+ this._clearCaches()
+ },
+ _parseSettings: function() {
+ var t = this.getConfig();
+ for (var e in t.parsed = {
+ dates: {},
+ hours: null,
+ haveCustomWeeks: !1,
+ customWeeks: {},
+ customWeeksRangeStart: null,
+ customWeeksRangeEnd: null,
+ customWeeksBoundaries: []
+ },
+ t.parsed.hours = this._parseHours(t.hours), t.dates) t.parsed.dates[e] = this._parseHours(t.dates[e]);
+ if (t.customWeeks) {
+ var n = null,
+ i = null;
+ for (var e in t.customWeeks) {
+ var r = t.customWeeks[e];
+ if (r.from && r.to) {
+ var a = r.from,
+ o = r.to; (!n || n > a.valueOf()) && (n = a.valueOf()),
+ (!i || i < o.valueOf()) && (i = o.valueOf()),
+ t.parsed.customWeeksBoundaries.push({
+ from: a.valueOf(),
+ fromReadable: new Date(a),
+ to: o.valueOf(),
+ toReadable: new Date(o),
+ name: e
+ }),
+ t.parsed.haveCustomWeeks = !0;
+ var s = t.parsed.customWeeks[e] = {
+ from: r.from,
+ to: r.to,
+ hours: this._parseHours(r.hours),
+ dates: {}
+ };
+ for (var l in r.dates) s.dates[l] = this._parseHours(r.dates[l])
+ }
+ }
+ t.parsed.customWeeksRangeStart = n,
+ t.parsed.customWeeksRangeEnd = i
+ }
+ },
+ _tryChangeCalendarSettings: function(t) {
+ var e = JSON.stringify(this.getConfig());
+ return t(),
+ !!this.hasWorkTime() || (this._setConfig(JSON.parse(e)), this._clearCaches(), !1)
+ },
+ _arraysEqual: function(t, e) {
+ if (t === e) return ! 0;
+ if (!t || !e) return ! 1;
+ if (t.length != e.length) return ! 1;
+ for (var n = 0; n < t.length; ++n) if (t[n] !== e[n]) return ! 1;
+ return ! 0
+ },
+ _compareSettings: function(t, e) {
+ if (!this._arraysEqual(t.hours, e.hours)) return ! 1;
+ var n = Object.keys(t.dates),
+ i = Object.keys(e.dates);
+ if (n.sort(), i.sort(), !this._arraysEqual(n, i)) return ! 1;
+ for (var r = 0; r < n.length; r++) {
+ var a = n[r],
+ o = t.dates[a],
+ s = t.dates[a];
+ if (o !== s && !(Array.isArray(o) && Array.isArray(s) && this._arraysEqual(o, s))) return ! 1
+ }
+ return ! 0
+ },
+ equals: function(t) {
+ if (! (t instanceof l)) return ! 1;
+ var e = this.getConfig(),
+ n = t.getConfig();
+ if (!this._compareSettings(e, n)) return ! 1;
+ if (e.parsed.haveCustomWeeks && n.parsed.haveCustomWeeks) {
+ if (e.parsed.customWeeksBoundaries.length != n.parsed.customWeeksBoundaries.length) return ! 1;
+ for (var i in e.parsed.customWeeks) {
+ var r = e.parsed.customWeeks[i],
+ a = n.parsed.customWeeks[i];
+ if (!a) return ! 1;
+ if (!this._compareSettings(r, a)) return ! 1
+ }
+ } else if (e.parse.haveCustomWeeks !== n.parsed.haveCustomWeeks) return ! 1;
+ return ! 0
+ },
+ getWorkHours: function() {
+ var t = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments);
+ return this._getWorkHours(t.date, !1)
+ },
+ _getWorkHours: function(t, e) {
+ var n = this.getConfig();
+ if (!1 !== e && (n = n.parsed), !t) return n.hours;
+ var i = this._timestamp({
+ date: t
+ });
+ if (n.haveCustomWeeks && n.customWeeksRangeStart <= i && n.customWeeksRangeEnd > i) for (var r = 0; r < n.customWeeksBoundaries.length; r++) if (n.customWeeksBoundaries[r].from <= i && n.customWeeksBoundaries[r].to > i) {
+ n = n.customWeeks[n.customWeeksBoundaries[r].name];
+ break
+ }
+ var a = !0;
+ return void 0 !== n.dates[i] ? a = n.dates[i] : void 0 !== n.dates[t.getDay()] && (a = n.dates[t.getDay()]),
+ !0 === a ? n.hours: a || []
+ },
+ _getIntervalTimestamp: function(t, e) {
+ var n = {
+ start: 0,
+ end: 0
+ };
+ n.start = 60 * t.getHours() * 60 + 60 * t.getMinutes() + t.getSeconds();
+ var i = e.getHours();
+ return ! i && !e.getMinutes() && !e.getSeconds() && t.valueOf() < e.valueOf() && (i = 24),
+ n.end = 60 * i * 60 + 60 * e.getMinutes() + e.getSeconds(),
+ n
+ },
+ _parseHours: function(t) {
+ if (Array.isArray(t)) {
+ var e = [];
+ t.forEach(function(t) {
+ "number" == typeof t ? e.push(60 * t * 60) : "string" == typeof t && t.split("-").map(function(t) {
+ return t.trim()
+ }).forEach(function(t) {
+ var n = t.split(":").map(function(t) {
+ return t.trim()
+ }),
+ i = parseInt(60 * n[0] * 60);
+ n[1] && (i += parseInt(60 * n[1])),
+ n[2] && (i += parseInt(n[2])),
+ e.push(i)
+ })
+ });
+ for (var n = [], i = 0; i < e.length; i += 2) {
+ var r = e[i],
+ a = e[i + 1],
+ o = a - r;
+ n.push({
+ start: r,
+ end: a,
+ startHour: Math.floor(r / 3600),
+ startMinute: Math.floor(r / 60),
+ endHour: Math.ceil(a / 3600),
+ endMinute: Math.ceil(a / 60),
+ durationSeconds: o,
+ durationMinutes: o / 60,
+ durationHours: o / 3600
+ })
+ }
+ return n
+ }
+ return t
+ },
+ setWorkTime: function(t) {
+ return this._tryChangeCalendarSettings(o.bind(function() {
+ var e = void 0 === t.hours || t.hours,
+ n = this._timestamp(t),
+ r = this.getConfig();
+ if (null !== n ? r.dates[n] = e: t.customWeeks || (r.hours = e), t.customWeeks) if (r.customWeeks || (r.customWeeks = {}), "string" == typeof t.customWeeks) null !== n ? r.customWeeks[t.customWeeks].dates[n] = e: t.customWeeks || (r.customWeeks[t.customWeeks].hours = e);
+ else if ("object" === i(t.customWeeks) && "function Object() { [native code] }" === Function.prototype.toString.call(t.customWeeks.constructor)) for (var a in t.customWeeks) r.customWeeks[a] = t.customWeeks[a];
+ this._parseSettings(),
+ this._clearCaches()
+ },
+ this))
+ },
+ unsetWorkTime: function(t) {
+ return this._tryChangeCalendarSettings(o.bind(function() {
+ if (t) {
+ var e = this._timestamp(t);
+ null !== e && delete this.getConfig().dates[e]
+ } else this.reset_calendar();
+ this._parseSettings(),
+ this._clearCaches()
+ },
+ this))
+ },
+ _isWorkTime: function(t, e) {
+ var n = -1,
+ i = null;
+ return i = String(t.valueOf()),
+ -1 == (n = this._workingUnitsCache.getItem(e, i, t)) && (n = this._checkIfWorkingUnit(t, e), this._workingUnitsCache.setItem(e, i, n, t)),
+ n
+ },
+ isWorkTime: function() {
+ var t = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ return this._isWorkTime(t.date, t.unit)
+ },
+ calculateDuration: function() {
+ var t = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);
+ if (!t.unit) return ! 1;
+ var e = this;
+ return this._dateDurationCache.getDuration(t.start_date, t.end_date, t.unit, t.step,
+ function() {
+ return e._calculateDuration(t.start_date, t.end_date, t.unit, t.step)
+ })
+ },
+ _calculateDuration: function(t, e, n, i) {
+ var r = 0,
+ a = 1;
+ if (t.valueOf() > e.valueOf()) {
+ var o = e;
+ e = t,
+ t = o,
+ a = -1
+ }
+ return r = "hour" == n && 1 == i ? this._getHoursBetween(t, e, n, i) : "minute" == n && 1 == i ? this._getMinutesBetween(t, e, n, i) : this._getWorkUnitsBetweenGeneric(t, e, n, i),
+ a * Math.round(r)
+ },
+ hasDuration: function() {
+ var t = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments),
+ e = t.start_date,
+ n = t.end_date,
+ i = t.unit,
+ r = t.step;
+ if (!i) return ! 1;
+ var a = new Date(e),
+ o = new Date(n);
+ for (r = r || 1; a.valueOf() < o.valueOf();) {
+ if (this._isWorkTime(a, i)) return ! 0;
+ a = this._nextDate(a, i, r)
+ }
+ return ! 1
+ },
+ calculateEndDate: function() {
+ var t = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments),
+ e = t.start_date,
+ n = t.duration,
+ i = t.unit,
+ r = t.step;
+ if (!i) return ! 1;
+ var a = t.duration >= 0 ? 1 : -1;
+ n = Math.abs(1 * n);
+ var o = this;
+ return this._dateDurationCache.getEndDate(e, n, i, r * a,
+ function() {
+ return o._calculateEndDate(e, n, i, r * a)
+ })
+ },
+ _calculateEndDate: function(t, e, n, i) {
+ return !! n && (1 == i && "minute" == n ? this._calculateMinuteEndDate(t, e, i) : -1 == i && "minute" == n ? this._subtractMinuteDate(t, e, i) : 1 == i && "hour" == n ? this._calculateHourEndDate(t, e, i) : this._addInterval(t, e, n, i, null).end)
+ },
+ _addInterval: function(t, e, n, i, r) {
+ for (var a = 0,
+ o = t,
+ s = !1; a < e && (!r || !r(o));) {
+ var l = this._nextDate(o, n, i);
+ "day" == n && (s = s || !o.getHours() && l.getHours()) && (l.setHours(0), l.getHours() || (s = !1));
+ var c = new Date(l.valueOf() + 1);
+ i > 0 && (c = new Date(l.valueOf() - 1)),
+ this._isWorkTime(c, n) && !s && a++,
+ o = l
+ }
+ return {
+ end: o,
+ start: t,
+ added: a
+ }
+ },
+ _addHoursUntilDayEnd: function(t, e) {
+ for (var n = this.$gantt.date.add(this.$gantt.date.day_start(new Date(t)), 1, "day"), i = 0, r = e, a = this._getIntervalTimestamp(t, n), o = this._getWorkHours(t), s = 0; s < o.length && i < e; s++) {
+ var l = o[s];
+ if (a.end >= l.start && a.start <= l.end) {
+ var c = Math.max(l.start, a.start),
+ u = Math.min(l.end, a.end),
+ d = (u - c) / 3600;
+ d > r && (d = r, u = c + 60 * r * 60);
+ var h = Math.round((u - c) / 3600);
+ i += h,
+ r -= h,
+ a.start = u
+ }
+ }
+ var f = n;
+ return i === e && (f = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 0, 0, a.start)),
+ {
+ added: i,
+ end: f
+ }
+ },
+ _calculateHourEndDate: function(t, e, n) {
+ var i = new Date(t),
+ r = 0;
+ n = n || 1,
+ e = Math.abs(1 * e);
+ var a = this._addHoursUntilDayEnd(i, e);
+ if (r = a.added, i = a.end, c = e - r) {
+ for (var o = i; r < e;) {
+ var s = this._nextDate(o, "day", n);
+ s.setHours(0),
+ s.setMinutes(0),
+ s.setSeconds(0);
+ var l = 0;
+ if (r + (l = n > 0 ? this.getHoursPerDay(new Date(s.valueOf() - 1)) : this.getHoursPerDay(new Date(s.valueOf() + 1))) >= e) break;
+ r += l,
+ o = s
+ }
+ i = o
+ }
+ if (r < e) {
+ var c = e - r;
+ i = (a = this._addHoursUntilDayEnd(i, c)).end
+ }
+ return i
+ },
+ _addMinutesUntilHourEnd: function(t, e) {
+ if (0 === t.getMinutes()) return {
+ added: 0,
+ end: new Date(t)
+ };
+ for (var n = this.$gantt.date.add(this.$gantt.date.hour_start(new Date(t)), 1, "hour"), i = 0, r = e, a = this._getIntervalTimestamp(t, n), o = this._getWorkHours(t), s = 0; s < o.length && i < e; s++) {
+ var l = o[s];
+ if (a.end >= l.start && a.start <= l.end) {
+ var c = Math.max(l.start, a.start),
+ u = Math.min(l.end, a.end),
+ d = (u - c) / 60;
+ d > r && (d = r, u = c + 60 * r);
+ var h = Math.round((u - c) / 60);
+ r -= h,
+ i += h,
+ a.start = u
+ }
+ }
+ var f = n;
+ return i === e && (f = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 0, 0, a.start)),
+ {
+ added: i,
+ end: f
+ }
+ },
+ _subtractMinutesUntilHourStart: function(t, e) {
+ for (var n = this.$gantt.date.hour_start(new Date(t)), i = 0, r = e, a = 60 * n.getHours() * 60 + 60 * n.getMinutes() + n.getSeconds(), o = 60 * t.getHours() * 60 + 60 * t.getMinutes() + t.getSeconds(), s = this._getWorkHours(t), l = s.length - 1; l >= 0 && i < e; l--) {
+ var c = s[l];
+ if (o > c.start && a <= c.end) {
+ var u = Math.min(o, c.end),
+ d = Math.max(a, c.start),
+ h = (u - d) / 60;
+ h > r && (h = r, d = u - 60 * r);
+ var f = Math.abs(Math.round((u - d) / 60));
+ r -= f,
+ i += f,
+ o = d
+ }
+ }
+ var _ = n;
+ return i === e && (_ = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 0, 0, o)),
+ {
+ added: i,
+ end: _
+ }
+ },
+ _subtractMinuteDate: function(t, e, n) {
+ var i = new Date(t),
+ r = 0;
+ n = n || -1,
+ e = Math.abs(1 * e),
+ e = Math.round(e);
+ var a = this._isMinutePrecision(i),
+ o = this._subtractMinutesUntilHourStart(i, e);
+ r += o.added,
+ i = o.end;
+ for (var s = 0,
+ l = [], c = 0; r < e;) {
+ var u = this.$gantt.date.day_start(new Date(i)),
+ d = !1;
+ i.valueOf() === u.valueOf() && (u = this.$gantt.date.add(u, -1, "day"), d = !0);
+ var h = new Date(u.getFullYear(), u.getMonth(), u.getDate(), 23, 59, 59, 999).valueOf();
+ h !== s && (l = this._getWorkHours(u), c = this._getMinutesPerDay(u), s = h);
+ var f = e - r,
+ _ = this._getTimeOfDayStamp(i, d);
+ if (l.length && c) if (l[l.length - 1].end <= _ && f > c) r += c,
+ i = this.$gantt.date.add(i, -1, "day");
+ else {
+ for (var g = !1,
+ p = null,
+ v = null,
+ m = l.length - 1; m >= 0; m--) if (l[m].start < _ - 1 && l[m].end >= _ - 1) {
+ g = !0,
+ p = l[m],
+ v = l[m - 1];
+ break
+ }
+ if (g) if (_ === p.end && f >= p.durationMinutes) r += p.durationMinutes,
+ i = this.$gantt.date.add(i, -p.durationMinutes, "minute");
+ else if (!a && f <= _ / 60 - p.startMinute) r += f,
+ i = this.$gantt.date.add(i, -f, "minute");
+ else if (a) f <= _ / 60 - p.startMinute ? (r += f, i = this.$gantt.date.add(i, -f, "minute")) : (r += _ / 60 - p.startMinute, i = v ? new Date(i.getFullYear(), i.getMonth(), i.getDate(), 0, 0, v.end) : this.$gantt.date.day_start(i));
+ else {
+ var y = this._getMinutesPerHour(i);
+ y <= f ? (r += y, i = this._nextDate(i, "hour", n)) : (r += (o = this._subtractMinutesUntilHourStart(i, f)).added, i = o.end)
+ } else if (0 === i.getHours() && 0 === i.getMinutes() && 0 === i.getSeconds()) {
+ if ((k = this._getClosestWorkTimePast(i, "hour")).valueOf() === i.valueOf()) {
+ var k = this.$gantt.date.add(i, -1, "day"),
+ b = this._getWorkHours(k);
+ if (b.length) {
+ var x = b[b.length - 1];
+ k.setSeconds(x.durationSeconds)
+ }
+ }
+ i = k
+ } else i = this._getClosestWorkTimePast(new Date(i - 1), "hour")
+ } else i = this.$gantt.date.add(i, -1, "day")
+ }
+ if (r < e) {
+ var w = e - r;
+ r += (o = this._subtractMinutesUntilHourStart(i, w)).added,
+ i = o.end
+ }
+ return i
+ },
+ _calculateMinuteEndDate: function(t, e, n) {
+ var i = new Date(t),
+ r = 0;
+ n = n || 1,
+ e = Math.abs(1 * e),
+ e = Math.round(e);
+ var a = this._addMinutesUntilHourEnd(i, e);
+ r += a.added,
+ i = a.end;
+ for (var o = 0,
+ s = [], l = 0, c = this._isMinutePrecision(i); r < e;) {
+ var u = this.$gantt.date.day_start(new Date(i)).valueOf();
+ u !== o && (s = this._getWorkHours(i), l = this._getMinutesPerDay(i), o = u);
+ var d = e - r,
+ h = this._getTimeOfDayStamp(i);
+ if (s.length && l) if (s[0].start >= h && d >= l) {
+ if (r += l, d == l) {
+ i = new Date(i.getFullYear(), i.getMonth(), i.getDate(), 0, 0, s[s.length - 1].end);
+ break
+ }
+ i = this.$gantt.date.add(i, 1, "day"),
+ i = this.$gantt.date.day_start(i)
+ } else {
+ for (var f = !1,
+ _ = null,
+ g = 0; g < s.length; g++) if (s[g].start <= h && s[g].end > h) {
+ f = !0,
+ _ = s[g];
+ break
+ }
+ if (f) if (h === _.start && d >= _.durationMinutes) r += _.durationMinutes,
+ i = this.$gantt.date.add(i, _.durationMinutes, "minute");
+ else if (d <= _.endMinute - h / 60) r += d,
+ i = this.$gantt.date.add(i, d, "minute");
+ else {
+ var p = this._getMinutesPerHour(i);
+ p <= d ? (r += p, i = c ? this.$gantt.date.add(i, p, "minute") : this._nextDate(i, "hour", n)) : (r += (a = this._addMinutesUntilHourEnd(i, d)).added, i = a.end)
+ } else i = this._getClosestWorkTimeFuture(i, "hour")
+ } else i = this.$gantt.date.add(this.$gantt.date.day_start(i), 1, "day")
+ }
+ if (r < e) {
+ var v = e - r;
+ r += (a = this._addMinutesUntilHourEnd(i, v)).added,
+ i = a.end
+ }
+ return i
+ },
+ getClosestWorkTime: function() {
+ var t = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ return this._getClosestWorkTime(t.date, t.unit, t.dir)
+ },
+ _getClosestWorkTime: function(t, e, n) {
+ var i = new Date(t);
+ if (this._isWorkTime(i, e)) return i;
+ if (i = this.$gantt.date[e + "_start"](i), "any" != n && n) i = "past" == n ? this._getClosestWorkTimePast(i, e) : this._getClosestWorkTimeFuture(i, e);
+ else {
+ var r = this._getClosestWorkTimeFuture(i, e),
+ a = this._getClosestWorkTimePast(i, e);
+ i = Math.abs(r - t) <= Math.abs(t - a) ? r: a
+ }
+ return i
+ },
+ _getClosestWorkTimeFuture: function(t, e) {
+ return this._getClosestWorkTimeGeneric(t, e, 1)
+ },
+ _getClosestWorkTimePast: function(t, e) {
+ var n = this._getClosestWorkTimeGeneric(t, e, -1);
+ return this.$gantt.date.add(n, 1, e)
+ },
+ _findClosestTimeInDay: function(t, e, n) {
+ var i = new Date(t),
+ r = null,
+ a = !1;
+ this._getWorkHours(i).length || (i = this._getClosestWorkTime(i, "day", e < 0 ? "past": "future"), e < 0 && (i = new Date(i.valueOf() - 1), a = !0), n = this._getWorkHours(i));
+ var o = this._getTimeOfDayStamp(i);
+ if (a && (o = this._getTimeOfDayStamp(new Date(i.valueOf() + 1), a)), e > 0) {
+ for (var s = 0; s < n.length; s++) if (n[s].start >= o) {
+ r = new Date(i.getFullYear(), i.getMonth(), i.getDate(), 0, 0, n[s].start);
+ break
+ }
+ } else for (s = n.length - 1; s >= 0; s--) {
+ if (n[s].end <= o) {
+ r = new Date(i.getFullYear(), i.getMonth(), i.getDate(), 0, 0, n[s].end);
+ break
+ }
+ if (n[s].end > o && n[s].start <= o) {
+ r = new Date(i.getFullYear(), i.getMonth(), i.getDate(), 0, 0, o);
+ break
+ }
+ }
+ return r
+ },
+ _getClosestWorkMinute: function(t, e, n) {
+ var i = new Date(t),
+ r = this._getWorkHours(i),
+ a = this._findClosestTimeInDay(i, n, r);
+ return a || (i = this.calculateEndDate(i, n, "day"), n > 0 ? i = this.$gantt.date.day_start(i) : (i = this.$gantt.date.day_start(i), i = this.$gantt.date.add(i, 1, "day"), i = new Date(i.valueOf() - 1)), r = this._getWorkHours(i), a = this._findClosestTimeInDay(i, n, r)),
+ n < 0 && (a = this.$gantt.date.add(a, -1, e)),
+ a
+ },
+ _getClosestWorkTimeGeneric: function(t, e, n) {
+ if ("hour" === e || "minute" === e) return this._getClosestWorkMinute(t, e, n);
+ for (var i = this._getUnitOrder(e), r = this.units[i - 1], a = t, o = 0; ! this._isWorkTime(a, e) && (!r || this._isWorkTime(a, r) || (a = n > 0 ? this._getClosestWorkTimeFuture(a, r) : this._getClosestWorkTimePast(a, r), !this._isWorkTime(a, e)));) {
+ if (++o > 3e3) return this.$gantt.assert(!1, "Invalid working time check"),
+ !1;
+ var s = a.getTimezoneOffset();
+ a = this.$gantt.date.add(a, n, e),
+ a = this.$gantt._correct_dst_change(a, s, n, e),
+ this.$gantt.date[e + "_start"] && (a = this.$gantt.date[e + "_start"](a))
+ }
+ return a
+ },
+ hasWorkTime: function() {
+ var t = this.getConfig(),
+ e = t.dates,
+ n = [];
+ for (var i in t.dates) Number(i) > 6 && n.push(Number(i));
+ var r = this._checkWorkHours(t.hours),
+ a = !1;
+ return [0, 1, 2, 3, 4, 5, 6].forEach(function(t) {
+ if (!a) {
+ var n = e[t]; ! 0 === n ? a = r: Array.isArray(n) && (a = this._checkWorkHours(n))
+ }
+ }.bind(this)),
+ a
+ },
+ _checkWorkHours: function(t) {
+ if (0 === t.length) return ! 1;
+ for (var e = !1,
+ n = 0; n < t.length; n += 2) t[n] !== t[n + 1] && (e = !0);
+ return e
+ },
+ _isMinutePrecision: function(t) {
+ var e = !1;
+ return this._getWorkHours(t).forEach(function(t) { (t.startMinute % 60 || t.endMinute % 60) && (e = !0)
+ }),
+ e
+ }
+ },
+ t.exports = l
+ },
+ function(t, e, n) {
+ var i = n(0);
+ function r() {}
+ r.prototype = {
+ _getIntervals: function(t) {
+ for (var e = [], n = 0; n < t.length; n += 2) e.push({
+ start: t[n],
+ end: t[n + 1]
+ });
+ return e
+ },
+ _toHoursArray: function(t) {
+ var e = [];
+ function n(t) {
+ var e = Math.floor(t / 3600),
+ n = t - 60 * e * 60;
+ return e + ":" +
+ function(t) {
+ var e = String(t);
+ return e.length < 2 && (e = "0" + e),
+ e
+ } (Math.floor(n / 60))
+ }
+ for (var i = 0; i < t.length; i++) e.push(n(t[i].start) + "-" + n(t[i].end));
+ return e
+ },
+ _intersectHourRanges: function(t, e) {
+ var n = [],
+ i = t.length > e.length ? t: e,
+ r = t === i ? e: t;
+ i = i.slice(),
+ r = r.slice();
+ n = [];
+ for (var a = 0; a < i.length; a++) for (var o = i[a], s = 0; s < r.length; s++) {
+ var l = r[s];
+ l.start < o.end && l.end > o.start && (n.push({
+ start: Math.max(o.start, l.start),
+ end: Math.min(o.end, l.end)
+ }), o.end > l.end && (r.splice(s, 1), s--, a--))
+ }
+ return n
+ },
+ _mergeAdjacentIntervals: function(t) {
+ var e = t.slice();
+ e.sort(function(t, e) {
+ return t.start - e.start
+ });
+ for (var n = e[0], i = 1; i < e.length; i++) {
+ var r = e[i];
+ r.start <= n.end ? (r.end > n.end && (n.end = r.end), e.splice(i, 1), i--) : n = r
+ }
+ return e
+ },
+ _mergeHoursConfig: function(t, e) {
+ return this._mergeAdjacentIntervals(this._intersectHourRanges(t, e))
+ },
+ merge: function(t, e) {
+ var n = i.copy(t.getConfig().parsed),
+ r = i.copy(e.getConfig().parsed),
+ a = {
+ hours: this._toHoursArray(this._mergeHoursConfig(n.hours, r.hours)),
+ dates: {},
+ customWeeks: {}
+ };
+ for (var o in n.dates) {
+ var s = n.dates[o],
+ l = r.dates[o];
+ if (s && l) if (Array.isArray(s) || Array.isArray(l)) {
+ var c = Array.isArray(s) ? s: n.hours,
+ u = Array.isArray(l) ? l: r.hours;
+ a.dates[o] = this._toHoursArray(this._mergeHoursConfig(c, u))
+ } else a.dates[o] = !0;
+ else a.dates[o] = !1
+ }
+ if (n.customWeeks) for (var o in n.customWeeks) a.customWeeks[o] = n.customWeeks[o];
+ if (r.customWeeks) for (var o in r.customWeeks) a.customWeeks[o] = r.customWeeks[o];
+ return a
+ }
+ },
+ t.exports = r
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(42),
+ a = n(198),
+ o = n(197),
+ s = n(192),
+ l = n(191)();
+ function c(t) {
+ this.$gantt = t,
+ this._calendars = {},
+ this._legacyConfig = void 0,
+ this.$gantt.attachEvent("onGanttReady",
+ function() {
+ this.$gantt.config.resource_calendars && (this._isLegacyConfig = s.isLegacyResourceCalendarFormat(this.$gantt.config.resource_calendars))
+ }.bind(this)),
+ this.$gantt.attachEvent("onBeforeGanttReady",
+ function() {
+ this.createDefaultCalendars()
+ }.bind(this)),
+ this.$gantt.attachEvent("onBeforeGanttRender",
+ function() {
+ this.createDefaultCalendars()
+ }.bind(this))
+ }
+ c.prototype = {
+ _calendars: {},
+ _convertWorkTimeSettings: function(t) {
+ var e = t.days;
+ if (e && !t.dates) {
+ t.dates = t.dates || {};
+ for (var n = 0; n < e.length; n++) t.dates[n] = e[n],
+ e[n] instanceof Array || (t.dates[n] = !!e[n])
+ }
+ return delete t.days,
+ t
+ },
+ mergeCalendars: function() {
+ var t = [],
+ e = arguments;
+ if (Array.isArray(e[0])) t = e[0].slice();
+ else for (var n = 0; n < arguments.length; n++) t.push(arguments[n]);
+ var i, r = new a;
+ return t.forEach(function(t) {
+ i = i ? this._createCalendarFromConfig(r.merge(i, t)) : t
+ }.bind(this)),
+ this.createCalendar(i)
+ },
+ _createCalendarFromConfig: function(t) {
+ var e = new o(this.$gantt, r(this.$gantt));
+ e.id = String(i.uid());
+ var n = this._convertWorkTimeSettings(t);
+ if (n.customWeeks) for (var a in n.customWeeks) n.customWeeks[a] = this._convertWorkTimeSettings(n.customWeeks[a]);
+ return e._setConfig(n),
+ e
+ },
+ createCalendar: function(t) {
+ var e;
+ t || (t = {}),
+ e = t.getConfig ? i.copy(t.getConfig()) : t.worktime ? i.copy(t.worktime) : i.copy(t);
+ var n = i.copy(this.defaults.fulltime.worktime);
+ return i.mixin(e, n),
+ this._createCalendarFromConfig(e)
+ },
+ getCalendar: function(t) {
+ t = t || "global";
+ var e = this._calendars[t];
+ return e || (this.createDefaultCalendars(), e = this._calendars[t]),
+ e
+ },
+ getCalendars: function() {
+ var t = [];
+ for (var e in this._calendars) t.push(this.getCalendar(e));
+ return t
+ },
+ _getOwnCalendar: function(t) {
+ var e = this.$gantt.config;
+ if (t[e.calendar_property]) return this.getCalendar(t[e.calendar_property]);
+ if (e.resource_calendars) {
+ var n;
+ if (n = !1 === this._legacyConfig ? e.resource_property: s.getResourceProperty(e), Array.isArray(t[n])) e.dynamic_resource_calendars && (i = l.getCalendarIdFromMultipleResources(t[n], this));
+ else if (void 0 === this._legacyConfig && (this._legacyConfig = s.isLegacyResourceCalendarFormat(e.resource_calendars)), this._legacyConfig) var i = s.getCalendarIdFromLegacyConfig(t, e.resource_calendars);
+ else if (n && t[n] && e.resource_calendars[t[n]]) var r = this.getResourceCalendar(t[n]);
+ if (i && (r = this.getCalendar(i)), r) return r
+ }
+ return null
+ },
+ getResourceCalendar: function(t) {
+ if (null === t || void 0 === t) return this.getCalendar();
+ var e = null;
+ e = "number" == typeof t || "string" == typeof t ? t: t.id || t.key;
+ var n = this.$gantt.config,
+ i = n.resource_calendars,
+ r = null;
+ if (i) {
+ if (void 0 === this._legacyConfig && (this._legacyConfig = s.isLegacyResourceCalendarFormat(n.resource_calendars)), this._legacyConfig) {
+ for (var a in i) if (i[a][e]) {
+ r = i[a][e];
+ break
+ }
+ } else r = i[e];
+ if (r) return this.getCalendar(r)
+ }
+ return this.getCalendar()
+ },
+ getTaskCalendar: function(t) {
+ var e, n = this.$gantt;
+ if (null === t || void 0 === t) return this.getCalendar();
+ if (! (e = "number" != typeof t && "string" != typeof t || !n.isTaskExists(t) ? t: n.getTask(t))) return this.getCalendar();
+ var i = this._getOwnCalendar(e),
+ r = !!n.getState().group_mode;
+ if (!i && n.config.inherit_calendar && n.isTaskExists(e.parent)) {
+ for (var a = e; n.isTaskExists(a.parent) && (a = n.getTask(a.parent), !n.isSummaryTask(a) || !(i = this._getOwnCalendar(a))););
+ r && !i && t.$effective_calendar && (i = this.getCalendar(t.$effective_calendar))
+ }
+ return i || this.getCalendar()
+ },
+ addCalendar: function(t) {
+ if (!this.isCalendar(t)) {
+ var e = t.id; (t = this.createCalendar(t)).id = e
+ }
+ if (t._tryChangeCalendarSettings(function() {})) {
+ var n = this.$gantt.config;
+ return t.id = t.id || i.uid(),
+ this._calendars[t.id] = t,
+ n.worktimes || (n.worktimes = {}),
+ n.worktimes[t.id] = t.getConfig(),
+ t.id
+ }
+ return this.$gantt.callEvent("onCalendarError", [{
+ message: "Invalid calendar settings, no worktime available"
+ },
+ t]),
+ null
+ },
+ deleteCalendar: function(t) {
+ var e = this.$gantt.config;
+ return !! t && ( !! this._calendars[t] && (delete this._calendars[t], e.worktimes && e.worktimes[t] && delete e.worktimes[t], !0))
+ },
+ restoreConfigCalendars: function(t) {
+ for (var e in t) if (!this._calendars[e]) {
+ var n = t[e],
+ i = this.createCalendar(n);
+ i.id = e,
+ this.addCalendar(i)
+ }
+ },
+ defaults: {
+ global: {
+ id: "global",
+ worktime: {
+ hours: [8, 12, 13, 17],
+ days: [0, 1, 1, 1, 1, 1, 0]
+ }
+ },
+ fulltime: {
+ id: "fulltime",
+ worktime: {
+ hours: [0, 24],
+ days: [1, 1, 1, 1, 1, 1, 1]
+ }
+ }
+ },
+ createDefaultCalendars: function() {
+ var t = this.$gantt.config;
+ this.restoreConfigCalendars(this.defaults),
+ this.restoreConfigCalendars(t.worktimes)
+ },
+ isCalendar: function(t) {
+ return [t.isWorkTime, t.setWorkTime, t.getWorkHours, t.unsetWorkTime, t.getClosestWorkTime, t.calculateDuration, t.hasDuration, t.calculateEndDate].every(function(t) {
+ return t instanceof Function
+ })
+ }
+ },
+ t.exports = c
+ },
+ function(t, e, n) {
+ var i = n(199),
+ r = n(190),
+ a = n(188),
+ o = n(0);
+ t.exports = function(t) {
+ var e = new i(t),
+ n = new r(e),
+ s = a.create(e, n);
+ o.mixin(t, s)
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(2);
+ t.exports = function(t) {
+ function e(e) {
+ throw t.assert(!1, "Can't parse data: incorrect value of gantt.parse or gantt.load method. Actual argument value: " + JSON.stringify(e)),
+ new Error("Invalid argument for gantt.parse or gantt.load. An object or a JSON string of format https://docs.dhtmlx.com/gantt/desktop__supported_data_formats.html#json is expected. Actual argument value: " + JSON.stringify(e))
+ }
+ t.load = function(e, n, i) {
+ this._load_url = e,
+ this.assert(arguments.length, "Invalid load arguments");
+ var r = "json",
+ a = null;
+ return arguments.length >= 3 ? (r = n, a = i) : "string" == typeof arguments[1] ? r = arguments[1] : "function" == typeof arguments[1] && (a = arguments[1]),
+ this._load_type = r,
+ this.callEvent("onLoadStart", [e, r]),
+ this.ajax.get(e, t.bind(function(t) {
+ this.on_load(t, r),
+ this.callEvent("onLoadEnd", [e, r]),
+ "function" == typeof a && a.call(this)
+ },
+ this))
+ },
+ t.parse = function(t, e) {
+ this.on_load({
+ xmlDoc: {
+ responseText: t
+ }
+ },
+ e)
+ },
+ t.serialize = function(t) {
+ return this[t = t || "json"].serialize()
+ },
+ t.on_load = function(e, n) {
+ if (e.xmlDoc && 404 === e.xmlDoc.status) this.assert(!1, "Failed to load the data from <a href='" + e.xmlDoc.responseURL + "' target='_blank'>" + e.xmlDoc.responseURL + "</a>, server returns 404");
+ else if (!t.$destroyed) {
+ this.callEvent("onBeforeParse", []),
+ n || (n = "json"),
+ this.assert(this[n], "Invalid data type:'" + n + "'");
+ var i = e.xmlDoc.responseText,
+ r = this[n].parse(i, e);
+ this._process_loading(r)
+ }
+ },
+ t._process_loading = function(e) {
+ e.collections && this._load_collections(e.collections),
+ e.resources && this.$data.resourcesStore && this.$data.resourcesStore.parse(e.resources);
+ var n = e.data || e.tasks;
+ e.assignments &&
+ function(e, n) {
+ var i = {};
+ n.forEach(function(t) {
+ i[t.task_id] || (i[t.task_id] = []),
+ i[t.task_id].push(t)
+ }),
+ e.forEach(function(e) {
+ e[t.config.resource_property] = i[e.id] || []
+ })
+ } (n, e.assignments),
+ this.$data.tasksStore.parse(n);
+ var i = e.links || (e.collections ? e.collections.links: []);
+ this.$data.linksStore.parse(i),
+ this.callEvent("onParse", []),
+ this.render()
+ },
+ t._load_collections = function(t) {
+ var e = !1;
+ for (var n in t) if (t.hasOwnProperty(n)) {
+ e = !0;
+ var i = t[n];
+ this.serverList[n] = this.serverList[n] || [];
+ var r = this.serverList[n];
+ if (!r) continue;
+ r.splice(0, r.length);
+ for (var a = 0; a < i.length; a++) {
+ var o = i[a],
+ s = this.copy(o);
+ for (var l in s.key = s.value,
+ o) if (o.hasOwnProperty(l)) {
+ if ("value" == l || "label" == l) continue;
+ s[l] = o[l]
+ }
+ r.push(s)
+ }
+ }
+ e && this.callEvent("onOptionsLoad", [])
+ },
+ t.attachEvent("onBeforeTaskDisplay",
+ function(t, e) {
+ return ! e.$ignore
+ }),
+ t.json = {
+ parse: function(n) {
+ if (n || e(n), "string" == typeof n) if (void 0 != ("undefined" == typeof JSON ? "undefined": i(JSON))) try {
+ n = JSON.parse(n)
+ } catch(t) {
+ e(n)
+ } else t.assert(!1, "JSON is not supported");
+ return n.data || n.tasks || e(n),
+ n.dhx_security && (t.security_key = n.dhx_security),
+ n
+ },
+ serializeTask: function(t) {
+ return this._copyObject(t)
+ },
+ serializeLink: function(t) {
+ return this._copyLink(t)
+ },
+ _copyLink: function(t) {
+ var e = {};
+ for (var n in t) e[n] = t[n];
+ return e
+ },
+ _copyObject: function(e) {
+ var n = {};
+ for (var i in e)"$" != i.charAt(0) && (n[i] = e[i], r.isDate(n[i]) && (n[i] = t.defined(t.templates.xml_format) ? t.templates.xml_format(n[i]) : t.templates.format_date(n[i])));
+ return n
+ },
+ serialize: function() {
+ var e = [],
+ n = [];
+ t.eachTask(function(n) {
+ t.resetProjectDates(n),
+ e.push(this.serializeTask(n))
+ },
+ t.config.root_id, this);
+ for (var i = t.getLinks(), r = 0; r < i.length; r++) n.push(this.serializeLink(i[r]));
+ return {
+ data: e,
+ links: n
+ }
+ }
+ },
+ t.xml = {
+ _xmlNodeToJSON: function(t, e) {
+ for (var n = {},
+ i = 0; i < t.attributes.length; i++) n[t.attributes[i].name] = t.attributes[i].value;
+ if (!e) {
+ for (i = 0; i < t.childNodes.length; i++) {
+ var r = t.childNodes[i];
+ 1 == r.nodeType && (n[r.tagName] = r.firstChild ? r.firstChild.nodeValue: "")
+ }
+ n.text || (n.text = t.firstChild ? t.firstChild.nodeValue: "")
+ }
+ return n
+ },
+ _getCollections: function(e) {
+ for (var n = {},
+ i = t.ajax.xpath("//coll_options", e), r = 0; r < i.length; r++) for (var a = n[i[r].getAttribute("for")] = [], o = t.ajax.xpath(".//item", i[r]), s = 0; s < o.length; s++) {
+ for (var l = o[s].attributes, c = {
+ key: o[s].getAttribute("value"),
+ label: o[s].getAttribute("label")
+ },
+ u = 0; u < l.length; u++) {
+ var d = l[u];
+ "value" != d.nodeName && "label" != d.nodeName && (c[d.nodeName] = d.nodeValue)
+ }
+ a.push(c)
+ }
+ return n
+ },
+ _getXML: function(e, n, i) {
+ i = i || "data",
+ n.getXMLTopNode || (n = t.ajax.parse(n));
+ var r = t.ajax.xmltop(i, n.xmlDoc);
+ r && r.tagName == i ||
+ function(e) {
+ throw t.assert(!1, "Can't parse data: incorrect value of gantt.parse or gantt.load method. Actual argument value: " + JSON.stringify(e)),
+ new Error("Invalid argument for gantt.parse or gantt.load. An XML of format https://docs.dhtmlx.com/gantt/desktop__supported_data_formats.html#xmldhtmlxgantt20 is expected. Actual argument value: " + JSON.stringify(e))
+ } (e);
+ var a = r.getAttribute("dhx_security");
+ return a && (t.security_key = a),
+ r
+ },
+ parse: function(e, n) {
+ n = this._getXML(e, n);
+ for (var i = {},
+ r = i.data = [], a = t.ajax.xpath("//task", n), o = 0; o < a.length; o++) r[o] = this._xmlNodeToJSON(a[o]);
+ return i.collections = this._getCollections(n),
+ i
+ },
+ _copyLink: function(t) {
+ return "<item id='" + t.id + "' source='" + t.source + "' target='" + t.target + "' type='" + t.type + "' />"
+ },
+ _copyObject: function(t) {
+ return "<task id='" + t.id + "' parent='" + (t.parent || "") + "' start_date='" + t.start_date + "' duration='" + t.duration + "' open='" + !!t.open + "' progress='" + t.progress + "' end_date='" + t.end_date + "'><![CDATA[" + t.text + "]]></task>"
+ },
+ serialize: function() {
+ for (var e = [], n = [], i = t.json.serialize(), r = 0, a = i.data.length; r < a; r++) e.push(this._copyObject(i.data[r]));
+ for (r = 0, a = i.links.length; r < a; r++) n.push(this._copyLink(i.links[r]));
+ return "<data>" + e.join("") + "<coll_options for='links'>" + n.join("") + "</coll_options></data>"
+ }
+ },
+ t.oldxml = {
+ parse: function(e, n) {
+ n = t.xml._getXML(e, n, "projects");
+ for (var i = {
+ collections: {
+ links: []
+ }
+ },
+ r = i.data = [], a = t.ajax.xpath("//task", n), o = 0; o < a.length; o++) {
+ r[o] = t.xml._xmlNodeToJSON(a[o]);
+ var s = a[o].parentNode;
+ "project" == s.tagName ? r[o].parent = "project-" + s.getAttribute("id") : r[o].parent = s.parentNode.getAttribute("id")
+ }
+ a = t.ajax.xpath("//project", n);
+ for (o = 0; o < a.length; o++) { (l = t.xml._xmlNodeToJSON(a[o], !0)).id = "project-" + l.id,
+ r.push(l)
+ }
+ for (o = 0; o < r.length; o++) {
+ var l; (l = r[o]).start_date = l.startdate || l.est,
+ l.end_date = l.enddate,
+ l.text = l.name,
+ l.duration = l.duration / 8,
+ l.open = 1,
+ l.duration || l.end_date || (l.duration = 1),
+ l.predecessortasks && i.collections.links.push({
+ target: l.id,
+ source: l.predecessortasks,
+ type: t.config.links.finish_to_start
+ })
+ }
+ return i
+ },
+ serialize: function() {
+ t.message("Serialization to 'old XML' is not implemented")
+ }
+ },
+ t.serverList = function(t, e) {
+ return e ? this.serverList[t] = e.slice(0) : this.serverList[t] || (this.serverList[t] = []),
+ this.serverList[t]
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.isReadonly = function(e) {
+ return "number" != typeof e && "string" != typeof e || !t.isTaskExists(e) || (e = t.getTask(e)),
+ (!e || !e[this.config.editable_property]) && (e && e[this.config.readonly_property] || this.config.readonly)
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.getGridColumn = function(e) {
+ for (var n = t.config.columns,
+ i = 0; i < n.length; i++) if (n[i].name == e) return n[i];
+ return null
+ },
+ t.getGridColumns = function() {
+ return t.config.columns.slice()
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t(t) {
+ this._scrollOrder = 0;
+ var e = t.gantt,
+ n = t.grid,
+ i = t.dnd,
+ r = t.getCurrentX;
+ this.$gantt = e,
+ this.$grid = n,
+ this._dnd = i,
+ this.getCurrentX = r,
+ this._scrollView = this.$gantt.$ui.getView(this.$grid.$config.scrollX),
+ this.attachEvents()
+ }
+ return t.prototype.attachEvents = function() {
+ var t = this;
+ this.isScrollable() && (this._dnd.attachEvent("onDragMove",
+ function(e, n) {
+ var i = t.$grid.$grid.getBoundingClientRect(),
+ r = i.right,
+ a = i.left,
+ o = t.getCurrentX(n.clientX);
+ return o >= r - 20 && (t.autoscrollRight(), t.autoscrollStart()),
+ o <= a + 20 && (t.autoscrollLeft(), t.autoscrollStart()),
+ o < r - 20 && o > a + 20 && t.autoscrollStop(),
+ !0
+ }), this._dnd.attachEvent("onDragEnd",
+ function() {
+ t.autoscrollStop()
+ }))
+ },
+ t.prototype.autoscrollStart = function() {
+ var t = this;
+ if (0 !== this._scrollOrder) {
+ var e = 10 * this._scrollOrder,
+ n = this._scrollView.getScrollState();
+ this._scrollView.scrollTo(n.position + e),
+ setTimeout(function() {
+ t.autoscrollStart()
+ },
+ 50)
+ }
+ },
+ t.prototype.autoscrollRight = function() {
+ this._scrollOrder = 1
+ },
+ t.prototype.autoscrollLeft = function() {
+ this._scrollOrder = -1
+ },
+ t.prototype.autoscrollStop = function() {
+ this._scrollOrder = 0
+ },
+ t.prototype.getCorrection = function() {
+ return this.isScrollable() ? this._scrollView.getScrollState().position: 0
+ },
+ t.prototype.isScrollable = function() {
+ return !! this.$grid.$config.scrollable
+ },
+ t
+ } ();
+ e.
+ default = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(1),
+ r = n(204),
+ a = function() {
+ function t(t, e) {
+ var n = this;
+ this._targetMarker = null,
+ this.calculateCurrentPosition = function(t) {
+ var e = n.$grid.$grid.getBoundingClientRect(),
+ i = e.right,
+ r = e.left,
+ a = t;
+ return a > i && (a = i),
+ a < r && (a = r),
+ a
+ },
+ this.$gantt = t,
+ this.$grid = e
+ }
+ return t.prototype.init = function() {
+ var t = this.$gantt.$services.getService("dnd");
+ this._dnd = new t(this.$grid.$grid_scale, {
+ updates_per_second: 60
+ }),
+ this._scrollableGrid = new r.
+ default({
+ gantt:
+ this.$gantt,
+ grid: this.$grid,
+ dnd: this._dnd,
+ getCurrentX: this.calculateCurrentPosition
+ }),
+ this.attachEvents()
+ },
+ t.prototype.attachEvents = function() {
+ var t = this;
+ this._dnd.attachEvent("onBeforeDragStart",
+ function(e, n) {
+ if (t._draggedCell = t.$gantt.utils.dom.closest(n.target, ".gantt_grid_head_cell"), t._draggedCell) {
+ var i, r, a = t.$grid.$getConfig().columns,
+ o = t._draggedCell.getAttribute("data-column-id");
+ return a.map(function(t, e) {
+ t.name === o && (i = t, r = e)
+ }),
+ !1 === t.$grid.callEvent("onBeforeColumnDragStart", [{
+ draggedColumn: i,
+ draggedIndex: r
+ }]) ? !1 : !(!t._draggedCell || !i) && (t._gridConfig = t.$grid.$getConfig(), t._originAutoscroll = t.$gantt.config.autoscroll, t.$gantt.config.autoscroll = !1, !0)
+ }
+ }),
+ this._dnd.attachEvent("onAfterDragStart",
+ function(e, n) {
+ t._draggedCell && (t._dnd.config.column = t._draggedCell.getAttribute("data-column-id"), t._dnd.config.marker.innerHTML = t._draggedCell.outerHTML, t._dnd.config.marker.classList.add("gantt_column_drag_marker"), t._dnd.config.marker.style.height = t._gridConfig.scale_height + "px", t._dnd.config.marker.style.lineHeight = t._gridConfig.scale_height + "px", t._draggedCell.classList.add("gantt_grid_head_cell_dragged"))
+ }),
+ this._dnd.attachEvent("onDragMove",
+ function(e, n) {
+ if (t._draggedCell) {
+ t._dragX = n.clientX;
+ var i = t.calculateCurrentPosition(n.clientX),
+ r = t.findColumnsIndexes(),
+ a = r.targetIndex,
+ o = r.draggedIndex,
+ s = t.$grid.$getConfig().columns,
+ l = s[o],
+ c = s[a];
+ return ! 1 === t.$grid.callEvent("onColumnDragMove", [{
+ draggedColumn: l,
+ targetColumn: c,
+ draggedIndex: o,
+ targetIndex: a
+ }]) ? (t.cleanTargetMarker(), !1) : (t.setMarkerPosition(i), t.drawTargetMarker(r), !0)
+ }
+ }),
+ this._dnd.attachEvent("onDragEnd",
+ function() {
+ t._draggedCell && (t.$gantt.config.autoscroll = t._originAutoscroll, t._draggedCell.classList.remove("gantt_grid_head_cell_dragged"), t.cleanTargetMarker(), t.reorderColumns())
+ })
+ },
+ t.prototype.reorderColumns = function() {
+ var t = this.findColumnsIndexes(),
+ e = t.targetIndex,
+ n = t.draggedIndex,
+ i = this.$grid.$getConfig().columns,
+ r = i[n],
+ a = i[e]; ! 1 !== this.$grid.callEvent("onBeforeColumnReorder", [{
+ draggedColumn: r,
+ targetColumn: a,
+ draggedIndex: n,
+ targetIndex: e
+ }]) && e !== n && (i.splice(n, 1), i.splice(e, 0, r), this.$gantt.render(), this.$grid.callEvent("onAfterColumnReorder", [{
+ draggedColumn: r,
+ targetColumn: a,
+ draggedIndex: n,
+ targetIndex: e
+ }]))
+ },
+ t.prototype.findColumnsIndexes = function() {
+ var t, e, n, i, r, a = this._dnd.config.column,
+ o = this.$grid.$getConfig().columns,
+ s = {
+ startX: 0,
+ endX: 0
+ },
+ l = 0,
+ c = o.length - 1,
+ u = function(t, e) {
+ return t <= e
+ },
+ d = function(t) {
+ return++t
+ };
+ this.$gantt.config.rtl && (l = o.length - 1, c = 0, u = function(t, e) {
+ return t >= e
+ },
+ d = function(t) {
+ return--t
+ });
+ for (var h = this._dragX - this.$grid.$grid.getBoundingClientRect().left + this._scrollableGrid.getCorrection(), f = l; u(f, c) && (void 0 === t || void 0 === e); f = d(f)) o[f].hide || (s.startX = s.endX, s.endX += o[f].width, h >= s.startX && (h <= s.endX || !u(d(f), c)) && (t = f, n = s.startX, i = s.endX, r = (h - s.startX) / (s.endX - s.startX)), a === o[f].name && (e = f));
+ return {
+ targetIndex: t,
+ draggedIndex: e,
+ xBefore: n,
+ xAfter: i,
+ columnRelativePos: r
+ }
+ },
+ t.prototype.setMarkerPosition = function(t, e) {
+ void 0 === e && (e = 10);
+ var n = this._dnd.config.marker,
+ i = this._dnd._obj.getBoundingClientRect();
+ n.style.top = i.y + e + "px",
+ n.style.left = t + "px"
+ },
+ t.prototype.drawTargetMarker = function(t) {
+ var e, n = t.targetIndex,
+ r = t.draggedIndex,
+ a = t.xBefore,
+ o = t.xAfter,
+ s = t.columnRelativePos;
+ this._targetMarker || (this._targetMarker = document.createElement("div"), i.addClassName(this._targetMarker, "gantt_grid_target_marker"), this._targetMarker.style.display = "none", this._targetMarker.style.height = this._gridConfig.scale_height + "px"),
+ this._targetMarker.parentNode || this.$grid.$grid_scale.appendChild(this._targetMarker),
+ e = n > r ? o: n < r ? a: s > .5 ? o: a,
+ this._targetMarker.style.left = e + "px",
+ this._targetMarker.style.display = "block"
+ },
+ t.prototype.cleanTargetMarker = function() {
+ this._targetMarker && this._targetMarker.parentNode && this.$grid.$grid_scale.removeChild(this._targetMarker),
+ this._targetMarker = null
+ },
+ t
+ } ();
+ e.ColumnsGridDnd = a
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(205);
+ e.
+ default = i.ColumnsGridDnd
+ },
+ function(t, e, n) {
+ var i = n(1);
+ t.exports = function(t, e) {
+ var n = {
+ row_before_start: t.bind(function(t, n, r) {
+ var a = e.$getConfig(),
+ o = e.$config.rowStore;
+ if (!i.locateAttribute(r, a.task_grid_row_resizer_attribute)) return ! 1;
+ var s = this.locate(r, a.task_grid_row_resizer_attribute),
+ l = o.getItem(s);
+ return ! 1 !== e.callEvent("onBeforeRowResize", [l]) && void 0
+ },
+ t),
+ row_after_start: t.bind(function(t, n, i) {
+ var r = e.$getConfig(),
+ a = this.locate(i, r.task_grid_row_resizer_attribute);
+ t.config.marker.innerHTML = "",
+ t.config.marker.className += " gantt_row_grid_resize_area",
+ t.config.marker.style.width = e.$grid.offsetWidth + "px",
+ t.config.drag_id = a
+ },
+ t),
+ row_drag_move: t.bind(function(t, n, r) {
+ var a = e.$config.rowStore,
+ o = e.$getConfig(),
+ s = t.config,
+ l = s.drag_id,
+ c = e.getItemHeight(l),
+ u = e.getItemTop(l),
+ d = i.getNodePosition(e.$grid_data),
+ h = parseInt(s.marker.style.top, 10),
+ f = u + d.y,
+ _ = 0,
+ g = o.min_task_grid_row_height;
+ return (_ = h - f) < g && (_ = g),
+ s.marker.style.left = d.x + "px",
+ s.marker.style.top = f - 1 + "px",
+ s.marker.style.height = Math.abs(_) + 1 + "px",
+ s.marker_height = _,
+ e.callEvent("onRowResize", [l, a.getItem(l), _ + c]),
+ !0
+ },
+ t),
+ row_drag_end: t.bind(function(n, i, r) {
+ var a = e.$config.rowStore,
+ o = n.config,
+ s = o.drag_id,
+ l = a.getItem(s),
+ c = e.getItemHeight(s),
+ u = o.marker_height; ! 1 !== e.callEvent("onBeforeRowResizeEnd", [s, l, u]) && l.row_height != u && (l.row_height = u, t.updateTask(s), e.callEvent("onAfterRowResize", [s, l, c, u]), this.render())
+ },
+ t)
+ };
+ return {
+ init: function() {
+ var i = t.$services.getService("dnd"),
+ r = e.$getConfig(),
+ a = new i(e.$grid_data, {
+ updates_per_second: 60
+ });
+ t.defined(r.dnd_sensitivity) && (a.config.sensitivity = r.dnd_sensitivity),
+ a.attachEvent("onBeforeDragStart",
+ function(t, e) {
+ return n.row_before_start(a, t, e)
+ }),
+ a.attachEvent("onAfterDragStart",
+ function(t, e) {
+ return n.row_after_start(a, t, e)
+ }),
+ a.attachEvent("onDragMove",
+ function(t, e) {
+ return n.row_drag_move(a, t, e)
+ }),
+ a.attachEvent("onDragEnd",
+ function(t, e) {
+ return n.row_drag_end(a, t, e)
+ })
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = -1,
+ n = -1;
+ return {
+ resetCache: function() {
+ e = -1,
+ n = -1
+ },
+ _getRowHeight: function() {
+ return - 1 === e && (e = t.$getConfig().row_height),
+ e
+ },
+ _refreshState: function() {
+ this.resetCache(),
+ n = !0;
+ var e = t.$config.rowStore;
+ if (e) for (var i = this._getRowHeight(), r = 0; r < e.fullOrder.length; r++) {
+ var a = e.getItem(e.fullOrder[r]);
+ if (a && a.row_height && a.row_height !== i) {
+ n = !1;
+ break
+ }
+ }
+ },
+ canUseSimpleCalculation: function() {
+ return - 1 === n && this._refreshState(),
+ n
+ },
+ getRowTop: function(e) {
+ return t.$config.rowStore ? e * this._getRowHeight() : 0
+ },
+ getItemHeight: function(t) {
+ return this._getRowHeight()
+ },
+ getTotalHeight: function() {
+ return t.$config.rowStore ? t.$config.rowStore.countVisible() * this._getRowHeight() : 0
+ },
+ getItemIndexByTopPosition: function(e) {
+ return t.$config.rowStore ? Math.floor(e / this._getRowHeight()) : 0
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t, e) {
+ return {
+ init: function() {},
+ doOnRender: function() {}
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(32);
+ t.exports = function(t) {
+ n(203)(t),
+ i.prototype.getGridColumns = function() {
+ for (var t = this.$getConfig().columns, e = [], n = 0; n < t.length; n++) t[n].hide || e.push(t[n]);
+ return e
+ }
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(47),
+ i = {};
+ t.attachEvent("onClearAll",
+ function() {
+ i = {}
+ });
+ var r = e.prototype.hasChild;
+ t.$data.tasksStore.hasChild = function(e) {
+ return t.config.branch_loading ? !!r.call(this, e) || !!this.exists(e) && this.getItem(e)[t.config.branch_loading_property] : r.call(this, e)
+ },
+ t.attachEvent("onTaskOpened",
+ function(e) {
+ if (t.config.branch_loading && t._load_url &&
+ function(e) {
+ return ! (!t.config.branch_loading || !t._load_url || i[e] || t.getChildren(e).length || !t.hasChild(e))
+ } (e)) {
+ var n = t._load_url,
+ r = (n = n.replace(/(\?|&)?parent_id=.+&?/, "")).indexOf("?") >= 0 ? "&": "?",
+ a = t.getScrollState().y || 0,
+ o = {
+ taskId: e,
+ url: n + r + "parent_id=" + encodeURIComponent(e)
+ };
+ if (!1 === t.callEvent("onBeforeBranchLoading", [o])) return;
+ t.load(o.url, this._load_type,
+ function() {
+ a && t.scrollTo(null, a),
+ t.callEvent("onAfterBranchLoading", [o])
+ }),
+ i[e] = !0
+ }
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ e.
+ default = function(t) {
+ t.ext = t.ext || {},
+ t.config.show_empty_state = !1,
+ t.ext.emptyStateElement = t.ext.emptyStateElement || {
+ isEnabled: function() {
+ return ! 0 === t.config.show_empty_state
+ },
+ isGanttEmpty: function() {
+ return ! t.getTaskByTime().length
+ },
+ renderContent: function(e) {
+ var n = "<div class='gantt_empty_state'><div class='gantt_empty_state_image'></div><div class='gantt_empty_state_text'>\n <div class='gantt_empty_state_text_link' data-empty-state-create-task>" + t.locale.labels.empty_state_text_link + "</div>\n <div class='gantt_empty_state_text_description'>" + t.locale.labels.empty_state_text_description + "</div>\n </div></div>";
+ e.innerHTML = n
+ },
+ clickEvents: [],
+ attachAddTaskEvent: function() {
+ var e = t.attachEvent("onEmptyClick",
+ function(e) {
+ t.utils.dom.closest(e.target, "[data-empty-state-create-task]") && t.createTask({
+ id: t.uid(),
+ text: "New Task"
+ })
+ });
+ this.clickEvents.push(e)
+ },
+ detachAddTaskEvents: function() {
+ this.clickEvents.forEach(function(e) {
+ t.detachEvent(e)
+ }),
+ this.clickEvents = []
+ },
+ getContainer: function() {
+ if (t.$container) {
+ var e = t.utils.dom;
+ if (t.$container.contains(t.$grid_data)) return e.closest(t.$grid_data, ".gantt_layout_content");
+ if (t.$container.contains(t.$task_data)) return e.closest(t.$task_data, ".gantt_layout_content")
+ }
+ return null
+ },
+ getNode: function() {
+ var t = this.getContainer();
+ return t ? t.querySelector(".gantt_empty_state_wrapper") : null
+ },
+ show: function() {
+ var e = this.getContainer();
+ if (!e && this.isGanttEmpty()) return null;
+ var n = document.createElement("div");
+ n.className = "gantt_empty_state_wrapper",
+ n.style.marginTop = t.config.scale_height - e.offsetHeight + "px";
+ var i = t.$container.querySelectorAll(".gantt_empty_state_wrapper");
+ Array.prototype.forEach.call(i,
+ function(t) {
+ t.parentNode.removeChild(t)
+ }),
+ this.detachAddTaskEvents(),
+ this.attachAddTaskEvent(),
+ e.appendChild(n),
+ this.renderContent(n)
+ },
+ hide: function() {
+ var t = this.getNode();
+ if (!t) return ! 1;
+ t.parentNode.removeChild(t)
+ },
+ init: function() {}
+ },
+ t.attachEvent("onDataRender",
+ function() {
+ var e = t.ext.emptyStateElement;
+ e.isEnabled() && e.isGanttEmpty() ? e.show() : e.hide()
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t(t) {
+ var e = this;
+ this.format = function(t) {
+ return e._getWBSCode(t.source)
+ },
+ this.canParse = function(t) {
+ return e._linkReg.test(t)
+ },
+ this.parse = function(t) {
+ if (!e.canParse(t)) return null;
+ var n = e._linkReg.exec(t)[0].trim();
+ return {
+ id: void 0,
+ source: e._findSource(n) || null,
+ target: null,
+ type: e._gantt.config.links.finish_to_start,
+ lag: 0
+ }
+ },
+ this._getWBSCode = function(t) {
+ var n = e._gantt.getTask(t);
+ return e._gantt.getWBSCode(n)
+ },
+ this._findSource = function(t) {
+ var n = new RegExp("^[0-9.]+", "i");
+ if (n.exec(t)) {
+ var i = n.exec(t)[0],
+ r = e._gantt.getTaskByWBSCode(i);
+ if (r) return r.id
+ }
+ return null
+ },
+ this._linkReg = /^[0-9\.]+/,
+ this._gantt = t
+ }
+ return t.create = function(e, n) {
+ return void 0 === e && (e = null),
+ new t(n)
+ },
+ t
+ } ();
+ e.
+ default = i
+ },
+ function(t, e, n) {
+ var i = n(44).
+ default,
+ r = n(213).
+ default;
+ t.exports = function(t) {
+ t.ext.formatters = {
+ durationFormatter: function(e) {
+ return e || (e = {}),
+ e.store || (e.store = t.config.duration_unit),
+ e.enter || (e.enter = t.config.duration_unit),
+ i.create(e, t)
+ },
+ linkFormatter: function(e) {
+ return r.create(e, t)
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ function e(e) {
+ return function() {
+ return ! t.config.auto_types || t.getTaskType(t.config.types.project) != t.config.types.project || e.apply(this, arguments)
+ }
+ }
+ function n(e, n) {
+ var i = t.getTask(e),
+ r = a(i); ! 1 !== r && t.getTaskType(i) !== r && (n.$needsUpdate = !0, n[i.id] = {
+ task: i,
+ type: r
+ })
+ }
+ function i(e) {
+ if (!t.getState().group_mode) {
+ var i = function(e, i) {
+ return n(e, i = i || {}),
+ t.eachParent(function(t) {
+ n(t.id, i)
+ },
+ e),
+ i
+ } (e);
+ i.$needsUpdate && t.batchUpdate(function() { !
+ function(e) {
+ for (var n in e) if (e[n] && e[n].task) {
+ var i = e[n].task;
+ i.type = e[n].type,
+ t.updateTask(i.id)
+ }
+ } (i)
+ })
+ }
+ }
+ var r;
+ function a(e) {
+ var n = t.config.types,
+ i = t.hasChild(e.id),
+ r = t.getTaskType(e.type);
+ return i && r === n.task ? n.project: !i && r === n.project && n.task
+ }
+ var o, s, l = !0;
+ function c(e) {
+ e != t.config.root_id && t.isTaskExists(e) && i(e)
+ }
+ t.attachEvent("onParse", e(function() {
+ l = !1,
+ t.getState().group_mode || (t.batchUpdate(function() {
+ t.eachTask(function(e) {
+ var n = a(e); ! 1 !== n &&
+ function(e, n) {
+ t.getState().group_mode || (e.type = n, t.updateTask(e.id))
+ } (e, n)
+ })
+ }), l = !0)
+ })),
+ t.attachEvent("onAfterTaskAdd", e(function(t) {
+ l && i(t)
+ })),
+ t.attachEvent("onAfterTaskUpdate", e(function(t) {
+ l && i(t)
+ })),
+ t.attachEvent("onBeforeTaskDelete", e(function(e, n) {
+ return r = t.getParent(e),
+ !0
+ })),
+ t.attachEvent("onAfterTaskDelete", e(function(t, e) {
+ c(r)
+ })),
+ t.attachEvent("onRowDragStart", e(function(e, n, i) {
+ return o = t.getParent(e),
+ !0
+ })),
+ t.attachEvent("onRowDragEnd", e(function(t, e) {
+ c(o),
+ i(t)
+ })),
+ t.attachEvent("onBeforeTaskMove", e(function(e, n, i) {
+ return s = t.getParent(e),
+ !0
+ })),
+ t.attachEvent("onAfterTaskMove", e(function(t, e, n) {
+ document.querySelector(".gantt_drag_marker") || (c(s), i(t))
+ }))
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ function e(e) {
+ return function() {
+ return ! t.config.placeholder_task || e.apply(this, arguments)
+ }
+ }
+ function n() {
+ var e = t.getTaskBy("type", t.config.types.placeholder);
+ if (!e.length || !t.isTaskExists(e[0].id)) {
+ var n = {
+ unscheduled: !0,
+ type: t.config.types.placeholder,
+ duration: 0,
+ text: t.locale.labels.new_task
+ };
+ if (!1 === t.callEvent("onTaskCreated", [n])) return;
+ t.addTask(n)
+ }
+ }
+ function i(e) {
+ var n = t.getTask(e);
+ n.type == t.config.types.placeholder && (n.start_date && n.end_date && n.unscheduled && (n.unscheduled = !1), t.batchUpdate(function() {
+ var e = t.copy(n);
+ t.silent(function() {
+ t.deleteTask(n.id)
+ }),
+ delete e["!nativeeditor_status"],
+ e.type = t.config.types.task,
+ e.id = t.uid(),
+ t.addTask(e)
+ }))
+ }
+ t.config.types.placeholder = "placeholder",
+ t.attachEvent("onDataProcessorReady", e(function(n) {
+ n && !n._silencedPlaceholder && (n._silencedPlaceholder = !0, n.attachEvent("onBeforeUpdate", e(function(e, i, r) {
+ return r.type != t.config.types.placeholder || (n.setUpdated(e, !1), !1)
+ })))
+ }));
+ var r = !1;
+ function a(e) {
+ if (t.config.types.placeholder && t.isTaskExists(e) && t.getTask(e).type == t.config.types.placeholder) return ! 0;
+ return ! 1
+ }
+ function o(t) {
+ return ! (!a(t.source) && !a(t.target))
+ }
+ t.attachEvent("onGanttReady",
+ function() {
+ r || (r = !0, t.attachEvent("onAfterTaskUpdate", e(i)), t.attachEvent("onAfterTaskAdd", e(function(e, i) {
+ i.type != t.config.types.placeholder && (t.getTaskBy("type", t.config.types.placeholder).forEach(function(e) {
+ t.silent(function() {
+ t.isTaskExists(e.id) && t.deleteTask(e.id)
+ })
+ }), n())
+ })), t.attachEvent("onParse", e(n)))
+ }),
+ t.attachEvent("onLinkValidation",
+ function(t) {
+ return ! o(t)
+ }),
+ t.attachEvent("onBeforeLinkAdd",
+ function(t, e) {
+ return ! o(e)
+ }),
+ t.attachEvent("onBeforeUndoStack",
+ function(e) {
+ for (var n = 0; n < e.commands.length; n++) {
+ var i = e.commands[n];
+ "task" === i.entity && i.value.type === t.config.types.placeholder && (e.commands.splice(n, 1), n--)
+ }
+ return ! 0
+ })
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = "$resourceAssignments";
+ t.config.resource_assignment_store = "resourceAssignments",
+ t.config.process_resource_assignments = !0;
+ var n = {
+ auto: "auto",
+ singleValue: "singleValue",
+ valueArray: "valueArray",
+ resourceValueArray: "resourceValueArray",
+ assignmentsArray: "assignmentsArray"
+ },
+ i = n.auto,
+ r = {
+ fixedDates: "fixedDates",
+ fixedDuration: "fixedDuration",
+ default:
+ "default"
+ };
+ function a(e, n) {
+ e.start_date ? e.start_date = t.date.parseDate(e.start_date, "parse_date") : e.start_date = null,
+ e.end_date ? e.end_date = t.date.parseDate(e.end_date, "parse_date") : e.end_date = null;
+ var i = Number(e.delay),
+ a = !1;
+ if (isNaN(i) ? (e.delay = 0, a = !0) : e.delay = i, t.defined(e.value) || (e.value = null), !e.task_id || !e.resource_id) return ! 1;
+ if (e.mode = e.mode || r.
+ default, e.mode === r.fixedDuration && (isNaN(Number(e.duration)) && (n = n || t.getTask(e.task_id), e.duration = t.calculateDuration({
+ start_date: e.start_date,
+ end_date: e.end_date,
+ id: n
+ })), a && (n = n || t.getTask(e.task_id), e.delay = t.calculateDuration({
+ start_date: n.start_date,
+ end_date: e.start_date,
+ id: n
+ }))), e.mode !== r.fixedDates && (n || t.isTaskExists(e.task_id))) {
+ var o = s(e, n = n || t.getTask(e.task_id));
+ e.start_date = o.start_date,
+ e.end_date = o.end_date,
+ e.duration = o.duration
+ }
+ }
+ var o = t.createDatastore({
+ name: t.config.resource_assignment_store,
+ initItem: function(e) {
+ return e.id || (e.id = t.uid()),
+ a(e),
+ e
+ }
+ });
+ function s(e, n) {
+ if (e.mode === r.fixedDates) return {
+ start_date: e.start_date,
+ end_date: e.end_date,
+ duration: e.duration
+ };
+ var i, a, o = e.delay ? t.calculateEndDate({
+ start_date: n.start_date,
+ duration: e.delay,
+ task: n
+ }) : new Date(n.start_date);
+ return e.mode === r.fixedDuration ? (i = t.calculateEndDate({
+ start_date: o,
+ duration: e.duration,
+ task: n
+ }), a = e.duration) : (i = new Date(n.end_date), a = n.duration - e.delay),
+ {
+ start_date: o,
+ end_date: i,
+ duration: a
+ }
+ }
+ function l(e) {
+ var o = t.config.resource_property,
+ s = e[o],
+ l = [],
+ c = i === n.auto;
+ if (t.defined(s) && s) {
+ Array.isArray(s) || (s = [s], c && (i = n.singleValue, c = !1));
+ var u = {};
+ s.forEach(function(o) {
+ o.resource_id || (o = {
+ resource_id: o
+ },
+ c && (i = n.valueArray, c = !1)),
+ c && (o.id && o.resource_id ? (i = n.assignmentsArray, c = !1) : (i = n.resourceValueArray, c = !1));
+ var s, d = r.
+ default;
+ o.mode || (o.start_date && o.end_date || o.start_date && o.duration) && (d = r.fixedDuration),
+ s = o.id || !o.$id || u[o.$id] ? o.id && !u[o.id] ? o.id: t.uid() : o.$id,
+ u[s] = !0;
+ var h = {
+ id: s,
+ start_date: o.start_date,
+ duration: o.duration,
+ end_date: o.end_date,
+ delay: o.delay,
+ task_id: e.id,
+ resource_id: o.resource_id,
+ value: o.value,
+ mode: o.mode || d
+ };
+ h.start_date && h.start_date.getMonth && h.end_date && h.end_date.getMonth && "number" == typeof h.duration || a(h, e),
+ l.push(h)
+ })
+ }
+ return l
+ }
+ function c(e) {
+ if (t.isTaskExists(e)) {
+ var n = t.getTask(e);
+ u(n, t.getTaskAssignments(n.id))
+ }
+ }
+ function u(r, a) {
+ a.sort(function(t, e) {
+ return t.start_date && e.start_date && t.start_date.valueOf() != e.start_date.valueOf() ? t.start_date - e.start_date: 0
+ }),
+ i == n.assignmentsArray ? r[t.config.resource_property] = a: i == n.resourceValueArray && (r[t.config.resource_property] = a.map(function(t) {
+ return {
+ $id: t.id,
+ start_date: t.start_date,
+ duration: t.duration,
+ end_date: t.end_date,
+ delay: t.delay,
+ resource_id: t.resource_id,
+ value: t.value,
+ mode: t.mode
+ }
+ })),
+ r[e] = a
+ }
+ function d(e) {
+ var n = l(e),
+ i = [];
+ return n.forEach(function(e) {
+ e.id = e.id || t.uid(),
+ i.push(e)
+ }),
+ n
+ }
+ function h(t, e) {
+ var a = function(t, e) {
+ var r = {
+ inBoth: [],
+ inTaskNotInStore: [],
+ inStoreNotInTask: []
+ };
+ if (i == n.singleValue) {
+ var a = t[0],
+ o = a ? a.resource_id: null,
+ s = !1;
+ e.forEach(function(t) {
+ t.resource_id != o ? r.inStoreNotInTask.push(t) : t.resource_id == o && (r.inBoth.push({
+ store: t,
+ task: a
+ }), s = !0)
+ }),
+ !s && a && r.inTaskNotInStore.push(a)
+ } else if (i == n.valueArray) {
+ var l = {},
+ c = {},
+ u = {};
+ t.forEach(function(t) {
+ l[t.resource_id] = t
+ }),
+ e.forEach(function(t) {
+ c[t.resource_id] = t
+ }),
+ t.concat(e).forEach(function(t) {
+ if (!u[t.resource_id]) {
+ u[t.resource_id] = !0;
+ var e = l[t.resource_id],
+ n = c[t.resource_id];
+ e && n ? r.inBoth.push({
+ store: n,
+ task: e
+ }) : e && !n ? r.inTaskNotInStore.push(e) : !e && n && r.inStoreNotInTask.push(n)
+ }
+ })
+ } else i != n.assignmentsArray && i != n.resourceValueArray || (l = {},
+ c = {},
+ u = {},
+ t.forEach(function(t) {
+ l[t.id || t.$id] = t
+ }), e.forEach(function(t) {
+ c[t.id] = t
+ }), t.concat(e).forEach(function(t) {
+ var e = t.id || t.$id;
+ if (!u[e]) {
+ u[e] = !0;
+ var n = l[e],
+ i = c[e];
+ n && i ? r.inBoth.push({
+ store: i,
+ task: n
+ }) : n && !i ? r.inTaskNotInStore.push(n) : !n && i && r.inStoreNotInTask.push(i)
+ }
+ }));
+ return r
+ } (l(t), e);
+ a.inStoreNotInTask.forEach(function(t) {
+ o.removeItem(t.id)
+ }),
+ a.inTaskNotInStore.forEach(function(t) {
+ o.addItem(t)
+ }),
+ a.inBoth.forEach(function(e) {
+ if (function(t, e) {
+ var n = {
+ id: !0
+ };
+ for (var i in t) if (!n[i] && String(t[i]) !== String(e[i])) return ! 0;
+ return ! 1
+ } (e.task, e.store)) !
+ function(t, e) {
+ var n = {
+ id: !0
+ };
+ for (var i in t) n[i] || (e[i] = t[i])
+ } (e.task, e.store),
+ o.updateItem(e.store.id);
+ else if (e.task.start_date && e.task.end_date && e.task.mode !== r.fixedDates) {
+ var n = s(e.store, t);
+ e.store.start_date.valueOf() == n.start_date.valueOf() && e.store.end_date.valueOf() == n.end_date.valueOf() || (e.store.start_date = n.start_date, e.store.end_date = n.end_date, e.store.duration = n.duration, o.updateItem(e.store.id))
+ }
+ }),
+ c(t.id)
+ }
+ function f(t) {
+ var n = t[e] || o.find(function(e) {
+ return e.task_id == t.id
+ });
+ h(t, n)
+ }
+ t.$data.assignmentsStore = o,
+ t.attachEvent("onGanttReady",
+ function() {
+ if (t.config.process_resource_assignments) {
+ t.attachEvent("onParse",
+ function() {
+ t.silent(function() {
+ o.clearAll();
+ var e = [];
+ t.eachTask(function(n) {
+ if (n.type !== t.config.types.project) {
+ var i = d(n);
+ u(n, i),
+ i.forEach(function(t) {
+ e.push(t)
+ })
+ }
+ }),
+ o.parse(e)
+ })
+ });
+ var e = !1,
+ n = !1,
+ i = {},
+ r = !1;
+ t.attachEvent("onBeforeBatchUpdate",
+ function() {
+ e = !0
+ }),
+ t.attachEvent("onAfterBatchUpdate",
+ function() {
+ if (n) {
+ var r = {};
+ for (var a in i) r[a] = t.getTaskAssignments(i[a].id);
+ for (var a in i) h(i[a], r[a])
+ }
+ n = !1,
+ e = !1,
+ i = {}
+ }),
+ t.attachEvent("onTaskCreated",
+ function(t) {
+ var e = d(t);
+ return o.parse(e),
+ u(t, e),
+ !0
+ }),
+ t.attachEvent("onAfterTaskUpdate",
+ function(t, r) {
+ e ? (n = !0, i[t] = r) : f(r)
+ }),
+ t.attachEvent("onAfterTaskAdd",
+ function(t, r) {
+ e ? (n = !0, i[t] = r) : f(r)
+ }),
+ t.attachEvent("onRowDragEnd",
+ function(e) {
+ f(t.getTask(e))
+ }),
+ t.$data.tasksStore.attachEvent("onAfterDeleteConfirmed",
+ function(e, n) {
+ var i = [e];
+ t.eachTask(function(t) {
+ i.push(t.id)
+ },
+ e),
+ function(t) {
+ var e = {};
+ t.forEach(function(t) {
+ e[t] = !0
+ }),
+ o.find(function(t) {
+ return e[t.task_id]
+ }).forEach(function(t) {
+ o.removeItem(t.id)
+ })
+ } (i)
+ }),
+ t.$data.tasksStore.attachEvent("onClearAll",
+ function() {
+ return a = null,
+ s = null,
+ l = null,
+ o.clearAll(),
+ !0
+ }),
+ t.attachEvent("onTaskIdChange",
+ function(t, e) {
+ o.find(function(e) {
+ return e.task_id == t
+ }).forEach(function(t) {
+ t.task_id = e,
+ o.updateItem(t.id)
+ }),
+ c(e)
+ }),
+ t.attachEvent("onBeforeUndo",
+ function(t) {
+ return r = !0,
+ !0
+ }),
+ t.attachEvent("onAfterUndo",
+ function(t) {
+ r = !0
+ });
+ var a = null,
+ s = null,
+ l = null;
+ o.attachEvent("onStoreUpdated",
+ function() {
+ return ! (!e || r) || (a = null, s = null, l = null, !0)
+ }),
+ t.getResourceAssignments = function(e, n) {
+ var i = t.defined(n) && null !== n;
+ return null === a && (a = {},
+ s = {},
+ o.eachItem(function(t) {
+ a[t.resource_id] || (a[t.resource_id] = []),
+ a[t.resource_id].push(t);
+ var e = t.resource_id + "-" + t.task_id;
+ s[e] || (s[e] = []),
+ s[e].push(t)
+ })),
+ i ? (s[e + "-" + n] || []).slice() : (a[e] || []).slice()
+ },
+ t.getTaskAssignments = function(t) {
+ if (null === l) {
+ var e = [];
+ l = {},
+ o.eachItem(function(n) {
+ l[n.task_id] || (l[n.task_id] = []),
+ l[n.task_id].push(n),
+ n.task_id == t && e.push(n)
+ })
+ }
+ return (l[t] || []).slice()
+ },
+ t.getTaskResources = function(e) {
+ var n = t.getDatastore("resource"),
+ i = {};
+ t.getTaskAssignments(e).forEach(function(t) {
+ i[t.resource_id] || (i[t.resource_id] = t.resource_id)
+ });
+ var r = [];
+ for (var a in i) {
+ var o = n.getItem(i[a]);
+ o && r.push(o)
+ }
+ return r
+ },
+ t.updateTaskAssignments = c
+ }
+ },
+ {
+ once: !0
+ })
+ }
+ },
+ function(t, e, n) {
+ var i = n(2);
+ function r(t) {
+ var e = {},
+ n = !1;
+ t.$data.tasksStore.attachEvent("onStoreUpdated",
+ function() {
+ e = {},
+ n = !1
+ }),
+ t.attachEvent("onBeforeGanttRender",
+ function() {
+ e = {}
+ });
+ var r = String(Math.random());
+ function a(t) {
+ return null === t ? r + String(t) : String(t)
+ }
+ function o(t, e, n) {
+ return Array.isArray(t) ? t.map(function(t) {
+ return a(t)
+ }).join("_") + "_".concat(e, "_").concat(n) : a(t) + "_".concat(e, "_").concat(n)
+ }
+ function s(r, s, l) {
+ var c, u = o(s, r, JSON.stringify(l)),
+ d = {};
+ return i.forEach(s,
+ function(t) {
+ d[a(t)] = !0
+ }),
+ e[u] ? c = e[u] : (c = e[u] = [], t.eachTask(function(s) {
+ if (l) {
+ if (!l[t.getTaskType(s)]) return
+ } else if (s.type == t.config.types.project) return;
+ var u;
+ r in s && (u = i.isArray(s[r]) ? s[r] : [s[r]], i.forEach(u,
+ function(t) {
+ var i = t && t.resource_id ? t.resource_id: t;
+ if (d[a(i)]) c.push(s);
+ else if (!n) {
+ var l = o(t, r);
+ e[l] || (e[l] = []),
+ e[l].push(s)
+ }
+ }))
+ }), n = !0),
+ c
+ }
+ function l(e, n, i) {
+ var r = t.config.resource_property,
+ a = [];
+ if (t.getDatastore("task").exists(n)) {
+ var o = t.getTask(n);
+ a = o[r] || []
+ }
+ Array.isArray(a) || (a = [a]);
+ for (var s = 0; s < a.length; s++) a[s].resource_id == e && i.push({
+ task_id: o.id,
+ resource_id: a[s].resource_id,
+ value: a[s].value
+ })
+ }
+ return {
+ getTaskBy: function(e, n, r) {
+ return "function" == typeof e ?
+ function(e) {
+ var n = [];
+ return t.eachTask(function(t) {
+ e(t) && n.push(t)
+ }),
+ n
+ } (e) : i.isArray(n) ? s(e, n, r) : s(e, [n], r)
+ },
+ getResourceAssignments: function(e, n) {
+ var i = [],
+ r = t.config.resource_property;
+ return void 0 !== n ? l(e, n, i) : t.getTaskBy(r, e).forEach(function(t) {
+ l(e, t.id, i)
+ }),
+ i
+ }
+ }
+ }
+ t.exports = function(t) {
+ var e = r(t);
+ t.ext.resources = function(t) {
+ var e = {
+ renderEditableLabel: function(e, n, i, r, a) {
+ var o = t.config.readonly ? "": "contenteditable";
+ if (e < i.end_date && n > i.start_date) {
+ for (var s = 0; s < a.length; s++) {
+ var l = a[s];
+ return "<div " + o + " data-assignment-cell data-assignment-id='" + l.id + "' data-row-id='" + i.id + "' data-task='" + i.$task_id + "' data-start-date='" + t.templates.format_date(e) + "' data-end-date='" + t.templates.format_date(n) + "'>" + l.value + "</div>"
+ }
+ return "<div " + o + " data-assignment-cell data-empty data-row-id='" + i.id + "' data-resource-id='" + i.$resource_id + "' data-task='" + i.$task_id + "' data-start-date='" + t.templates.format_date(e) + "'' data-end-date='" + t.templates.format_date(n) + "'>-</div>"
+ }
+ return ""
+ },
+ renderSummaryLabel: function(t, e, n, i, r) {
+ var a = r.reduce(function(t, e) {
+ return t + Number(e.value)
+ },
+ 0);
+ return a % 1 && (a = Math.round(10 * a) / 10),
+ a ? "<div>" + a + "</div>": ""
+ },
+ editableResourceCellTemplate: function(t, n, i, r, a) {
+ return "task" === i.$role ? e.renderEditableLabel(t, n, i, r, a) : e.renderSummaryLabel(t, n, i, r, a)
+ },
+ editableResourceCellClass: function(t, e, n, i, r) {
+ var a = [];
+ a.push("resource_marker"),
+ "task" === n.$role ? a.push("task_cell") : a.push("resource_cell");
+ var o = r.reduce(function(t, e) {
+ return t + Number(e.value)
+ },
+ 0),
+ s = Number(n.capacity);
+ return isNaN(s) && (s = 8),
+ o <= s ? a.push("workday_ok") : a.push("workday_over"),
+ a.join(" ")
+ },
+ getSummaryResourceAssignments: function(e) {
+ var n, i = t.getDatastore(t.config.resource_store),
+ r = i.getItem(e);
+ return "task" === r.$role ? n = t.getResourceAssignments(r.$resource_id, r.$task_id) : (n = t.getResourceAssignments(e), i.eachItem && i.eachItem(function(e) {
+ "task" !== e.$role && (n = n.concat(t.getResourceAssignments(e.id)))
+ },
+ e)),
+ n
+ },
+ initEditableDiagram: function() {
+ t.config.resource_render_empty_cells = !0,
+ function() {
+ var e = null;
+ function n() {
+ return e && cancelAnimationFrame(e),
+ e = requestAnimationFrame(function() {
+ Array.prototype.slice.call(t.$container.querySelectorAll(".resourceTimeline_cell [data-assignment-cell]")).forEach(function(t) {
+ t.contentEditable = !0
+ })
+ }),
+ !0
+ }
+ t.attachEvent("onGanttReady",
+ function() {
+ t.getDatastore(t.config.resource_assignment_store).attachEvent("onStoreUpdated", n),
+ t.getDatastore(t.config.resource_store).attachEvent("onStoreUpdated", n)
+ },
+ {
+ once: !0
+ }),
+ t.attachEvent("onGanttLayoutReady",
+ function() {
+ t.$layout.getCellsByType("viewCell").forEach(function(t) {
+ t.$config && "resourceTimeline" === t.$config.view && t.$content && t.$content.attachEvent("onScroll", n)
+ })
+ })
+ } (),
+ t.attachEvent("onGanttReady",
+ function() {
+ var e = !1;
+ t.event(t.$container, "keypress",
+ function(t) {
+ var e = t.target.closest(".resourceTimeline_cell [data-assignment-cell]");
+ e && (13 !== t.keyCode && 27 !== t.keyCode || e.blur())
+ }),
+ t.event(t.$container, "focusout",
+ function(n) {
+ if (!e) {
+ e = !0,
+ setTimeout(function() {
+ e = !1
+ },
+ 300);
+ var i = n.target.closest(".resourceTimeline_cell [data-assignment-cell]");
+ if (i) {
+ var r = (i.innerText || "").trim();
+ "-" == r && (r = "0");
+ var a = Number(r),
+ o = i.getAttribute("data-row-id"),
+ s = i.getAttribute("data-assignment-id"),
+ l = i.getAttribute("data-task"),
+ c = i.getAttribute("data-resource-id"),
+ u = t.templates.parse_date(i.getAttribute("data-start-date")),
+ d = t.templates.parse_date(i.getAttribute("data-end-date")),
+ h = t.getDatastore(t.config.resource_assignment_store);
+ if (isNaN(a)) t.getDatastore(t.config.resource_store).refresh(o);
+ else {
+ var f = t.getTask(l);
+ if (t.plugins().undo && t.ext.undo.saveState(l, "task"), s) {
+ if (a === (g = h.getItem(s)).value) return;
+ if (g.start_date.valueOf() === u.valueOf() && g.end_date.valueOf() === d.valueOf()) g.value = a,
+ a ? h.updateItem(g.id) : h.removeItem(g.id);
+ else {
+ if (g.end_date.valueOf() > d.valueOf()) {
+ var _ = t.copy(g);
+ _.id = t.uid(),
+ _.start_date = d,
+ _.duration = t.calculateDuration({
+ start_date: _.start_date,
+ end_date: _.end_date,
+ task: f
+ }),
+ _.delay = t.calculateDuration({
+ start_date: f.start_date,
+ end_date: _.start_date,
+ task: f
+ }),
+ _.mode = g.mode || "default",
+ 0 !== _.duration && h.addItem(_)
+ }
+ g.start_date.valueOf() < u.valueOf() ? (g.end_date = u, g.duration = t.calculateDuration({
+ start_date: g.start_date,
+ end_date: g.end_date,
+ task: f
+ }), g.mode = "fixedDuration", 0 === g.duration ? h.removeItem(g.id) : h.updateItem(g.id)) : h.removeItem(g.id),
+ a && h.addItem({
+ task_id: g.task_id,
+ resource_id: g.resource_id,
+ value: a,
+ start_date: u,
+ end_date: d,
+ duration: t.calculateDuration({
+ start_date: u,
+ end_date: d,
+ task: f
+ }),
+ delay: t.calculateDuration({
+ start_date: f.start_date,
+ end_date: u,
+ task: f
+ }),
+ mode: "fixedDuration"
+ })
+ }
+ t.updateTaskAssignments(f.id),
+ t.updateTask(f.id)
+ } else if (a) {
+ var g = {
+ task_id: l,
+ resource_id: c,
+ value: a,
+ start_date: u,
+ end_date: d,
+ duration: t.calculateDuration({
+ start_date: u,
+ end_date: d,
+ task: f
+ }),
+ delay: t.calculateDuration({
+ start_date: f.start_date,
+ end_date: u,
+ task: f
+ }),
+ mode: "fixedDuration"
+ };
+ h.addItem(g),
+ t.updateTaskAssignments(f.id),
+ t.updateTask(f.id)
+ }
+ }
+ }
+ }
+ })
+ },
+ {
+ once: !0
+ })
+ }
+ };
+ return e
+ } (t),
+ t.config.resources = {
+ dataprocessor_assignments: !1,
+ dataprocessor_resources: !1,
+ editable_resource_diagram: !1,
+ resource_store: {
+ type: "treeDataStore",
+ fetchTasks: !1,
+ initItem: function(e) {
+ return e.parent = e.parent || t.config.root_id,
+ e[t.config.resource_property] = e.parent,
+ e.open = !0,
+ e
+ }
+ },
+ lightbox_resources: function(e) {
+ var n = [],
+ i = t.getDatastore(t.config.resource_store);
+ return e.forEach(function(e) {
+ if (!i.hasChild(e.id)) {
+ var r = t.copy(e);
+ r.key = e.id,
+ r.label = e.text,
+ n.push(r)
+ }
+ }),
+ n
+ }
+ },
+ t.attachEvent("onBeforeGanttReady",
+ function() {
+ if (!t.getDatastore(t.config.resource_store)) {
+ var e = t.config.resources ? t.config.resources.resource_store: void 0,
+ n = e ? e.fetchTasks: void 0;
+ t.config.resources && t.config.resources.editable_resource_diagram && (n = !0);
+ var i = function(e) {
+ return e.parent = e.parent || t.config.root_id,
+ e[t.config.resource_property] = e.parent,
+ e.open = !0,
+ e
+ };
+ e && e.initItem && (i = e.initItem);
+ var r = e && e.type ? e.type: "treeDatastore";
+ t.$resourcesStore = t.createDatastore({
+ name: t.config.resource_store,
+ type: r,
+ fetchTasks: void 0 !== n && n,
+ initItem: i
+ }),
+ t.$data.resourcesStore = t.$resourcesStore,
+ t.$resourcesStore.attachEvent("onParse",
+ function() {
+ var e = function(e) {
+ var n = [];
+ return e.forEach(function(e) {
+ if (!t.$resourcesStore.hasChild(e.id)) {
+ var i = t.copy(e);
+ i.key = e.id,
+ i.label = e.text,
+ n.push(i)
+ }
+ }),
+ n
+ };
+ t.config.resources && t.config.resources.lightbox_resources && (e = t.config.resources.lightbox_resources);
+ var n = e(t.$resourcesStore.getItems());
+ t.updateCollection("resourceOptions", n)
+ })
+ }
+ }),
+ t.getTaskBy = e.getTaskBy,
+ t.getResourceAssignments = e.getResourceAssignments,
+ t.config.resource_property = "owner_id",
+ t.config.resource_store = "resource",
+ t.config.resource_render_empty_cells = !1,
+ t.templates.histogram_cell_class = function(t, e, n, i, r) {},
+ t.templates.histogram_cell_label = function(t, e, n, i, r) {
+ return i.length + "/3"
+ },
+ t.templates.histogram_cell_allocated = function(t, e, n, i, r) {
+ return i.length / 3
+ },
+ t.templates.histogram_cell_capacity = function(t, e, n, i, r) {
+ return 0
+ };
+ var n = function(t, e, n, i, r) {
+ return i.length <= 1 ? "gantt_resource_marker_ok": "gantt_resource_marker_overtime"
+ },
+ i = function(t, e, n, i, r) {
+ return 8 * i.length
+ };
+ t.templates.resource_cell_value = i,
+ t.templates.resource_cell_class = n,
+ t.attachEvent("onBeforeGanttReady",
+ function() {
+ t.config.resources && t.config.resources.editable_resource_diagram && (t.config.resource_render_empty_cells = !0, t.templates.resource_cell_value === i && (t.templates.resource_cell_value = t.ext.resources.editableResourceCellTemplate), t.templates.resource_cell_class === n && (t.templates.resource_cell_class = t.ext.resources.editableResourceCellClass), t.ext.resources.initEditableDiagram(t))
+ })
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = function(t) {
+ return {
+ _needRecalc: !0,
+ reset: function() {
+ this._needRecalc = !0
+ },
+ _isRecalcNeeded: function() {
+ return ! this._isGroupSort() && this._needRecalc
+ },
+ _isGroupSort: function() {
+ return !! t.getState().group_mode
+ },
+ _getWBSCode: function(t) {
+ return t ? (this._isRecalcNeeded() && this._calcWBS(), t.$virtual ? "": this._isGroupSort() ? t.$wbs || "": (t.$wbs || (this.reset(), this._calcWBS()), t.$wbs)) : ""
+ },
+ _setWBSCode: function(t, e) {
+ t.$wbs = e
+ },
+ getWBSCode: function(t) {
+ return this._getWBSCode(t)
+ },
+ getByWBSCode: function(e) {
+ for (var n = e.split("."), i = t.config.root_id, r = 0; r < n.length; r++) {
+ var a = t.getChildren(i),
+ o = 1 * n[r] - 1;
+ if (!t.isTaskExists(a[o])) return null;
+ i = a[o]
+ }
+ return t.isTaskExists(i) ? t.getTask(i) : null
+ },
+ _calcWBS: function() {
+ if (this._isRecalcNeeded()) {
+ var e = !0;
+ t.eachTask(function(n) {
+ if (e) return e = !1,
+ void this._setWBSCode(n, "1");
+ var i = t.getPrevSibling(n.id);
+ if (null !== i) {
+ var r = t.getTask(i).$wbs;
+ r && ((r = r.split("."))[r.length - 1]++, this._setWBSCode(n, r.join(".")))
+ } else {
+ var a = t.getParent(n.id);
+ this._setWBSCode(n, t.getTask(a).$wbs + ".1")
+ }
+ },
+ t.config.root_id, this),
+ this._needRecalc = !1
+ }
+ }
+ }
+ } (t);
+ function n() {
+ return e.reset(),
+ !0
+ }
+ t.getWBSCode = function(t) {
+ return e.getWBSCode(t)
+ },
+ t.getTaskByWBSCode = function(t) {
+ return e.getByWBSCode(t)
+ },
+ t.attachEvent("onAfterTaskMove", n),
+ t.attachEvent("onBeforeParse", n),
+ t.attachEvent("onAfterTaskDelete", n),
+ t.attachEvent("onAfterTaskAdd", n),
+ t.attachEvent("onAfterSort", n)
+ }
+ },
+ function(t, e, n) {
+ var i = n(21);
+ function r(t) {
+ var e = {},
+ n = !1;
+ function r(t, n) {
+ n = "function" == typeof n ? n: function() {},
+ e[t] || (e[t] = this[t], this[t] = n)
+ }
+ function a(t) {
+ e[t] && (this[t] = e[t], e[t] = null)
+ }
+ function o() {
+ for (var t in e) a.call(this, t)
+ }
+ function s(t) {
+ try {
+ t()
+ } catch(t) {
+ i.console.error(t)
+ }
+ }
+ return t.$services.getService("state").registerProvider("batchUpdate",
+ function() {
+ return {
+ batch_update: n
+ }
+ },
+ !1),
+ function(t, e) {
+ if (n) s(t);
+ else {
+ var i, a = this._dp && "off" != this._dp.updateMode;
+ a && (i = this._dp.updateMode, this._dp.setUpdateMode("off"));
+ var l = {},
+ c = {
+ render: !0,
+ refreshData: !0,
+ refreshTask: !0,
+ refreshLink: !0,
+ resetProjectDates: function(t) {
+ l[t.id] = t
+ }
+ };
+ for (var u in
+ function(t) {
+ for (var e in t) r.call(this, e, t[e])
+ }.call(this, c), n = !0, this.callEvent("onBeforeBatchUpdate", []), s(t), this.callEvent("onAfterBatchUpdate", []), o.call(this), l) this.resetProjectDates(l[u]);
+ n = !1,
+ e || this.render(),
+ a && (this._dp.setUpdateMode(i), this._dp.setGanttMode("task"), this._dp.sendData(), this._dp.setGanttMode("link"), this._dp.sendData())
+ }
+ }
+ }
+ t.exports = function(t) {
+ t.batchUpdate = r(t)
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ t.ext || (t.ext = {});
+ for (var e = [n(220), n(219), n(218), n(217), n(216), n(215), n(214), n(212).
+ default], i = 0; i < e.length; i++) e[i] && e[i](t)
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(0),
+ r = function() {
+ function t() {
+ var t = this;
+ this.clear = function() {
+ t._storage = {}
+ },
+ this.storeItem = function(e) {
+ t._storage[e.id] = i.copy(e)
+ },
+ this.getStoredItem = function(e) {
+ return t._storage[e] || null
+ },
+ this._storage = {}
+ }
+ return t.create = function() {
+ return new t
+ },
+ t
+ } ();
+ e.
+ default = r
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ e.
+ default = function(t, e) {
+ t.getUserData = function(t, e, n) {
+ return this.userdata || (this.userdata = {}),
+ this.userdata[n] = this.userdata[n] || {},
+ this.userdata[n][t] && this.userdata[n][t][e] ? this.userdata[n][t][e] : ""
+ },
+ t.setUserData = function(t, e, n, i) {
+ this.userdata || (this.userdata = {}),
+ this.userdata[i] = this.userdata[i] || {},
+ this.userdata[i][t] = this.userdata[i][t] || {},
+ this.userdata[i][t][e] = n
+ },
+ t._change_id = function(t, e) {
+ switch (this._dp._ganttMode) {
+ case "task":
+ this.changeTaskId(t, e);
+ break;
+ case "link":
+ this.changeLinkId(t, e);
+ break;
+ case "assignment":
+ this.$data.assignmentsStore.changeId(t, e);
+ break;
+ case "resource":
+ this.$data.resourcesStore.changeId(t, e);
+ break;
+ default:
+ throw new Error("Invalid mode of the dataProcessor after database id is received: " + this._dp._ganttMode + ", new id: " + e)
+ }
+ },
+ t._row_style = function(e, n) {
+ "task" === this._dp._ganttMode && t.isTaskExists(e) && (t.getTask(e).$dataprocessor_class = n, t.refreshTask(e))
+ },
+ t._delete_task = function(t, e) {},
+ t._sendTaskOrder = function(t, e) {
+ e.$drop_target && (this._dp.setGanttMode("task"), this.getTask(t).target = e.$drop_target, this._dp.setUpdated(t, !0, "order"), delete this.getTask(t).$drop_target)
+ },
+ t.setDp = function() {
+ this._dp = e
+ },
+ t.setDp()
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(2),
+ r = function() {
+ function t(t, e) {
+ this.$gantt = t,
+ this.$dp = e,
+ this._dataProcessorHandlers = []
+ }
+ return t.prototype.attach = function() {
+ var t = this,
+ e = this.$dp,
+ i = this.$gantt,
+ r = n(45),
+ a = {},
+ o = function(n) {
+ return t.clientSideDelete(n, e, i)
+ };
+ this._dataProcessorHandlers.push(i.attachEvent("onAfterTaskAdd",
+ function(t, n) {
+ i.isTaskExists(t) && (e.setGanttMode("tasks"), e.setUpdated(t, !0, "inserted"))
+ })),
+ this._dataProcessorHandlers.push(i.attachEvent("onAfterTaskUpdate",
+ function(t, n) {
+ i.isTaskExists(t) && (e.setGanttMode("tasks"), e.setUpdated(t, !0), i._sendTaskOrder && i._sendTaskOrder(t, n))
+ })),
+ this._dataProcessorHandlers.push(i.attachEvent("onBeforeTaskDelete",
+ function(t, n) {
+ return i.config.cascade_delete && (a[t] = {
+ tasks: r.getSubtreeTasks(i, t),
+ links: r.getSubtreeLinks(i, t)
+ }),
+ !e.deleteAfterConfirmation || (e.setGanttMode("tasks"), e.setUpdated(t, !0, "deleted"), !1)
+ })),
+ this._dataProcessorHandlers.push(i.attachEvent("onAfterTaskDelete",
+ function(t, n) {
+ e.setGanttMode("tasks");
+ var r = !o(t),
+ s = i.config.cascade_delete && a[t];
+ if (r || s) {
+ if (s) {
+ var l = e.updateMode;
+ e.setUpdateMode("off");
+ var c = a[t];
+ for (var u in c.tasks) o(u) || (e.storeItem(c.tasks[u]), e.setUpdated(u, !0, "deleted"));
+ for (var u in e.setGanttMode("links"), c.links) o(u) || (e.storeItem(c.links[u]), e.setUpdated(u, !0, "deleted"));
+ a[t] = null,
+ "off" !== l && e.sendAllData(),
+ e.setGanttMode("tasks"),
+ e.setUpdateMode(l)
+ }
+ r && (e.storeItem(n), e.deleteAfterConfirmation || e.setUpdated(t, !0, "deleted")),
+ "off" === e.updateMode || e._tSend || e.sendAllData()
+ }
+ })),
+ this._dataProcessorHandlers.push(i.attachEvent("onAfterLinkUpdate",
+ function(t, n) {
+ i.isLinkExists(t) && (e.setGanttMode("links"), e.setUpdated(t, !0))
+ })),
+ this._dataProcessorHandlers.push(i.attachEvent("onAfterLinkAdd",
+ function(t, n) {
+ i.isLinkExists(t) && (e.setGanttMode("links"), e.setUpdated(t, !0, "inserted"))
+ })),
+ this._dataProcessorHandlers.push(i.attachEvent("onAfterLinkDelete",
+ function(t, n) {
+ e.setGanttMode("links"),
+ !o(t) && (e.storeItem(n), e.setUpdated(t, !0, "deleted"))
+ })),
+ this._dataProcessorHandlers.push(i.attachEvent("onRowDragEnd",
+ function(t, e) {
+ i._sendTaskOrder(t, i.getTask(t))
+ }));
+ var s = null,
+ l = null;
+ this._dataProcessorHandlers.push(i.attachEvent("onTaskIdChange",
+ function(t, n) {
+ if (e._waitMode) {
+ var r = i.getChildren(n);
+ if (r.length) {
+ s = s || {};
+ for (var a = 0; a < r.length; a++) {
+ var o = this.getTask(r[a]);
+ s[o.id] = o
+ }
+ }
+ var c = function(t) {
+ var e = [];
+ return t.$source && (e = e.concat(t.$source)),
+ t.$target && (e = e.concat(t.$target)),
+ e
+ } (this.getTask(n));
+ if (c.length) {
+ l = l || {};
+ for (a = 0; a < c.length; a++) {
+ var u = this.getLink(c[a]);
+ l[u.id] = u
+ }
+ }
+ }
+ })),
+ e.attachEvent("onAfterUpdateFinish",
+ function() { (s || l) && (i.batchUpdate(function() {
+ for (var t in s) i.updateTask(s[t].id);
+ for (var t in l) i.updateLink(l[t].id);
+ s = null,
+ l = null
+ }), s ? i._dp.setGanttMode("tasks") : i._dp.setGanttMode("links"))
+ }),
+ e.attachEvent("onBeforeDataSending",
+ function() {
+ if ("CUSTOM" === this._tMode) return ! 0;
+ var t = this._serverProcessor;
+ if ("REST-JSON" === this._tMode || "REST" === this._tMode) {
+ var e = this._ganttMode;
+ t = t.substring(0, t.indexOf("?") > -1 ? t.indexOf("?") : t.length),
+ this.serverProcessor = t + ("/" === t.slice( - 1) ? "": "/") + e
+ } else {
+ var n = this._ganttMode + "s";
+ this.serverProcessor = t + i.ajax.urlSeparator(t) + "gantt_mode=" + n
+ }
+ return ! 0
+ }),
+ e.attachEvent("insertCallback",
+ function(t, e, n, r) {
+ var a = t.data || i.xml._xmlNodeToJSON(t.firstChild),
+ o = {
+ add: i.addTask,
+ isExist: i.isTaskExists
+ };
+ "links" === r && (o.add = i.addLink, o.isExist = i.isLinkExists),
+ o.isExist.call(i, e) || (a.id = e, o.add.call(i, a))
+ }),
+ e.attachEvent("updateCallback",
+ function(t, e) {
+ var n = t.data || i.xml._xmlNodeToJSON(t.firstChild);
+ if (i.isTaskExists(e)) {
+ var r = i.getTask(e);
+ for (var a in n) {
+ var o = n[a];
+ switch (a) {
+ case "id":
+ continue;
+ case "start_date":
+ case "end_date":
+ o = i.defined(i.templates.xml_date) ? i.templates.xml_date(o) : i.templates.parse_date(o);
+ break;
+ case "duration":
+ r.end_date = i.calculateEndDate({
+ start_date: r.start_date,
+ duration: o,
+ task: r
+ })
+ }
+ r[a] = o
+ }
+ i.updateTask(e),
+ i.refreshData()
+ }
+ }),
+ e.attachEvent("deleteCallback",
+ function(t, e, n, r) {
+ var a = {
+ delete: i.deleteTask,
+ isExist: i.isTaskExists
+ };
+ "links" === r ? (a.delete = i.deleteLink, a.isExist = i.isLinkExists) : "assignment" === r && (a.delete = function(t) {
+ i.$data.assignmentsStore.remove(t)
+ },
+ a.isExist = function(t) {
+ return i.$data.assignmentsStore.exists(t)
+ }),
+ a.isExist.call(i, e) && a.delete.call(i, e)
+ }),
+ this.handleResourceCRUD(e, i),
+ this.handleResourceAssignmentCRUD(e, i)
+ },
+ t.prototype.clientSideDelete = function(t, e, n) {
+ var i = e.updatedRows.slice(),
+ r = !1;
+ "true_deleted" === n.getUserData(t, "!nativeeditor_status", e._ganttMode) && (r = !0, e.setUpdated(t, !1));
+ for (var a = 0; a < i.length && !e._in_progress[t]; a++) i[a] === t && ("inserted" === n.getUserData(t, "!nativeeditor_status", e._ganttMode) && (r = !0), e.setUpdated(t, !1));
+ return r
+ },
+ t.prototype.handleResourceAssignmentCRUD = function(t, e) {
+ var n = this;
+ if (e.config.resources && !0 === e.config.resources.dataprocessor_assignments) {
+ var i = e.getDatastore(e.config.resource_assignment_store),
+ r = {},
+ a = {};
+ e.attachEvent("onBeforeTaskAdd",
+ function(t, e) {
+ return r[t] = !0,
+ !0
+ }),
+ e.attachEvent("onTaskIdChange",
+ function(t, e) {
+ delete r[t]
+ }),
+ i.attachEvent("onAfterAdd",
+ function(t, e) {
+ r[e.task_id] ?
+ function(t) {
+ a[t.id] = t,
+ r[t.task_id] = !0
+ } (e) : o(e)
+ }),
+ i.attachEvent("onAfterUpdate",
+ function(e, n) {
+ i.exists(e) && (a[e] ? o(n) : (t.setGanttMode("assignment"), t.setUpdated(e, !0)))
+ }),
+ i.attachEvent("onAfterDelete",
+ function(i, r) {
+ t.setGanttMode("assignment"),
+ !n.clientSideDelete(i, t, e) && (t.storeItem(r), t.setUpdated(i, !0, "deleted"))
+ })
+ }
+ function o(e) {
+ var n = e.id;
+ i.exists(n) && (t.setGanttMode("assignment"), t.setUpdated(n, !0, "inserted")),
+ delete a[n]
+ }
+ },
+ t.prototype.handleResourceCRUD = function(t, e) {
+ var n = this;
+ if (e.config.resources && !0 === e.config.resources.dataprocessor_resources) {
+ var i = e.getDatastore(e.config.resource_store);
+ i.attachEvent("onAfterAdd",
+ function(e, n) { !
+ function(e) {
+ var n = e.id;
+ i.exists(n) && (t.setGanttMode("resource"), t.setUpdated(n, !0, "inserted"))
+ } (n)
+ }),
+ i.attachEvent("onAfterUpdate",
+ function(e, n) {
+ i.exists(e) && (t.setGanttMode("resource"), t.setUpdated(e, !0))
+ }),
+ i.attachEvent("onAfterDelete",
+ function(i, r) {
+ t.setGanttMode("resource"),
+ !n.clientSideDelete(i, t, e) && (t.storeItem(r), t.setUpdated(i, !0, "deleted"))
+ })
+ }
+ },
+ t.prototype.detach = function() {
+ var t = this;
+ i.forEach(this._dataProcessorHandlers,
+ function(e) {
+ t.$gantt.detachEvent(e)
+ }),
+ this._dataProcessorHandlers = []
+ },
+ t
+ } ();
+ e.
+ default = r
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(5),
+ r = n(2),
+ a = n(0),
+ o = n(224),
+ s = n(223),
+ l = n(222);
+ e.createDataProcessor = function(t) {
+ var e, n;
+ t instanceof Function ? e = t: t.hasOwnProperty("router") ? e = t.router: (t.hasOwnProperty("assignment") || t.hasOwnProperty("link") || t.hasOwnProperty("task")) && (e = t),
+ n = e ? "CUSTOM": t.mode || "REST-JSON";
+ var i = new c(t.url);
+ return i.init(this),
+ i.setTransactionMode({
+ mode: n,
+ router: e
+ },
+ t.batchUpdate),
+ t.deleteAfterConfirmation && (i.deleteAfterConfirmation = t.deleteAfterConfirmation),
+ i
+ };
+ var c = function() {
+ function t(t) {
+ this.serverProcessor = t,
+ this.action_param = "!nativeeditor_status",
+ this.updatedRows = [],
+ this.autoUpdate = !0,
+ this.updateMode = "cell",
+ this._headers = null,
+ this._payload = null,
+ this._postDelim = "_",
+ this._routerParametersFormat = "parameters",
+ this._waitMode = 0,
+ this._in_progress = {},
+ this._storage = l.
+ default.create(),
+ this._invalid = {},
+ this.messages = [],
+ this.styles = {
+ updated: "font-weight:bold;",
+ inserted: "font-weight:bold;",
+ deleted: "text-decoration : line-through;",
+ invalid: "background-color:FFE0E0;",
+ invalid_cell: "border-bottom:2px solid red;",
+ error: "color:red;",
+ clear: "font-weight:normal;text-decoration:none;"
+ },
+ this.enableUTFencoding(!0),
+ i(this)
+ }
+ return t.prototype.setTransactionMode = function(t, e) {
+ "object" == typeof t ? (this._tMode = t.mode || this._tMode, a.defined(t.headers) && (this._headers = t.headers), a.defined(t.payload) && (this._payload = t.payload), this._tSend = !!e) : (this._tMode = t, this._tSend = e),
+ "REST" === this._tMode && (this._tSend = !1),
+ "JSON" === this._tMode || "REST-JSON" === this._tMode ? (this._tSend = !1, this._serializeAsJson = !0, this._headers = this._headers || {},
+ this._headers["Content-Type"] = "application/json") : this._headers && !this._headers["Content-Type"] && (this._headers["Content-Type"] = "application/x-www-form-urlencoded"),
+ "CUSTOM" === this._tMode && (this._tSend = !1, this._router = t.router)
+ },
+ t.prototype.escape = function(t) {
+ return this._utf ? encodeURIComponent(t) : escape(t)
+ },
+ t.prototype.enableUTFencoding = function(t) {
+ this._utf = !!t
+ },
+ t.prototype.getSyncState = function() {
+ return ! this.updatedRows.length
+ },
+ t.prototype.setUpdateMode = function(t, e) {
+ this.autoUpdate = "cell" === t,
+ this.updateMode = t,
+ this.dnd = e
+ },
+ t.prototype.ignore = function(t, e) {
+ this._silent_mode = !0,
+ t.call(e || window),
+ this._silent_mode = !1
+ },
+ t.prototype.setUpdated = function(t, e, n) {
+ if (!this._silent_mode) {
+ var i = this.findRow(t);
+ n = n || "updated";
+ var r = this.$gantt.getUserData(t, this.action_param, this._ganttMode);
+ r && "updated" === n && (n = r),
+ e ? (this.set_invalid(t, !1), this.updatedRows[i] = t, this.$gantt.setUserData(t, this.action_param, n, this._ganttMode), this._in_progress[t] && (this._in_progress[t] = "wait")) : this.is_invalid(t) || (this.updatedRows.splice(i, 1), this.$gantt.setUserData(t, this.action_param, "", this._ganttMode)),
+ this.markRow(t, e, n),
+ e && this.autoUpdate && this.sendData(t)
+ }
+ },
+ t.prototype.markRow = function(t, e, n) {
+ var i = "",
+ r = this.is_invalid(t);
+ if (r && (i = this.styles[r], e = !0), this.callEvent("onRowMark", [t, e, n, r]) && (i = this.styles[e ? n: "clear"] + " " + i, this.$gantt[this._methods[0]](t, i), r && r.details)) {
+ i += this.styles[r + "_cell"];
+ for (var a = 0; a < r.details.length; a++) r.details[a] && this.$gantt[this._methods[1]](t, a, i)
+ }
+ },
+ t.prototype.getActionByState = function(t) {
+ return "inserted" === t ? "create": "updated" === t ? "update": "deleted" === t ? "delete": "update"
+ },
+ t.prototype.getState = function(t) {
+ return this.$gantt.getUserData(t, this.action_param, this._ganttMode)
+ },
+ t.prototype.is_invalid = function(t) {
+ return this._invalid[t]
+ },
+ t.prototype.set_invalid = function(t, e, n) {
+ n && (e = {
+ value: e,
+ details: n,
+ toString: function() {
+ return this.value.toString()
+ }
+ }),
+ this._invalid[t] = e
+ },
+ t.prototype.checkBeforeUpdate = function(t) {
+ return ! 0
+ },
+ t.prototype.sendData = function(t) {
+ var e = this;
+ if (this.$gantt.editStop && this.$gantt.editStop(), void 0 === t || this._tSend) {
+ var n = [];
+ if (this.modes) { ["task", "link", "assignment"].forEach(function(t) {
+ e.modes[t] && e.modes[t].updatedRows.length && n.push(t)
+ })
+ }
+ if (n.length) {
+ for (var i = 0; i < n.length; i++) this.setGanttMode(n[i]),
+ this.sendAllData();
+ return
+ }
+ return this.sendAllData()
+ }
+ return ! this._in_progress[t] && (this.messages = [], !(!this.checkBeforeUpdate(t) && this.callEvent("onValidationError", [t, this.messages])) && void this._beforeSendData(this._getRowData(t), t))
+ },
+ t.prototype.serialize = function(t, e) {
+ if (this._serializeAsJson) return this._serializeAsJSON(t);
+ if ("string" == typeof t) return t;
+ if (void 0 !== e) return this.serialize_one(t, "");
+ var n = [],
+ i = [];
+ for (var r in t) t.hasOwnProperty(r) && (n.push(this.serialize_one(t[r], r + this._postDelim)), i.push(r));
+ return n.push("ids=" + this.escape(i.join(","))),
+ this.$gantt.security_key && n.push("dhx_security=" + this.$gantt.security_key),
+ n.join("&")
+ },
+ t.prototype.serialize_one = function(t, e) {
+ if ("string" == typeof t) return t;
+ var n = [],
+ i = "";
+ for (var r in t) if (t.hasOwnProperty(r)) {
+ if (("id" === r || r == this.action_param) && "REST" === this._tMode) continue;
+ i = "string" == typeof t[r] || "number" == typeof t[r] ? t[r] : JSON.stringify(t[r]),
+ n.push(this.escape((e || "") + r) + "=" + this.escape(i))
+ }
+ return n.join("&")
+ },
+ t.prototype.sendAllData = function() {
+ if (this.updatedRows.length) {
+ this.messages = [];
+ var t = !0;
+ if (this._forEachUpdatedRow(function(e) {
+ t = t && this.checkBeforeUpdate(e)
+ }), !t && !this.callEvent("onValidationError", ["", this.messages])) return ! 1;
+ this._tSend ? this._sendData(this._getAllData()) : this._forEachUpdatedRow(function(t) {
+ if (!this._in_progress[t]) {
+ if (this.is_invalid(t)) return;
+ this._beforeSendData(this._getRowData(t), t)
+ }
+ })
+ }
+ },
+ t.prototype.findRow = function(t) {
+ var e = 0;
+ for (e = 0; e < this.updatedRows.length && t != this.updatedRows[e]; e++);
+ return e
+ },
+ t.prototype.defineAction = function(t, e) {
+ this._uActions || (this._uActions = {}),
+ this._uActions[t] = e
+ },
+ t.prototype.afterUpdateCallback = function(t, e, n, i, r) {
+ var a = this;
+ if (this.$gantt) {
+ this.setGanttMode(r);
+ var o = t,
+ s = "error" !== n && "invalid" !== n;
+ if (s || this.set_invalid(t, n), this._uActions && this._uActions[n] && !this._uActions[n](i)) return delete this._in_progress[o];
+ "wait" !== this._in_progress[o] && this.setUpdated(t, !1);
+ var l = t;
+ switch (n) {
+ case "inserted":
+ case "insert":
+ e != t && (this.setUpdated(t, !1), this.$gantt[this._methods[2]](t, e), t = e);
+ break;
+ case "delete":
+ case "deleted":
+ if (this.deleteAfterConfirmation && "task" === this._ganttMode) {
+ if ("task" === this._ganttMode && this.$gantt.isTaskExists(t)) {
+ this.$gantt.setUserData(t, this.action_param, "true_deleted", this._ganttMode);
+ var c = this.$gantt.getTask(t);
+ this.$gantt.silent(function() {
+ a.$gantt.deleteTask(t)
+ }),
+ this.$gantt.callEvent("onAfterTaskDelete", [t, c]),
+ this.$gantt.render(),
+ delete this._in_progress[o]
+ }
+ return this.callEvent("onAfterUpdate", [t, n, e, i])
+ }
+ return this.$gantt.setUserData(t, this.action_param, "true_deleted", this._ganttMode),
+ this.$gantt[this._methods[3]](t),
+ delete this._in_progress[o],
+ this.callEvent("onAfterUpdate", [t, n, e, i])
+ }
+ "wait" !== this._in_progress[o] ? (s && this.$gantt.setUserData(t, this.action_param, "", this._ganttMode), delete this._in_progress[o]) : (delete this._in_progress[o], this.setUpdated(e, !0, this.$gantt.getUserData(t, this.action_param, this._ganttMode))),
+ this.callEvent("onAfterUpdate", [l, n, e, i])
+ }
+ },
+ t.prototype.afterUpdate = function(t, e, n) {
+ var i, r = this;
+ i = 3 === arguments.length ? arguments[1] : arguments[4];
+ var a = this.getGanttMode(),
+ o = i.filePath || i.url;
+ a = "REST" !== this._tMode && "REST-JSON" !== this._tMode ? -1 !== o.indexOf("gantt_mode=links") ? "link": -1 !== o.indexOf("gantt_mode=assignments") ? "assignment": "task": o.indexOf("/link") >= 0 ? "link": o.indexOf("/assignment") >= 0 ? "assignment": "task",
+ this.setGanttMode(a);
+ var s, l = this.$gantt.ajax;
+ try {
+ s = JSON.parse(e.xmlDoc.responseText)
+ } catch(t) {
+ e.xmlDoc.responseText.length || (s = {})
+ }
+ var c = function(e) {
+ var n = s.action || r.getState(e) || "updated",
+ i = s.sid || e[0],
+ o = s.tid || e[0];
+ t.afterUpdateCallback(i, o, n, s, a)
+ };
+ if (s) return Array.isArray(n) && n.length > 1 ? n.forEach(function(t) {
+ return c(t)
+ }) : c(n),
+ t.finalizeUpdate(),
+ void this.setGanttMode(a);
+ var u = l.xmltop("data", e.xmlDoc);
+ if (!u) return this.cleanUpdate(n);
+ var d = l.xpath("//data/action", u);
+ if (!d.length) return this.cleanUpdate(n);
+ for (var h = 0; h < d.length; h++) {
+ var f = d[h],
+ _ = f.getAttribute("type"),
+ g = f.getAttribute("sid"),
+ p = f.getAttribute("tid");
+ t.afterUpdateCallback(g, p, _, f, a)
+ }
+ t.finalizeUpdate()
+ },
+ t.prototype.cleanUpdate = function(t) {
+ if (t) for (var e = 0; e < t.length; e++) delete this._in_progress[t[e]]
+ },
+ t.prototype.finalizeUpdate = function() {
+ this._waitMode && this._waitMode--,
+ this.callEvent("onAfterUpdateFinish", []),
+ this.updatedRows.length || this.callEvent("onFullSync", [])
+ },
+ t.prototype.init = function(t) {
+ if (!this._initialized) {
+ this.$gantt = t,
+ this.$gantt._dp_init && this.$gantt._dp_init(this),
+ this._setDefaultTransactionMode(),
+ this.styles = {
+ updated: "gantt_updated",
+ order: "gantt_updated",
+ inserted: "gantt_inserted",
+ deleted: "gantt_deleted",
+ delete_confirmation: "gantt_deleted",
+ invalid: "gantt_invalid",
+ error: "gantt_error",
+ clear: ""
+ },
+ this._methods = ["_row_style", "setCellTextStyle", "_change_id", "_delete_task"],
+ s.
+ default(this.$gantt, this);
+ var e = new o.
+ default(this.$gantt, this);
+ e.attach(),
+ this.attachEvent("onDestroy",
+ function() {
+ delete this.setGanttMode,
+ delete this._getRowData,
+ delete this.$gantt._dp,
+ delete this.$gantt._change_id,
+ delete this.$gantt._row_style,
+ delete this.$gantt._delete_task,
+ delete this.$gantt._sendTaskOrder,
+ delete this.$gantt,
+ e.detach()
+ }),
+ this.$gantt.callEvent("onDataProcessorReady", [this]),
+ this._initialized = !0
+ }
+ },
+ t.prototype.setOnAfterUpdate = function(t) {
+ this.attachEvent("onAfterUpdate", t)
+ },
+ t.prototype.setOnBeforeUpdateHandler = function(t) {
+ this.attachEvent("onBeforeDataSending", t)
+ },
+ t.prototype.setAutoUpdate = function(t, e) {
+ var n = this;
+ t = t || 2e3,
+ this._user = e || (new Date).valueOf(),
+ this._needUpdate = !1,
+ this._updateBusy = !1,
+ this.attachEvent("onAfterUpdate", this.afterAutoUpdate),
+ this.attachEvent("onFullSync", this.fullSync),
+ setInterval(function() {
+ n.loadUpdate()
+ },
+ t)
+ },
+ t.prototype.afterAutoUpdate = function(t, e, n, i) {
+ return "collision" !== e || (this._needUpdate = !0, !1)
+ },
+ t.prototype.fullSync = function() {
+ return this._needUpdate && (this._needUpdate = !1, this.loadUpdate()),
+ !0
+ },
+ t.prototype.getUpdates = function(t, e) {
+ var n = this.$gantt.ajax;
+ if (this._updateBusy) return ! 1;
+ this._updateBusy = !0,
+ n.get(t, e)
+ },
+ t.prototype.loadUpdate = function() {
+ var t = this,
+ e = this.$gantt.ajax,
+ n = this.$gantt.getUserData(0, "version", this._ganttMode),
+ i = this.serverProcessor + e.urlSeparator(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + n].join("&");
+ i = i.replace("editing=true&", ""),
+ this.getUpdates(i,
+ function(n) {
+ var i = e.xpath("//userdata", n);
+ t.$gantt.setUserData(0, "version", t._getXmlNodeValue(i[0]), t._ganttMode);
+ var r = e.xpath("//update", n);
+ if (r.length) {
+ t._silent_mode = !0;
+ for (var a = 0; a < r.length; a++) {
+ var o = r[a].getAttribute("status"),
+ s = r[a].getAttribute("id"),
+ l = r[a].getAttribute("parent");
+ switch (o) {
+ case "inserted":
+ t.callEvent("insertCallback", [r[a], s, l]);
+ break;
+ case "updated":
+ t.callEvent("updateCallback", [r[a], s, l]);
+ break;
+ case "deleted":
+ t.callEvent("deleteCallback", [r[a], s, l])
+ }
+ }
+ t._silent_mode = !1
+ }
+ t._updateBusy = !1
+ })
+ },
+ t.prototype.destructor = function() {
+ this.callEvent("onDestroy", []),
+ this.detachAllEvents(),
+ this.updatedRows = [],
+ this._in_progress = {},
+ this._invalid = {},
+ this._storage.clear(),
+ this._storage = null,
+ this._headers = null,
+ this._payload = null,
+ delete this._initialized
+ },
+ t.prototype.setGanttMode = function(t) {
+ "tasks" === t ? t = "task": "links" === t && (t = "link");
+ var e = this.modes || {},
+ n = this.getGanttMode();
+ n && (e[n] = {
+ _in_progress: this._in_progress,
+ _invalid: this._invalid,
+ _storage: this._storage,
+ updatedRows: this.updatedRows
+ });
+ var i = e[t];
+ i || (i = e[t] = {
+ _in_progress: {},
+ _invalid: {},
+ _storage: l.
+ default.create(),
+ updatedRows: []
+ }),
+ this._in_progress = i._in_progress,
+ this._invalid = i._invalid,
+ this._storage = i._storage,
+ this.updatedRows = i.updatedRows,
+ this.modes = e,
+ this._ganttMode = t
+ },
+ t.prototype.getGanttMode = function() {
+ return this._ganttMode
+ },
+ t.prototype.storeItem = function(t) {
+ this._storage.storeItem(t)
+ },
+ t.prototype.url = function(t) {
+ this.serverProcessor = this._serverProcessor = t
+ },
+ t.prototype._beforeSendData = function(t, e) {
+ if (!this.callEvent("onBeforeUpdate", [e, this.getState(e), t])) return ! 1;
+ this._sendData(t, e)
+ },
+ t.prototype._serializeAsJSON = function(t) {
+ if ("string" == typeof t) return t;
+ var e = a.copy(t);
+ return "REST-JSON" === this._tMode && (delete e.id, delete e[this.action_param]),
+ JSON.stringify(e)
+ },
+ t.prototype._applyPayload = function(t) {
+ var e = this.$gantt.ajax;
+ if (this._payload) for (var n in this._payload) t = t + e.urlSeparator(t) + this.escape(n) + "=" + this.escape(this._payload[n]);
+ return t
+ },
+ t.prototype._cleanupArgumentsBeforeSend = function(t) {
+ var e;
+ if (void 0 === t[this.action_param]) for (var n in e = {},
+ t) e[n] = this._cleanupArgumentsBeforeSend(t[n]);
+ else e = this._cleanupItemBeforeSend(t);
+ return e
+ },
+ t.prototype._cleanupItemBeforeSend = function(t) {
+ var e = null;
+ return t && ("deleted" === t[this.action_param] ? ((e = {}).id = t.id, e[this.action_param] = t[this.action_param]) : e = t),
+ e
+ },
+ t.prototype._sendData = function(t, e) {
+ var n = this;
+ if (t) {
+ if (!this.callEvent("onBeforeDataSending", e ? [e, this.getState(e), t] : [null, null, t])) return ! 1;
+ e && (this._in_progress[e] = (new Date).valueOf());
+ var i = this.$gantt.ajax;
+ if ("CUSTOM" !== this._tMode) {
+ var r;
+ r = {
+ callback: function(i) {
+ var r = [];
+ if (e) r.push(e);
+ else if (t) for (var a in t) r.push(a);
+ return n.afterUpdate(n, i, r)
+ },
+ headers: this._headers
+ };
+ var a, o = "dhx_version=" + this.$gantt.getUserData(0, "version", this._ganttMode),
+ s = this.serverProcessor + (this._user ? i.urlSeparator(this.serverProcessor) + ["dhx_user=" + this._user, o].join("&") : ""),
+ l = this._applyPayload(s);
+ switch (this._tMode) {
+ case "GET":
+ a = this._cleanupArgumentsBeforeSend(t),
+ r.url = l + i.urlSeparator(l) + this.serialize(a, e),
+ r.method = "GET";
+ break;
+ case "POST":
+ a = this._cleanupArgumentsBeforeSend(t),
+ r.url = l,
+ r.method = "POST",
+ r.data = this.serialize(a, e);
+ break;
+ case "JSON":
+ a = {};
+ var c = this._cleanupItemBeforeSend(t);
+ for (var u in c) u !== this.action_param && "id" !== u && "gr_id" !== u && (a[u] = c[u]);
+ r.url = l,
+ r.method = "POST",
+ r.data = JSON.stringify({
+ id: e,
+ action: t[this.action_param],
+ data: a
+ });
+ break;
+ case "REST":
+ case "REST-JSON":
+ switch (l = s.replace(/(&|\?)editing=true/, ""), a = "", this.getState(e)) {
+ case "inserted":
+ r.method = "POST",
+ r.data = this.serialize(t, e);
+ break;
+ case "deleted":
+ r.method = "DELETE",
+ l = l + ("/" === l.slice( - 1) ? "": "/") + e;
+ break;
+ default:
+ r.method = "PUT",
+ r.data = this.serialize(t, e),
+ l = l + ("/" === l.slice( - 1) ? "": "/") + e
+ }
+ r.url = this._applyPayload(l)
+ }
+ return this._waitMode++,
+ i.query(r)
+ }
+ var d = this.getState(e),
+ h = this.getActionByState(d),
+ f = this.getGanttMode(),
+ _ = function(t) {
+ var i = d || "updated",
+ r = e,
+ a = e;
+ t && (i = t.action || d, r = t.sid || r, a = t.id || t.tid || a),
+ n.afterUpdateCallback(r, a, i, t, f)
+ },
+ g = void 0;
+ if (this._router instanceof Function) if ("object" === this._routerParametersFormat) {
+ var p = {
+ entity: f,
+ action: h,
+ data: t,
+ id: e
+ };
+ g = this._router(p)
+ } else g = this._router(f, h, t, e);
+ else if (this._router[f] instanceof Function) g = this._router[f](h, t, e);
+ else {
+ var v = "Incorrect configuration of gantt.createDataProcessor",
+ m = "\nYou need to either add missing properties to the dataProcessor router object or to use a router function.\nSee https://docs.dhtmlx.com/gantt/desktop__server_side.html#customrouting and https://docs.dhtmlx.com/gantt/api__gantt_createdataprocessor.html for details.";
+ if (!this._router[f]) throw new Error(v + ": router for the **" + f + "** entity is not defined. " + m);
+ switch (d) {
+ case "inserted":
+ if (!this._router[f].create) throw new Error(v + ": **create** action for the **" + f + "** entity is not defined. " + m);
+ g = this._router[f].create(t);
+ break;
+ case "deleted":
+ if (!this._router[f].delete) throw new Error(v + ": **delete** action for the **" + f + "** entity is not defined. " + m);
+ g = this._router[f].delete(e);
+ break;
+ default:
+ if (!this._router[f].update) throw new Error(v + ': **update**" action for the **' + f + "** entity is not defined. " + m);
+ g = this._router[f].update(t, e)
+ }
+ }
+ if (g) {
+ if (!g.then && void 0 === g.id && void 0 === g.tid && void 0 === g.action) throw new Error("Incorrect router return value. A Promise or a response object is expected");
+ g.then ? g.then(_).
+ catch(function(t) {
+ t && t.action ? _(t) : _({
+ action: "error",
+ value: t
+ })
+ }) : _(g)
+ } else _(null)
+ }
+ },
+ t.prototype._forEachUpdatedRow = function(t) {
+ for (var e = this.updatedRows.slice(), n = 0; n < e.length; n++) {
+ var i = e[n];
+ this.$gantt.getUserData(i, this.action_param, this._ganttMode) && t.call(this, i)
+ }
+ },
+ t.prototype._setDefaultTransactionMode = function() {
+ this.serverProcessor && (this.setTransactionMode("POST", !0), this.serverProcessor += ( - 1 !== this.serverProcessor.indexOf("?") ? "&": "?") + "editing=true", this._serverProcessor = this.serverProcessor)
+ },
+ t.prototype._getXmlNodeValue = function(t) {
+ return t.firstChild ? t.firstChild.nodeValue: ""
+ },
+ t.prototype._getAllData = function() {
+ var t = {},
+ e = !1;
+ return this._forEachUpdatedRow(function(n) {
+ if (!this._in_progress[n] && !this.is_invalid(n)) {
+ var i = this._getRowData(n);
+ this.callEvent("onBeforeUpdate", [n, this.getState(n), i]) && (t[n] = i, e = !0, this._in_progress[n] = (new Date).valueOf())
+ }
+ }),
+ e ? t: null
+ },
+ t.prototype._prepareDate = function(t) {
+ return this.$gantt.defined(this.$gantt.templates.xml_format) ? this.$gantt.templates.xml_format(t) : this.$gantt.templates.format_date(t)
+ },
+ t.prototype._prepareArray = function(t, e) {
+ var n = this;
+ return e.push(t),
+ t.map(function(t) {
+ return r.isDate(t) ? n._prepareDate(t) : Array.isArray(t) && !r.arrayIncludes(e, t) ? n._prepareArray(t, e) : t && "object" == typeof t && !r.arrayIncludes(e, t) ? n._prepareObject(t, e) : t
+ })
+ },
+ t.prototype._prepareObject = function(t, e) {
+ var n = {};
+ for (var i in e.push(t), t) if ("$" !== i.substr(0, 1)) {
+ var a = t[i];
+ r.isDate(a) ? n[i] = this._prepareDate(a) : null === a ? n[i] = "": Array.isArray(a) && !r.arrayIncludes(e, a) ? n[i] = this._prepareArray(a, e) : a && "object" == typeof a && !r.arrayIncludes(e, a) ? n[i] = this._prepareObject(a, e) : n[i] = a
+ }
+ return n
+ },
+ t.prototype._prepareDataItem = function(t) {
+ var e = this._prepareObject(t, []);
+ return e[this.action_param] = this.$gantt.getUserData(t.id, this.action_param, this._ganttMode),
+ e
+ },
+ t.prototype.getStoredItem = function(t) {
+ return this._storage.getStoredItem(t)
+ },
+ t.prototype._getRowData = function(t) {
+ var e, n = this.$gantt;
+ return "task" === this.getGanttMode() ? n.isTaskExists(t) && (e = this.$gantt.getTask(t)) : "assignment" === this.getGanttMode() ? this.$gantt.$data.assignmentsStore.exists(t) && (e = this.$gantt.$data.assignmentsStore.getItem(t)) : n.isLinkExists(t) && (e = this.$gantt.getLink(t)),
+ e || (e = this.getStoredItem(t)),
+ e || (e = {
+ id: t
+ }),
+ this._prepareDataItem(e)
+ },
+ t
+ } ();
+ e.DataProcessor = c
+ },
+ function(t, e, n) {
+ var i = n(225);
+ t.exports = {
+ DEPRECATED_api: function(t) {
+ return new i.DataProcessor(t)
+ },
+ createDataProcessor: i.createDataProcessor,
+ getDataProcessorModes: i.getAvailableModes
+ }
+ },
+ function(t, e, n) {
+ var i = n(15);
+ t.exports = {
+ bindDataStore: function(t, e) {
+ var n = e.getDatastore(t),
+ r = function(t, e) {
+ var i = e.getLayers(),
+ r = n.getItem(t);
+ if (r && n.isVisible(t)) for (var a = 0; a < i.length; a++) i[a].render_item(r)
+ },
+ a = function(t) {
+ for (var e = t.getLayers(), i = 0; i < e.length; i++) e[i].clear();
+ for (var r = null,
+ a = {},
+ o = 0; o < e.length; o++) {
+ var s = e[o],
+ l = void 0;
+ if (s.get_visible_range) {
+ var c = s.get_visible_range(n);
+ if (void 0 !== c.start && void 0 !== c.end) {
+ var u = c.start + " - " + c.end;
+ a[u] ? l = a[u] : (l = n.getIndexRange(c.start, c.end), a[u] = l)
+ } else {
+ if (void 0 === c.ids) throw new Error("Invalid range returned from 'getVisibleRange' of the layer");
+ l = c.ids.map(function(t) {
+ return n.getItem(t)
+ })
+ }
+ } else r || (r = n.getVisibleItems()),
+ l = r;
+ s.prepare_data && s.prepare_data(l),
+ e[o].render_items(l)
+ }
+ },
+ o = function(t) {
+ if (t.update_items) {
+ var e;
+ if (t.get_visible_range) {
+ var i = t.get_visible_range(n);
+ if (void 0 !== i.start && void 0 !== i.end) e = n.getIndexRange(i.start, i.end);
+ else {
+ if (void 0 === i.ids) throw new Error("Invalid range returned from 'getVisibleRange' of the layer");
+ e = i.ids.map(function(t) {
+ return n.getItem(t)
+ })
+ }
+ } else e = n.getVisibleItems();
+ t.prepare_data && t.prepare_data(e, t),
+ t.update_items(e)
+ }
+ };
+ function s(t) {
+ return !! t.$services.getService("state").getState("batchUpdate").batch_update
+ }
+ n.attachEvent("onStoreUpdated",
+ function(n, r, a) {
+ if (i(e)) return ! 0;
+ var s = e.$services.getService("layers").getDataRender(t);
+ s && (s.onUpdateRequest = function(t) {
+ o(t)
+ })
+ }),
+ n.attachEvent("onStoreUpdated",
+ function(t, i, r) {
+ s(e) || (t && "move" != r && "delete" != r ? (n.callEvent("onBeforeRefreshItem", [i.id]), n.callEvent("onAfterRefreshItem", [i.id])) : (n.callEvent("onBeforeRefreshAll", []), n.callEvent("onAfterRefreshAll", [])))
+ }),
+ n.attachEvent("onAfterRefreshAll",
+ function() {
+ if (i(e)) return ! 0;
+ var n = e.$services.getService("layers").getDataRender(t);
+ n && !s(e) && a(n)
+ }),
+ n.attachEvent("onAfterRefreshItem",
+ function(n) {
+ if (i(e)) return ! 0;
+ var a = e.$services.getService("layers").getDataRender(t);
+ a && r(n, a)
+ }),
+ n.attachEvent("onItemOpen",
+ function() {
+ if (i(e)) return ! 0;
+ e.render()
+ }),
+ n.attachEvent("onItemClose",
+ function() {
+ if (i(e)) return ! 0;
+ e.render()
+ }),
+ n.attachEvent("onIdChange",
+ function(a, o) {
+ if (i(e)) return ! 0;
+ if (n.callEvent("onBeforeIdChange", [a, o]), !s(e) && !n.isSilent()) {
+ var l = e.$services.getService("layers").getDataRender(t);
+ l ? (function(t, e, n, i) {
+ for (var r = 0; r < t.length; r++) t[r].change_id(e, n)
+ } (l.getLayers(), a, o, n.getItem(o)), r(o, l)) : e.render()
+ }
+ })
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = null,
+ n = t._removeItemInner;
+ function i(t) {
+ e = null,
+ this.callEvent("onAfterUnselect", [t])
+ }
+ return t._removeItemInner = function(t) {
+ return e == t && i.call(this, t),
+ e && this.eachItem && this.eachItem(function(t) {
+ t.id == e && i.call(this, t.id)
+ },
+ t),
+ n.apply(this, arguments)
+ },
+ t.attachEvent("onIdChange",
+ function(e, n) {
+ t.getSelectedId() == e && t.silent(function() {
+ t.unselect(e),
+ t.select(n)
+ })
+ }),
+ {
+ select: function(t) {
+ if (t) {
+ if (e == t) return e;
+ if (!this._skip_refresh && !this.callEvent("onBeforeSelect", [t])) return ! 1;
+ this.unselect(),
+ e = t,
+ this._skip_refresh || (this.refresh(t), this.callEvent("onAfterSelect", [t]))
+ }
+ return e
+ },
+ getSelectedId: function() {
+ return e
+ },
+ isSelected: function(t) {
+ return t == e
+ },
+ unselect: function(t) { (t = t || e) && (e = null, this._skip_refresh || (this.refresh(t), i.call(this, t)))
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(0);
+ t.exports = function() {
+ return {
+ getLinkCount: function() {
+ return this.$data.linksStore.count()
+ },
+ getLink: function(t) {
+ return this.$data.linksStore.getItem(t)
+ },
+ getLinks: function() {
+ return this.$data.linksStore.getItems()
+ },
+ isLinkExists: function(t) {
+ return this.$data.linksStore.exists(t)
+ },
+ addLink: function(t) {
+ var e = this.$data.linksStore.addItem(t);
+ return this.$data.linksStore.isSilent() && this.$data.linksStore.fullOrder.push(e),
+ e
+ },
+ updateLink: function(t, e) {
+ i.defined(e) || (e = this.getLink(t)),
+ this.$data.linksStore.updateItem(t, e)
+ },
+ deleteLink: function(t) {
+ return this.$data.linksStore.removeItem(t)
+ },
+ changeLinkId: function(t, e) {
+ return this.$data.linksStore.changeId(t, e)
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(2).replaceValidZeroId;
+ t.exports = function() {
+ return {
+ getTask: function(t) {
+ t = r(t, this.config.root_id),
+ this.assert(t, "Invalid argument for gantt.getTask");
+ var e = this.$data.tasksStore.getItem(t);
+ return this.assert(e, "Task not found id=" + t),
+ e
+ },
+ getTaskByTime: function(t, e) {
+ var n = this.$data.tasksStore.getItems(),
+ i = [];
+ if (t || e) {
+ t = +t || -1 / 0,
+ e = +e || 1 / 0;
+ for (var r = 0; r < n.length; r++) {
+ var a = n[r]; + a.start_date < e && +a.end_date > t && i.push(a)
+ }
+ } else i = n;
+ return i
+ },
+ isTaskExists: function(t) {
+ return ! (!this.$data || !this.$data.tasksStore) && this.$data.tasksStore.exists(t)
+ },
+ updateTask: function(t, e) {
+ i.defined(e) || (e = this.getTask(t)),
+ this.$data.tasksStore.updateItem(t, e),
+ this.isTaskExists(t) && this.refreshTask(t)
+ },
+ addTask: function(t, e, n) {
+ return i.defined(t.id) || (t.id = i.uid()),
+ this.isTaskExists(t.id) && this.getTask(t.id).$index != t.$index ? (t.start_date && "string" == typeof t.start_date && (t.start_date = this.date.parseDate(t.start_date, "parse_date")), t.end_date && "string" == typeof t.end_date && (t.end_date = this.date.parseDate(t.end_date, "parse_date")), this.$data.tasksStore.updateItem(t.id, t)) : (i.defined(e) || (e = this.getParent(t) || 0), this.isTaskExists(e) || (e = this.config.root_id), this.setParent(t, e), this.$data.tasksStore.addItem(t, n, e))
+ },
+ deleteTask: function(t) {
+ return t = r(t, this.config.root_id),
+ this.$data.tasksStore.removeItem(t)
+ },
+ getTaskCount: function() {
+ return this.$data.tasksStore.count()
+ },
+ getVisibleTaskCount: function() {
+ return this.$data.tasksStore.countVisible()
+ },
+ getTaskIndex: function(t) {
+ return this.$data.tasksStore.getBranchIndex(t)
+ },
+ getGlobalTaskIndex: function(t) {
+ return t = r(t, this.config.root_id),
+ this.assert(t, "Invalid argument"),
+ this.$data.tasksStore.getIndexById(t)
+ },
+ eachTask: function(t, e, n) {
+ return this.$data.tasksStore.eachItem(i.bind(t, n || this), e)
+ },
+ eachParent: function(t, e, n) {
+ return this.$data.tasksStore.eachParent(i.bind(t, n || this), e)
+ },
+ changeTaskId: function(t, e) {
+ this.$data.tasksStore.changeId(t, e);
+ var n = this.$data.tasksStore.getItem(e),
+ i = [];
+ n.$source && (i = i.concat(n.$source)),
+ n.$target && (i = i.concat(n.$target));
+ for (var r = 0; r < i.length; r++) {
+ var a = this.getLink(i[r]);
+ a.source == t && (a.source = e),
+ a.target == t && (a.target = e)
+ }
+ },
+ calculateTaskLevel: function(t) {
+ return this.$data.tasksStore.calculateItemLevel(t)
+ },
+ getNext: function(t) {
+ return this.$data.tasksStore.getNext(t)
+ },
+ getPrev: function(t) {
+ return this.$data.tasksStore.getPrev(t)
+ },
+ getParent: function(t) {
+ return this.$data.tasksStore.getParent(t)
+ },
+ setParent: function(t, e, n) {
+ return this.$data.tasksStore.setParent(t, e, n)
+ },
+ getSiblings: function(t) {
+ return this.$data.tasksStore.getSiblings(t).slice()
+ },
+ getNextSibling: function(t) {
+ return this.$data.tasksStore.getNextSibling(t)
+ },
+ getPrevSibling: function(t) {
+ return this.$data.tasksStore.getPrevSibling(t)
+ },
+ getTaskByIndex: function(t) {
+ var e = this.$data.tasksStore.getIdByIndex(t);
+ return this.isTaskExists(e) ? this.getTask(e) : null
+ },
+ getChildren: function(t) {
+ return this.hasChild(t) ? this.$data.tasksStore.getChildren(t).slice() : []
+ },
+ hasChild: function(t) {
+ return this.$data.tasksStore.hasChild(t)
+ },
+ open: function(t) {
+ this.$data.tasksStore.open(t)
+ },
+ close: function(t) {
+ this.$data.tasksStore.close(t)
+ },
+ moveTask: function(t, e, n) {
+ return n = r(n, this.config.root_id),
+ this.$data.tasksStore.move.apply(this.$data.tasksStore, arguments)
+ },
+ sort: function(t, e, n, i) {
+ var r = !i;
+ this.$data.tasksStore.sort(t, e, n),
+ this.callEvent("onAfterSort", [t, e, n]),
+ r && this.render()
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(230),
+ a = n(229),
+ o = n(49),
+ s = n(47),
+ l = n(228),
+ c = n(227),
+ u = n(15),
+ d = n(2).replaceValidZeroId;
+ function h() {
+ for (var t = this.$services.getService("datastores"), e = [], n = 0; n < t.length; n++) {
+ var i = this.getDatastore(t[n]);
+ i.$destroyed || e.push(i)
+ }
+ return e
+ }
+ o.
+ default && (o = o.
+ default);
+ var f = function() {
+ return {
+ createDatastore: function(t) {
+ var e = "treedatastore" == (t.type || "").toLowerCase() ? s: o;
+ if (t) {
+ var n = this;
+ t.openInitially = function() {
+ return n.config.open_tree_initially
+ },
+ t.copyOnParse = function() {
+ return n.config.deepcopy_on_parse
+ }
+ }
+ var i = new e(t);
+ if (this.mixin(i, l(i)), t.name) {
+ var r = "datastore:" + t.name;
+ i.attachEvent("onDestroy",
+ function() {
+ this.$services.dropService(r);
+ for (var e = this.$services.getService("datastores"), n = 0; n < e.length; n++) if (e[n] === t.name) {
+ e.splice(n, 1);
+ break
+ }
+ }.bind(this)),
+ this.$services.dropService(r),
+ this.$services.setService(r,
+ function() {
+ return i
+ });
+ var a = this.$services.getService("datastores");
+ a ? a.indexOf(t.name) < 0 && a.push(t.name) : (a = [], this.$services.setService("datastores",
+ function() {
+ return a
+ }), a.push(t.name)),
+ c.bindDataStore(t.name, this)
+ }
+ return i
+ },
+ getDatastore: function(t) {
+ return this.$services.getService("datastore:" + t)
+ },
+ _getDatastores: h,
+ refreshData: function() {
+ var t;
+ u(this) || (t = this.getScrollState()),
+ this.callEvent("onBeforeDataRender", []);
+ for (var e = h.call(this), n = 0; n < e.length; n++) e[n].refresh();
+ this.config.preserve_scroll && !u(this) && (t.x || t.y) && this.scrollTo(t.x, t.y),
+ this.callEvent("onDataRender", [])
+ },
+ isChildOf: function(t, e) {
+ return this.$data.tasksStore.isChildOf(t, e)
+ },
+ refreshTask: function(t, e) {
+ var n = this.getTask(t),
+ i = this;
+ function r() {
+ if (void 0 === e || e) {
+ for (var t = 0; t < n.$source.length; t++) i.refreshLink(n.$source[t]);
+ for (t = 0; t < n.$target.length; t++) i.refreshLink(n.$target[t])
+ }
+ }
+ if (n && this.isTaskVisible(t)) this.$data.tasksStore.refresh(t, !!this.getState("tasksDnd").drag_id || !1 === e),
+ r();
+ else if (this.isTaskExists(t) && this.isTaskExists(this.getParent(t)) && !this._bulk_dnd) {
+ this.refreshTask(this.getParent(t));
+ var a = !1;
+ this.eachParent(function(t) { (a || this.isSplitTask(t)) && (a = !0)
+ },
+ t),
+ a && r()
+ }
+ },
+ refreshLink: function(t) {
+ this.$data.linksStore.refresh(t, !!this.getState("tasksDnd").drag_id)
+ },
+ silent: function(t) {
+ var e = this;
+ e.$data.tasksStore.silent(function() {
+ e.$data.linksStore.silent(function() {
+ t()
+ })
+ })
+ },
+ clearAll: function() {
+ for (var t = h.call(this), e = 0; e < t.length; e++) t[e].silent(function() {
+ t[e].clearAll()
+ });
+ for (e = 0; e < t.length; e++) t[e].clearAll();
+ this._update_flags(),
+ this.userdata = {},
+ this.callEvent("onClear", []),
+ this.render()
+ },
+ _clear_data: function() {
+ this.$data.tasksStore.clearAll(),
+ this.$data.linksStore.clearAll(),
+ this._update_flags(),
+ this.userdata = {}
+ },
+ selectTask: function(t) {
+ var e = this.$data.tasksStore;
+ if (!this.config.select_task) return ! 1;
+ if (t = d(t, this.config.root_id)) {
+ var n = this.getSelectedId();
+ e._skipResourceRepaint = !0,
+ e.select(t),
+ e._skipResourceRepaint = !1,
+ n && e.pull[n].$split_subtask && n != t && this.refreshTask(n),
+ e.pull[t].$split_subtask && n != t && this.refreshTask(t)
+ }
+ return e.getSelectedId()
+ },
+ unselectTask: function(t) {
+ var e = this.$data.tasksStore;
+ e.unselect(t),
+ t && e.pull[t].$split_subtask && this.refreshTask(t)
+ },
+ isSelectedTask: function(t) {
+ return this.$data.tasksStore.isSelected(t)
+ },
+ getSelectedId: function() {
+ return this.$data.tasksStore.getSelectedId()
+ }
+ }
+ };
+ t.exports = {
+ create: function() {
+ var t = i.mixin({},
+ f());
+ return i.mixin(t, r()),
+ i.mixin(t, a()),
+ t
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(0),
+ r = n(231),
+ a = n(46),
+ o = n(16);
+ t.exports = function(t) {
+ var e = r.create();
+ i.mixin(t, e);
+ var s = t.createDatastore({
+ name: "task",
+ type: "treeDatastore",
+ rootId: function() {
+ return t.config.root_id
+ },
+ initItem: i.bind(function(e) {
+ this.defined(e.id) || (e.id = this.uid()),
+ e.start_date && (e.start_date = t.date.parseDate(e.start_date, "parse_date")),
+ e.end_date && (e.end_date = t.date.parseDate(e.end_date, "parse_date"));
+ var n = null; (e.duration || 0 === e.duration) && (e.duration = n = 1 * e.duration),
+ n && (e.start_date && !e.end_date ? e.end_date = this.calculateEndDate(e) : !e.start_date && e.end_date && (e.start_date = this.calculateEndDate({
+ start_date: e.end_date,
+ duration: -e.duration,
+ task: e
+ }))),
+ e.progress = Number(e.progress) || 0,
+ this._isAllowedUnscheduledTask(e) && this._set_default_task_timing(e),
+ this._init_task_timing(e),
+ e.start_date && e.end_date && this.correctTaskWorkTime(e),
+ e.$source = [],
+ e.$target = [];
+ var r = this.$data.tasksStore.getItem(e.id);
+ return r && !i.defined(e.open) && (e.$open = r.$open),
+ void 0 === e.parent && (e.parent = this.config.root_id),
+ e
+ },
+ t),
+ getConfig: function() {
+ return t.config
+ }
+ }),
+ l = t.createDatastore({
+ name: "link",
+ initItem: i.bind(function(t) {
+ return this.defined(t.id) || (t.id = this.uid()),
+ t
+ },
+ t)
+ });
+ function c(e) {
+ var n = t.isTaskVisible(e);
+ if (!n && t.isTaskExists(e)) {
+ var i = t.getParent(e);
+ t.isTaskExists(i) && t.isTaskVisible(i) && (i = t.getTask(i), t.isSplitTask(i) && (n = !0))
+ }
+ return n
+ }
+ function u(e) {
+ if (t.isTaskExists(e.source)) {
+ var n = t.getTask(e.source);
+ n.$source = n.$source || [],
+ n.$source.push(e.id)
+ }
+ if (t.isTaskExists(e.target)) {
+ var i = t.getTask(e.target);
+ i.$target = i.$target || [],
+ i.$target.push(e.id)
+ }
+ }
+ function d(e) {
+ if (t.isTaskExists(e.source)) for (var n = t.getTask(e.source), i = 0; i < n.$source.length; i++) if (n.$source[i] == e.id) {
+ n.$source.splice(i, 1);
+ break
+ }
+ if (t.isTaskExists(e.target)) {
+ var r = t.getTask(e.target);
+ for (i = 0; i < r.$target.length; i++) if (r.$target[i] == e.id) {
+ r.$target.splice(i, 1);
+ break
+ }
+ }
+ }
+ function h() {
+ for (var e = null,
+ n = t.$data.tasksStore.getItems(), i = 0, r = n.length; i < r; i++)(e = n[i]).$source = [],
+ e.$target = [];
+ var a = t.$data.linksStore.getItems();
+ for (i = 0, r = a.length; i < r; i++) u(a[i])
+ }
+ function f(t) {
+ var e = t.source,
+ n = t.target;
+ for (var i in t.events) !
+ function(t, i) {
+ e.attachEvent(t,
+ function() {
+ return n.callEvent(i, Array.prototype.slice.call(arguments))
+ },
+ i)
+ } (i, t.events[i])
+ }
+ t.attachEvent("onDestroy",
+ function() {
+ s.destructor(),
+ l.destructor()
+ }),
+ t.attachEvent("onLinkValidation",
+ function(e) {
+ if (t.isLinkExists(e.id) || "predecessor_generated" === e.id) return ! 0;
+ for (var n = t.getTask(e.source).$source, i = 0; i < n.length; i++) {
+ var r = t.getLink(n[i]),
+ a = e.source == r.source,
+ o = e.target == r.target,
+ s = e.type == r.type;
+ if (a && o && s) return ! 1
+ }
+ return ! 0
+ }),
+ s.attachEvent("onBeforeRefreshAll",
+ function() {
+ if (!s._skipTaskRecalculation) for (var e = s.getVisibleItems(), n = 0; n < e.length; n++) {
+ var i = e[n];
+ i.$index = n,
+ i.$local_index = t.getTaskIndex(i.id),
+ t.resetProjectDates(i)
+ }
+ }),
+ s.attachEvent("onFilterItem",
+ function(e, n) {
+ if (t.config.show_tasks_outside_timescale) return ! 0;
+ var i = null,
+ r = null;
+ if (t.config.start_date && t.config.end_date) {
+ if (t._isAllowedUnscheduledTask(n)) return ! 0;
+ if (i = t.config.start_date.valueOf(), r = t.config.end_date.valueOf(), +n.start_date > r || +n.end_date < +i) return ! 1
+ }
+ return ! 0
+ }),
+ s.attachEvent("onIdChange",
+ function(e, n) {
+ t._update_flags(e, n);
+ var i = t.getTask(n);
+ s.isSilent() || (i.$split_subtask || i.rollup) && t.eachParent(function(e) {
+ t.refreshTask(e.id)
+ },
+ n)
+ }),
+ s.attachEvent("onAfterUpdate",
+ function(e) {
+ if (t._update_parents(e), t.getState("batchUpdate").batch_update) return ! 0;
+ var n = s.getItem(e);
+ n.$source || (n.$source = []);
+ for (var i = 0; i < n.$source.length; i++) l.refresh(n.$source[i]);
+ for (n.$target || (n.$target = []), i = 0; i < n.$target.length; i++) l.refresh(n.$target[i])
+ }),
+ s.attachEvent("onBeforeItemMove",
+ function(e, n, i) {
+ return ! o(e, t, s) || (console.log("The placeholder task cannot be moved to another position."), !1)
+ }),
+ s.attachEvent("onAfterItemMove",
+ function(e, n, i) {
+ var r = t.getTask(e);
+ null !== this.getNextSibling(e) ? r.$drop_target = this.getNextSibling(e) : null !== this.getPrevSibling(e) ? r.$drop_target = "next:" + this.getPrevSibling(e) : r.$drop_target = "next:null"
+ }),
+ s.attachEvent("onStoreUpdated",
+ function(e, n, i) {
+ if ("delete" == i && t._update_flags(e, null), !t.$services.getService("state").getState("batchUpdate").batch_update) {
+ if (t.config.fit_tasks && "paint" !== i) {
+ var r = t.getState();
+ a(t);
+ var o = t.getState();
+ if ( + r.min_date != +o.min_date || +r.max_date != +o.max_date) return t.render(),
+ t.callEvent("onScaleAdjusted", []),
+ !0
+ }
+ "add" == i || "move" == i || "delete" == i ? t.$layout && ("task" != this.$config.name || "add" != i && "delete" != i || "lightbox" != this._skipTaskRecalculation && (this._skipTaskRecalculation = !0), t.$layout.resize()) : e || l.refresh()
+ }
+ }),
+ l.attachEvent("onAfterAdd",
+ function(t, e) {
+ u(e)
+ }),
+ l.attachEvent("onAfterUpdate",
+ function(t, e) {
+ h()
+ }),
+ l.attachEvent("onAfterDelete",
+ function(t, e) {
+ d(e)
+ }),
+ l.attachEvent("onBeforeIdChange",
+ function(e, n) {
+ d(t.mixin({
+ id: e
+ },
+ t.$data.linksStore.getItem(n))),
+ u(t.$data.linksStore.getItem(n))
+ }),
+ l.attachEvent("onFilterItem",
+ function(e, n) {
+ if (!t.config.show_links) return ! 1;
+ var i = c(n.source),
+ r = c(n.target);
+ return ! (!i || !r || t._isAllowedUnscheduledTask(t.getTask(n.source)) || t._isAllowedUnscheduledTask(t.getTask(n.target))) && t.callEvent("onBeforeLinkDisplay", [e, n])
+ }),
+ function() {
+ var e = n(45),
+ i = {};
+ t.attachEvent("onBeforeTaskDelete",
+ function(n, r) {
+ return i[n] = e.getSubtreeLinks(t, n),
+ !0
+ }),
+ t.attachEvent("onAfterTaskDelete",
+ function(e, n) {
+ i[e] && t.$data.linksStore.silent(function() {
+ for (var n in i[e]) t.isLinkExists(n) && t.$data.linksStore.removeItem(n),
+ d(i[e][n]);
+ i[e] = null
+ })
+ })
+ } (),
+ t.attachEvent("onAfterLinkDelete",
+ function(e, n) {
+ t.refreshTask(n.source),
+ t.refreshTask(n.target)
+ }),
+ t.attachEvent("onParse", h),
+ f({
+ source: l,
+ target: t,
+ events: {
+ onItemLoading: "onLinkLoading",
+ onBeforeAdd: "onBeforeLinkAdd",
+ onAfterAdd: "onAfterLinkAdd",
+ onBeforeUpdate: "onBeforeLinkUpdate",
+ onAfterUpdate: "onAfterLinkUpdate",
+ onBeforeDelete: "onBeforeLinkDelete",
+ onAfterDelete: "onAfterLinkDelete",
+ onIdChange: "onLinkIdChange"
+ }
+ }),
+ f({
+ source: s,
+ target: t,
+ events: {
+ onItemLoading: "onTaskLoading",
+ onBeforeAdd: "onBeforeTaskAdd",
+ onAfterAdd: "onAfterTaskAdd",
+ onBeforeUpdate: "onBeforeTaskUpdate",
+ onAfterUpdate: "onAfterTaskUpdate",
+ onBeforeDelete: "onBeforeTaskDelete",
+ onAfterDelete: "onAfterTaskDelete",
+ onIdChange: "onTaskIdChange",
+ onBeforeItemMove: "onBeforeTaskMove",
+ onAfterItemMove: "onAfterTaskMove",
+ onFilterItem: "onBeforeTaskDisplay",
+ onItemOpen: "onTaskOpened",
+ onItemClose: "onTaskClosed",
+ onBeforeSelect: "onBeforeTaskSelected",
+ onAfterSelect: "onTaskSelected",
+ onAfterUnselect: "onTaskUnselected"
+ }
+ }),
+ t.$data = {
+ tasksStore: s,
+ linksStore: l
+ }
+ }
+ },
+ function(t, e, n) { (function(n, i, r) {
+ var a, o, s;
+ function l(t) {
+ "@babel/helpers - typeof";
+ return (l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ /* @preserve
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2018 Petka Antonov
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+ !
+ function(n) {
+ "object" == l(e) && void 0 !== t ? t.exports = n() : (o = [], void 0 === (s = "function" == typeof(a = n) ? a.apply(e, o) : a) || (t.exports = s))
+ } (function() {
+ var t, e, a;
+ return function t(e, n, i) {
+ function r(o, s) {
+ if (!n[o]) {
+ if (!e[o]) {
+ var l = "function" == typeof _dereq_ && _dereq_;
+ if (!s && l) return l(o, !0);
+ if (a) return a(o, !0);
+ var c = new Error("Cannot find module '" + o + "'");
+ throw c.code = "MODULE_NOT_FOUND",
+ c
+ }
+ var u = n[o] = {
+ exports: {}
+ };
+ e[o][0].call(u.exports,
+ function(t) {
+ var n = e[o][1][t];
+ return r(n || t)
+ },
+ u, u.exports, t, e, n, i)
+ }
+ return n[o].exports
+ }
+ for (var a = "function" == typeof _dereq_ && _dereq_,
+ o = 0; o < i.length; o++) r(i[o]);
+ return r
+ } ({
+ 1 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(t) {
+ var e = t._SomePromiseArray;
+ function n(t) {
+ var n = new e(t),
+ i = n.promise();
+ return n.setHowMany(1),
+ n.setUnwrap(),
+ n.init(),
+ i
+ }
+ t.any = function(t) {
+ return n(t)
+ },
+ t.prototype.any = function() {
+ return n(this)
+ }
+ }
+ },
+ {}],
+ 2 : [function(t, e, i) {
+ "use strict";
+ var r;
+ try {
+ throw new Error
+ } catch(t) {
+ r = t
+ }
+ var a = t("./schedule"),
+ o = t("./queue"),
+ s = t("./util");
+ function l() {
+ this._customScheduler = !1,
+ this._isTickUsed = !1,
+ this._lateQueue = new o(16),
+ this._normalQueue = new o(16),
+ this._haveDrainedQueues = !1,
+ this._trampolineEnabled = !0;
+ var t = this;
+ this.drainQueues = function() {
+ t._drainQueues()
+ },
+ this._schedule = a
+ }
+ function c(t, e, n) {
+ this._lateQueue.push(t, e, n),
+ this._queueTick()
+ }
+ function u(t, e, n) {
+ this._normalQueue.push(t, e, n),
+ this._queueTick()
+ }
+ function d(t) {
+ this._normalQueue._pushOne(t),
+ this._queueTick()
+ }
+ function h(t) {
+ for (; t.length() > 0;) f(t)
+ }
+ function f(t) {
+ var e = t.shift();
+ if ("function" != typeof e) e._settlePromises();
+ else {
+ var n = t.shift(),
+ i = t.shift();
+ e.call(n, i)
+ }
+ }
+ l.prototype.setScheduler = function(t) {
+ var e = this._schedule;
+ return this._schedule = t,
+ this._customScheduler = !0,
+ e
+ },
+ l.prototype.hasCustomScheduler = function() {
+ return this._customScheduler
+ },
+ l.prototype.enableTrampoline = function() {
+ this._trampolineEnabled = !0
+ },
+ l.prototype.disableTrampolineIfNecessary = function() {
+ s.hasDevTools && (this._trampolineEnabled = !1)
+ },
+ l.prototype.haveItemsQueued = function() {
+ return this._isTickUsed || this._haveDrainedQueues
+ },
+ l.prototype.fatalError = function(t, e) {
+ e ? (n.stderr.write("Fatal " + (t instanceof Error ? t.stack: t) + "\n"), n.exit(2)) : this.throwLater(t)
+ },
+ l.prototype.throwLater = function(t, e) {
+ if (1 === arguments.length && (e = t, t = function() {
+ throw e
+ }), "undefined" != typeof setTimeout) setTimeout(function() {
+ t(e)
+ },
+ 0);
+ else try {
+ this._schedule(function() {
+ t(e)
+ })
+ } catch(t) {
+ throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")
+ }
+ },
+ s.hasDevTools ? (l.prototype.invokeLater = function(t, e, n) {
+ this._trampolineEnabled ? c.call(this, t, e, n) : this._schedule(function() {
+ setTimeout(function() {
+ t.call(e, n)
+ },
+ 100)
+ })
+ },
+ l.prototype.invoke = function(t, e, n) {
+ this._trampolineEnabled ? u.call(this, t, e, n) : this._schedule(function() {
+ t.call(e, n)
+ })
+ },
+ l.prototype.settlePromises = function(t) {
+ this._trampolineEnabled ? d.call(this, t) : this._schedule(function() {
+ t._settlePromises()
+ })
+ }) : (l.prototype.invokeLater = c, l.prototype.invoke = u, l.prototype.settlePromises = d),
+ l.prototype._drainQueues = function() {
+ h(this._normalQueue),
+ this._reset(),
+ this._haveDrainedQueues = !0,
+ h(this._lateQueue)
+ },
+ l.prototype._queueTick = function() {
+ this._isTickUsed || (this._isTickUsed = !0, this._schedule(this.drainQueues))
+ },
+ l.prototype._reset = function() {
+ this._isTickUsed = !1
+ },
+ e.exports = l,
+ e.exports.firstLineError = r
+ },
+ {
+ "./queue": 26,
+ "./schedule": 29,
+ "./util": 36
+ }],
+ 3 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(t, e, n, i) {
+ var r = !1,
+ a = function(t, e) {
+ this._reject(e)
+ },
+ o = function(t, e) {
+ e.promiseRejectionQueued = !0,
+ e.bindingPromise._then(a, a, null, this, t)
+ },
+ s = function(t, e) {
+ 0 == (50397184 & this._bitField) && this._resolveCallback(e.target)
+ },
+ l = function(t, e) {
+ e.promiseRejectionQueued || this._reject(t)
+ };
+ t.prototype.bind = function(a) {
+ r || (r = !0, t.prototype._propagateFrom = i.propagateFromFunction(), t.prototype._boundValue = i.boundValueFunction());
+ var c = n(a),
+ u = new t(e);
+ u._propagateFrom(this, 1);
+ var d = this._target();
+ if (u._setBoundTo(c), c instanceof t) {
+ var h = {
+ promiseRejectionQueued: !1,
+ promise: u,
+ target: d,
+ bindingPromise: c
+ };
+ d._then(e, o, void 0, u, h),
+ c._then(s, l, void 0, u, h),
+ u._setOnCancel(c)
+ } else u._resolveCallback(d);
+ return u
+ },
+ t.prototype._setBoundTo = function(t) {
+ void 0 !== t ? (this._bitField = 2097152 | this._bitField, this._boundTo = t) : this._bitField = -2097153 & this._bitField
+ },
+ t.prototype._isBound = function() {
+ return 2097152 == (2097152 & this._bitField)
+ },
+ t.bind = function(e, n) {
+ return t.resolve(n).bind(e)
+ }
+ }
+ },
+ {}],
+ 4 : [function(t, e, n) {
+ "use strict";
+ var i;
+ "undefined" != typeof Promise && (i = Promise);
+ var r = t("./promise")();
+ r.noConflict = function() {
+ try {
+ Promise === r && (Promise = i)
+ } catch(t) {}
+ return r
+ },
+ e.exports = r
+ },
+ {
+ "./promise": 22
+ }],
+ 5 : [function(t, e, n) {
+ "use strict";
+ var i = Object.create;
+ if (i) {
+ var r = i(null),
+ a = i(null);
+ r[" size"] = a[" size"] = 0
+ }
+ e.exports = function(e) {
+ var n = t("./util"),
+ i = n.canEvaluate;
+ n.isIdentifier;
+ function r(t) {
+ return function(t, i) {
+ var r;
+ if (null != t && (r = t[i]), "function" != typeof r) {
+ var a = "Object " + n.classString(t) + " has no method '" + n.toString(i) + "'";
+ throw new e.TypeError(a)
+ }
+ return r
+ } (t, this.pop()).apply(t, this)
+ }
+ function a(t) {
+ return t[this]
+ }
+ function o(t) {
+ var e = +this;
+ return e < 0 && (e = Math.max(0, e + t.length)),
+ t[e]
+ }
+ e.prototype.call = function(t) {
+ var e = [].slice.call(arguments, 1);
+ return e.push(t),
+ this._then(r, void 0, void 0, e, void 0)
+ },
+ e.prototype.get = function(t) {
+ var e;
+ if ("number" == typeof t) e = o;
+ else if (i) {
+ var n = (void 0)(t);
+ e = null !== n ? n: a
+ } else e = a;
+ return this._then(e, void 0, void 0, t, void 0)
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 6 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r) {
+ var a = t("./util"),
+ o = a.tryCatch,
+ s = a.errorObj,
+ l = e._async;
+ e.prototype.
+ break = e.prototype.cancel = function() {
+ if (!r.cancellation()) return this._warn("cancellation is disabled");
+ for (var t = this,
+ e = t; t._isCancellable();) {
+ if (!t._cancelBy(e)) {
+ e._isFollowing() ? e._followee().cancel() : e._cancelBranched();
+ break
+ }
+ var n = t._cancellationParent;
+ if (null == n || !n._isCancellable()) {
+ t._isFollowing() ? t._followee().cancel() : t._cancelBranched();
+ break
+ }
+ t._isFollowing() && t._followee().cancel(),
+ t._setWillBeCancelled(),
+ e = t,
+ t = n
+ }
+ },
+ e.prototype._branchHasCancelled = function() {
+ this._branchesRemainingToCancel--
+ },
+ e.prototype._enoughBranchesHaveCancelled = function() {
+ return void 0 === this._branchesRemainingToCancel || this._branchesRemainingToCancel <= 0
+ },
+ e.prototype._cancelBy = function(t) {
+ return t === this ? (this._branchesRemainingToCancel = 0, this._invokeOnCancel(), !0) : (this._branchHasCancelled(), !!this._enoughBranchesHaveCancelled() && (this._invokeOnCancel(), !0))
+ },
+ e.prototype._cancelBranched = function() {
+ this._enoughBranchesHaveCancelled() && this._cancel()
+ },
+ e.prototype._cancel = function() {
+ this._isCancellable() && (this._setCancelled(), l.invoke(this._cancelPromises, this, void 0))
+ },
+ e.prototype._cancelPromises = function() {
+ this._length() > 0 && this._settlePromises()
+ },
+ e.prototype._unsetOnCancel = function() {
+ this._onCancelField = void 0
+ },
+ e.prototype._isCancellable = function() {
+ return this.isPending() && !this._isCancelled()
+ },
+ e.prototype.isCancellable = function() {
+ return this.isPending() && !this.isCancelled()
+ },
+ e.prototype._doInvokeOnCancel = function(t, e) {
+ if (a.isArray(t)) for (var n = 0; n < t.length; ++n) this._doInvokeOnCancel(t[n], e);
+ else if (void 0 !== t) if ("function" == typeof t) {
+ if (!e) {
+ var i = o(t).call(this._boundValue());
+ i === s && (this._attachExtraTrace(i.e), l.throwLater(i.e))
+ }
+ } else t._resultCancelled(this)
+ },
+ e.prototype._invokeOnCancel = function() {
+ var t = this._onCancel();
+ this._unsetOnCancel(),
+ l.invoke(this._doInvokeOnCancel, this, t)
+ },
+ e.prototype._invokeInternalOnCancel = function() {
+ this._isCancellable() && (this._doInvokeOnCancel(this._onCancel(), !0), this._unsetOnCancel())
+ },
+ e.prototype._resultCancelled = function() {
+ this.cancel()
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 7 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e) {
+ var n = t("./util"),
+ i = t("./es5").keys,
+ r = n.tryCatch,
+ a = n.errorObj;
+ return function(t, o, s) {
+ return function(l) {
+ var c = s._boundValue();
+ t: for (var u = 0; u < t.length; ++u) {
+ var d = t[u];
+ if (d === Error || null != d && d.prototype instanceof Error) {
+ if (l instanceof d) return r(o).call(c, l)
+ } else if ("function" == typeof d) {
+ var h = r(d).call(c, l);
+ if (h === a) return h;
+ if (h) return r(o).call(c, l)
+ } else if (n.isObject(l)) {
+ for (var f = i(d), _ = 0; _ < f.length; ++_) {
+ var g = f[_];
+ if (d[g] != l[g]) continue t
+ }
+ return r(o).call(c, l)
+ }
+ }
+ return e
+ }
+ }
+ }
+ },
+ {
+ "./es5": 13,
+ "./util": 36
+ }],
+ 8 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(t) {
+ var e = !1,
+ n = [];
+ function i() {
+ this._trace = new i.CapturedTrace(r())
+ }
+ function r() {
+ var t = n.length - 1;
+ if (t >= 0) return n[t]
+ }
+ return t.prototype._promiseCreated = function() {},
+ t.prototype._pushContext = function() {},
+ t.prototype._popContext = function() {
+ return null
+ },
+ t._peekContext = t.prototype._peekContext = function() {},
+ i.prototype._pushContext = function() {
+ void 0 !== this._trace && (this._trace._promiseCreated = null, n.push(this._trace))
+ },
+ i.prototype._popContext = function() {
+ if (void 0 !== this._trace) {
+ var t = n.pop(),
+ e = t._promiseCreated;
+ return t._promiseCreated = null,
+ e
+ }
+ return null
+ },
+ i.CapturedTrace = null,
+ i.create = function() {
+ if (e) return new i
+ },
+ i.deactivateLongStackTraces = function() {},
+ i.activateLongStackTraces = function() {
+ var n = t.prototype._pushContext,
+ a = t.prototype._popContext,
+ o = t._peekContext,
+ s = t.prototype._peekContext,
+ l = t.prototype._promiseCreated;
+ i.deactivateLongStackTraces = function() {
+ t.prototype._pushContext = n,
+ t.prototype._popContext = a,
+ t._peekContext = o,
+ t.prototype._peekContext = s,
+ t.prototype._promiseCreated = l,
+ e = !1
+ },
+ e = !0,
+ t.prototype._pushContext = i.prototype._pushContext,
+ t.prototype._popContext = i.prototype._popContext,
+ t._peekContext = t.prototype._peekContext = r,
+ t.prototype._promiseCreated = function() {
+ var t = this._peekContext();
+ t && null == t._promiseCreated && (t._promiseCreated = this)
+ }
+ },
+ i
+ }
+ },
+ {}],
+ 9 : [function(t, e, i) {
+ "use strict";
+ e.exports = function(e, i) {
+ var r, a, o, s = e._getDomain,
+ c = e._async,
+ u = t("./errors").Warning,
+ d = t("./util"),
+ h = t("./es5"),
+ f = d.canAttachTrace,
+ _ = /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,
+ g = /\((?:timers\.js):\d+:\d+\)/,
+ p = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,
+ v = null,
+ m = null,
+ y = !1,
+ k = !(0 == d.env("BLUEBIRD_DEBUG")),
+ b = !(0 == d.env("BLUEBIRD_WARNINGS") || !k && !d.env("BLUEBIRD_WARNINGS")),
+ x = !(0 == d.env("BLUEBIRD_LONG_STACK_TRACES") || !k && !d.env("BLUEBIRD_LONG_STACK_TRACES")),
+ w = 0 != d.env("BLUEBIRD_W_FORGOTTEN_RETURN") && (b || !!d.env("BLUEBIRD_W_FORGOTTEN_RETURN"));
+ e.prototype.suppressUnhandledRejections = function() {
+ var t = this._target();
+ t._bitField = -1048577 & t._bitField | 524288
+ },
+ e.prototype._ensurePossibleRejectionHandled = function() {
+ if (0 == (524288 & this._bitField)) {
+ this._setRejectionIsUnhandled();
+ var t = this;
+ setTimeout(function() {
+ t._notifyUnhandledRejection()
+ },
+ 1)
+ }
+ },
+ e.prototype._notifyUnhandledRejectionIsHandled = function() {
+ q("rejectionHandled", r, void 0, this)
+ },
+ e.prototype._setReturnedNonUndefined = function() {
+ this._bitField = 268435456 | this._bitField
+ },
+ e.prototype._returnedNonUndefined = function() {
+ return 0 != (268435456 & this._bitField)
+ },
+ e.prototype._notifyUnhandledRejection = function() {
+ if (this._isRejectionUnhandled()) {
+ var t = this._settledValue();
+ this._setUnhandledRejectionIsNotified(),
+ q("unhandledRejection", a, t, this)
+ }
+ },
+ e.prototype._setUnhandledRejectionIsNotified = function() {
+ this._bitField = 262144 | this._bitField
+ },
+ e.prototype._unsetUnhandledRejectionIsNotified = function() {
+ this._bitField = -262145 & this._bitField
+ },
+ e.prototype._isUnhandledRejectionNotified = function() {
+ return (262144 & this._bitField) > 0
+ },
+ e.prototype._setRejectionIsUnhandled = function() {
+ this._bitField = 1048576 | this._bitField
+ },
+ e.prototype._unsetRejectionIsUnhandled = function() {
+ this._bitField = -1048577 & this._bitField,
+ this._isUnhandledRejectionNotified() && (this._unsetUnhandledRejectionIsNotified(), this._notifyUnhandledRejectionIsHandled())
+ },
+ e.prototype._isRejectionUnhandled = function() {
+ return (1048576 & this._bitField) > 0
+ },
+ e.prototype._warn = function(t, e, n) {
+ return z(t, e, n || this)
+ },
+ e.onPossiblyUnhandledRejection = function(t) {
+ var e = s();
+ a = "function" == typeof t ? null === e ? t: d.domainBind(e, t) : void 0
+ },
+ e.onUnhandledRejectionHandled = function(t) {
+ var e = s();
+ r = "function" == typeof t ? null === e ? t: d.domainBind(e, t) : void 0
+ };
+ var S = function() {};
+ e.longStackTraces = function() {
+ if (c.haveItemsQueued() && !tt.longStackTraces) throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");
+ if (!tt.longStackTraces && Y()) {
+ var t = e.prototype._captureStackTrace,
+ n = e.prototype._attachExtraTrace,
+ r = e.prototype._dereferenceTrace;
+ tt.longStackTraces = !0,
+ S = function() {
+ if (c.haveItemsQueued() && !tt.longStackTraces) throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");
+ e.prototype._captureStackTrace = t,
+ e.prototype._attachExtraTrace = n,
+ e.prototype._dereferenceTrace = r,
+ i.deactivateLongStackTraces(),
+ c.enableTrampoline(),
+ tt.longStackTraces = !1
+ },
+ e.prototype._captureStackTrace = H,
+ e.prototype._attachExtraTrace = F,
+ e.prototype._dereferenceTrace = B,
+ i.activateLongStackTraces(),
+ c.disableTrampolineIfNecessary()
+ }
+ },
+ e.hasLongStackTraces = function() {
+ return tt.longStackTraces && Y()
+ };
+ var T = function() {
+ try {
+ if ("function" == typeof CustomEvent) {
+ var t = new CustomEvent("CustomEvent");
+ return d.global.dispatchEvent(t),
+ function(t, e) {
+ var n = {
+ detail: e,
+ cancelable: !0
+ };
+ h.defineProperty(n, "promise", {
+ value: e.promise
+ }),
+ h.defineProperty(n, "reason", {
+ value: e.reason
+ });
+ var i = new CustomEvent(t.toLowerCase(), n);
+ return ! d.global.dispatchEvent(i)
+ }
+ }
+ if ("function" == typeof Event) {
+ t = new Event("CustomEvent");
+ return d.global.dispatchEvent(t),
+ function(t, e) {
+ var n = new Event(t.toLowerCase(), {
+ cancelable: !0
+ });
+ return n.detail = e,
+ h.defineProperty(n, "promise", {
+ value: e.promise
+ }),
+ h.defineProperty(n, "reason", {
+ value: e.reason
+ }),
+ !d.global.dispatchEvent(n)
+ }
+ }
+ return (t = document.createEvent("CustomEvent")).initCustomEvent("testingtheevent", !1, !0, {}),
+ d.global.dispatchEvent(t),
+ function(t, e) {
+ var n = document.createEvent("CustomEvent");
+ return n.initCustomEvent(t.toLowerCase(), !1, !0, e),
+ !d.global.dispatchEvent(n)
+ }
+ } catch(t) {}
+ return function() {
+ return ! 1
+ }
+ } (),
+ $ = d.isNode ?
+ function() {
+ return n.emit.apply(n, arguments)
+ }: d.global ?
+ function(t) {
+ var e = "on" + t.toLowerCase(),
+ n = d.global[e];
+ return !! n && (n.apply(d.global, [].slice.call(arguments, 1)), !0)
+ }: function() {
+ return ! 1
+ };
+ function C(t, e) {
+ return {
+ promise: e
+ }
+ }
+ var E = {
+ promiseCreated: C,
+ promiseFulfilled: C,
+ promiseRejected: C,
+ promiseResolved: C,
+ promiseCancelled: C,
+ promiseChained: function(t, e, n) {
+ return {
+ promise: e,
+ child: n
+ }
+ },
+ warning: function(t, e) {
+ return {
+ warning: e
+ }
+ },
+ unhandledRejection: function(t, e, n) {
+ return {
+ reason: e,
+ promise: n
+ }
+ },
+ rejectionHandled: C
+ },
+ A = function(t) {
+ var e = !1;
+ try {
+ e = $.apply(null, arguments)
+ } catch(t) {
+ c.throwLater(t),
+ e = !0
+ }
+ var n = !1;
+ try {
+ n = T(t, E[t].apply(null, arguments))
+ } catch(t) {
+ c.throwLater(t),
+ n = !0
+ }
+ return n || e
+ };
+ function D() {
+ return ! 1
+ }
+ function M(t, e, n) {
+ var i = this;
+ try {
+ t(e, n,
+ function(t) {
+ if ("function" != typeof t) throw new TypeError("onCancel must be a function, got: " + d.toString(t));
+ i._attachCancellationCallback(t)
+ })
+ } catch(t) {
+ return t
+ }
+ }
+ function I(t) {
+ if (!this._isCancellable()) return this;
+ var e = this._onCancel();
+ void 0 !== e ? d.isArray(e) ? e.push(t) : this._setOnCancel([e, t]) : this._setOnCancel(t)
+ }
+ function P() {
+ return this._onCancelField
+ }
+ function N(t) {
+ this._onCancelField = t
+ }
+ function O() {
+ this._cancellationParent = void 0,
+ this._onCancelField = void 0
+ }
+ function L(t, e) {
+ if (0 != (1 & e)) {
+ this._cancellationParent = t;
+ var n = t._branchesRemainingToCancel;
+ void 0 === n && (n = 0),
+ t._branchesRemainingToCancel = n + 1
+ }
+ 0 != (2 & e) && t._isBound() && this._setBoundTo(t._boundTo)
+ }
+ e.config = function(t) {
+ if ("longStackTraces" in (t = Object(t)) && (t.longStackTraces ? e.longStackTraces() : !t.longStackTraces && e.hasLongStackTraces() && S()), "warnings" in t) {
+ var n = t.warnings;
+ tt.warnings = !!n,
+ w = tt.warnings,
+ d.isObject(n) && "wForgottenReturn" in n && (w = !!n.wForgottenReturn)
+ }
+ if ("cancellation" in t && t.cancellation && !tt.cancellation) {
+ if (c.haveItemsQueued()) throw new Error("cannot enable cancellation after promises are in use");
+ e.prototype._clearCancellationData = O,
+ e.prototype._propagateFrom = L,
+ e.prototype._onCancel = P,
+ e.prototype._setOnCancel = N,
+ e.prototype._attachCancellationCallback = I,
+ e.prototype._execute = M,
+ R = L,
+ tt.cancellation = !0
+ }
+ return "monitoring" in t && (t.monitoring && !tt.monitoring ? (tt.monitoring = !0, e.prototype._fireEvent = A) : !t.monitoring && tt.monitoring && (tt.monitoring = !1, e.prototype._fireEvent = D)),
+ e
+ },
+ e.prototype._fireEvent = D,
+ e.prototype._execute = function(t, e, n) {
+ try {
+ t(e, n)
+ } catch(t) {
+ return t
+ }
+ },
+ e.prototype._onCancel = function() {},
+ e.prototype._setOnCancel = function(t) {},
+ e.prototype._attachCancellationCallback = function(t) {},
+ e.prototype._captureStackTrace = function() {},
+ e.prototype._attachExtraTrace = function() {},
+ e.prototype._dereferenceTrace = function() {},
+ e.prototype._clearCancellationData = function() {},
+ e.prototype._propagateFrom = function(t, e) {};
+ var R = function(t, e) {
+ 0 != (2 & e) && t._isBound() && this._setBoundTo(t._boundTo)
+ };
+ function j() {
+ var t = this._boundTo;
+ return void 0 !== t && t instanceof e ? t.isFulfilled() ? t.value() : void 0 : t
+ }
+ function H() {
+ this._trace = new Q(this._peekContext())
+ }
+ function F(t, e) {
+ if (f(t)) {
+ var n = this._trace;
+ if (void 0 !== n && e && (n = n._parent), void 0 !== n) n.attachExtraTrace(t);
+ else if (!t.__stackCleaned__) {
+ var i = W(t);
+ d.notEnumerableProp(t, "stack", i.message + "\n" + i.stack.join("\n")),
+ d.notEnumerableProp(t, "__stackCleaned__", !0)
+ }
+ }
+ }
+ function B() {
+ this._trace = void 0
+ }
+ function z(t, n, i) {
+ if (tt.warnings) {
+ var r, a = new u(t);
+ if (n) i._attachExtraTrace(a);
+ else if (tt.longStackTraces && (r = e._peekContext())) r.attachExtraTrace(a);
+ else {
+ var o = W(a);
+ a.stack = o.message + "\n" + o.stack.join("\n")
+ }
+ A("warning", a) || V(a, "", !0)
+ }
+ }
+ function U(t) {
+ for (var e = [], n = 0; n < t.length; ++n) {
+ var i = t[n],
+ r = " (No stack trace)" === i || v.test(i),
+ a = r && J(i);
+ r && !a && (y && " " !== i.charAt(0) && (i = " " + i), e.push(i))
+ }
+ return e
+ }
+ function W(t) {
+ var e = t.stack,
+ n = t.toString();
+ return e = "string" == typeof e && e.length > 0 ?
+ function(t) {
+ for (var e = t.stack.replace(/\s+$/g, "").split("\n"), n = 0; n < e.length; ++n) {
+ var i = e[n];
+ if (" (No stack trace)" === i || v.test(i)) break
+ }
+ return n > 0 && "SyntaxError" != t.name && (e = e.slice(n)),
+ e
+ } (t) : [" (No stack trace)"],
+ {
+ message: n,
+ stack: "SyntaxError" == t.name ? e: U(e)
+ }
+ }
+ function V(t, e, n) {
+ if ("undefined" != typeof console) {
+ var i;
+ if (d.isObject(t)) {
+ var r = t.stack;
+ i = e + m(r, t)
+ } else i = e + String(t);
+ "function" == typeof o ? o(i, n) : "function" != typeof console.log && "object" !== l(console.log) || console.log(i)
+ }
+ }
+ function q(t, e, n, i) {
+ var r = !1;
+ try {
+ "function" == typeof e && (r = !0, "rejectionHandled" === t ? e(i) : e(n, i))
+ } catch(t) {
+ c.throwLater(t)
+ }
+ "unhandledRejection" === t ? A(t, n, i) || r || V(n, "Unhandled rejection ") : A(t, i)
+ }
+ function G(t) {
+ var e;
+ if ("function" == typeof t) e = "[function " + (t.name || "anonymous") + "]";
+ else {
+ e = t && "function" == typeof t.toString ? t.toString() : d.toString(t);
+ if (/\[object [a-zA-Z0-9$_]+\]/.test(e)) try {
+ e = JSON.stringify(t)
+ } catch(t) {}
+ 0 === e.length && (e = "(empty array)")
+ }
+ return "(<" +
+ function(t) {
+ if (t.length < 41) return t;
+ return t.substr(0, 38) + "..."
+ } (e) + ">, no stack trace)"
+ }
+ function Y() {
+ return "function" == typeof Z
+ }
+ var J = function() {
+ return ! 1
+ },
+ X = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
+ function K(t) {
+ var e = t.match(X);
+ if (e) return {
+ fileName: e[1],
+ line: parseInt(e[2], 10)
+ }
+ }
+ function Q(t) {
+ this._parent = t,
+ this._promisesCreated = 0;
+ var e = this._length = 1 + (void 0 === t ? 0 : t._length);
+ Z(this, Q),
+ e > 32 && this.uncycle()
+ }
+ d.inherits(Q, Error),
+ i.CapturedTrace = Q,
+ Q.prototype.uncycle = function() {
+ var t = this._length;
+ if (! (t < 2)) {
+ for (var e = [], n = {},
+ i = 0, r = this; void 0 !== r; ++i) e.push(r),
+ r = r._parent;
+ for (i = (t = this._length = i) - 1; i >= 0; --i) {
+ var a = e[i].stack;
+ void 0 === n[a] && (n[a] = i)
+ }
+ for (i = 0; i < t; ++i) {
+ var o = n[e[i].stack];
+ if (void 0 !== o && o !== i) {
+ o > 0 && (e[o - 1]._parent = void 0, e[o - 1]._length = 1),
+ e[i]._parent = void 0,
+ e[i]._length = 1;
+ var s = i > 0 ? e[i - 1] : this;
+ o < t - 1 ? (s._parent = e[o + 1], s._parent.uncycle(), s._length = s._parent._length + 1) : (s._parent = void 0, s._length = 1);
+ for (var l = s._length + 1,
+ c = i - 2; c >= 0; --c) e[c]._length = l,
+ l++;
+ return
+ }
+ }
+ }
+ },
+ Q.prototype.attachExtraTrace = function(t) {
+ if (!t.__stackCleaned__) {
+ this.uncycle();
+ for (var e = W(t), n = e.message, i = [e.stack], r = this; void 0 !== r;) i.push(U(r.stack.split("\n"))),
+ r = r._parent; !
+ function(t) {
+ for (var e = t[0], n = 1; n < t.length; ++n) {
+ for (var i = t[n], r = e.length - 1, a = e[r], o = -1, s = i.length - 1; s >= 0; --s) if (i[s] === a) {
+ o = s;
+ break
+ }
+ for (s = o; s >= 0; --s) {
+ var l = i[s];
+ if (e[r] !== l) break;
+ e.pop(),
+ r--
+ }
+ e = i
+ }
+ } (i),
+ function(t) {
+ for (var e = 0; e < t.length; ++e)(0 === t[e].length || e + 1 < t.length && t[e][0] === t[e + 1][0]) && (t.splice(e, 1), e--)
+ } (i),
+ d.notEnumerableProp(t, "stack",
+ function(t, e) {
+ for (var n = 0; n < e.length - 1; ++n) e[n].push("From previous event:"),
+ e[n] = e[n].join("\n");
+ return n < e.length && (e[n] = e[n].join("\n")),
+ t + "\n" + e.join("\n")
+ } (n, i)),
+ d.notEnumerableProp(t, "__stackCleaned__", !0)
+ }
+ };
+ var Z = function() {
+ var t = /^\s*at\s*/,
+ e = function(t, e) {
+ return "string" == typeof t ? t: void 0 !== e.name && void 0 !== e.message ? e.toString() : G(e)
+ };
+ if ("number" == typeof Error.stackTraceLimit && "function" == typeof Error.captureStackTrace) {
+ Error.stackTraceLimit += 6,
+ v = t,
+ m = e;
+ var n = Error.captureStackTrace;
+ return J = function(t) {
+ return _.test(t)
+ },
+ function(t, e) {
+ Error.stackTraceLimit += 6,
+ n(t, e),
+ Error.stackTraceLimit -= 6
+ }
+ }
+ var i, r = new Error;
+ if ("string" == typeof r.stack && r.stack.split("\n")[0].indexOf("stackDetection@") >= 0) return v = /@/,
+ m = e,
+ y = !0,
+ function(t) {
+ t.stack = (new Error).stack
+ };
+ try {
+ throw new Error
+ } catch(t) {
+ i = "stack" in t
+ }
+ return "stack" in r || !i || "number" != typeof Error.stackTraceLimit ? (m = function(t, e) {
+ return "string" == typeof t ? t: "object" !== l(e) && "function" != typeof e || void 0 === e.name || void 0 === e.message ? G(e) : e.toString()
+ },
+ null) : (v = t, m = e,
+ function(t) {
+ Error.stackTraceLimit += 6;
+ try {
+ throw new Error
+ } catch(e) {
+ t.stack = e.stack
+ }
+ Error.stackTraceLimit -= 6
+ })
+ } ();
+ "undefined" != typeof console && void 0 !== console.warn && (o = function(t) {
+ console.warn(t)
+ },
+ d.isNode && n.stderr.isTTY ? o = function(t, e) {
+ var n = e ? "[33m": "[31m";
+ console.warn(n + t + "[0m\n")
+ }: d.isNode || "string" != typeof(new Error).stack || (o = function(t, e) {
+ console.warn("%c" + t, e ? "color: darkorange": "color: red")
+ }));
+ var tt = {
+ warnings: b,
+ longStackTraces: !1,
+ cancellation: !1,
+ monitoring: !1
+ };
+ return x && e.longStackTraces(),
+ {
+ longStackTraces: function() {
+ return tt.longStackTraces
+ },
+ warnings: function() {
+ return tt.warnings
+ },
+ cancellation: function() {
+ return tt.cancellation
+ },
+ monitoring: function() {
+ return tt.monitoring
+ },
+ propagateFromFunction: function() {
+ return R
+ },
+ boundValueFunction: function() {
+ return j
+ },
+ checkForgottenReturns: function(t, e, n, i, r) {
+ if (void 0 === t && null !== e && w) {
+ if (void 0 !== r && r._returnedNonUndefined()) return;
+ if (0 == (65535 & i._bitField)) return;
+ n && (n += " ");
+ var a = "",
+ o = "";
+ if (e._trace) {
+ for (var s = e._trace.stack.split("\n"), l = U(s), c = l.length - 1; c >= 0; --c) {
+ var u = l[c];
+ if (!g.test(u)) {
+ var d = u.match(p);
+ d && (a = "at " + d[1] + ":" + d[2] + ":" + d[3] + " ");
+ break
+ }
+ }
+ if (l.length > 0) {
+ var h = l[0];
+ for (c = 0; c < s.length; ++c) if (s[c] === h) {
+ c > 0 && (o = "\n" + s[c - 1]);
+ break
+ }
+ }
+ }
+ var f = "a promise was created in a " + n + "handler " + a + "but was not returned from it, see http://goo.gl/rRqMUw" + o;
+ i._warn(f, !0, e)
+ }
+ },
+ setBounds: function(t, e) {
+ if (Y()) {
+ for (var n, i, r = t.stack.split("\n"), a = e.stack.split("\n"), o = -1, s = -1, l = 0; l < r.length; ++l) if (c = K(r[l])) {
+ n = c.fileName,
+ o = c.line;
+ break
+ }
+ for (l = 0; l < a.length; ++l) {
+ var c;
+ if (c = K(a[l])) {
+ i = c.fileName,
+ s = c.line;
+ break
+ }
+ }
+ o < 0 || s < 0 || !n || !i || n !== i || o >= s || (J = function(t) {
+ if (_.test(t)) return ! 0;
+ var e = K(t);
+ return !! (e && e.fileName === n && o <= e.line && e.line <= s)
+ })
+ }
+ },
+ warn: z,
+ deprecated: function(t, e) {
+ var n = t + " is deprecated and will be removed in a future version.";
+ return e && (n += " Use " + e + " instead."),
+ z(n)
+ },
+ CapturedTrace: Q,
+ fireDomEvent: T,
+ fireGlobalEvent: $
+ }
+ }
+ },
+ {
+ "./errors": 12,
+ "./es5": 13,
+ "./util": 36
+ }],
+ 10 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(t) {
+ function e() {
+ return this.value
+ }
+ function n() {
+ throw this.reason
+ }
+ t.prototype.
+ return = t.prototype.thenReturn = function(n) {
+ return n instanceof t && n.suppressUnhandledRejections(),
+ this._then(e, void 0, void 0, {
+ value: n
+ },
+ void 0)
+ },
+ t.prototype.
+ throw = t.prototype.thenThrow = function(t) {
+ return this._then(n, void 0, void 0, {
+ reason: t
+ },
+ void 0)
+ },
+ t.prototype.catchThrow = function(t) {
+ if (arguments.length <= 1) return this._then(void 0, n, void 0, {
+ reason: t
+ },
+ void 0);
+ var e = arguments[1];
+ return this.caught(t,
+ function() {
+ throw e
+ })
+ },
+ t.prototype.catchReturn = function(n) {
+ if (arguments.length <= 1) return n instanceof t && n.suppressUnhandledRejections(),
+ this._then(void 0, e, void 0, {
+ value: n
+ },
+ void 0);
+ var i = arguments[1];
+ i instanceof t && i.suppressUnhandledRejections();
+ return this.caught(n,
+ function() {
+ return i
+ })
+ }
+ }
+ },
+ {}],
+ 11 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(t, e) {
+ var n = t.reduce,
+ i = t.all;
+ function r() {
+ return i(this)
+ }
+ t.prototype.each = function(t) {
+ return n(this, t, e, 0)._then(r, void 0, void 0, this, void 0)
+ },
+ t.prototype.mapSeries = function(t) {
+ return n(this, t, e, e)
+ },
+ t.each = function(t, i) {
+ return n(t, i, e, 0)._then(r, void 0, void 0, t, void 0)
+ },
+ t.mapSeries = function(t, i) {
+ return n(t, i, e, e)
+ }
+ }
+ },
+ {}],
+ 12 : [function(t, e, n) {
+ "use strict";
+ var i, r, a = t("./es5"),
+ o = a.freeze,
+ s = t("./util"),
+ l = s.inherits,
+ c = s.notEnumerableProp;
+ function u(t, e) {
+ function n(i) {
+ if (! (this instanceof n)) return new n(i);
+ c(this, "message", "string" == typeof i ? i: e),
+ c(this, "name", t),
+ Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : Error.call(this)
+ }
+ return l(n, Error),
+ n
+ }
+ var d = u("Warning", "warning"),
+ h = u("CancellationError", "cancellation error"),
+ f = u("TimeoutError", "timeout error"),
+ _ = u("AggregateError", "aggregate error");
+ try {
+ i = TypeError,
+ r = RangeError
+ } catch(t) {
+ i = u("TypeError", "type error"),
+ r = u("RangeError", "range error")
+ }
+ for (var g = "join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "), p = 0; p < g.length; ++p)"function" == typeof Array.prototype[g[p]] && (_.prototype[g[p]] = Array.prototype[g[p]]);
+ a.defineProperty(_.prototype, "length", {
+ value: 0,
+ configurable: !1,
+ writable: !0,
+ enumerable: !0
+ }),
+ _.prototype.isOperational = !0;
+ var v = 0;
+ function m(t) {
+ if (! (this instanceof m)) return new m(t);
+ c(this, "name", "OperationalError"),
+ c(this, "message", t),
+ this.cause = t,
+ this.isOperational = !0,
+ t instanceof Error ? (c(this, "message", t.message), c(this, "stack", t.stack)) : Error.captureStackTrace && Error.captureStackTrace(this, this.constructor)
+ }
+ _.prototype.toString = function() {
+ var t = Array(4 * v + 1).join(" "),
+ e = "\n" + t + "AggregateError of:\n";
+ v++,
+ t = Array(4 * v + 1).join(" ");
+ for (var n = 0; n < this.length; ++n) {
+ for (var i = this[n] === this ? "[Circular AggregateError]": this[n] + "", r = i.split("\n"), a = 0; a < r.length; ++a) r[a] = t + r[a];
+ e += (i = r.join("\n")) + "\n"
+ }
+ return v--,
+ e
+ },
+ l(m, Error);
+ var y = Error.__BluebirdErrorTypes__;
+ y || (y = o({
+ CancellationError: h,
+ TimeoutError: f,
+ OperationalError: m,
+ RejectionError: m,
+ AggregateError: _
+ }), a.defineProperty(Error, "__BluebirdErrorTypes__", {
+ value: y,
+ writable: !1,
+ enumerable: !1,
+ configurable: !1
+ })),
+ e.exports = {
+ Error: Error,
+ TypeError: i,
+ RangeError: r,
+ CancellationError: y.CancellationError,
+ OperationalError: y.OperationalError,
+ TimeoutError: y.TimeoutError,
+ AggregateError: y.AggregateError,
+ Warning: d
+ }
+ },
+ {
+ "./es5": 13,
+ "./util": 36
+ }],
+ 13 : [function(t, e, n) {
+ var i = function() {
+ "use strict";
+ return void 0 === this
+ } ();
+ if (i) e.exports = {
+ freeze: Object.freeze,
+ defineProperty: Object.defineProperty,
+ getDescriptor: Object.getOwnPropertyDescriptor,
+ keys: Object.keys,
+ names: Object.getOwnPropertyNames,
+ getPrototypeOf: Object.getPrototypeOf,
+ isArray: Array.isArray,
+ isES5: i,
+ propertyIsWritable: function(t, e) {
+ var n = Object.getOwnPropertyDescriptor(t, e);
+ return ! (n && !n.writable && !n.set)
+ }
+ };
+ else {
+ var r = {}.hasOwnProperty,
+ a = {}.toString,
+ o = {}.constructor.prototype,
+ s = function(t) {
+ var e = [];
+ for (var n in t) r.call(t, n) && e.push(n);
+ return e
+ };
+ e.exports = {
+ isArray: function(t) {
+ try {
+ return "[object Array]" === a.call(t)
+ } catch(t) {
+ return ! 1
+ }
+ },
+ keys: s,
+ names: s,
+ defineProperty: function(t, e, n) {
+ return t[e] = n.value,
+ t
+ },
+ getDescriptor: function(t, e) {
+ return {
+ value: t[e]
+ }
+ },
+ freeze: function(t) {
+ return t
+ },
+ getPrototypeOf: function(t) {
+ try {
+ return Object(t).constructor.prototype
+ } catch(t) {
+ return o
+ }
+ },
+ isES5: i,
+ propertyIsWritable: function() {
+ return ! 0
+ }
+ }
+ }
+ },
+ {}],
+ 14 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(t, e) {
+ var n = t.map;
+ t.prototype.filter = function(t, i) {
+ return n(this, t, i, e)
+ },
+ t.filter = function(t, i, r) {
+ return n(t, i, r, e)
+ }
+ }
+ },
+ {}],
+ 15 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i) {
+ var r = t("./util"),
+ a = e.CancellationError,
+ o = r.errorObj,
+ s = t("./catch_filter")(i);
+ function l(t, e, n) {
+ this.promise = t,
+ this.type = e,
+ this.handler = n,
+ this.called = !1,
+ this.cancelPromise = null
+ }
+ function c(t) {
+ this.finallyHandler = t
+ }
+ function u(t, e) {
+ return null != t.cancelPromise && (arguments.length > 1 ? t.cancelPromise._reject(e) : t.cancelPromise._cancel(), t.cancelPromise = null, !0)
+ }
+ function d() {
+ return f.call(this, this.promise._target()._settledValue())
+ }
+ function h(t) {
+ if (!u(this, t)) return o.e = t,
+ o
+ }
+ function f(t) {
+ var r = this.promise,
+ s = this.handler;
+ if (!this.called) {
+ this.called = !0;
+ var l = this.isFinallyHandler() ? s.call(r._boundValue()) : s.call(r._boundValue(), t);
+ if (l === i) return l;
+ if (void 0 !== l) {
+ r._setReturnedNonUndefined();
+ var f = n(l, r);
+ if (f instanceof e) {
+ if (null != this.cancelPromise) {
+ if (f._isCancelled()) {
+ var _ = new a("late cancellation observer");
+ return r._attachExtraTrace(_),
+ o.e = _,
+ o
+ }
+ f.isPending() && f._attachCancellationCallback(new c(this))
+ }
+ return f._then(d, h, void 0, this, void 0)
+ }
+ }
+ }
+ return r.isRejected() ? (u(this), o.e = t, o) : (u(this), t)
+ }
+ return l.prototype.isFinallyHandler = function() {
+ return 0 === this.type
+ },
+ c.prototype._resultCancelled = function() {
+ u(this.finallyHandler)
+ },
+ e.prototype._passThrough = function(t, e, n, i) {
+ return "function" != typeof t ? this.then() : this._then(n, i, void 0, new l(this, e, t), void 0)
+ },
+ e.prototype.lastly = e.prototype.
+ finally = function(t) {
+ return this._passThrough(t, 0, f, f)
+ },
+ e.prototype.tap = function(t) {
+ return this._passThrough(t, 1, f)
+ },
+ e.prototype.tapCatch = function(t) {
+ var n = arguments.length;
+ if (1 === n) return this._passThrough(t, 1, void 0, f);
+ var i, a = new Array(n - 1),
+ o = 0;
+ for (i = 0; i < n - 1; ++i) {
+ var l = arguments[i];
+ if (!r.isObject(l)) return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got " + r.classString(l)));
+ a[o++] = l
+ }
+ a.length = o;
+ var c = arguments[i];
+ return this._passThrough(s(a, c, this), 1, void 0, f)
+ },
+ l
+ }
+ },
+ {
+ "./catch_filter": 7,
+ "./util": 36
+ }],
+ 16 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r, a, o) {
+ var s = t("./errors").TypeError,
+ l = t("./util"),
+ c = l.errorObj,
+ u = l.tryCatch,
+ d = [];
+ function h(t, n, r, a) {
+ if (o.cancellation()) {
+ var s = new e(i),
+ l = this._finallyPromise = new e(i);
+ this._promise = s.lastly(function() {
+ return l
+ }),
+ s._captureStackTrace(),
+ s._setOnCancel(this)
+ } else { (this._promise = new e(i))._captureStackTrace()
+ }
+ this._stack = a,
+ this._generatorFunction = t,
+ this._receiver = n,
+ this._generator = void 0,
+ this._yieldHandlers = "function" == typeof r ? [r].concat(d) : d,
+ this._yieldedPromise = null,
+ this._cancellationPhase = !1
+ }
+ l.inherits(h, a),
+ h.prototype._isResolved = function() {
+ return null === this._promise
+ },
+ h.prototype._cleanup = function() {
+ this._promise = this._generator = null,
+ o.cancellation() && null !== this._finallyPromise && (this._finallyPromise._fulfill(), this._finallyPromise = null)
+ },
+ h.prototype._promiseCancelled = function() {
+ if (!this._isResolved()) {
+ var t;
+ if (void 0 !== this._generator.
+ return) this._promise._pushContext(),
+ t = u(this._generator.
+ return).call(this._generator, void 0),
+ this._promise._popContext();
+ else {
+ var n = new e.CancellationError("generator .return() sentinel");
+ e.coroutine.returnSentinel = n,
+ this._promise._attachExtraTrace(n),
+ this._promise._pushContext(),
+ t = u(this._generator.
+ throw).call(this._generator, n),
+ this._promise._popContext()
+ }
+ this._cancellationPhase = !0,
+ this._yieldedPromise = null,
+ this._continue(t)
+ }
+ },
+ h.prototype._promiseFulfilled = function(t) {
+ this._yieldedPromise = null,
+ this._promise._pushContext();
+ var e = u(this._generator.next).call(this._generator, t);
+ this._promise._popContext(),
+ this._continue(e)
+ },
+ h.prototype._promiseRejected = function(t) {
+ this._yieldedPromise = null,
+ this._promise._attachExtraTrace(t),
+ this._promise._pushContext();
+ var e = u(this._generator.
+ throw).call(this._generator, t);
+ this._promise._popContext(),
+ this._continue(e)
+ },
+ h.prototype._resultCancelled = function() {
+ if (this._yieldedPromise instanceof e) {
+ var t = this._yieldedPromise;
+ this._yieldedPromise = null,
+ t.cancel()
+ }
+ },
+ h.prototype.promise = function() {
+ return this._promise
+ },
+ h.prototype._run = function() {
+ this._generator = this._generatorFunction.call(this._receiver),
+ this._receiver = this._generatorFunction = void 0,
+ this._promiseFulfilled(void 0)
+ },
+ h.prototype._continue = function(t) {
+ var n = this._promise;
+ if (t === c) return this._cleanup(),
+ this._cancellationPhase ? n.cancel() : n._rejectCallback(t.e, !1);
+ var i = t.value;
+ if (!0 === t.done) return this._cleanup(),
+ this._cancellationPhase ? n.cancel() : n._resolveCallback(i);
+ var a = r(i, this._promise);
+ if (a instanceof e || null !== (a = function(t, n, i) {
+ for (var a = 0; a < n.length; ++a) {
+ i._pushContext();
+ var o = u(n[a])(t);
+ if (i._popContext(), o === c) {
+ i._pushContext();
+ var s = e.reject(c.e);
+ return i._popContext(),
+ s
+ }
+ var l = r(o, i);
+ if (l instanceof e) return l
+ }
+ return null
+ } (a, this._yieldHandlers, this._promise))) {
+ var o = (a = a._target())._bitField;
+ 0 == (50397184 & o) ? (this._yieldedPromise = a, a._proxy(this, null)) : 0 != (33554432 & o) ? e._async.invoke(this._promiseFulfilled, this, a._value()) : 0 != (16777216 & o) ? e._async.invoke(this._promiseRejected, this, a._reason()) : this._promiseCancelled()
+ } else this._promiseRejected(new s("A value %s was yielded that could not be treated as a promise\n\n See http://goo.gl/MqrFmX\n\n".replace("%s", String(i)) + "From coroutine:\n" + this._stack.split("\n").slice(1, -7).join("\n")))
+ },
+ e.coroutine = function(t, e) {
+ if ("function" != typeof t) throw new s("generatorFunction must be a function\n\n See http://goo.gl/MqrFmX\n");
+ var n = Object(e).yieldHandler,
+ i = h,
+ r = (new Error).stack;
+ return function() {
+ var e = t.apply(this, arguments),
+ a = new i(void 0, void 0, n, r),
+ o = a.promise();
+ return a._generator = e,
+ a._promiseFulfilled(void 0),
+ o
+ }
+ },
+ e.coroutine.addYieldHandler = function(t) {
+ if ("function" != typeof t) throw new s("expecting a function but got " + l.classString(t));
+ d.push(t)
+ },
+ e.spawn = function(t) {
+ if (o.deprecated("Promise.spawn()", "Promise.coroutine()"), "function" != typeof t) return n("generatorFunction must be a function\n\n See http://goo.gl/MqrFmX\n");
+ var i = new h(t, this),
+ r = i.promise();
+ return i._run(e.spawn),
+ r
+ }
+ }
+ },
+ {
+ "./errors": 12,
+ "./util": 36
+ }],
+ 17 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r, a, o) {
+ var s = t("./util");
+ s.canEvaluate,
+ s.tryCatch,
+ s.errorObj;
+ e.join = function() {
+ var t, e = arguments.length - 1;
+ e > 0 && "function" == typeof arguments[e] && (t = arguments[e]);
+ var i = [].slice.call(arguments);
+ t && i.pop();
+ var r = new n(i).promise();
+ return void 0 !== t ? r.spread(t) : r
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 18 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r, a, o) {
+ var s = e._getDomain,
+ c = t("./util"),
+ u = c.tryCatch,
+ d = c.errorObj,
+ h = e._async;
+ function f(t, e, n, i) {
+ this.constructor$(t),
+ this._promise._captureStackTrace();
+ var r = s();
+ this._callback = null === r ? e: c.domainBind(r, e),
+ this._preservedValues = i === a ? new Array(this.length()) : null,
+ this._limit = n,
+ this._inFlight = 0,
+ this._queue = [],
+ h.invoke(this._asyncInit, this, void 0)
+ }
+ function _(t, n, r, a) {
+ if ("function" != typeof n) return i("expecting a function but got " + c.classString(n));
+ var o = 0;
+ if (void 0 !== r) {
+ if ("object" !== l(r) || null === r) return e.reject(new TypeError("options argument must be an object but it is " + c.classString(r)));
+ if ("number" != typeof r.concurrency) return e.reject(new TypeError("'concurrency' must be a number but it is " + c.classString(r.concurrency)));
+ o = r.concurrency
+ }
+ return new f(t, n, o = "number" == typeof o && isFinite(o) && o >= 1 ? o: 0, a).promise()
+ }
+ c.inherits(f, n),
+ f.prototype._asyncInit = function() {
+ this._init$(void 0, -2)
+ },
+ f.prototype._init = function() {},
+ f.prototype._promiseFulfilled = function(t, n) {
+ var i = this._values,
+ a = this.length(),
+ s = this._preservedValues,
+ l = this._limit;
+ if (n < 0) {
+ if (i[n = -1 * n - 1] = t, l >= 1 && (this._inFlight--, this._drainQueue(), this._isResolved())) return ! 0
+ } else {
+ if (l >= 1 && this._inFlight >= l) return i[n] = t,
+ this._queue.push(n),
+ !1;
+ null !== s && (s[n] = t);
+ var c = this._promise,
+ h = this._callback,
+ f = c._boundValue();
+ c._pushContext();
+ var _ = u(h).call(f, t, n, a),
+ g = c._popContext();
+ if (o.checkForgottenReturns(_, g, null !== s ? "Promise.filter": "Promise.map", c), _ === d) return this._reject(_.e),
+ !0;
+ var p = r(_, this._promise);
+ if (p instanceof e) {
+ var v = (p = p._target())._bitField;
+ if (0 == (50397184 & v)) return l >= 1 && this._inFlight++,
+ i[n] = p,
+ p._proxy(this, -1 * (n + 1)),
+ !1;
+ if (0 == (33554432 & v)) return 0 != (16777216 & v) ? (this._reject(p._reason()), !0) : (this._cancel(), !0);
+ _ = p._value()
+ }
+ i[n] = _
+ }
+ return++this._totalResolved >= a && (null !== s ? this._filter(i, s) : this._resolve(i), !0)
+ },
+ f.prototype._drainQueue = function() {
+ for (var t = this._queue,
+ e = this._limit,
+ n = this._values; t.length > 0 && this._inFlight < e;) {
+ if (this._isResolved()) return;
+ var i = t.pop();
+ this._promiseFulfilled(n[i], i)
+ }
+ },
+ f.prototype._filter = function(t, e) {
+ for (var n = e.length,
+ i = new Array(n), r = 0, a = 0; a < n; ++a) t[a] && (i[r++] = e[a]);
+ i.length = r,
+ this._resolve(i)
+ },
+ f.prototype.preservedValues = function() {
+ return this._preservedValues
+ },
+ e.prototype.map = function(t, e) {
+ return _(this, t, e, null)
+ },
+ e.map = function(t, e, n, i) {
+ return _(t, e, n, i)
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 19 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r, a) {
+ var o = t("./util"),
+ s = o.tryCatch;
+ e.method = function(t) {
+ if ("function" != typeof t) throw new e.TypeError("expecting a function but got " + o.classString(t));
+ return function() {
+ var i = new e(n);
+ i._captureStackTrace(),
+ i._pushContext();
+ var r = s(t).apply(this, arguments),
+ o = i._popContext();
+ return a.checkForgottenReturns(r, o, "Promise.method", i),
+ i._resolveFromSyncValue(r),
+ i
+ }
+ },
+ e.attempt = e.
+ try = function(t) {
+ if ("function" != typeof t) return r("expecting a function but got " + o.classString(t));
+ var i, l = new e(n);
+ if (l._captureStackTrace(), l._pushContext(), arguments.length > 1) {
+ a.deprecated("calling Promise.try with more than 1 argument");
+ var c = arguments[1],
+ u = arguments[2];
+ i = o.isArray(c) ? s(t).apply(u, c) : s(t).call(u, c)
+ } else i = s(t)();
+ var d = l._popContext();
+ return a.checkForgottenReturns(i, d, "Promise.try", l),
+ l._resolveFromSyncValue(i),
+ l
+ },
+ e.prototype._resolveFromSyncValue = function(t) {
+ t === o.errorObj ? this._rejectCallback(t.e, !1) : this._resolveCallback(t, !0)
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 20 : [function(t, e, n) {
+ "use strict";
+ var i = t("./util"),
+ r = i.maybeWrapAsError,
+ a = t("./errors").OperationalError,
+ o = t("./es5");
+ var s = /^(?:name|message|stack|cause)$/;
+ function l(t) {
+ var e;
+ if (function(t) {
+ return t instanceof Error && o.getPrototypeOf(t) === Error.prototype
+ } (t)) { (e = new a(t)).name = t.name,
+ e.message = t.message,
+ e.stack = t.stack;
+ for (var n = o.keys(t), r = 0; r < n.length; ++r) {
+ var l = n[r];
+ s.test(l) || (e[l] = t[l])
+ }
+ return e
+ }
+ return i.markAsOriginatingFromRejection(t),
+ t
+ }
+ e.exports = function(t, e) {
+ return function(n, i) {
+ if (null !== t) {
+ if (n) {
+ var a = l(r(n));
+ t._attachExtraTrace(a),
+ t._reject(a)
+ } else if (e) {
+ var o = [].slice.call(arguments, 1);
+ t._fulfill(o)
+ } else t._fulfill(i);
+ t = null
+ }
+ }
+ }
+ },
+ {
+ "./errors": 12,
+ "./es5": 13,
+ "./util": 36
+ }],
+ 21 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e) {
+ var n = t("./util"),
+ i = e._async,
+ r = n.tryCatch,
+ a = n.errorObj;
+ function o(t, e) {
+ if (!n.isArray(t)) return s.call(this, t, e);
+ var o = r(e).apply(this._boundValue(), [null].concat(t));
+ o === a && i.throwLater(o.e)
+ }
+ function s(t, e) {
+ var n = this._boundValue(),
+ o = void 0 === t ? r(e).call(n, null) : r(e).call(n, null, t);
+ o === a && i.throwLater(o.e)
+ }
+ function l(t, e) {
+ if (!t) {
+ var n = new Error(t + "");
+ n.cause = t,
+ t = n
+ }
+ var o = r(e).call(this._boundValue(), t);
+ o === a && i.throwLater(o.e)
+ }
+ e.prototype.asCallback = e.prototype.nodeify = function(t, e) {
+ if ("function" == typeof t) {
+ var n = s;
+ void 0 !== e && Object(e).spread && (n = o),
+ this._then(n, l, void 0, this, t)
+ }
+ return this
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 22 : [function(t, e, i) {
+ "use strict";
+ e.exports = function() {
+ var i = function() {
+ return new _("circular promise resolution chain\n\n See http://goo.gl/MqrFmX\n")
+ },
+ r = function() {
+ return new A.PromiseInspection(this._target())
+ },
+ a = function(t) {
+ return A.reject(new _(t))
+ };
+ function o() {}
+ var s, l = {},
+ c = t("./util");
+ s = c.isNode ?
+ function() {
+ var t = n.domain;
+ return void 0 === t && (t = null),
+ t
+ }: function() {
+ return null
+ },
+ c.notEnumerableProp(A, "_getDomain", s);
+ var u = t("./es5"),
+ d = t("./async"),
+ h = new d;
+ u.defineProperty(A, "_async", {
+ value: h
+ });
+ var f = t("./errors"),
+ _ = A.TypeError = f.TypeError;
+ A.RangeError = f.RangeError;
+ var g = A.CancellationError = f.CancellationError;
+ A.TimeoutError = f.TimeoutError,
+ A.OperationalError = f.OperationalError,
+ A.RejectionError = f.OperationalError,
+ A.AggregateError = f.AggregateError;
+ var p = function() {},
+ v = {},
+ m = {},
+ y = t("./thenables")(A, p),
+ k = t("./promise_array")(A, p, y, a, o),
+ b = t("./context")(A),
+ x = b.create,
+ w = t("./debuggability")(A, b),
+ S = (w.CapturedTrace, t("./finally")(A, y, m)),
+ T = t("./catch_filter")(m),
+ $ = t("./nodeback"),
+ C = c.errorObj,
+ E = c.tryCatch;
+ function A(t) {
+ t !== p &&
+ function(t, e) {
+ if (null == t || t.constructor !== A) throw new _("the promise constructor cannot be invoked directly\n\n See http://goo.gl/MqrFmX\n");
+ if ("function" != typeof e) throw new _("expecting a function but got " + c.classString(e))
+ } (this, t),
+ this._bitField = 0,
+ this._fulfillmentHandler0 = void 0,
+ this._rejectionHandler0 = void 0,
+ this._promise0 = void 0,
+ this._receiver0 = void 0,
+ this._resolveFromExecutor(t),
+ this._promiseCreated(),
+ this._fireEvent("promiseCreated", this)
+ }
+ function D(t) {
+ this.promise._resolveCallback(t)
+ }
+ function M(t) {
+ this.promise._rejectCallback(t, !1)
+ }
+ function I(t) {
+ var e = new A(p);
+ e._fulfillmentHandler0 = t,
+ e._rejectionHandler0 = t,
+ e._promise0 = t,
+ e._receiver0 = t
+ }
+ return A.prototype.toString = function() {
+ return "[object Promise]"
+ },
+ A.prototype.caught = A.prototype.
+ catch = function(t) {
+ var e = arguments.length;
+ if (e > 1) {
+ var n, i = new Array(e - 1),
+ r = 0;
+ for (n = 0; n < e - 1; ++n) {
+ var o = arguments[n];
+ if (!c.isObject(o)) return a("Catch statement predicate: expecting an object but got " + c.classString(o));
+ i[r++] = o
+ }
+ return i.length = r,
+ t = arguments[n],
+ this.then(void 0, T(i, t, this))
+ }
+ return this.then(void 0, t)
+ },
+ A.prototype.reflect = function() {
+ return this._then(r, r, void 0, this, void 0)
+ },
+ A.prototype.then = function(t, e) {
+ if (w.warnings() && arguments.length > 0 && "function" != typeof t && "function" != typeof e) {
+ var n = ".then() only accepts functions but was passed: " + c.classString(t);
+ arguments.length > 1 && (n += ", " + c.classString(e)),
+ this._warn(n)
+ }
+ return this._then(t, e, void 0, void 0, void 0)
+ },
+ A.prototype.done = function(t, e) {
+ this._then(t, e, void 0, void 0, void 0)._setIsFinal()
+ },
+ A.prototype.spread = function(t) {
+ return "function" != typeof t ? a("expecting a function but got " + c.classString(t)) : this.all()._then(t, void 0, void 0, v, void 0)
+ },
+ A.prototype.toJSON = function() {
+ var t = {
+ isFulfilled: !1,
+ isRejected: !1,
+ fulfillmentValue: void 0,
+ rejectionReason: void 0
+ };
+ return this.isFulfilled() ? (t.fulfillmentValue = this.value(), t.isFulfilled = !0) : this.isRejected() && (t.rejectionReason = this.reason(), t.isRejected = !0),
+ t
+ },
+ A.prototype.all = function() {
+ return arguments.length > 0 && this._warn(".all() was passed arguments but it does not take any"),
+ new k(this).promise()
+ },
+ A.prototype.error = function(t) {
+ return this.caught(c.originatesFromRejection, t)
+ },
+ A.getNewLibraryCopy = e.exports,
+ A.is = function(t) {
+ return t instanceof A
+ },
+ A.fromNode = A.fromCallback = function(t) {
+ var e = new A(p);
+ e._captureStackTrace();
+ var n = arguments.length > 1 && !!Object(arguments[1]).multiArgs,
+ i = E(t)($(e, n));
+ return i === C && e._rejectCallback(i.e, !0),
+ e._isFateSealed() || e._setAsyncGuaranteed(),
+ e
+ },
+ A.all = function(t) {
+ return new k(t).promise()
+ },
+ A.cast = function(t) {
+ var e = y(t);
+ return e instanceof A || ((e = new A(p))._captureStackTrace(), e._setFulfilled(), e._rejectionHandler0 = t),
+ e
+ },
+ A.resolve = A.fulfilled = A.cast,
+ A.reject = A.rejected = function(t) {
+ var e = new A(p);
+ return e._captureStackTrace(),
+ e._rejectCallback(t, !0),
+ e
+ },
+ A.setScheduler = function(t) {
+ if ("function" != typeof t) throw new _("expecting a function but got " + c.classString(t));
+ return h.setScheduler(t)
+ },
+ A.prototype._then = function(t, e, n, i, r) {
+ var a = void 0 !== r,
+ o = a ? r: new A(p),
+ l = this._target(),
+ u = l._bitField;
+ a || (o._propagateFrom(this, 3), o._captureStackTrace(), void 0 === i && 0 != (2097152 & this._bitField) && (i = 0 != (50397184 & u) ? this._boundValue() : l === this ? void 0 : this._boundTo), this._fireEvent("promiseChained", this, o));
+ var d = s();
+ if (0 != (50397184 & u)) {
+ var f, _, v = l._settlePromiseCtx;
+ 0 != (33554432 & u) ? (_ = l._rejectionHandler0, f = t) : 0 != (16777216 & u) ? (_ = l._fulfillmentHandler0, f = e, l._unsetRejectionIsUnhandled()) : (v = l._settlePromiseLateCancellationObserver, _ = new g("late cancellation observer"), l._attachExtraTrace(_), f = e),
+ h.invoke(v, l, {
+ handler: null === d ? f: "function" == typeof f && c.domainBind(d, f),
+ promise: o,
+ receiver: i,
+ value: _
+ })
+ } else l._addCallbacks(t, e, o, i, d);
+ return o
+ },
+ A.prototype._length = function() {
+ return 65535 & this._bitField
+ },
+ A.prototype._isFateSealed = function() {
+ return 0 != (117506048 & this._bitField)
+ },
+ A.prototype._isFollowing = function() {
+ return 67108864 == (67108864 & this._bitField)
+ },
+ A.prototype._setLength = function(t) {
+ this._bitField = -65536 & this._bitField | 65535 & t
+ },
+ A.prototype._setFulfilled = function() {
+ this._bitField = 33554432 | this._bitField,
+ this._fireEvent("promiseFulfilled", this)
+ },
+ A.prototype._setRejected = function() {
+ this._bitField = 16777216 | this._bitField,
+ this._fireEvent("promiseRejected", this)
+ },
+ A.prototype._setFollowing = function() {
+ this._bitField = 67108864 | this._bitField,
+ this._fireEvent("promiseResolved", this)
+ },
+ A.prototype._setIsFinal = function() {
+ this._bitField = 4194304 | this._bitField
+ },
+ A.prototype._isFinal = function() {
+ return (4194304 & this._bitField) > 0
+ },
+ A.prototype._unsetCancelled = function() {
+ this._bitField = -65537 & this._bitField
+ },
+ A.prototype._setCancelled = function() {
+ this._bitField = 65536 | this._bitField,
+ this._fireEvent("promiseCancelled", this)
+ },
+ A.prototype._setWillBeCancelled = function() {
+ this._bitField = 8388608 | this._bitField
+ },
+ A.prototype._setAsyncGuaranteed = function() {
+ h.hasCustomScheduler() || (this._bitField = 134217728 | this._bitField)
+ },
+ A.prototype._receiverAt = function(t) {
+ var e = 0 === t ? this._receiver0: this[4 * t - 4 + 3];
+ if (e !== l) return void 0 === e && this._isBound() ? this._boundValue() : e
+ },
+ A.prototype._promiseAt = function(t) {
+ return this[4 * t - 4 + 2]
+ },
+ A.prototype._fulfillmentHandlerAt = function(t) {
+ return this[4 * t - 4 + 0]
+ },
+ A.prototype._rejectionHandlerAt = function(t) {
+ return this[4 * t - 4 + 1]
+ },
+ A.prototype._boundValue = function() {},
+ A.prototype._migrateCallback0 = function(t) {
+ t._bitField;
+ var e = t._fulfillmentHandler0,
+ n = t._rejectionHandler0,
+ i = t._promise0,
+ r = t._receiverAt(0);
+ void 0 === r && (r = l),
+ this._addCallbacks(e, n, i, r, null)
+ },
+ A.prototype._migrateCallbackAt = function(t, e) {
+ var n = t._fulfillmentHandlerAt(e),
+ i = t._rejectionHandlerAt(e),
+ r = t._promiseAt(e),
+ a = t._receiverAt(e);
+ void 0 === a && (a = l),
+ this._addCallbacks(n, i, r, a, null)
+ },
+ A.prototype._addCallbacks = function(t, e, n, i, r) {
+ var a = this._length();
+ if (a >= 65531 && (a = 0, this._setLength(0)), 0 === a) this._promise0 = n,
+ this._receiver0 = i,
+ "function" == typeof t && (this._fulfillmentHandler0 = null === r ? t: c.domainBind(r, t)),
+ "function" == typeof e && (this._rejectionHandler0 = null === r ? e: c.domainBind(r, e));
+ else {
+ var o = 4 * a - 4;
+ this[o + 2] = n,
+ this[o + 3] = i,
+ "function" == typeof t && (this[o + 0] = null === r ? t: c.domainBind(r, t)),
+ "function" == typeof e && (this[o + 1] = null === r ? e: c.domainBind(r, e))
+ }
+ return this._setLength(a + 1),
+ a
+ },
+ A.prototype._proxy = function(t, e) {
+ this._addCallbacks(void 0, void 0, e, t, null)
+ },
+ A.prototype._resolveCallback = function(t, e) {
+ if (0 == (117506048 & this._bitField)) {
+ if (t === this) return this._rejectCallback(i(), !1);
+ var n = y(t, this);
+ if (! (n instanceof A)) return this._fulfill(t);
+ e && this._propagateFrom(n, 2);
+ var r = n._target();
+ if (r !== this) {
+ var a = r._bitField;
+ if (0 == (50397184 & a)) {
+ var o = this._length();
+ o > 0 && r._migrateCallback0(this);
+ for (var s = 1; s < o; ++s) r._migrateCallbackAt(this, s);
+ this._setFollowing(),
+ this._setLength(0),
+ this._setFollowee(r)
+ } else if (0 != (33554432 & a)) this._fulfill(r._value());
+ else if (0 != (16777216 & a)) this._reject(r._reason());
+ else {
+ var l = new g("late cancellation observer");
+ r._attachExtraTrace(l),
+ this._reject(l)
+ }
+ } else this._reject(i())
+ }
+ },
+ A.prototype._rejectCallback = function(t, e, n) {
+ var i = c.ensureErrorObject(t),
+ r = i === t;
+ if (!r && !n && w.warnings()) {
+ var a = "a promise was rejected with a non-error: " + c.classString(t);
+ this._warn(a, !0)
+ }
+ this._attachExtraTrace(i, !!e && r),
+ this._reject(t)
+ },
+ A.prototype._resolveFromExecutor = function(t) {
+ if (t !== p) {
+ var e = this;
+ this._captureStackTrace(),
+ this._pushContext();
+ var n = !0,
+ i = this._execute(t,
+ function(t) {
+ e._resolveCallback(t)
+ },
+ function(t) {
+ e._rejectCallback(t, n)
+ });
+ n = !1,
+ this._popContext(),
+ void 0 !== i && e._rejectCallback(i, !0)
+ }
+ },
+ A.prototype._settlePromiseFromHandler = function(t, e, n, i) {
+ var r = i._bitField;
+ if (0 == (65536 & r)) {
+ var a;
+ i._pushContext(),
+ e === v ? n && "number" == typeof n.length ? a = E(t).apply(this._boundValue(), n) : (a = C).e = new _("cannot .spread() a non-array: " + c.classString(n)) : a = E(t).call(e, n);
+ var o = i._popContext();
+ 0 == (65536 & (r = i._bitField)) && (a === m ? i._reject(n) : a === C ? i._rejectCallback(a.e, !1) : (w.checkForgottenReturns(a, o, "", i, this), i._resolveCallback(a)))
+ }
+ },
+ A.prototype._target = function() {
+ for (var t = this; t._isFollowing();) t = t._followee();
+ return t
+ },
+ A.prototype._followee = function() {
+ return this._rejectionHandler0
+ },
+ A.prototype._setFollowee = function(t) {
+ this._rejectionHandler0 = t
+ },
+ A.prototype._settlePromise = function(t, e, n, i) {
+ var a = t instanceof A,
+ s = this._bitField,
+ l = 0 != (134217728 & s);
+ 0 != (65536 & s) ? (a && t._invokeInternalOnCancel(), n instanceof S && n.isFinallyHandler() ? (n.cancelPromise = t, E(e).call(n, i) === C && t._reject(C.e)) : e === r ? t._fulfill(r.call(n)) : n instanceof o ? n._promiseCancelled(t) : a || t instanceof k ? t._cancel() : n.cancel()) : "function" == typeof e ? a ? (l && t._setAsyncGuaranteed(), this._settlePromiseFromHandler(e, n, i, t)) : e.call(n, i, t) : n instanceof o ? n._isResolved() || (0 != (33554432 & s) ? n._promiseFulfilled(i, t) : n._promiseRejected(i, t)) : a && (l && t._setAsyncGuaranteed(), 0 != (33554432 & s) ? t._fulfill(i) : t._reject(i))
+ },
+ A.prototype._settlePromiseLateCancellationObserver = function(t) {
+ var e = t.handler,
+ n = t.promise,
+ i = t.receiver,
+ r = t.value;
+ "function" == typeof e ? n instanceof A ? this._settlePromiseFromHandler(e, i, r, n) : e.call(i, r, n) : n instanceof A && n._reject(r)
+ },
+ A.prototype._settlePromiseCtx = function(t) {
+ this._settlePromise(t.promise, t.handler, t.receiver, t.value)
+ },
+ A.prototype._settlePromise0 = function(t, e, n) {
+ var i = this._promise0,
+ r = this._receiverAt(0);
+ this._promise0 = void 0,
+ this._receiver0 = void 0,
+ this._settlePromise(i, t, r, e)
+ },
+ A.prototype._clearCallbackDataAtIndex = function(t) {
+ var e = 4 * t - 4;
+ this[e + 2] = this[e + 3] = this[e + 0] = this[e + 1] = void 0
+ },
+ A.prototype._fulfill = function(t) {
+ var e = this._bitField;
+ if (! ((117506048 & e) >>> 16)) {
+ if (t === this) {
+ var n = i();
+ return this._attachExtraTrace(n),
+ this._reject(n)
+ }
+ this._setFulfilled(),
+ this._rejectionHandler0 = t,
+ (65535 & e) > 0 && (0 != (134217728 & e) ? this._settlePromises() : h.settlePromises(this), this._dereferenceTrace())
+ }
+ },
+ A.prototype._reject = function(t) {
+ var e = this._bitField;
+ if (! ((117506048 & e) >>> 16)) {
+ if (this._setRejected(), this._fulfillmentHandler0 = t, this._isFinal()) return h.fatalError(t, c.isNode); (65535 & e) > 0 ? h.settlePromises(this) : this._ensurePossibleRejectionHandled()
+ }
+ },
+ A.prototype._fulfillPromises = function(t, e) {
+ for (var n = 1; n < t; n++) {
+ var i = this._fulfillmentHandlerAt(n),
+ r = this._promiseAt(n),
+ a = this._receiverAt(n);
+ this._clearCallbackDataAtIndex(n),
+ this._settlePromise(r, i, a, e)
+ }
+ },
+ A.prototype._rejectPromises = function(t, e) {
+ for (var n = 1; n < t; n++) {
+ var i = this._rejectionHandlerAt(n),
+ r = this._promiseAt(n),
+ a = this._receiverAt(n);
+ this._clearCallbackDataAtIndex(n),
+ this._settlePromise(r, i, a, e)
+ }
+ },
+ A.prototype._settlePromises = function() {
+ var t = this._bitField,
+ e = 65535 & t;
+ if (e > 0) {
+ if (0 != (16842752 & t)) {
+ var n = this._fulfillmentHandler0;
+ this._settlePromise0(this._rejectionHandler0, n, t),
+ this._rejectPromises(e, n)
+ } else {
+ var i = this._rejectionHandler0;
+ this._settlePromise0(this._fulfillmentHandler0, i, t),
+ this._fulfillPromises(e, i)
+ }
+ this._setLength(0)
+ }
+ this._clearCancellationData()
+ },
+ A.prototype._settledValue = function() {
+ var t = this._bitField;
+ return 0 != (33554432 & t) ? this._rejectionHandler0: 0 != (16777216 & t) ? this._fulfillmentHandler0: void 0
+ },
+ A.defer = A.pending = function() {
+ return w.deprecated("Promise.defer", "new Promise"),
+ {
+ promise: new A(p),
+ resolve: D,
+ reject: M
+ }
+ },
+ c.notEnumerableProp(A, "_makeSelfResolutionError", i),
+ t("./method")(A, p, y, a, w),
+ t("./bind")(A, p, y, w),
+ t("./cancel")(A, k, a, w),
+ t("./direct_resolve")(A),
+ t("./synchronous_inspection")(A),
+ t("./join")(A, k, y, p, h, s),
+ A.Promise = A,
+ A.version = "3.5.4",
+ t("./map.js")(A, k, a, y, p, w),
+ t("./call_get.js")(A),
+ t("./using.js")(A, a, y, x, p, w),
+ t("./timers.js")(A, p, w),
+ t("./generators.js")(A, a, p, y, o, w),
+ t("./nodeify.js")(A),
+ t("./promisify.js")(A, p),
+ t("./props.js")(A, k, y, a),
+ t("./race.js")(A, p, y, a),
+ t("./reduce.js")(A, k, a, y, p, w),
+ t("./settle.js")(A, k, w),
+ t("./some.js")(A, k, a),
+ t("./filter.js")(A, p),
+ t("./each.js")(A, p),
+ t("./any.js")(A),
+ c.toFastProperties(A),
+ c.toFastProperties(A.prototype),
+ I({
+ a: 1
+ }),
+ I({
+ b: 2
+ }),
+ I({
+ c: 3
+ }),
+ I(1),
+ I(function() {}),
+ I(void 0),
+ I(!1),
+ I(new A(p)),
+ w.setBounds(d.firstLineError, c.lastLineError),
+ A
+ }
+ },
+ {
+ "./any.js": 1,
+ "./async": 2,
+ "./bind": 3,
+ "./call_get.js": 5,
+ "./cancel": 6,
+ "./catch_filter": 7,
+ "./context": 8,
+ "./debuggability": 9,
+ "./direct_resolve": 10,
+ "./each.js": 11,
+ "./errors": 12,
+ "./es5": 13,
+ "./filter.js": 14,
+ "./finally": 15,
+ "./generators.js": 16,
+ "./join": 17,
+ "./map.js": 18,
+ "./method": 19,
+ "./nodeback": 20,
+ "./nodeify.js": 21,
+ "./promise_array": 23,
+ "./promisify.js": 24,
+ "./props.js": 25,
+ "./race.js": 27,
+ "./reduce.js": 28,
+ "./settle.js": 30,
+ "./some.js": 31,
+ "./synchronous_inspection": 32,
+ "./thenables": 33,
+ "./timers.js": 34,
+ "./using.js": 35,
+ "./util": 36
+ }],
+ 23 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r, a) {
+ var o = t("./util");
+ o.isArray;
+ function s(t) {
+ var i = this._promise = new e(n);
+ t instanceof e && i._propagateFrom(t, 3),
+ i._setOnCancel(this),
+ this._values = t,
+ this._length = 0,
+ this._totalResolved = 0,
+ this._init(void 0, -2)
+ }
+ return o.inherits(s, a),
+ s.prototype.length = function() {
+ return this._length
+ },
+ s.prototype.promise = function() {
+ return this._promise
+ },
+ s.prototype._init = function t(n, a) {
+ var s = i(this._values, this._promise);
+ if (s instanceof e) {
+ var l = (s = s._target())._bitField;
+ if (this._values = s, 0 == (50397184 & l)) return this._promise._setAsyncGuaranteed(),
+ s._then(t, this._reject, void 0, this, a);
+ if (0 == (33554432 & l)) return 0 != (16777216 & l) ? this._reject(s._reason()) : this._cancel();
+ s = s._value()
+ }
+ if (null !== (s = o.asArray(s))) 0 !== s.length ? this._iterate(s) : -5 === a ? this._resolveEmptyArray() : this._resolve(function(t) {
+ switch (t) {
+ case - 2 : return [];
+ case - 3 : return {};
+ case - 6 : return new Map
+ }
+ } (a));
+ else {
+ var c = r("expecting an array or an iterable object but got " + o.classString(s)).reason();
+ this._promise._rejectCallback(c, !1)
+ }
+ },
+ s.prototype._iterate = function(t) {
+ var n = this.getActualLength(t.length);
+ this._length = n,
+ this._values = this.shouldCopyValues() ? new Array(n) : this._values;
+ for (var r = this._promise,
+ a = !1,
+ o = null,
+ s = 0; s < n; ++s) {
+ var l = i(t[s], r);
+ o = l instanceof e ? (l = l._target())._bitField: null,
+ a ? null !== o && l.suppressUnhandledRejections() : null !== o ? 0 == (50397184 & o) ? (l._proxy(this, s), this._values[s] = l) : a = 0 != (33554432 & o) ? this._promiseFulfilled(l._value(), s) : 0 != (16777216 & o) ? this._promiseRejected(l._reason(), s) : this._promiseCancelled(s) : a = this._promiseFulfilled(l, s)
+ }
+ a || r._setAsyncGuaranteed()
+ },
+ s.prototype._isResolved = function() {
+ return null === this._values
+ },
+ s.prototype._resolve = function(t) {
+ this._values = null,
+ this._promise._fulfill(t)
+ },
+ s.prototype._cancel = function() { ! this._isResolved() && this._promise._isCancellable() && (this._values = null, this._promise._cancel())
+ },
+ s.prototype._reject = function(t) {
+ this._values = null,
+ this._promise._rejectCallback(t, !1)
+ },
+ s.prototype._promiseFulfilled = function(t, e) {
+ return this._values[e] = t,
+ ++this._totalResolved >= this._length && (this._resolve(this._values), !0)
+ },
+ s.prototype._promiseCancelled = function() {
+ return this._cancel(),
+ !0
+ },
+ s.prototype._promiseRejected = function(t) {
+ return this._totalResolved++,
+ this._reject(t),
+ !0
+ },
+ s.prototype._resultCancelled = function() {
+ if (!this._isResolved()) {
+ var t = this._values;
+ if (this._cancel(), t instanceof e) t.cancel();
+ else for (var n = 0; n < t.length; ++n) t[n] instanceof e && t[n].cancel()
+ }
+ },
+ s.prototype.shouldCopyValues = function() {
+ return ! 0
+ },
+ s.prototype.getActualLength = function(t) {
+ return t
+ },
+ s
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 24 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n) {
+ var i = {},
+ r = t("./util"),
+ a = t("./nodeback"),
+ o = r.withAppended,
+ s = r.maybeWrapAsError,
+ c = r.canEvaluate,
+ u = t("./errors").TypeError,
+ d = {
+ __isPromisified__: !0
+ },
+ h = new RegExp("^(?:" + ["arity", "length", "name", "arguments", "caller", "callee", "prototype", "__isPromisified__"].join("|") + ")$"),
+ f = function(t) {
+ return r.isIdentifier(t) && "_" !== t.charAt(0) && "constructor" !== t
+ };
+ function _(t) {
+ return ! h.test(t)
+ }
+ function g(t) {
+ try {
+ return ! 0 === t.__isPromisified__
+ } catch(t) {
+ return ! 1
+ }
+ }
+ function p(t, e, n) {
+ var i = r.getDataPropertyOrDefault(t, e + n, d);
+ return !! i && g(i)
+ }
+ function v(t, e, n, i) {
+ for (var a = r.inheritedDataKeys(t), o = [], s = 0; s < a.length; ++s) {
+ var l = a[s],
+ c = t[l],
+ d = i === f || f(l, c, t);
+ "function" != typeof c || g(c) || p(t, l, e) || !i(l, c, t, d) || o.push(l, c)
+ }
+ return function(t, e, n) {
+ for (var i = 0; i < t.length; i += 2) {
+ var r = t[i];
+ if (n.test(r)) for (var a = r.replace(n, ""), o = 0; o < t.length; o += 2) if (t[o] === a) throw new u("Cannot promisify an API that has normal methods with '%s'-suffix\n\n See http://goo.gl/MqrFmX\n".replace("%s", e))
+ }
+ } (o, e, n),
+ o
+ }
+ var m = function(t) {
+ return t.replace(/([$])/, "\\$")
+ };
+ var y = c ? void 0 : function(t, l, c, u, d, h) {
+ var f = function() {
+ return this
+ } (),
+ _ = t;
+ function g() {
+ var r = l;
+ l === i && (r = this);
+ var c = new e(n);
+ c._captureStackTrace();
+ var u = "string" == typeof _ && this !== f ? this[_] : t,
+ d = a(c, h);
+ try {
+ u.apply(r, o(arguments, d))
+ } catch(t) {
+ c._rejectCallback(s(t), !0, !0)
+ }
+ return c._isFateSealed() || c._setAsyncGuaranteed(),
+ c
+ }
+ return "string" == typeof _ && (t = u),
+ r.notEnumerableProp(g, "__isPromisified__", !0),
+ g
+ };
+ function k(t, e, n, a, o) {
+ for (var s = new RegExp(m(e) + "$"), l = v(t, e, s, n), c = 0, u = l.length; c < u; c += 2) {
+ var d = l[c],
+ h = l[c + 1],
+ f = d + e;
+ if (a === y) t[f] = y(d, i, d, h, e, o);
+ else {
+ var _ = a(h,
+ function() {
+ return y(d, i, d, h, e, o)
+ });
+ r.notEnumerableProp(_, "__isPromisified__", !0),
+ t[f] = _
+ }
+ }
+ return r.toFastProperties(t),
+ t
+ }
+ e.promisify = function(t, e) {
+ if ("function" != typeof t) throw new u("expecting a function but got " + r.classString(t));
+ if (g(t)) return t;
+ var n = function(t, e, n) {
+ return y(t, e, void 0, t, null, n)
+ } (t, void 0 === (e = Object(e)).context ? i: e.context, !!e.multiArgs);
+ return r.copyDescriptors(t, n, _),
+ n
+ },
+ e.promisifyAll = function(t, e) {
+ if ("function" != typeof t && "object" !== l(t)) throw new u("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/MqrFmX\n");
+ var n = !!(e = Object(e)).multiArgs,
+ i = e.suffix;
+ "string" != typeof i && (i = "Async");
+ var a = e.filter;
+ "function" != typeof a && (a = f);
+ var o = e.promisifier;
+ if ("function" != typeof o && (o = y), !r.isIdentifier(i)) throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/MqrFmX\n");
+ for (var s = r.inheritedDataKeys(t), c = 0; c < s.length; ++c) {
+ var d = t[s[c]];
+ "constructor" !== s[c] && r.isClass(d) && (k(d.prototype, i, a, o, n), k(d, i, a, o, n))
+ }
+ return k(t, i, a, o, n)
+ }
+ }
+ },
+ {
+ "./errors": 12,
+ "./nodeback": 20,
+ "./util": 36
+ }],
+ 25 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r) {
+ var a, o = t("./util"),
+ s = o.isObject,
+ l = t("./es5");
+ "function" == typeof Map && (a = Map);
+ var c = function() {
+ var t = 0,
+ e = 0;
+ function n(n, i) {
+ this[t] = n,
+ this[t + e] = i,
+ t++
+ }
+ return function(i) {
+ e = i.size,
+ t = 0;
+ var r = new Array(2 * i.size);
+ return i.forEach(n, r),
+ r
+ }
+ } ();
+ function u(t) {
+ var e, n = !1;
+ if (void 0 !== a && t instanceof a) e = c(t),
+ n = !0;
+ else {
+ var i = l.keys(t),
+ r = i.length;
+ e = new Array(2 * r);
+ for (var o = 0; o < r; ++o) {
+ var s = i[o];
+ e[o] = t[s],
+ e[o + r] = s
+ }
+ }
+ this.constructor$(e),
+ this._isMap = n,
+ this._init$(void 0, n ? -6 : -3)
+ }
+ function d(t) {
+ var n, a = i(t);
+ return s(a) ? (n = a instanceof e ? a._then(e.props, void 0, void 0, void 0, void 0) : new u(a).promise(), a instanceof e && n._propagateFrom(a, 2), n) : r("cannot await properties of a non-object\n\n See http://goo.gl/MqrFmX\n")
+ }
+ o.inherits(u, n),
+ u.prototype._init = function() {},
+ u.prototype._promiseFulfilled = function(t, e) {
+ if (this._values[e] = t, ++this._totalResolved >= this._length) {
+ var n;
+ if (this._isMap) n = function(t) {
+ for (var e = new a,
+ n = t.length / 2 | 0,
+ i = 0; i < n; ++i) {
+ var r = t[n + i],
+ o = t[i];
+ e.set(r, o)
+ }
+ return e
+ } (this._values);
+ else {
+ n = {};
+ for (var i = this.length(), r = 0, o = this.length(); r < o; ++r) n[this._values[r + i]] = this._values[r]
+ }
+ return this._resolve(n),
+ !0
+ }
+ return ! 1
+ },
+ u.prototype.shouldCopyValues = function() {
+ return ! 1
+ },
+ u.prototype.getActualLength = function(t) {
+ return t >> 1
+ },
+ e.prototype.props = function() {
+ return d(this)
+ },
+ e.props = function(t) {
+ return d(t)
+ }
+ }
+ },
+ {
+ "./es5": 13,
+ "./util": 36
+ }],
+ 26 : [function(t, e, n) {
+ "use strict";
+ function i(t) {
+ this._capacity = t,
+ this._length = 0,
+ this._front = 0
+ }
+ i.prototype._willBeOverCapacity = function(t) {
+ return this._capacity < t
+ },
+ i.prototype._pushOne = function(t) {
+ var e = this.length();
+ this._checkCapacity(e + 1),
+ this[this._front + e & this._capacity - 1] = t,
+ this._length = e + 1
+ },
+ i.prototype.push = function(t, e, n) {
+ var i = this.length() + 3;
+ if (this._willBeOverCapacity(i)) return this._pushOne(t),
+ this._pushOne(e),
+ void this._pushOne(n);
+ var r = this._front + i - 3;
+ this._checkCapacity(i);
+ var a = this._capacity - 1;
+ this[r + 0 & a] = t,
+ this[r + 1 & a] = e,
+ this[r + 2 & a] = n,
+ this._length = i
+ },
+ i.prototype.shift = function() {
+ var t = this._front,
+ e = this[t];
+ return this[t] = void 0,
+ this._front = t + 1 & this._capacity - 1,
+ this._length--,
+ e
+ },
+ i.prototype.length = function() {
+ return this._length
+ },
+ i.prototype._checkCapacity = function(t) {
+ this._capacity < t && this._resizeTo(this._capacity << 1)
+ },
+ i.prototype._resizeTo = function(t) {
+ var e = this._capacity;
+ this._capacity = t,
+ function(t, e, n, i, r) {
+ for (var a = 0; a < r; ++a) n[a + i] = t[a + e],
+ t[a + e] = void 0
+ } (this, 0, this, e, this._front + this._length & e - 1)
+ },
+ e.exports = i
+ },
+ {}],
+ 27 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r) {
+ var a = t("./util"),
+ o = function(t) {
+ return t.then(function(e) {
+ return s(e, t)
+ })
+ };
+ function s(t, s) {
+ var l = i(t);
+ if (l instanceof e) return o(l);
+ if (null === (t = a.asArray(t))) return r("expecting an array or an iterable object but got " + a.classString(t));
+ var c = new e(n);
+ void 0 !== s && c._propagateFrom(s, 3);
+ for (var u = c._fulfill,
+ d = c._reject,
+ h = 0,
+ f = t.length; h < f; ++h) {
+ var _ = t[h]; (void 0 !== _ || h in t) && e.cast(_)._then(u, d, void 0, c, null)
+ }
+ return c
+ }
+ e.race = function(t) {
+ return s(t, void 0)
+ },
+ e.prototype.race = function() {
+ return s(this, void 0)
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 28 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r, a, o) {
+ var s = e._getDomain,
+ l = t("./util"),
+ c = l.tryCatch;
+ function u(t, n, i, r) {
+ this.constructor$(t);
+ var o = s();
+ this._fn = null === o ? n: l.domainBind(o, n),
+ void 0 !== i && (i = e.resolve(i))._attachCancellationCallback(this),
+ this._initialValue = i,
+ this._currentCancellable = null,
+ this._eachValues = r === a ? Array(this._length) : 0 === r ? null: void 0,
+ this._promise._captureStackTrace(),
+ this._init$(void 0, -5)
+ }
+ function d(t, e) {
+ this.isFulfilled() ? e._resolve(t) : e._reject(t)
+ }
+ function h(t, e, n, r) {
+ return "function" != typeof e ? i("expecting a function but got " + l.classString(e)) : new u(t, e, n, r).promise()
+ }
+ function f(t) {
+ this.accum = t,
+ this.array._gotAccum(t);
+ var n = r(this.value, this.array._promise);
+ return n instanceof e ? (this.array._currentCancellable = n, n._then(_, void 0, void 0, this, void 0)) : _.call(this, n)
+ }
+ function _(t) {
+ var n, i = this.array,
+ r = i._promise,
+ a = c(i._fn);
+ r._pushContext(),
+ (n = void 0 !== i._eachValues ? a.call(r._boundValue(), t, this.index, this.length) : a.call(r._boundValue(), this.accum, t, this.index, this.length)) instanceof e && (i._currentCancellable = n);
+ var s = r._popContext();
+ return o.checkForgottenReturns(n, s, void 0 !== i._eachValues ? "Promise.each": "Promise.reduce", r),
+ n
+ }
+ l.inherits(u, n),
+ u.prototype._gotAccum = function(t) {
+ void 0 !== this._eachValues && null !== this._eachValues && t !== a && this._eachValues.push(t)
+ },
+ u.prototype._eachComplete = function(t) {
+ return null !== this._eachValues && this._eachValues.push(t),
+ this._eachValues
+ },
+ u.prototype._init = function() {},
+ u.prototype._resolveEmptyArray = function() {
+ this._resolve(void 0 !== this._eachValues ? this._eachValues: this._initialValue)
+ },
+ u.prototype.shouldCopyValues = function() {
+ return ! 1
+ },
+ u.prototype._resolve = function(t) {
+ this._promise._resolveCallback(t),
+ this._values = null
+ },
+ u.prototype._resultCancelled = function(t) {
+ if (t === this._initialValue) return this._cancel();
+ this._isResolved() || (this._resultCancelled$(), this._currentCancellable instanceof e && this._currentCancellable.cancel(), this._initialValue instanceof e && this._initialValue.cancel())
+ },
+ u.prototype._iterate = function(t) {
+ var n, i;
+ this._values = t;
+ var r = t.length;
+ if (void 0 !== this._initialValue ? (n = this._initialValue, i = 0) : (n = e.resolve(t[0]), i = 1), this._currentCancellable = n, !n.isRejected()) for (; i < r; ++i) {
+ var a = {
+ accum: null,
+ value: t[i],
+ index: i,
+ length: r,
+ array: this
+ };
+ n = n._then(f, void 0, void 0, a, void 0)
+ }
+ void 0 !== this._eachValues && (n = n._then(this._eachComplete, void 0, void 0, this, void 0)),
+ n._then(d, d, void 0, n, this)
+ },
+ e.prototype.reduce = function(t, e) {
+ return h(this, t, e, null)
+ },
+ e.reduce = function(t, e, n, i) {
+ return h(t, e, n, i)
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 29 : [function(t, e, a) {
+ "use strict";
+ var o, s = t("./util"),
+ l = s.getNativePromise();
+ if (s.isNode && "undefined" == typeof MutationObserver) {
+ var c = i.setImmediate,
+ u = n.nextTick;
+ o = s.isRecentNode ?
+ function(t) {
+ c.call(i, t)
+ }: function(t) {
+ u.call(n, t)
+ }
+ } else if ("function" == typeof l && "function" == typeof l.resolve) {
+ var d = l.resolve();
+ o = function(t) {
+ d.then(t)
+ }
+ } else o = "undefined" == typeof MutationObserver || "undefined" != typeof window && window.navigator && (window.navigator.standalone || window.cordova) ? void 0 !== r ?
+ function(t) {
+ r(t)
+ }: "undefined" != typeof setTimeout ?
+ function(t) {
+ setTimeout(t, 0)
+ }: function() {
+ throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")
+ }: function() {
+ var t = document.createElement("div"),
+ e = {
+ attributes: !0
+ },
+ n = !1,
+ i = document.createElement("div");
+ new MutationObserver(function() {
+ t.classList.toggle("foo"),
+ n = !1
+ }).observe(i, e);
+ return function(r) {
+ var a = new MutationObserver(function() {
+ a.disconnect(),
+ r()
+ });
+ a.observe(t, e),
+ n || (n = !0, i.classList.toggle("foo"))
+ }
+ } ();
+ e.exports = o
+ },
+ {
+ "./util": 36
+ }],
+ 30 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i) {
+ var r = e.PromiseInspection;
+ function a(t) {
+ this.constructor$(t)
+ }
+ t("./util").inherits(a, n),
+ a.prototype._promiseResolved = function(t, e) {
+ return this._values[t] = e,
+ ++this._totalResolved >= this._length && (this._resolve(this._values), !0)
+ },
+ a.prototype._promiseFulfilled = function(t, e) {
+ var n = new r;
+ return n._bitField = 33554432,
+ n._settledValueField = t,
+ this._promiseResolved(e, n)
+ },
+ a.prototype._promiseRejected = function(t, e) {
+ var n = new r;
+ return n._bitField = 16777216,
+ n._settledValueField = t,
+ this._promiseResolved(e, n)
+ },
+ e.settle = function(t) {
+ return i.deprecated(".settle()", ".reflect()"),
+ new a(t).promise()
+ },
+ e.prototype.settle = function() {
+ return e.settle(this)
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 31 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i) {
+ var r = t("./util"),
+ a = t("./errors").RangeError,
+ o = t("./errors").AggregateError,
+ s = r.isArray,
+ l = {};
+ function c(t) {
+ this.constructor$(t),
+ this._howMany = 0,
+ this._unwrap = !1,
+ this._initialized = !1
+ }
+ function u(t, e) {
+ if ((0 | e) !== e || e < 0) return i("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");
+ var n = new c(t),
+ r = n.promise();
+ return n.setHowMany(e),
+ n.init(),
+ r
+ }
+ r.inherits(c, n),
+ c.prototype._init = function() {
+ if (this._initialized) if (0 !== this._howMany) {
+ this._init$(void 0, -5);
+ var t = s(this._values); ! this._isResolved() && t && this._howMany > this._canPossiblyFulfill() && this._reject(this._getRangeError(this.length()))
+ } else this._resolve([])
+ },
+ c.prototype.init = function() {
+ this._initialized = !0,
+ this._init()
+ },
+ c.prototype.setUnwrap = function() {
+ this._unwrap = !0
+ },
+ c.prototype.howMany = function() {
+ return this._howMany
+ },
+ c.prototype.setHowMany = function(t) {
+ this._howMany = t
+ },
+ c.prototype._promiseFulfilled = function(t) {
+ return this._addFulfilled(t),
+ this._fulfilled() === this.howMany() && (this._values.length = this.howMany(), 1 === this.howMany() && this._unwrap ? this._resolve(this._values[0]) : this._resolve(this._values), !0)
+ },
+ c.prototype._promiseRejected = function(t) {
+ return this._addRejected(t),
+ this._checkOutcome()
+ },
+ c.prototype._promiseCancelled = function() {
+ return this._values instanceof e || null == this._values ? this._cancel() : (this._addRejected(l), this._checkOutcome())
+ },
+ c.prototype._checkOutcome = function() {
+ if (this.howMany() > this._canPossiblyFulfill()) {
+ for (var t = new o,
+ e = this.length(); e < this._values.length; ++e) this._values[e] !== l && t.push(this._values[e]);
+ return t.length > 0 ? this._reject(t) : this._cancel(),
+ !0
+ }
+ return ! 1
+ },
+ c.prototype._fulfilled = function() {
+ return this._totalResolved
+ },
+ c.prototype._rejected = function() {
+ return this._values.length - this.length()
+ },
+ c.prototype._addRejected = function(t) {
+ this._values.push(t)
+ },
+ c.prototype._addFulfilled = function(t) {
+ this._values[this._totalResolved++] = t
+ },
+ c.prototype._canPossiblyFulfill = function() {
+ return this.length() - this._rejected()
+ },
+ c.prototype._getRangeError = function(t) {
+ var e = "Input array must contain at least " + this._howMany + " items but contains only " + t + " items";
+ return new a(e)
+ },
+ c.prototype._resolveEmptyArray = function() {
+ this._reject(this._getRangeError(0))
+ },
+ e.some = function(t, e) {
+ return u(t, e)
+ },
+ e.prototype.some = function(t) {
+ return u(this, t)
+ },
+ e._SomePromiseArray = c
+ }
+ },
+ {
+ "./errors": 12,
+ "./util": 36
+ }],
+ 32 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(t) {
+ function e(t) {
+ void 0 !== t ? (t = t._target(), this._bitField = t._bitField, this._settledValueField = t._isFateSealed() ? t._settledValue() : void 0) : (this._bitField = 0, this._settledValueField = void 0)
+ }
+ e.prototype._settledValue = function() {
+ return this._settledValueField
+ };
+ var n = e.prototype.value = function() {
+ if (!this.isFulfilled()) throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");
+ return this._settledValue()
+ },
+ i = e.prototype.error = e.prototype.reason = function() {
+ if (!this.isRejected()) throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");
+ return this._settledValue()
+ },
+ r = e.prototype.isFulfilled = function() {
+ return 0 != (33554432 & this._bitField)
+ },
+ a = e.prototype.isRejected = function() {
+ return 0 != (16777216 & this._bitField)
+ },
+ o = e.prototype.isPending = function() {
+ return 0 == (50397184 & this._bitField)
+ },
+ s = e.prototype.isResolved = function() {
+ return 0 != (50331648 & this._bitField)
+ };
+ e.prototype.isCancelled = function() {
+ return 0 != (8454144 & this._bitField)
+ },
+ t.prototype.__isCancelled = function() {
+ return 65536 == (65536 & this._bitField)
+ },
+ t.prototype._isCancelled = function() {
+ return this._target().__isCancelled()
+ },
+ t.prototype.isCancelled = function() {
+ return 0 != (8454144 & this._target()._bitField)
+ },
+ t.prototype.isPending = function() {
+ return o.call(this._target())
+ },
+ t.prototype.isRejected = function() {
+ return a.call(this._target())
+ },
+ t.prototype.isFulfilled = function() {
+ return r.call(this._target())
+ },
+ t.prototype.isResolved = function() {
+ return s.call(this._target())
+ },
+ t.prototype.value = function() {
+ return n.call(this._target())
+ },
+ t.prototype.reason = function() {
+ var t = this._target();
+ return t._unsetRejectionIsUnhandled(),
+ i.call(t)
+ },
+ t.prototype._value = function() {
+ return this._settledValue()
+ },
+ t.prototype._reason = function() {
+ return this._unsetRejectionIsUnhandled(),
+ this._settledValue()
+ },
+ t.PromiseInspection = e
+ }
+ },
+ {}],
+ 33 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n) {
+ var i = t("./util"),
+ r = i.errorObj,
+ a = i.isObject;
+ var o = {}.hasOwnProperty;
+ return function(t, s) {
+ if (a(t)) {
+ if (t instanceof e) return t;
+ var l = function(t) {
+ try {
+ return function(t) {
+ return t.then
+ } (t)
+ } catch(t) {
+ return r.e = t,
+ r
+ }
+ } (t);
+ if (l === r) {
+ s && s._pushContext();
+ var c = e.reject(l.e);
+ return s && s._popContext(),
+ c
+ }
+ if ("function" == typeof l) return function(t) {
+ try {
+ return o.call(t, "_promise0")
+ } catch(t) {
+ return ! 1
+ }
+ } (t) ? (c = new e(n), t._then(c._fulfill, c._reject, void 0, c, null), c) : function(t, a, o) {
+ var s = new e(n),
+ l = s;
+ o && o._pushContext(),
+ s._captureStackTrace(),
+ o && o._popContext();
+ var c = !0,
+ u = i.tryCatch(a).call(t,
+ function(t) {
+ s && (s._resolveCallback(t), s = null)
+ },
+ function(t) {
+ s && (s._rejectCallback(t, c, !0), s = null)
+ });
+ return c = !1,
+ s && u === r && (s._rejectCallback(u.e, !0, !0), s = null),
+ l
+ } (t, l, s)
+ }
+ return t
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 34 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i) {
+ var r = t("./util"),
+ a = e.TimeoutError;
+ function o(t) {
+ this.handle = t
+ }
+ o.prototype._resultCancelled = function() {
+ clearTimeout(this.handle)
+ };
+ var s = function(t) {
+ return l( + this).thenReturn(t)
+ },
+ l = e.delay = function(t, r) {
+ var a, l;
+ return void 0 !== r ? (a = e.resolve(r)._then(s, null, null, t, void 0), i.cancellation() && r instanceof e && a._setOnCancel(r)) : (a = new e(n), l = setTimeout(function() {
+ a._fulfill()
+ },
+ +t), i.cancellation() && a._setOnCancel(new o(l)), a._captureStackTrace()),
+ a._setAsyncGuaranteed(),
+ a
+ };
+ e.prototype.delay = function(t) {
+ return l(t, this)
+ };
+ function c(t) {
+ return clearTimeout(this.handle),
+ t
+ }
+ function u(t) {
+ throw clearTimeout(this.handle),
+ t
+ }
+ e.prototype.timeout = function(t, e) {
+ var n, s;
+ t = +t;
+ var l = new o(setTimeout(function() {
+ n.isPending() &&
+ function(t, e, n) {
+ var i;
+ i = "string" != typeof e ? e instanceof Error ? e: new a("operation timed out") : new a(e),
+ r.markAsOriginatingFromRejection(i),
+ t._attachExtraTrace(i),
+ t._reject(i),
+ null != n && n.cancel()
+ } (n, e, s)
+ },
+ t));
+ return i.cancellation() ? (s = this.then(), (n = s._then(c, u, void 0, l, void 0))._setOnCancel(l)) : n = this._then(c, u, void 0, l, void 0),
+ n
+ }
+ }
+ },
+ {
+ "./util": 36
+ }],
+ 35 : [function(t, e, n) {
+ "use strict";
+ e.exports = function(e, n, i, r, a, o) {
+ var s = t("./util"),
+ l = t("./errors").TypeError,
+ c = t("./util").inherits,
+ u = s.errorObj,
+ d = s.tryCatch,
+ h = {};
+ function f(t) {
+ setTimeout(function() {
+ throw t
+ },
+ 0)
+ }
+ function _(t, n) {
+ var r = 0,
+ o = t.length,
+ s = new e(a);
+ return function a() {
+ if (r >= o) return s._fulfill();
+ var l = function(t) {
+ var e = i(t);
+ return e !== t && "function" == typeof t._isDisposable && "function" == typeof t._getDisposer && t._isDisposable() && e._setDisposable(t._getDisposer()),
+ e
+ } (t[r++]);
+ if (l instanceof e && l._isDisposable()) {
+ try {
+ l = i(l._getDisposer().tryDispose(n), t.promise)
+ } catch(t) {
+ return f(t)
+ }
+ if (l instanceof e) return l._then(a, f, null, null, null)
+ }
+ a()
+ } (),
+ s
+ }
+ function g(t, e, n) {
+ this._data = t,
+ this._promise = e,
+ this._context = n
+ }
+ function p(t, e, n) {
+ this.constructor$(t, e, n)
+ }
+ function v(t) {
+ return g.isDisposer(t) ? (this.resources[this.index]._setDisposable(t), t.promise()) : t
+ }
+ function m(t) {
+ this.length = t,
+ this.promise = null,
+ this[t - 1] = null
+ }
+ g.prototype.data = function() {
+ return this._data
+ },
+ g.prototype.promise = function() {
+ return this._promise
+ },
+ g.prototype.resource = function() {
+ return this.promise().isFulfilled() ? this.promise().value() : h
+ },
+ g.prototype.tryDispose = function(t) {
+ var e = this.resource(),
+ n = this._context;
+ void 0 !== n && n._pushContext();
+ var i = e !== h ? this.doDispose(e, t) : null;
+ return void 0 !== n && n._popContext(),
+ this._promise._unsetDisposable(),
+ this._data = null,
+ i
+ },
+ g.isDisposer = function(t) {
+ return null != t && "function" == typeof t.resource && "function" == typeof t.tryDispose
+ },
+ c(p, g),
+ p.prototype.doDispose = function(t, e) {
+ return this.data().call(t, t, e)
+ },
+ m.prototype._resultCancelled = function() {
+ for (var t = this.length,
+ n = 0; n < t; ++n) {
+ var i = this[n];
+ i instanceof e && i.cancel()
+ }
+ },
+ e.using = function() {
+ var t = arguments.length;
+ if (t < 2) return n("you must pass at least 2 arguments to Promise.using");
+ var r, a = arguments[t - 1];
+ if ("function" != typeof a) return n("expecting a function but got " + s.classString(a));
+ var l = !0;
+ 2 === t && Array.isArray(arguments[0]) ? (t = (r = arguments[0]).length, l = !1) : (r = arguments, t--);
+ for (var c = new m(t), h = 0; h < t; ++h) {
+ var f = r[h];
+ if (g.isDisposer(f)) {
+ var p = f; (f = f.promise())._setDisposable(p)
+ } else {
+ var y = i(f);
+ y instanceof e && (f = y._then(v, null, null, {
+ resources: c,
+ index: h
+ },
+ void 0))
+ }
+ c[h] = f
+ }
+ var k = new Array(c.length);
+ for (h = 0; h < k.length; ++h) k[h] = e.resolve(c[h]).reflect();
+ var b = e.all(k).then(function(t) {
+ for (var e = 0; e < t.length; ++e) {
+ var n = t[e];
+ if (n.isRejected()) return u.e = n.error(),
+ u;
+ if (!n.isFulfilled()) return void b.cancel();
+ t[e] = n.value()
+ }
+ x._pushContext(),
+ a = d(a);
+ var i = l ? a.apply(void 0, t) : a(t),
+ r = x._popContext();
+ return o.checkForgottenReturns(i, r, "Promise.using", x),
+ i
+ }),
+ x = b.lastly(function() {
+ var t = new e.PromiseInspection(b);
+ return _(c, t)
+ });
+ return c.promise = x,
+ x._setOnCancel(c),
+ x
+ },
+ e.prototype._setDisposable = function(t) {
+ this._bitField = 131072 | this._bitField,
+ this._disposer = t
+ },
+ e.prototype._isDisposable = function() {
+ return (131072 & this._bitField) > 0
+ },
+ e.prototype._getDisposer = function() {
+ return this._disposer
+ },
+ e.prototype._unsetDisposable = function() {
+ this._bitField = -131073 & this._bitField,
+ this._disposer = void 0
+ },
+ e.prototype.disposer = function(t) {
+ if ("function" == typeof t) return new p(t, this, r());
+ throw new l
+ }
+ }
+ },
+ {
+ "./errors": 12,
+ "./util": 36
+ }],
+ 36 : [function(t, e, r) {
+ "use strict";
+ var a = t("./es5"),
+ o = "undefined" == typeof navigator,
+ s = {
+ e: {}
+ },
+ c,
+ u = "undefined" != typeof self ? self: "undefined" != typeof window ? window: void 0 !== i ? i: void 0 !== this ? this: null;
+ function d() {
+ try {
+ var t = c;
+ return c = null,
+ t.apply(this, arguments)
+ } catch(t) {
+ return s.e = t,
+ s
+ }
+ }
+ function h(t) {
+ return c = t,
+ d
+ }
+ var f = function(t, e) {
+ var n = {}.hasOwnProperty;
+ function i() {
+ for (var i in this.constructor = t,
+ this.constructor$ = e,
+ e.prototype) n.call(e.prototype, i) && "$" !== i.charAt(i.length - 1) && (this[i + "$"] = e.prototype[i])
+ }
+ return i.prototype = e.prototype,
+ t.prototype = new i,
+ t.prototype
+ };
+ function _(t) {
+ return null == t || !0 === t || !1 === t || "string" == typeof t || "number" == typeof t
+ }
+ function g(t) {
+ return "function" == typeof t || "object" === l(t) && null !== t
+ }
+ function p(t) {
+ return _(t) ? new Error(E(t)) : t
+ }
+ function v(t, e) {
+ var n, i = t.length,
+ r = new Array(i + 1);
+ for (n = 0; n < i; ++n) r[n] = t[n];
+ return r[n] = e,
+ r
+ }
+ function m(t, e, n) {
+ if (!a.isES5) return {}.hasOwnProperty.call(t, e) ? t[e] : void 0;
+ var i = Object.getOwnPropertyDescriptor(t, e);
+ return null != i ? null == i.get && null == i.set ? i.value: n: void 0
+ }
+ function y(t, e, n) {
+ if (_(t)) return t;
+ var i = {
+ value: n,
+ configurable: !0,
+ enumerable: !1,
+ writable: !0
+ };
+ return a.defineProperty(t, e, i),
+ t
+ }
+ function k(t) {
+ throw t
+ }
+ var b = function() {
+ var t = [Array.prototype, Object.prototype, Function.prototype],
+ e = function(e) {
+ for (var n = 0; n < t.length; ++n) if (t[n] === e) return ! 0;
+ return ! 1
+ };
+ if (a.isES5) {
+ var n = Object.getOwnPropertyNames;
+ return function(t) {
+ for (var i = [], r = Object.create(null); null != t && !e(t);) {
+ var o;
+ try {
+ o = n(t)
+ } catch(t) {
+ return i
+ }
+ for (var s = 0; s < o.length; ++s) {
+ var l = o[s];
+ if (!r[l]) {
+ r[l] = !0;
+ var c = Object.getOwnPropertyDescriptor(t, l);
+ null != c && null == c.get && null == c.set && i.push(l)
+ }
+ }
+ t = a.getPrototypeOf(t)
+ }
+ return i
+ }
+ }
+ var i = {}.hasOwnProperty;
+ return function(n) {
+ if (e(n)) return [];
+ var r = [];
+ t: for (var a in n) if (i.call(n, a)) r.push(a);
+ else {
+ for (var o = 0; o < t.length; ++o) if (i.call(t[o], a)) continue t;
+ r.push(a)
+ }
+ return r
+ }
+ } (),
+ x = /this\s*\.\s*\S+\s*=/;
+ function w(t) {
+ try {
+ if ("function" == typeof t) {
+ var e = a.names(t.prototype),
+ n = a.isES5 && e.length > 1,
+ i = e.length > 0 && !(1 === e.length && "constructor" === e[0]),
+ r = x.test(t + "") && a.names(t).length > 0;
+ if (n || i || r) return ! 0
+ }
+ return ! 1
+ } catch(t) {
+ return ! 1
+ }
+ }
+ function S(t) {
+ function e() {}
+ e.prototype = t;
+ var n = new e;
+ function i() {
+ return l(n.foo)
+ }
+ return i(),
+ i(),
+ t
+ }
+ var T = /^[a-z$_][a-z$_0-9]*$/i;
+ function $(t) {
+ return T.test(t)
+ }
+ function C(t, e, n) {
+ for (var i = new Array(t), r = 0; r < t; ++r) i[r] = e + r + n;
+ return i
+ }
+ function E(t) {
+ try {
+ return t + ""
+ } catch(t) {
+ return "[no string representation]"
+ }
+ }
+ function A(t) {
+ return t instanceof Error || null !== t && "object" === l(t) && "string" == typeof t.message && "string" == typeof t.name
+ }
+ function D(t) {
+ try {
+ y(t, "isOperational", !0)
+ } catch(t) {}
+ }
+ function M(t) {
+ return null != t && (t instanceof Error.__BluebirdErrorTypes__.OperationalError || !0 === t.isOperational)
+ }
+ function I(t) {
+ return A(t) && a.propertyIsWritable(t, "stack")
+ }
+ var P = "stack" in new Error ?
+ function(t) {
+ return I(t) ? t: new Error(E(t))
+ }: function(t) {
+ if (I(t)) return t;
+ try {
+ throw new Error(E(t))
+ } catch(t) {
+ return t
+ }
+ };
+ function N(t) {
+ return {}.toString.call(t)
+ }
+ function O(t, e, n) {
+ for (var i = a.names(t), r = 0; r < i.length; ++r) {
+ var o = i[r];
+ if (n(o)) try {
+ a.defineProperty(e, o, a.getDescriptor(t, o))
+ } catch(t) {}
+ }
+ }
+ var L = function(t) {
+ return a.isArray(t) ? t: null
+ };
+ if ("undefined" != typeof Symbol && Symbol.iterator) {
+ var R = "function" == typeof Array.from ?
+ function(t) {
+ return Array.from(t)
+ }: function(t) {
+ for (var e, n = [], i = t[Symbol.iterator](); ! (e = i.next()).done;) n.push(e.value);
+ return n
+ };
+ L = function(t) {
+ return a.isArray(t) ? t: null != t && "function" == typeof t[Symbol.iterator] ? R(t) : null
+ }
+ }
+ var j = void 0 !== n && "[object process]" === N(n).toLowerCase(),
+ H = void 0 !== n && void 0 !== n.env;
+ function F(t) {
+ return H ? n.env[t] : void 0
+ }
+ function B() {
+ if ("function" == typeof Promise) try {
+ var t = new Promise(function() {});
+ if ("[object Promise]" === {}.toString.call(t)) return Promise
+ } catch(t) {}
+ }
+ function z(t, e) {
+ return t.bind(e)
+ }
+ var U = {
+ isClass: w,
+ isIdentifier: $,
+ inheritedDataKeys: b,
+ getDataPropertyOrDefault: m,
+ thrower: k,
+ isArray: a.isArray,
+ asArray: L,
+ notEnumerableProp: y,
+ isPrimitive: _,
+ isObject: g,
+ isError: A,
+ canEvaluate: o,
+ errorObj: s,
+ tryCatch: h,
+ inherits: f,
+ withAppended: v,
+ maybeWrapAsError: p,
+ toFastProperties: S,
+ filledRange: C,
+ toString: E,
+ canAttachTrace: I,
+ ensureErrorObject: P,
+ originatesFromRejection: M,
+ markAsOriginatingFromRejection: D,
+ classString: N,
+ copyDescriptors: O,
+ hasDevTools: "undefined" != typeof chrome && chrome && "function" == typeof chrome.loadTimes,
+ isNode: j,
+ hasEnvVariables: H,
+ env: F,
+ global: u,
+ getNativePromise: B,
+ domainBind: z
+ };
+ U.isRecentNode = U.isNode &&
+ function() {
+ var t;
+ return n.versions && n.versions.node ? t = n.versions.node.split(".").map(Number) : n.version && (t = n.version.split(".").map(Number)),
+ 0 === t[0] && t[1] > 10 || t[0] > 0
+ } (),
+ U.isNode && U.toFastProperties(n);
+ try {
+ throw new Error
+ } catch(t) {
+ U.lastLineError = t
+ }
+ e.exports = U
+ },
+ {
+ "./es5": 13
+ }]
+ },
+ {},
+ [4])(4)
+ }),
+ "undefined" != typeof window && null !== window ? window.P = window.Promise: "undefined" != typeof self && null !== self && (self.P = self.Promise)
+ }).call(this, n(9), n(4), n(57).setImmediate)
+ },
+ function(t, e, n) {
+ t.exports = n(233)
+ },
+ function(t, e, n) {
+ var i = n(0);
+ t.exports = function() {
+ var t = {};
+ return {
+ getState: function(e) {
+ if (t[e]) return t[e].method();
+ var n = {};
+ for (var r in t) t[r].internal || i.mixin(n, t[r].method(), !0);
+ return n
+ },
+ registerProvider: function(e, n, i) {
+ t[e] = {
+ method: n,
+ internal: i
+ }
+ },
+ unregisterProvider: function(e) {
+ delete t[e]
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ var e = {};
+ function n(n, i, r) {
+ r = r || n;
+ var a = t.config,
+ o = t.templates;
+ t.config[n] && e[r] != a[n] && (i && o[r] || (o[r] = t.date.date_to_str(a[n]), e[r] = a[n]))
+ }
+ return {
+ initTemplates: function() {
+ var e = t.locale.labels;
+ e.gantt_save_btn = e.icon_save,
+ e.gantt_cancel_btn = e.icon_cancel,
+ e.gantt_delete_btn = e.icon_delete;
+ var i = t.date,
+ r = i.date_to_str,
+ a = t.config,
+ o = r(a.xml_date || a.date_format, a.server_utc),
+ s = i.str_to_date(a.xml_date || a.date_format, a.server_utc);
+ n("date_scale", !0, void 0, t.config, t.templates),
+ n("date_grid", !0, "grid_date_format", t.config, t.templates),
+ n("task_date", !0, void 0, t.config, t.templates),
+ t.mixin(t.templates, {
+ xml_format: void 0,
+ format_date: o,
+ xml_date: void 0,
+ parse_date: s,
+ progress_text: function(t, e, n) {
+ return ""
+ },
+ grid_header_class: function(t, e) {
+ return ""
+ },
+ task_text: function(t, e, n) {
+ return n.text
+ },
+ task_class: function(t, e, n) {
+ return ""
+ },
+ task_end_date: function(e) {
+ return t.templates.task_date(e)
+ },
+ grid_row_class: function(t, e, n) {
+ return ""
+ },
+ task_row_class: function(t, e, n) {
+ return ""
+ },
+ timeline_cell_class: function(t, e) {
+ return ""
+ },
+ timeline_cell_content: function(t, e) {
+ return ""
+ },
+ scale_cell_class: function(t) {
+ return ""
+ },
+ scale_row_class: function(t) {
+ return ""
+ },
+ grid_indent: function(t) {
+ return "<div class='gantt_tree_indent'></div>"
+ },
+ grid_folder: function(t) {
+ return "<div class='gantt_tree_icon gantt_folder_" + (t.$open ? "open": "closed") + "'></div>"
+ },
+ grid_file: function(t) {
+ return "<div class='gantt_tree_icon gantt_file'></div>"
+ },
+ grid_open: function(t) {
+ return "<div class='gantt_tree_icon gantt_" + (t.$open ? "close": "open") + "'></div>"
+ },
+ grid_blank: function(t) {
+ return "<div class='gantt_tree_icon gantt_blank'></div>"
+ },
+ date_grid: function(e, n, i) {
+ return n && t.isUnscheduledTask(n) && t.config.show_unscheduled ? t.templates.task_unscheduled_time(n) : t.templates.grid_date_format(e, i)
+ },
+ task_time: function(e, n, i) {
+ return t.isUnscheduledTask(i) && t.config.show_unscheduled ? t.templates.task_unscheduled_time(i) : t.templates.task_date(e) + " - " + t.templates.task_end_date(n)
+ },
+ task_unscheduled_time: function(t) {
+ return ""
+ },
+ time_picker: r(a.time_picker),
+ link_class: function(t) {
+ return ""
+ },
+ link_description: function(e) {
+ var n = t.getTask(e.source),
+ i = t.getTask(e.target);
+ return "<b>" + n.text + "</b> – <b>" + i.text + "</b>"
+ },
+ drag_link: function(e, n, i, r) {
+ e = t.getTask(e);
+ var a = t.locale.labels,
+ o = "<b>" + e.text + "</b> " + (n ? a.link_start: a.link_end) + "<br/>";
+ return i && (o += "<b> " + (i = t.getTask(i)).text + "</b> " + (r ? a.link_start: a.link_end) + "<br/>"),
+ o
+ },
+ drag_link_class: function(e, n, i, r) {
+ var a = "";
+ return e && i && (a = " " + (t.isLinkAllowed(e, i, n, r) ? "gantt_link_allow": "gantt_link_deny")),
+ "gantt_link_tooltip" + a
+ },
+ tooltip_date_format: i.date_to_str("%Y-%m-%d"),
+ tooltip_text: function(e, n, i) {
+ return "<b>浠诲姟:</b> " + i.text + "<br/><b>寮�濮嬫椂闂�:</b> " + t.templates.tooltip_date_format(e) + "<br/><b>缁撴潫鏃堕棿:</b> " + t.templates.tooltip_date_format(n)
+ // return "<b>Task:</b> " + i.text + "<br/><b>Start date:</b> " + t.templates.tooltip_date_format(e) + "<br/><b>End date:</b> " + t.templates.tooltip_date_format(n)
+ }
+ })
+ },
+ initTemplate: n
+ }
+ }
+ },
+ function(t, e, n) {
+ var i = n(5),
+ r = n(0),
+ a = n(50),
+ o = n(21),
+ s = n(1);
+ t.exports = function(t) {
+ function e(t) {
+ return {
+ target: t.target || t.srcElement,
+ pageX: t.pageX,
+ pageY: t.pageY,
+ clientX: t.clientX,
+ clientY: t.clientY,
+ metaKey: t.metaKey,
+ shiftKey: t.shiftKey,
+ ctrlKey: t.ctrlKey,
+ altKey: t.altKey
+ }
+ }
+ function n(n, a) {
+ this._obj = n,
+ this._settings = a || {},
+ i(this);
+ var o = this.getInputMethods();
+ this._drag_start_timer = null,
+ t.attachEvent("onGanttScroll", r.bind(function(t, e) {
+ this.clearDragTimer()
+ },
+ this));
+ for (var l = {
+ passive: !1
+ },
+ c = 0; c < o.length; c++) r.bind(function(i) {
+ t.event(n, i.down, r.bind(function(o) {
+ i.accessor(o) && (a.preventDefault && a.selector && s.closest(o.target, a.selector) && o.preventDefault(), t.config.touch && o.timeStamp && o.timeStamp - 0 < 300 || (this._settings.original_target = e(o), t.config.touch ? (this.clearDragTimer(), this._drag_start_timer = setTimeout(r.bind(function() {
+ t.getState().lightbox || this.dragStart(n, o, i)
+ },
+ this), t.config.touch_drag)) : this.dragStart(n, o, i)))
+ },
+ this), l);
+ var o = document.body;
+ t.event(o, i.up, r.bind(function(t) {
+ i.accessor(t) && this.clearDragTimer()
+ },
+ this), l)
+ },
+ this)(o[c])
+ }
+ return n.prototype = {
+ traceDragEvents: function(e, n) {
+ var i = r.bind(function(t) {
+ return this.dragMove(e, t, n.accessor)
+ },
+ this);
+ r.bind(function(t) {
+ return this.dragScroll(e, t)
+ },
+ this);
+ var o = r.bind(function(t) {
+ if (!this.config.started || !r.defined(this.config.updates_per_second) || a(this, this.config.updates_per_second)) {
+ var e = i(t);
+ if (e) try {
+ t && t.preventDefault && t.cancelable && t.preventDefault()
+ } catch(t) {}
+ return e
+ }
+ },
+ this),
+ l = s.getRootNode(t.$root),
+ c = this.config.mousemoveContainer || s.getRootNode(t.$root),
+ u = {
+ passive: !1
+ },
+ d = r.bind(function(i) {
+ return t.eventRemove(c, n.move, o),
+ t.eventRemove(l, n.up, d, u),
+ this.dragEnd(e)
+ },
+ this);
+ t.event(c, n.move, o, u),
+ t.event(l, n.up, d, u)
+ },
+ checkPositionChange: function(t) {
+ var e = t.x - this.config.pos.x,
+ n = t.y - this.config.pos.y;
+ return Math.sqrt(Math.pow(Math.abs(e), 2) + Math.pow(Math.abs(n), 2)) > this.config.sensitivity
+ },
+ initDnDMarker: function() {
+ var t = this.config.marker = document.createElement("div");
+ t.className = "gantt_drag_marker",
+ t.innerHTML = "",
+ document.body.appendChild(t)
+ },
+ backupEventTarget: function(n, i) {
+ if (t.config.touch) {
+ var r = i(n),
+ a = r.target || r.srcElement,
+ o = a.cloneNode(!0);
+ this.config.original_target = e(r),
+ this.config.original_target.target = o,
+ this.config.backup_element = a,
+ a.parentNode.appendChild(o),
+ a.style.display = "none",
+ (this.config.mousemoveContainer || document.body).appendChild(a)
+ }
+ },
+ getInputMethods: function() {
+ var e = [];
+ if (e.push({
+ move: "mousemove",
+ down: "mousedown",
+ up: "mouseup",
+ accessor: function(t) {
+ return t
+ }
+ }), t.config.touch) {
+ var n = !0;
+ try {
+ document.createEvent("TouchEvent")
+ } catch(t) {
+ n = !1
+ }
+ n ? e.push({
+ move: "touchmove",
+ down: "touchstart",
+ up: "touchend",
+ accessor: function(t) {
+ return t.touches && t.touches.length > 1 ? null: t.touches[0] ? {
+ target: document.elementFromPoint(t.touches[0].clientX, t.touches[0].clientY),
+ pageX: t.touches[0].pageX,
+ pageY: t.touches[0].pageY,
+ clientX: t.touches[0].clientX,
+ clientY: t.touches[0].clientY
+ }: t
+ }
+ }) : o.navigator.pointerEnabled ? e.push({
+ move: "pointermove",
+ down: "pointerdown",
+ up: "pointerup",
+ accessor: function(t) {
+ return "mouse" == t.pointerType ? null: t
+ }
+ }) : o.navigator.msPointerEnabled && e.push({
+ move: "MSPointerMove",
+ down: "MSPointerDown",
+ up: "MSPointerUp",
+ accessor: function(t) {
+ return t.pointerType == t.MSPOINTER_TYPE_MOUSE ? null: t
+ }
+ })
+ }
+ return e
+ },
+ clearDragTimer: function() {
+ this._drag_start_timer && (clearTimeout(this._drag_start_timer), this._drag_start_timer = null)
+ },
+ dragStart: function(e, n, i) {
+ this.config && this.config.started || (this.config = {
+ obj: e,
+ marker: null,
+ started: !1,
+ pos: this.getPosition(n),
+ sensitivity: 4
+ },
+ this._settings && r.mixin(this.config, this._settings, !0), this.traceDragEvents(e, i), t._prevent_touch_scroll = !0, document.body.className += " gantt_noselect", t.config.touch && this.dragMove(e, n, i.accessor))
+ },
+ dragMove: function(e, n, i) {
+ var r = i(n);
+ if (!r) return ! 1;
+ if (!this.config.marker && !this.config.started) {
+ var a = this.getPosition(r);
+ if (t.config.touch || this.checkPositionChange(a)) {
+ if (this.config.started = !0, this.config.ignore = !1, !1 === this.callEvent("onBeforeDragStart", [e, this.config.original_target])) return this.config.ignore = !0,
+ !1;
+ this.backupEventTarget(n, i),
+ this.initDnDMarker(),
+ t._touch_feedback(),
+ this.callEvent("onAfterDragStart", [e, this.config.original_target])
+ } else this.config.ignore = !0
+ }
+ if (!this.config.ignore) {
+ if (n.targetTouches && !r.target) return;
+ return r.pos = this.getPosition(r),
+ this.config.marker.style.left = r.pos.x + "px",
+ this.config.marker.style.top = r.pos.y + "px",
+ this.callEvent("onDragMove", [e, r]),
+ !0
+ }
+ return ! 1
+ },
+ dragEnd: function(e) {
+ var n = this.config.backup_element;
+ n && n.parentNode && n.parentNode.removeChild(n),
+ t._prevent_touch_scroll = !1,
+ this.config.marker && (this.config.marker.parentNode.removeChild(this.config.marker), this.config.marker = null, this.callEvent("onDragEnd", [])),
+ this.config.started = !1,
+ document.body.className = document.body.className.replace(" gantt_noselect", "")
+ },
+ getPosition: function(t) {
+ var e = 0,
+ n = 0;
+ return t.pageX || t.pageY ? (e = t.pageX, n = t.pageY) : (t.clientX || t.clientY) && (e = t.clientX + document.body.scrollLeft + document.documentElement.scrollLeft, n = t.clientY + document.body.scrollTop + document.documentElement.scrollTop),
+ {
+ x: e,
+ y: n
+ }
+ }
+ },
+ n
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ function i(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var i = e[n];
+ i.enumerable = i.enumerable || !1,
+ i.configurable = !0,
+ "value" in i && (i.writable = !0),
+ Object.defineProperty(t, i.key, i)
+ }
+ }
+ n.r(e),
+ n.d(e, "Client",
+ function() {
+ return r
+ });
+ var r = function() {
+ function t(e) { !
+ function(t, e) {
+ if (! (t instanceof e)) throw new TypeError("Cannot call a class as a function")
+ } (this, t);
+ var n = e.url,
+ i = e.token;
+ this._url = n,
+ this._token = i,
+ this._mode = 1,
+ this._seed = 1,
+ this._queue = [],
+ this.data = {},
+ this.api = {},
+ this._events = {}
+ }
+ return function(t, e, n) {
+ e && i(t.prototype, e),
+ n && i(t, n)
+ } (t, [{
+ key: "headers",
+ value: function() {
+ return {
+ Accept: "application/json",
+ "Content-Type": "application/json",
+ "Remote-Token": this._token
+ }
+ }
+ },
+ {
+ key: "fetch",
+ value: function(t) {
+ function e(e, n) {
+ return t.apply(this, arguments)
+ }
+ return e.toString = function() {
+ return t.toString()
+ },
+ e
+ } (function(t, e) {
+ var n = {
+ credentials: "include",
+ headers: this.headers()
+ };
+ return e && (n.method = "POST", n.body = e),
+ fetch(t, n).then(function(t) {
+ return t.json()
+ })
+ })
+ },
+ {
+ key: "load",
+ value: function(t) {
+ var e = this;
+ return t && (this._url = t),
+ this.fetch(this._url).then(function(t) {
+ return e.parse(t)
+ })
+ }
+ },
+ {
+ key: "parse",
+ value: function(t) {
+ var e = t.key,
+ n = t.websocket;
+ for (var i in e && (this._token = t.key), t.data) this.data[i] = t.data[i];
+ for (var r in t.api) {
+ var a = this.api[r] = {},
+ o = t.api[r];
+ for (var s in o) a[s] = this._wrapper(r + "." + s)
+ }
+ return n && this.connect(),
+ this
+ }
+ },
+ {
+ key: "connect",
+ value: function() {
+ var t = this,
+ e = this._socket;
+ e && (this._socket = null, e.onclose = function() {},
+ e.close()),
+ this._mode = 2,
+ this._socket = function(e, n, i, r) {
+ var a = n;
+ "/" === a[0] && (a = document.location.protocol + "//" + document.location.host + n);
+ var o = -1 != (a = a.replace(/^http(s|):/, "ws$1:")).indexOf("?") ? "&": "?";
+ a = "".concat(a).concat(o, "token=").concat(i, "&ws=1");
+ var s = new WebSocket(a);
+ return s.onclose = function() {
+ return setTimeout(function() {
+ return e.connect()
+ },
+ 2e3)
+ },
+ s.onmessage = function(n) {
+ var i = JSON.parse(n.data);
+ switch (i.action) {
+ case "result":
+ e.result(i.body, []);
+ break;
+ case "event":
+ e.fire(i.body.name, i.body.value);
+ break;
+ case "start":
+ t._mode = 3,
+ t._send(),
+ t._resubscribe();
+ break;
+ default:
+ e.onError(i.data)
+ }
+ },
+ s
+ } (this, this._url, this._token)
+ }
+ },
+ {
+ key: "_wrapper",
+ value: function(t) {
+ return function() {
+ var e = this,
+ n = [].slice.call(arguments),
+ i = null,
+ r = new Promise(function(r, a) {
+ i = {
+ data: {
+ id: e._uid(),
+ name: t,
+ args: n
+ },
+ status: 1,
+ resolve: r,
+ reject: a
+ },
+ e._queue.push(i)
+ });
+ return this.onCall(i, r),
+ 3 === this._mode ? this._send(i) : setTimeout(function() {
+ return e._send()
+ },
+ 1),
+ r
+ }.bind(this)
+ }
+ },
+ {
+ key: "_uid",
+ value: function() {
+ return (this._seed++).toString()
+ }
+ },
+ {
+ key: "_send",
+ value: function(t) {
+ var e = this;
+ if (2 != this._mode) {
+ var n = t ? [t] : this._queue.filter(function(t) {
+ return 1 === t.status
+ });
+ if (n.length) {
+ var i = n.map(function(t) {
+ return t.status = 2,
+ t.data
+ });
+ 3 !== this._mode ? this.fetch(this._url, JSON.stringify(i)).
+ catch(function(t) {
+ return e.onError(t)
+ }).then(function(t) {
+ return e.result(t, i)
+ }) : this._socket.send(JSON.stringify({
+ action: "call",
+ body: i
+ }))
+ }
+ } else setTimeout(function() {
+ return e._send()
+ },
+ 100)
+ }
+ },
+ {
+ key: "result",
+ value: function(t, e) {
+ var n = {};
+ if (t) for (var i = 0; i < t.length; i++) n[t[i].id] = t[i];
+ else for (var r = 0; r < e.length; r++) n[e[r].id] = {
+ id: e[r].id,
+ error: "Network Error",
+ data: null
+ };
+ for (var a = this._queue.length - 1; a >= 0; a--) {
+ var o = this._queue[a],
+ s = n[o.data.id];
+ s && (this.onResponse(o, s), s.error ? o.reject(s.error) : o.resolve(s.data), this._queue.splice(a, 1))
+ }
+ }
+ },
+ {
+ key: "on",
+ value: function(t, e) {
+ var n = this._uid(),
+ i = this._events[t],
+ r = !!i;
+ return r || (i = this._events[t] = []),
+ i.push({
+ id: n,
+ handler: e
+ }),
+ r || 3 != this._mode || this._socket.send(JSON.stringify({
+ action: "subscribe",
+ name: t
+ })),
+ {
+ name: t,
+ id: n
+ }
+ }
+ },
+ {
+ key: "_resubscribe",
+ value: function() {
+ if (3 == this._mode) for (var t in this._events) this._socket.send(JSON.stringify({
+ action: "subscribe",
+ name: t
+ }))
+ }
+ },
+ {
+ key: "detach",
+ value: function(t) {
+ if (t) {
+ var e = t.id,
+ n = t.name,
+ i = this._events[n];
+ if (i) {
+ var r = i.filter(function(t) {
+ return t.id != e
+ });
+ r.length ? this._events[n] = r: (delete this._events[n], 3 == this._mode && this._socket.send(JSON.stringify({
+ action: "unsubscribe",
+ name: n
+ })))
+ }
+ } else {
+ if (3 == this._mode) for (var a in this._events) this._socket.send(JSON.stringify({
+ action: "unsubscribe",
+ key: a
+ }));
+ this._events = {}
+ }
+ }
+ },
+ {
+ key: "fire",
+ value: function(t, e) {
+ var n = this._events[t];
+ if (n) for (var i = 0; i < n.length; i++) n[i].handler(e)
+ }
+ },
+ {
+ key: "onError",
+ value: function(t) {
+ return null
+ }
+ },
+ {
+ key: "onCall",
+ value: function(t, e) {}
+ },
+ {
+ key: "onResponse",
+ value: function(t, e) {}
+ }]),
+ t
+ } ()
+ },
+ function(t, e, n) {
+ var i = n(238);
+ t.exports = {
+ remoteEvents: function(t, e) {
+ var n = this,
+ r = new i.Client({
+ url: t,
+ token: e
+ });
+ r.fetch = function(t, e) {
+ var n = {
+ headers: this.headers()
+ };
+ return e && (n.method = "POST", n.body = e),
+ fetch(t, n).then(function(t) {
+ return t.json()
+ })
+ },
+ this._ready = r.load().then(function(t) {
+ return n._remote = t
+ }),
+ this.ready = function() {
+ return this._ready
+ },
+ this.on = function(t, e) {
+ this.ready().then(function(n) {
+ if ("string" == typeof t) n.on(t, e);
+ else for (var i in t) n.on(i, t[i])
+ })
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = {
+ date_to_str: function(t, e, n) {
+ return function(i) {
+ return t.replace(/%[a-zA-Z]/g,
+ function(t) {
+ switch (t) {
+ case "%d":
+ return e ? n.date.to_fixed(i.getUTCDate()) : n.date.to_fixed(i.getDate());
+ case "%m":
+ return e ? n.date.to_fixed(i.getUTCMonth() + 1) : n.date.to_fixed(i.getMonth() + 1);
+ case "%j":
+ return e ? i.getUTCDate() : i.getDate();
+ case "%n":
+ return e ? i.getUTCMonth() + 1 : i.getMonth() + 1;
+ case "%y":
+ return e ? n.date.to_fixed(i.getUTCFullYear() % 100) : n.date.to_fixed(i.getFullYear() % 100);
+ case "%Y":
+ return e ? i.getUTCFullYear() : i.getFullYear();
+ case "%D":
+ return e ? n.locale.date.day_short[i.getUTCDay()] : n.locale.date.day_short[i.getDay()];
+ case "%l":
+ return e ? n.locale.date.day_full[i.getUTCDay()] : n.locale.date.day_full[i.getDay()];
+ case "%M":
+ return e ? n.locale.date.month_short[i.getUTCMonth()] : n.locale.date.month_short[i.getMonth()];
+ case "%F":
+ return e ? n.locale.date.month_full[i.getUTCMonth()] : n.locale.date.month_full[i.getMonth()];
+ case "%h":
+ return e ? n.date.to_fixed((i.getUTCHours() + 11) % 12 + 1) : n.date.to_fixed((i.getHours() + 11) % 12 + 1);
+ case "%g":
+ return e ? (i.getUTCHours() + 11) % 12 + 1 : (i.getHours() + 11) % 12 + 1;
+ case "%G":
+ return e ? i.getUTCHours() : i.getHours();
+ case "%H":
+ return e ? n.date.to_fixed(i.getUTCHours()) : n.date.to_fixed(i.getHours());
+ case "%i":
+ return e ? n.date.to_fixed(i.getUTCMinutes()) : n.date.to_fixed(i.getMinutes());
+ case "%a":
+ return e ? i.getUTCHours() > 11 ? "pm": "am": i.getHours() > 11 ? "pm": "am";
+ case "%A":
+ return e ? i.getUTCHours() > 11 ? "PM": "AM": i.getHours() > 11 ? "PM": "AM";
+ case "%s":
+ return e ? n.date.to_fixed(i.getUTCSeconds()) : n.date.to_fixed(i.getSeconds());
+ case "%W":
+ return e ? n.date.to_fixed(n.date.getUTCISOWeek(i)) : n.date.to_fixed(n.date.getISOWeek(i));
+ default:
+ return t
+ }
+ })
+ }
+ },
+ str_to_date: function(t, e, n) {
+ return function(i) {
+ for (var r = [0, 0, 1, 0, 0, 0], a = i.match(/[a-zA-Z]+|[0-9]+/g), o = t.match(/%[a-zA-Z]/g), s = 0; s < o.length; s++) switch (o[s]) {
+ case "%j":
+ case "%d":
+ r[2] = a[s] || 1;
+ break;
+ case "%n":
+ case "%m":
+ r[1] = (a[s] || 1) - 1;
+ break;
+ case "%y":
+ r[0] = 1 * a[s] + (a[s] > 50 ? 1900 : 2e3);
+ break;
+ case "%g":
+ case "%G":
+ case "%h":
+ case "%H":
+ r[3] = a[s] || 0;
+ break;
+ case "%i":
+ r[4] = a[s] || 0;
+ break;
+ case "%Y":
+ r[0] = a[s] || 0;
+ break;
+ case "%a":
+ case "%A":
+ r[3] = r[3] % 12 + ("am" === (a[s] || "").toLowerCase() ? 0 : 12);
+ break;
+ case "%s":
+ r[5] = a[s] || 0;
+ break;
+ case "%M":
+ r[1] = n.locale.date.month_short_hash[a[s]] || 0;
+ break;
+ case "%F":
+ r[1] = n.locale.date.month_full_hash[a[s]] || 0
+ }
+ return e ? new Date(Date.UTC(r[0], r[1], r[2], r[3], r[4], r[5])) : new Date(r[0], r[1], r[2], r[3], r[4], r[5])
+ }
+ }
+ };
+ e.
+ default = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = {
+ date_to_str: function(t, e, n) {
+ t = t.replace(/%[a-zA-Z]/g,
+ function(t) {
+ switch (t) {
+ case "%d":
+ return '"+to_fixed(date.get' + (e ? "UTC": "") + 'Date())+"';
+ case "%m":
+ return '"+to_fixed((date.get' + (e ? "UTC": "") + 'Month()+1))+"';
+ case "%j":
+ return '"+date.get' + (e ? "UTC": "") + 'Date()+"';
+ case "%n":
+ return '"+(date.get' + (e ? "UTC": "") + 'Month()+1)+"';
+ case "%y":
+ return '"+to_fixed(date.get' + (e ? "UTC": "") + 'FullYear()%100)+"';
+ case "%Y":
+ return '"+date.get' + (e ? "UTC": "") + 'FullYear()+"';
+ case "%D":
+ return '"+locale.date.day_short[date.get' + (e ? "UTC": "") + 'Day()]+"';
+ case "%l":
+ return '"+locale.date.day_full[date.get' + (e ? "UTC": "") + 'Day()]+"';
+ case "%M":
+ return '"+locale.date.month_short[date.get' + (e ? "UTC": "") + 'Month()]+"';
+ case "%F":
+ return '"+locale.date.month_full[date.get' + (e ? "UTC": "") + 'Month()]+"';
+ case "%h":
+ return '"+to_fixed((date.get' + (e ? "UTC": "") + 'Hours()+11)%12+1)+"';
+ case "%g":
+ return '"+((date.get' + (e ? "UTC": "") + 'Hours()+11)%12+1)+"';
+ case "%G":
+ return '"+date.get' + (e ? "UTC": "") + 'Hours()+"';
+ case "%H":
+ return '"+to_fixed(date.get' + (e ? "UTC": "") + 'Hours())+"';
+ case "%i":
+ return '"+to_fixed(date.get' + (e ? "UTC": "") + 'Minutes())+"';
+ case "%a":
+ return '"+(date.get' + (e ? "UTC": "") + 'Hours()>11?"pm":"am")+"';
+ case "%A":
+ return '"+(date.get' + (e ? "UTC": "") + 'Hours()>11?"PM":"AM")+"';
+ case "%s":
+ return '"+to_fixed(date.get' + (e ? "UTC": "") + 'Seconds())+"';
+ case "%W":
+ return '"+to_fixed(getISOWeek(date))+"';
+ case "%w":
+ return '"+to_fixed(getWeek(date))+"';
+ default:
+ return t
+ }
+ });
+ var i = new Function("date", "to_fixed", "locale", "getISOWeek", "getWeek", 'return "' + t + '";');
+ return function(t) {
+ return i(t, n.date.to_fixed, n.locale, n.date.getISOWeek, n.date.getWeek)
+ }
+ },
+ str_to_date: function(t, e, n) {
+ for (var i = "var temp=date.match(/[a-zA-Z]+|[0-9]+/g);",
+ r = t.match(/%[a-zA-Z]/g), a = 0; a < r.length; a++) switch (r[a]) {
+ case "%j":
+ case "%d":
+ i += "set[2]=temp[" + a + "]||1;";
+ break;
+ case "%n":
+ case "%m":
+ i += "set[1]=(temp[" + a + "]||1)-1;";
+ break;
+ case "%y":
+ i += "set[0]=temp[" + a + "]*1+(temp[" + a + "]>50?1900:2000);";
+ break;
+ case "%g":
+ case "%G":
+ case "%h":
+ case "%H":
+ i += "set[3]=temp[" + a + "]||0;";
+ break;
+ case "%i":
+ i += "set[4]=temp[" + a + "]||0;";
+ break;
+ case "%Y":
+ i += "set[0]=temp[" + a + "]||0;";
+ break;
+ case "%a":
+ case "%A":
+ i += "set[3]=set[3]%12+((temp[" + a + "]||'').toLowerCase()=='am'?0:12);";
+ break;
+ case "%s":
+ i += "set[5]=temp[" + a + "]||0;";
+ break;
+ case "%M":
+ i += "set[1]=locale.date.month_short_hash[temp[" + a + "]]||0;";
+ break;
+ case "%F":
+ i += "set[1]=locale.date.month_full_hash[temp[" + a + "]]||0;"
+ }
+ var o = "set[0],set[1],set[2],set[3],set[4],set[5]";
+ e && (o = " Date.UTC(" + o + ")");
+ var s = new Function("date", "locale", "var set=[0,0,1,0,0,0]; " + i + " return new Date(" + o + ");");
+ return function(t) {
+ return s(t, n.locale)
+ }
+ }
+ };
+ e.
+ default = i
+ },
+ function(t, e, n) {
+ var i = n(241).
+ default,
+ r = n(240).
+ default;
+ t.exports = function(t) {
+ var e = null;
+ function n() {
+ var n = !1;
+ return "auto" === t.config.csp ? (null === e &&
+ function() {
+ try {
+ new Function("canUseCsp = false;")
+ } catch(t) {
+ e = !0
+ }
+ } (), n = e) : n = t.config.csp,
+ n
+ }
+ return {
+ init: function() {
+ for (var e = t.locale,
+ n = e.date.month_short,
+ i = e.date.month_short_hash = {},
+ r = 0; r < n.length; r++) i[n[r]] = r;
+ for (n = e.date.month_full, i = e.date.month_full_hash = {},
+ r = 0; r < n.length; r++) i[n[r]] = r
+ },
+ date_part: function(t) {
+ var e = new Date(t);
+ return t.setHours(0),
+ this.hour_start(t),
+ t.getHours() && (t.getDate() < e.getDate() || t.getMonth() < e.getMonth() || t.getFullYear() < e.getFullYear()) && t.setTime(t.getTime() + 36e5 * (24 - t.getHours())),
+ t
+ },
+ time_part: function(t) {
+ return (t.valueOf() / 1e3 - 60 * t.getTimezoneOffset()) % 86400
+ },
+ week_start: function(e) {
+ var n = e.getDay();
+ return t.config.start_on_monday && (0 === n ? n = 6 : n--),
+ this.date_part(this.add(e, -1 * n, "day"))
+ },
+ month_start: function(t) {
+ return t.setDate(1),
+ this.date_part(t)
+ },
+ quarter_start: function(t) {
+ this.month_start(t);
+ var e, n = t.getMonth();
+ return e = n >= 9 ? 9 : n >= 6 ? 6 : n >= 3 ? 3 : 0,
+ t.setMonth(e),
+ t
+ },
+ year_start: function(t) {
+ return t.setMonth(0),
+ this.month_start(t)
+ },
+ day_start: function(t) {
+ return this.date_part(t)
+ },
+ hour_start: function(t) {
+ return t.getMinutes() && t.setMinutes(0),
+ this.minute_start(t),
+ t
+ },
+ minute_start: function(t) {
+ return t.getSeconds() && t.setSeconds(0),
+ t.getMilliseconds() && t.setMilliseconds(0),
+ t
+ },
+ _add_days: function(t, e, n) {
+ t.setDate(t.getDate() + e);
+ var i = e >= 0,
+ r = !n.getHours() && t.getHours(),
+ a = t.getDate() <= n.getDate() || t.getMonth() < n.getMonth() || t.getFullYear() < n.getFullYear();
+ return i && r && a && t.setTime(t.getTime() + 36e5 * (24 - t.getHours())),
+ e > 1 && r && t.setHours(0),
+ t
+ },
+ add: function(t, e, n) {
+ var i = new Date(t.valueOf());
+ switch (n) {
+ case "day":
+ i = this._add_days(i, e, t);
+ break;
+ case "week":
+ i = this._add_days(i, 7 * e, t);
+ break;
+ case "month":
+ i.setMonth(i.getMonth() + e);
+ break;
+ case "year":
+ i.setYear(i.getFullYear() + e);
+ break;
+ case "hour":
+ i.setTime(i.getTime() + 60 * e * 60 * 1e3);
+ break;
+ case "minute":
+ i.setTime(i.getTime() + 60 * e * 1e3);
+ break;
+ default:
+ return this["add_" + n](t, e, n)
+ }
+ return i
+ },
+ add_quarter: function(t, e) {
+ return this.add(t, 3 * e, "month")
+ },
+ to_fixed: function(t) {
+ return t < 10 ? "0" + t: t
+ },
+ copy: function(t) {
+ return new Date(t.valueOf())
+ },
+ date_to_str: function(e, a) {
+ var o = i;
+ return n() && (o = r),
+ o.date_to_str(e, a, t)
+ },
+ str_to_date: function(e, a) {
+ var o = i;
+ return n() && (o = r),
+ o.str_to_date(e, a, t)
+ },
+ getISOWeek: function(e) {
+ return t.date._getWeekNumber(e, !0)
+ },
+ _getWeekNumber: function(t, e) {
+ if (!t) return ! 1;
+ var n = t.getDay();
+ e && 0 === n && (n = 7);
+ var i = new Date(t.valueOf());
+ i.setDate(t.getDate() + (4 - n));
+ var r = i.getFullYear(),
+ a = Math.round((i.getTime() - new Date(r, 0, 1).getTime()) / 864e5);
+ return 1 + Math.floor(a / 7)
+ },
+ getWeek: function(e) {
+ return t.date._getWeekNumber(e, t.config.start_on_monday)
+ },
+ getUTCISOWeek: function(e) {
+ return t.date.getISOWeek(e)
+ },
+ convert_to_utc: function(t) {
+ return new Date(t.getUTCFullYear(), t.getUTCMonth(), t.getUTCDate(), t.getUTCHours(), t.getUTCMinutes(), t.getUTCSeconds())
+ },
+ parseDate: function(e, n) {
+ return e && !e.getFullYear && ("function" != typeof n && (n = "string" == typeof n ? "parse_date" === n || "xml_date" === n ? t.defined(t.templates.xml_date) ? t.templates.xml_date: t.templates.parse_date: t.defined(t.templates[n]) ? t.templates[n] : t.date.str_to_date(n) : t.defined(t.templates.xml_date) ? t.templates.xml_date: t.templates.parse_date), e = e ? n(e) : null),
+ e
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ e.
+ default = function(t) {
+ if ("string" == typeof t || "number" == typeof t) return t;
+ var e = "";
+ for (var n in t) {
+ var i = "";
+ t.hasOwnProperty(n) && (i = n + "=" + (i = "string" == typeof t[n] ? encodeURIComponent(t[n]) : "number" == typeof t[n] ? t[n] : encodeURIComponent(JSON.stringify(t[n]))), e.length && (i = "&" + i), e += i)
+ }
+ return e
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = n(11),
+ a = n(21),
+ o = n(243).
+ default;
+ function s(t, e) {
+ var n = {
+ method: t
+ };
+ if (0 === e.length) throw new Error("Arguments list of query is wrong.");
+ if (1 === e.length) return "string" == typeof e[0] ? (n.url = e[0], n.async = !0) : (n.url = e[0].url, n.async = e[0].async || !0, n.callback = e[0].callback, n.headers = e[0].headers),
+ e[0].data ? "string" != typeof e[0].data ? n.data = o(e[0].data) : n.data = e[0].data: n.data = "",
+ n;
+ switch (n.url = e[0], t) {
+ case "GET":
+ case "DELETE":
+ n.callback = e[1],
+ n.headers = e[2];
+ break;
+ case "POST":
+ case "PUT":
+ e[1] ? "string" != typeof e[1] ? n.data = o(e[1]) : n.data = e[1] : n.data = "",
+ n.callback = e[2],
+ n.headers = e[3]
+ }
+ return n
+ }
+ t.exports = function(t) {
+ return {
+ cache: !0,
+ method: "get",
+ parse: function(t) {
+ return "string" != typeof t ? t: (t = t.replace(/^[\s]+/, ""), "undefined" == typeof DOMParser || r.isIE ? void 0 !== a.ActiveXObject && ((e = new a.ActiveXObject("Microsoft.XMLDOM")).async = "false", e.loadXML(t)) : e = (new DOMParser).parseFromString(t, "text/xml"), e);
+ var e
+ }, xmltop: function(e, n, i) {
+ if (void 0 === n.status || n.status < 400) {
+ var r = n.responseXML ? n.responseXML || n: this.parse(n.responseText || n);
+ if (r && null !== r.documentElement && !r.getElementsByTagName("parsererror").length) return r.getElementsByTagName(e)[0]
+ }
+ return - 1 !== i && t.callEvent("onLoadXMLError", ["Incorrect XML", arguments[1], i]),
+ document.createElement("DIV")
+ },
+ xpath: function(t, e) {
+ if (e.nodeName || (e = e.responseXML || e), r.isIE) return e.selectNodes(t) || [];
+ for (var n, i = [], a = (e.ownerDocument || e).evaluate(t, e, null, XPathResult.ANY_TYPE, null); n = a.iterateNext();) i.push(n);
+ return i
+ },
+ query: function(t) {
+ return this._call(t.method || "GET", t.url, t.data || "", t.async || !0, t.callback, t.headers)
+ },
+ get: function(t, e, n) {
+ var i = s("GET", arguments);
+ return this.query(i)
+ },
+ getSync: function(t, e) {
+ var n = s("GET", arguments);
+ return n.async = !1,
+ this.query(n)
+ },
+ put: function(t, e, n, i) {
+ var r = s("PUT", arguments);
+ return this.query(r)
+ },
+ del: function(t, e, n) {
+ var i = s("DELETE", arguments);
+ return this.query(i)
+ },
+ post: function(t, e, n, i) {
+ 1 == arguments.length ? e = "": 2 == arguments.length && "function" == typeof e && (e, e = "");
+ var r = s("POST", arguments);
+ return this.query(r)
+ },
+ postSync: function(t, e, n) {
+ e = null === e ? "": String(e);
+ var i = s("POST", arguments);
+ return i.async = !1,
+ this.query(i)
+ },
+ _call: function(e, n, r, o, s, l) {
+ return new t.Promise(function(c, u) {
+ var d = void 0 !== ("undefined" == typeof XMLHttpRequest ? "undefined": i(XMLHttpRequest)) ? new XMLHttpRequest: new a.ActiveXObject("Microsoft.XMLHTTP"),
+ h = null !== navigator.userAgent.match(/AppleWebKit/) && null !== navigator.userAgent.match(/Qt/) && null !== navigator.userAgent.match(/Safari/);
+ o && (d.onreadystatechange = function() {
+ if (4 == d.readyState || h && 3 == d.readyState) {
+ if ((200 != d.status || "" === d.responseText) && !t.callEvent("onAjaxError", [d])) return;
+ setTimeout(function() {
+ "function" == typeof s && s.apply(a, [{
+ xmlDoc: d,
+ filePath: n
+ }]),
+ c(d),
+ "function" == typeof s && (s = null, d = null)
+ },
+ 0)
+ }
+ });
+ var f = !this || !this.cache;
+ if ("GET" == e && f && (n += (n.indexOf("?") >= 0 ? "&": "?") + "dhxr" + (new Date).getTime() + "=1"), d.open(e, n, o), l) for (var _ in l) d.setRequestHeader(_, l[_]);
+ else "POST" == e.toUpperCase() || "PUT" == e || "DELETE" == e ? d.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") : "GET" == e && (r = null);
+ if (d.setRequestHeader("X-Requested-With", "XMLHttpRequest"), d.send(r), !o) return {
+ xmlDoc: d,
+ filePath: n
+ }
+ })
+ },
+ urlSeparator: function(t) {
+ return - 1 != t.indexOf("?") ? "&": "?"
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ t.exports = function() {
+ return {
+ layout: {
+ css: "gantt_container",
+ rows: [{
+ cols: [{
+ view: "grid",
+ scrollX: "scrollHor",
+ scrollY: "scrollVer"
+ },
+ {
+ resizer: !0,
+ width: 1
+ },
+ {
+ view: "timeline",
+ scrollX: "scrollHor",
+ scrollY: "scrollVer"
+ },
+ {
+ view: "scrollbar",
+ id: "scrollVer"
+ }]
+ },
+ {
+ view: "scrollbar",
+ id: "scrollHor",
+ height: 20
+ }]
+ },
+ links: {
+ finish_to_start: "0",
+ start_to_start: "1",
+ finish_to_finish: "2",
+ start_to_finish: "3"
+ },
+ types: {
+ task: "task",
+ project: "project",
+ milestone: "milestone"
+ },
+ auto_types: !1,
+ duration_unit: "day",
+ work_time: !1,
+ correct_work_time: !1,
+ skip_off_time: !1,
+ cascade_delete: !0,
+ autosize: !1,
+ autosize_min_width: 0,
+ autoscroll: !0,
+ autoscroll_speed: 30,
+ deepcopy_on_parse: !1,
+ show_links: !0,
+ show_task_cells: !0,
+ static_background: !1,
+ static_background_cells: !0,
+ branch_loading: !1,
+ branch_loading_property: "$has_child",
+ show_loading: !1,
+ show_chart: !0,
+ show_grid: !0,
+ min_duration: 36e5,
+ date_format: "%d-%m-%Y %H:%i",
+ xml_date: void 0,
+ start_on_monday: !0,
+ server_utc: !1,
+ show_progress: !0,
+ fit_tasks: !1,
+ select_task: !0,
+ scroll_on_click: !0,
+ smart_rendering: !0,
+ preserve_scroll: !0,
+ readonly: !1,
+ container_resize_timeout: 20,
+ date_grid: "%Y-%m-%d",
+ drag_links: !0,
+ drag_progress: !0,
+ drag_resize: !0,
+ drag_project: !1,
+ drag_move: !0,
+ drag_mode: {
+ resize: "resize",
+ progress: "progress",
+ move: "move",
+ ignore: "ignore"
+ },
+ round_dnd_dates: !0,
+ link_wrapper_width: 20,
+ root_id: 0,
+ autofit: !1,
+ columns: [{
+ name: "text",
+ tree: !0,
+ width: "*",
+ resize: !0
+ },
+ {
+ name: "start_date",
+ align: "center",
+ resize: !0
+ },
+ {
+ name: "duration",
+ align: "center"
+ },
+ {
+ name: "add",
+ width: 44
+ }],
+ scale_offset_minimal: !0,
+ inherit_scale_class: !1,
+ scales: [{
+ unit: "day",
+ step: 1,
+ date: "%d %M"
+ }],
+ time_step: 60,
+ duration_step: 1,
+ task_date: "%d %F %Y",
+ time_picker: "%H:%i",
+ task_attribute: "data-task-id",
+ link_attribute: "data-link-id",
+ layer_attribute: "data-layer",
+ buttons_left: ["gantt_save_btn", "gantt_cancel_btn"],
+ _migrate_buttons: {
+ dhx_save_btn: "gantt_save_btn",
+ dhx_cancel_btn: "gantt_cancel_btn",
+ dhx_delete_btn: "gantt_delete_btn"
+ },
+ buttons_right: ["gantt_delete_btn"],
+ lightbox: {
+ sections: [{
+ name: "description",
+ height: 70,
+ map_to: "text",
+ type: "textarea",
+ focus: !0
+ },
+ {
+ name: "time",
+ type: "duration",
+ map_to: "auto"
+ }],
+ project_sections: [{
+ name: "description",
+ height: 70,
+ map_to: "text",
+ type: "textarea",
+ focus: !0
+ },
+ {
+ name: "type",
+ type: "typeselect",
+ map_to: "type"
+ },
+ {
+ name: "time",
+ type: "duration",
+ readonly: !0,
+ map_to: "auto"
+ }],
+ milestone_sections: [{
+ name: "description",
+ height: 70,
+ map_to: "text",
+ type: "textarea",
+ focus: !0
+ },
+ {
+ name: "type",
+ type: "typeselect",
+ map_to: "type"
+ },
+ {
+ name: "time",
+ type: "duration",
+ single_date: !0,
+ map_to: "auto"
+ }]
+ },
+ drag_lightbox: !0,
+ sort: !1,
+ details_on_create: !0,
+ details_on_dblclick: !0,
+ initial_scroll: !0,
+ task_scroll_offset: 100,
+ order_branch: !1,
+ order_branch_free: !1,
+ task_height: void 0,
+ bar_height: "full",
+ min_column_width: 70,
+ min_grid_column_width: 70,
+ grid_resizer_column_attribute: "data-column-index",
+ keep_grid_width: !1,
+ grid_resize: !1,
+ grid_elastic_columns: !1,
+ show_tasks_outside_timescale: !1,
+ show_unscheduled: !0,
+ resize_rows: !1,
+ task_grid_row_resizer_attribute: "data-row-index",
+ min_task_grid_row_height: 30,
+ readonly_property: "readonly",
+ editable_property: "editable",
+ calendar_property: "calendar_id",
+ resource_calendars: {},
+ dynamic_resource_calendars: !1,
+ inherit_calendar: !1,
+ type_renderers: {},
+ open_tree_initially: !1,
+ optimize_render: !0,
+ prevent_default_scroll: !1,
+ show_errors: !0,
+ wai_aria_attributes: !0,
+ smart_scales: !0,
+ rtl: !1,
+ placeholder_task: !1,
+ horizontal_scroll_key: "shiftKey",
+ drag_timeline: {
+ useKey: void 0,
+ ignore: ".gantt_task_line, .gantt_task_link"
+ },
+ drag_multiple: !0,
+ csp: "auto"
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function() {
+ var t = {};
+ return {
+ services: {},
+ setService: function(e, n) {
+ t[e] = n
+ },
+ getService: function(e) {
+ return t[e] ? t[e]() : null
+ },
+ dropService: function(e) {
+ t[e] && delete t[e]
+ },
+ destructor: function() {
+ for (var e in t) if (t[e]) {
+ var n = t[e];
+ n && n.destructor && n.destructor()
+ }
+ t = null
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ return function(t) {
+ var e = this;
+ for (var n in this.addExtension = function(t, n) {
+ e._extensions[t] = n
+ },
+ this.getExtension = function(t) {
+ return e._extensions[t]
+ },
+ this._extensions = {},
+ t) this._extensions[n] = t[n]
+ }
+ } ();
+ e.
+ default = i
+ },
+ function(t, e) {
+ t.exports = {
+ KEY_CODES: {
+ UP: 38,
+ DOWN: 40,
+ LEFT: 37,
+ RIGHT: 39,
+ SPACE: 32,
+ ENTER: 13,
+ DELETE: 46,
+ ESC: 27,
+ TAB: 9
+ }
+ }
+ },
+ function(t, e, n) {
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ t.exports = function(t) {
+ var e = new
+ function() {
+ this.constants = n(248),
+ this.version = "8.0.6",
+ this.license = "gpl",
+ this.templates = {},
+ this.ext = {},
+ this.keys = {
+ edit_save: this.constants.KEY_CODES.ENTER,
+ edit_cancel: this.constants.KEY_CODES.ESC
+ }
+ },
+ r = new(0, n(247).
+ default)(t),
+ a = {};
+ e.plugins = function(t) {
+ for (var n in t) if (t[n] && !a[n]) {
+ var i = r.getExtension(n);
+ i && (i(e), a[n] = !0)
+ }
+ return a
+ },
+ e.$services = n(246)(),
+ e.config = n(245)(),
+ e.ajax = n(244)(e),
+ e.date = n(242)(e),
+ e.RemoteEvents = n(239).remoteEvents;
+ var o = n(237)(e);
+ e.$services.setService("dnd",
+ function() {
+ return o
+ });
+ var s = n(236)(e);
+ e.$services.setService("templateLoader",
+ function() {
+ return s
+ }),
+ n(5)(e);
+ var l = new(n(235));
+ l.registerProvider("global",
+ function() {
+ var t = {
+ min_date: e._min_date,
+ max_date: e._max_date,
+ selected_task: null
+ };
+ return e.$data && e.$data.tasksStore && (t.selected_task = e.$data.tasksStore.getSelectedId()),
+ t
+ }),
+ e.getState = l.getState,
+ e.$services.setService("state",
+ function() {
+ return l
+ });
+ var c = n(0);
+ c.mixin(e, c),
+ e.Promise = n(234),
+ e.env = n(11),
+ n(232)(e);
+ var u = n(226);
+ e.dataProcessor = u.DEPRECATED_api,
+ e.createDataProcessor = u.createDataProcessor,
+ n(221)(e),
+ n(211)(e),
+ n(210)(e),
+ n(202)(e),
+ n(201)(e),
+ n(200)(e),
+ n(187)(e),
+ n(186).
+ default(e),
+ n(185)(e),
+ n(184)(e),
+ n(183)(e),
+ n(180)(e),
+ n(179).
+ default(e);
+ var d = n(178).
+ default();
+ return e.i18n = {
+ addLocale: d.addLocale,
+ setLocale: function(t) {
+ if ("string" == typeof t) {
+ var n = d.getLocale(t);
+ n || (n = d.getLocale("en")),
+ e.locale = n
+ } else if (t) if (e.locale) for (var r in t) t[r] && "object" === i(t[r]) ? (e.locale[r] || (e.locale[r] = {}), e.mixin(e.locale[r], t[r], !0)) : e.locale[r] = t[r];
+ else e.locale = t
+ },
+ getLocale: d.getLocale
+ },
+ e.i18n.setLocale("en"),
+ e
+ }
+ },
+ function(t, e, n) {
+ n(35);
+ var i = n(249);
+ t.exports = function(t) {
+ var e = i(t);
+ return e.env.isNode || n(144)(e),
+ e
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = 100,
+ r = function() {
+ function t(t) {
+ var e = this;
+ this.maxSteps = i,
+ this.undoEnabled = !0,
+ this.redoEnabled = !0,
+ this.action = {
+ create: function(t) {
+ return {
+ commands: t ? t.slice() : []
+ }
+ },
+ invert: function(t) {
+ for (var n, i = e._gantt.copy(t), r = e.command, a = 0; a < t.commands.length; a++) {
+ var o = i.commands[a] = r.invert(i.commands[a]);
+ o.type !== r.type.update && o.type !== r.type.move || (n = [o.oldValue, o.value], o.value = n[0], o.oldValue = n[1])
+ }
+ return i
+ }
+ },
+ this.command = {
+ entity: null,
+ type: null,
+ create: function(t, n, i, r) {
+ var a = e._gantt;
+ return {
+ entity: r,
+ type: i,
+ value: a.copy(t),
+ oldValue: a.copy(n || t)
+ }
+ },
+ invert: function(t) {
+ var n = e._gantt.copy(t);
+ return n.type = e.command.inverseCommands(t.type),
+ n
+ },
+ inverseCommands: function(t) {
+ var n = e._gantt,
+ i = e.command.type;
+ switch (t) {
+ case i.update:
+ return i.update;
+ case i.remove:
+ return i.add;
+ case i.add:
+ return i.remove;
+ case i.move:
+ return i.move;
+ default:
+ return n.assert(!1, "Invalid command " + t),
+ null
+ }
+ }
+ },
+ this._undoStack = [],
+ this._redoStack = [],
+ this._gantt = t
+ }
+ return t.prototype.getUndoStack = function() {
+ return this._undoStack
+ },
+ t.prototype.setUndoStack = function(t) {
+ this._undoStack = t
+ },
+ t.prototype.getRedoStack = function() {
+ return this._redoStack
+ },
+ t.prototype.setRedoStack = function(t) {
+ this._redoStack = t
+ },
+ t.prototype.clearUndoStack = function() {
+ this._undoStack = []
+ },
+ t.prototype.clearRedoStack = function() {
+ this._redoStack = []
+ },
+ t.prototype.updateConfigs = function() {
+ var t = this._gantt;
+ this.maxSteps = t.config.undo_steps || i,
+ this.command.entity = t.config.undo_types,
+ this.command.type = t.config.undo_actions,
+ this.undoEnabled = !!t.config.undo,
+ this.redoEnabled = !!t.config.redo
+ },
+ t.prototype.undo = function() {
+ var t = this._gantt;
+ if (this.updateConfigs(), this.undoEnabled) {
+ var e = this._pop(this._undoStack);
+ if (e && this._reorderCommands(e), !1 !== t.callEvent("onBeforeUndo", [e]) && e) return this._applyAction(this.action.invert(e)),
+ this._push(this._redoStack, t.copy(e)),
+ void t.callEvent("onAfterUndo", [e]);
+ t.callEvent("onAfterUndo", [null])
+ }
+ },
+ t.prototype.redo = function() {
+ var t = this._gantt;
+ if (this.updateConfigs(), this.redoEnabled) {
+ var e = this._pop(this._redoStack);
+ if (e && this._reorderCommands(e), !1 !== t.callEvent("onBeforeRedo", [e]) && e) return this._applyAction(e),
+ this._push(this._undoStack, t.copy(e)),
+ void t.callEvent("onAfterRedo", [e]);
+ t.callEvent("onAfterRedo", [null])
+ }
+ },
+ t.prototype.logAction = function(t) {
+ this._push(this._undoStack, t),
+ this._redoStack = []
+ },
+ t.prototype._push = function(t, e) {
+ var n = this._gantt;
+ if (e.commands.length) {
+ var i = t === this._undoStack ? "onBeforeUndoStack": "onBeforeRedoStack";
+ if (!1 !== n.callEvent(i, [e]) && e.commands.length) {
+ for (t.push(e); t.length > this.maxSteps;) t.shift();
+ return e
+ }
+ }
+ },
+ t.prototype._pop = function(t) {
+ return t.pop()
+ },
+ t.prototype._reorderCommands = function(t) {
+ var e = {
+ any: 0,
+ link: 1,
+ task: 2
+ },
+ n = {
+ move: 1,
+ any: 0
+ };
+ t.commands.sort(function(t, i) {
+ if ("task" === t.entity && "task" === i.entity) return t.type !== i.type ? (n[i.type] || 0) - (n[t.type] || 0) : "move" === t.type && t.oldValue && i.oldValue && i.oldValue.parent === t.oldValue.parent ? t.oldValue.$index - i.oldValue.$index: 0;
+ var r = e[t.entity] || e.any;
+ return (e[i.entity] || e.any) - r
+ })
+ },
+ t.prototype._applyAction = function(t) {
+ var e = null,
+ n = this.command.entity,
+ i = this.command.type,
+ r = this._gantt,
+ a = {};
+ a[n.task] = {
+ add: "addTask",
+ get: "getTask",
+ update: "updateTask",
+ remove: "deleteTask",
+ move: "moveTask",
+ isExists: "isTaskExists"
+ },
+ a[n.link] = {
+ add: "addLink",
+ get: "getLink",
+ update: "updateLink",
+ remove: "deleteLink",
+ isExists: "isLinkExists"
+ },
+ r.batchUpdate(function() {
+ for (var n = 0; n < t.commands.length; n++) {
+ e = t.commands[n];
+ var o = a[e.entity][e.type],
+ s = a[e.entity].get,
+ l = a[e.entity].isExists;
+ if (e.type === i.add) r[o](e.oldValue, e.oldValue.parent, e.oldValue.$local_index);
+ else if (e.type === i.remove) r[l](e.value.id) && r[o](e.value.id);
+ else if (e.type === i.update) {
+ var c = r[s](e.value.id);
+ for (var u in e.value) u.startsWith("$") || u.startsWith("_") || (c[u] = e.value[u]);
+ r[o](e.value.id)
+ } else e.type === i.move && (r[o](e.value.id, e.value.$local_index, e.value.parent), r.callEvent("onRowDragEnd", [e.value.id]))
+ }
+ })
+ },
+ t
+ } ();
+ e.Undo = r
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = {
+ onBeforeUndo: "onAfterUndo",
+ onBeforeRedo: "onAfterRedo"
+ },
+ r = ["onTaskDragStart", "onAfterTaskUpdate", "onAfterTaskDelete", "onBeforeBatchUpdate"],
+ a = function() {
+ function t(t, e) {
+ this._batchAction = null,
+ this._batchMode = !1,
+ this._ignore = !1,
+ this._ignoreMoveEvents = !1,
+ this._initialTasks = {},
+ this._initialLinks = {},
+ this._nestedTasks = {},
+ this._nestedLinks = {},
+ this._undo = t,
+ this._gantt = e,
+ this._attachEvents()
+ }
+ return t.prototype.store = function(t, e, n) {
+ return void 0 === n && (n = !1),
+ e === this._gantt.config.undo_types.task ? this._storeTask(t, n) : e === this._gantt.config.undo_types.link && this._storeLink(t, n)
+ },
+ t.prototype.isMoveEventsIgnored = function() {
+ return this._ignoreMoveEvents
+ },
+ t.prototype.toggleIgnoreMoveEvents = function(t) {
+ this._ignoreMoveEvents = t || !1
+ },
+ t.prototype.startIgnore = function() {
+ this._ignore = !0
+ },
+ t.prototype.stopIgnore = function() {
+ this._ignore = !1
+ },
+ t.prototype.startBatchAction = function() {
+ var t = this;
+ this._timeout || (this._timeout = setTimeout(function() {
+ t.stopBatchAction(),
+ t._timeout = null
+ },
+ 10)),
+ this._ignore || this._batchMode || (this._batchMode = !0, this._batchAction = this._undo.action.create())
+ },
+ t.prototype.stopBatchAction = function() {
+ if (!this._ignore) {
+ var t = this._undo;
+ this._batchAction && t.logAction(this._batchAction),
+ this._batchMode = !1,
+ this._batchAction = null
+ }
+ },
+ t.prototype.onTaskAdded = function(t) {
+ this._ignore || this._storeTaskCommand(t, this._undo.command.type.add)
+ },
+ t.prototype.onTaskUpdated = function(t) {
+ this._ignore || this._storeTaskCommand(t, this._undo.command.type.update)
+ },
+ t.prototype.onTaskMoved = function(t) {
+ if (!this._ignore) {
+ t.$local_index = this._gantt.getTaskIndex(t.id);
+ var e = this.getInitialTask(t.id);
+ if (t.$local_index === e.$local_index && this._gantt.getParent(t) === this._gantt.getParent(e)) return;
+ this._storeEntityCommand(t, this.getInitialTask(t.id), this._undo.command.type.move, this._undo.command.entity.task)
+ }
+ },
+ t.prototype.onTaskDeleted = function(t) {
+ if (!this._ignore) {
+ if (this._storeTaskCommand(t, this._undo.command.type.remove), this._nestedTasks[t.id]) for (var e = this._nestedTasks[t.id], n = 0; n < e.length; n++) this._storeTaskCommand(e[n], this._undo.command.type.remove);
+ if (this._nestedLinks[t.id]) {
+ var i = this._nestedLinks[t.id];
+ for (n = 0; n < i.length; n++) this._storeLinkCommand(i[n], this._undo.command.type.remove)
+ }
+ }
+ },
+ t.prototype.onLinkAdded = function(t) {
+ this._ignore || this._storeLinkCommand(t, this._undo.command.type.add)
+ },
+ t.prototype.onLinkUpdated = function(t) {
+ this._ignore || this._storeLinkCommand(t, this._undo.command.type.update)
+ },
+ t.prototype.onLinkDeleted = function(t) {
+ this._ignore || this._storeLinkCommand(t, this._undo.command.type.remove)
+ },
+ t.prototype.setNestedTasks = function(t, e) {
+ for (var n = this._gantt,
+ i = null,
+ r = [], a = this._getLinks(n.getTask(t)), o = 0; o < e.length; o++) i = this.setInitialTask(e[o]),
+ a = a.concat(this._getLinks(i)),
+ r.push(i);
+ var s = {};
+ for (o = 0; o < a.length; o++) s[a[o]] = !0;
+ var l = [];
+ for (var o in s) l.push(this.setInitialLink(o));
+ this._nestedTasks[t] = r,
+ this._nestedLinks[t] = l
+ },
+ t.prototype.setInitialTask = function(t, e) {
+ var n = this._gantt;
+ if (e || !this._initialTasks[t] || !this._batchMode) {
+ var i = n.copy(n.getTask(t));
+ i.$index = n.getGlobalTaskIndex(t),
+ i.$local_index = n.getTaskIndex(t),
+ this.setInitialTaskObject(t, i)
+ }
+ return this._initialTasks[t]
+ },
+ t.prototype.getInitialTask = function(t) {
+ return this._initialTasks[t]
+ },
+ t.prototype.clearInitialTasks = function() {
+ this._initialTasks = {}
+ },
+ t.prototype.setInitialTaskObject = function(t, e) {
+ this._initialTasks[t] = e
+ },
+ t.prototype.setInitialLink = function(t, e) {
+ return this._initialLinks[t] && this._batchMode || (this._initialLinks[t] = this._gantt.copy(this._gantt.getLink(t))),
+ this._initialLinks[t]
+ },
+ t.prototype.getInitialLink = function(t) {
+ return this._initialLinks[t]
+ },
+ t.prototype.clearInitialLinks = function() {
+ this._initialLinks = {}
+ },
+ t.prototype._attachEvents = function() {
+ var t = this,
+ e = null,
+ n = this._gantt,
+ a = function() {
+ e || (e = setTimeout(function() {
+ e = null
+ }), t.clearInitialTasks(), n.eachTask(function(e) {
+ t.setInitialTask(e.id)
+ }), t.clearInitialLinks(), n.getLinks().forEach(function(e) {
+ t.setInitialLink(e.id)
+ }))
+ },
+ o = function(t) {
+ return n.copy(n.getTask(t))
+ };
+ for (var s in i) n.attachEvent(s,
+ function() {
+ return t.startIgnore(),
+ !0
+ }),
+ n.attachEvent(i[s],
+ function() {
+ return t.stopIgnore(),
+ !0
+ });
+ for (s = 0; s < r.length; s++) n.attachEvent(r[s],
+ function() {
+ return t.startBatchAction(),
+ !0
+ });
+ n.attachEvent("onParse",
+ function() {
+ t._undo.clearUndoStack(),
+ t._undo.clearRedoStack(),
+ a()
+ }),
+ n.attachEvent("onAfterTaskAdd",
+ function(e, n) {
+ t.setInitialTask(e, !0),
+ t.onTaskAdded(n)
+ }),
+ n.attachEvent("onAfterTaskUpdate",
+ function(e, n) {
+ t.onTaskUpdated(n)
+ }),
+ n.attachEvent("onAfterTaskDelete",
+ function(e, n) {
+ t.onTaskDeleted(n)
+ }),
+ n.attachEvent("onAfterLinkAdd",
+ function(e, n) {
+ t.setInitialLink(e, !0),
+ t.onLinkAdded(n)
+ }),
+ n.attachEvent("onAfterLinkUpdate",
+ function(e, n) {
+ t.onLinkUpdated(n)
+ }),
+ n.attachEvent("onAfterLinkDelete",
+ function(e, n) {
+ t.onLinkDeleted(n)
+ }),
+ n.attachEvent("onRowDragEnd",
+ function(e, n) {
+ return t.onTaskMoved(o(e)),
+ t.toggleIgnoreMoveEvents(),
+ !0
+ }),
+ n.attachEvent("onBeforeTaskDelete",
+ function(e) {
+ t.store(e, n.config.undo_types.task);
+ var i = [];
+ return a(),
+ n.eachTask(function(t) {
+ i.push(t.id)
+ },
+ e),
+ t.setNestedTasks(e, i),
+ !0
+ });
+ var l = n.getDatastore("task");
+ l.attachEvent("onBeforeItemMove",
+ function(e, n, i) {
+ return t.isMoveEventsIgnored() || a(),
+ !0
+ }),
+ l.attachEvent("onAfterItemMove",
+ function(e, n, i) {
+ return t.isMoveEventsIgnored() || t.onTaskMoved(o(e)),
+ !0
+ }),
+ n.attachEvent("onRowDragStart",
+ function(e, n, i) {
+ return t.toggleIgnoreMoveEvents(!0),
+ a(),
+ !0
+ }),
+ n.attachEvent("onBeforeTaskDrag",
+ function(e) {
+ return t.store(e, n.config.undo_types.task)
+ }),
+ n.attachEvent("onLightbox",
+ function(e) {
+ return t.store(e, n.config.undo_types.task)
+ }),
+ n.attachEvent("onBeforeTaskAutoSchedule",
+ function(e) {
+ return t.store(e.id, n.config.undo_types.task),
+ !0
+ }),
+ n.ext.inlineEditors && n.ext.inlineEditors.attachEvent("onEditStart",
+ function(e) {
+ t.store(e.id, n.config.undo_types.task)
+ })
+ },
+ t.prototype._storeCommand = function(t) {
+ var e = this._undo;
+ if (e.updateConfigs(), e.undoEnabled) if (this._batchMode) this._batchAction.commands.push(t);
+ else {
+ var n = e.action.create([t]);
+ e.logAction(n)
+ }
+ },
+ t.prototype._storeEntityCommand = function(t, e, n, i) {
+ var r = this._undo.command.create(t, e, n, i);
+ this._storeCommand(r)
+ },
+ t.prototype._storeTaskCommand = function(t, e) {
+ this._gantt.isTaskExists(t.id) && (t.$local_index = this._gantt.getTaskIndex(t.id)),
+ this._storeEntityCommand(t, this.getInitialTask(t.id), e, this._undo.command.entity.task)
+ },
+ t.prototype._storeLinkCommand = function(t, e) {
+ this._storeEntityCommand(t, this.getInitialLink(t.id), e, this._undo.command.entity.link)
+ },
+ t.prototype._getLinks = function(t) {
+ return t.$source.concat(t.$target)
+ },
+ t.prototype._storeTask = function(t, e) {
+ var n = this;
+ void 0 === e && (e = !1);
+ var i = this._gantt;
+ return this.setInitialTask(t, e),
+ i.eachTask(function(t) {
+ n.setInitialTask(t.id)
+ },
+ t),
+ !0
+ },
+ t.prototype._storeLink = function(t, e) {
+ return void 0 === e && (e = !1),
+ this.setInitialLink(t, e),
+ !0
+ },
+ t
+ } ();
+ e.Monitor = a
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(252),
+ r = n(251);
+ e.
+ default = function(t) {
+ var e = new r.Undo(t),
+ n = new i.Monitor(e, t);
+ function a(t, e, n) {
+ t && (t.id === e && (t.id = n), t.parent === e && (t.parent = n))
+ }
+ function o(t, e, n) {
+ a(t.value, e, n),
+ a(t.oldValue, e, n)
+ }
+ function s(t, e, n) {
+ t && (t.source === e && (t.source = n), t.target === e && (t.target = n))
+ }
+ function l(t, e, n) {
+ s(t.value, e, n),
+ s(t.oldValue, e, n)
+ }
+ function c(t, n, i) {
+ for (var r = e,
+ a = 0; a < t.length; a++) for (var s = t[a], c = 0; c < s.commands.length; c++) s.commands[c].entity === r.command.entity.task ? o(s.commands[c], n, i) : s.commands[c].entity === r.command.entity.link && l(s.commands[c], n, i)
+ }
+ function u(t, n, i) {
+ for (var r = e,
+ a = 0; a < t.length; a++) for (var o = t[a], s = 0; s < o.commands.length; s++) {
+ var l = o.commands[s];
+ l.entity === r.command.entity.link && (l.value && l.value.id === n && (l.value.id = i), l.oldValue && l.oldValue.id === n && (l.oldValue.id = i))
+ }
+ }
+ t.config.undo = !0,
+ t.config.redo = !0,
+ t.config.undo_types = {
+ link: "link",
+ task: "task"
+ },
+ t.config.undo_actions = {
+ update: "update",
+ remove: "remove",
+ add: "add",
+ move: "move"
+ },
+ t.ext || (t.ext = {}),
+ t.ext.undo = {
+ undo: function() {
+ return e.undo()
+ },
+ redo: function() {
+ return e.redo()
+ },
+ getUndoStack: function() {
+ return e.getUndoStack()
+ },
+ setUndoStack: function(t) {
+ return e.setUndoStack(t)
+ },
+ getRedoStack: function() {
+ return e.getRedoStack()
+ },
+ setRedoStack: function(t) {
+ return e.setRedoStack(t)
+ },
+ clearUndoStack: function() {
+ return e.clearUndoStack()
+ },
+ clearRedoStack: function() {
+ return e.clearRedoStack()
+ },
+ saveState: function(t, e) {
+ return n.store(t, e, !0)
+ },
+ getInitialState: function(e, i) {
+ return i === t.config.undo_types.link ? n.getInitialLink(e) : n.getInitialTask(e)
+ }
+ },
+ t.undo = t.ext.undo.undo,
+ t.redo = t.ext.undo.redo,
+ t.getUndoStack = t.ext.undo.getUndoStack,
+ t.getRedoStack = t.ext.undo.getRedoStack,
+ t.clearUndoStack = t.ext.undo.clearUndoStack,
+ t.clearRedoStack = t.ext.undo.clearRedoStack,
+ t.attachEvent("onTaskIdChange",
+ function(t, n) {
+ var i = e;
+ c(i.getUndoStack(), t, n),
+ c(i.getRedoStack(), t, n)
+ }),
+ t.attachEvent("onLinkIdChange",
+ function(t, n) {
+ var i = e;
+ u(i.getUndoStack(), t, n),
+ u(i.getRedoStack(), t, n)
+ }),
+ t.attachEvent("onGanttReady",
+ function() {
+ e.updateConfigs()
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(1),
+ r = function() {
+ function t(t) {
+ this._gantt = t
+ }
+ return t.prototype.getNode = function() {
+ var t = this._gantt;
+ return this._tooltipNode || (this._tooltipNode = document.createElement("div"), this._tooltipNode.className = "gantt_tooltip", t._waiAria.tooltipAttr(this._tooltipNode)),
+ this._tooltipNode
+ },
+ t.prototype.setViewport = function(t) {
+ return this._root = t,
+ this
+ },
+ t.prototype.show = function(t, e) {
+ var n = this._gantt,
+ r = document.body,
+ a = this.getNode();
+ if (i.isChildOf(a, r) || (this.hide(), r.appendChild(a)), this._isLikeMouseEvent(t)) {
+ var o = this._calculateTooltipPosition(t);
+ e = o.top,
+ t = o.left
+ }
+ return a.style.top = e + "px",
+ a.style.left = t + "px",
+ n._waiAria.tooltipVisibleAttr(a),
+ this
+ },
+ t.prototype.hide = function() {
+ var t = this._gantt,
+ e = this.getNode();
+ return e && e.parentNode && e.parentNode.removeChild(e),
+ t._waiAria.tooltipHiddenAttr(e),
+ this
+ },
+ t.prototype.setContent = function(t) {
+ return this.getNode().innerHTML = t,
+ this
+ },
+ t.prototype._isLikeMouseEvent = function(t) {
+ return ! (!t || "object" != typeof t) && ("clientX" in t && "clientY" in t)
+ },
+ t.prototype._getViewPort = function() {
+ return this._root || document.body
+ },
+ t.prototype._calculateTooltipPosition = function(t) {
+ var e = this._gantt,
+ n = this._getViewPortSize(),
+ r = this.getNode(),
+ a = {
+ top: 0,
+ left: 0,
+ width: r.offsetWidth,
+ height: r.offsetHeight,
+ bottom: 0,
+ right: 0
+ },
+ o = e.config.tooltip_offset_x,
+ s = e.config.tooltip_offset_y,
+ l = document.body,
+ c = i.getRelativeEventPosition(t, l),
+ u = i.getNodePosition(l);
+ c.y += u.y,
+ a.top = c.y,
+ a.left = c.x,
+ a.top += s,
+ a.left += o,
+ a.bottom = a.top + a.height,
+ a.right = a.left + a.width;
+ var d = window.scrollY + l.scrollTop;
+ return a.top < n.top - d ? (a.top = n.top, a.bottom = a.top + a.height) : a.bottom > n.bottom && (a.bottom = n.bottom, a.top = a.bottom - a.height),
+ a.left < n.left ? (a.left = n.left, a.right = n.left + a.width) : a.right > n.right && (a.right = n.right, a.left = a.right - a.width),
+ c.x >= a.left && c.x <= a.right && (a.left = c.x - a.width - o, a.right = a.left + a.width),
+ c.y >= a.top && c.y <= a.bottom && (a.top = c.y - a.height - s, a.bottom = a.top + a.height),
+ a
+ },
+ t.prototype._getViewPortSize = function() {
+ var t, e = this._gantt,
+ n = this._getViewPort(),
+ r = n,
+ a = window.scrollY + document.body.scrollTop,
+ o = window.scrollX + document.body.scrollLeft;
+ return n === e.$task_data ? (r = e.$task, a = 0, o = 0, t = i.getNodePosition(e.$task)) : t = i.getNodePosition(r),
+ {
+ left: t.x + o,
+ top: t.y + a,
+ width: t.width,
+ height: t.height,
+ bottom: t.y + t.height + a,
+ right: t.x + t.width + o
+ }
+ },
+ t
+ } ();
+ e.Tooltip = r
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(51),
+ r = n(1),
+ a = n(2),
+ o = n(254),
+ s = function() {
+ function t(t) {
+ this._listeners = {},
+ this.tooltip = new o.Tooltip(t),
+ this._gantt = t,
+ this._domEvents = i(),
+ this._initDelayedFunctions()
+ }
+ return t.prototype.destructor = function() {
+ this.tooltip.hide(),
+ this._domEvents.detachAll()
+ },
+ t.prototype.hideTooltip = function() {
+ this.delayHide()
+ },
+ t.prototype.attach = function(t) {
+ var e = this,
+ n = document.body,
+ i = this._gantt;
+ t.global || (n = i.$root);
+ var a = null,
+ o = function(n) {
+ var i = r.getTargetNode(n),
+ o = r.closest(i, t.selector);
+ if (!r.isChildOf(i, e.tooltip.getNode())) {
+ var s = function() {
+ a = o,
+ t.onmouseenter(n, o)
+ };
+ a ? o && o === a ? t.onmousemove(n, o) : (t.onmouseleave(n, a), a = null, o && o !== a && s()) : o && s()
+ }
+ };
+ this.detach(t.selector),
+ this._domEvents.attach(n, "mousemove", o),
+ this._listeners[t.selector] = {
+ node: n,
+ handler: o
+ }
+ },
+ t.prototype.detach = function(t) {
+ var e = this._listeners[t];
+ e && this._domEvents.detach(e.node, "mousemove", e.handler)
+ },
+ t.prototype.tooltipFor = function(t) {
+ var e = this,
+ n = function(t) {
+ var e = t;
+ return document.createEventObject && !document.createEvent && (e = document.createEventObject(t)),
+ e
+ };
+ this._initDelayedFunctions(),
+ this.attach({
+ selector: t.selector,
+ global: t.global,
+ onmouseenter: function(i, r) {
+ var a = t.html(i, r);
+ a && e.delayShow(n(i), a)
+ },
+ onmousemove: function(i, r) {
+ var a = t.html(i, r);
+ a ? e.delayShow(n(i), a) : (e.delayShow.$cancelTimeout(), e.delayHide())
+ },
+ onmouseleave: function() {
+ e.delayShow.$cancelTimeout(),
+ e.delayHide()
+ }
+ })
+ },
+ t.prototype._initDelayedFunctions = function() {
+ var t = this,
+ e = this._gantt;
+ this.delayShow && this.delayShow.$cancelTimeout(),
+ this.delayHide && this.delayHide.$cancelTimeout(),
+ this.tooltip.hide(),
+ this.delayShow = a.delay(function(n, i) { ! 1 === e.callEvent("onBeforeTooltip", [n]) ? t.tooltip.hide() : (t.tooltip.setContent(i), t.tooltip.show(n))
+ },
+ e.config.tooltip_timeout || 1),
+ this.delayHide = a.delay(function() {
+ t.delayShow.$cancelTimeout(),
+ t.tooltip.hide()
+ },
+ e.config.tooltip_hide_timeout || 1)
+ },
+ t
+ } ();
+ e.TooltipManager = s
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(255);
+ e.
+ default = function(t) {
+ t.config.tooltip_timeout = 30,
+ t.config.tooltip_offset_y = 20,
+ t.config.tooltip_offset_x = 10,
+ t.config.tooltip_hide_timeout = 30;
+ var e = new i.TooltipManager(t);
+ t.ext.tooltips = e,
+ t.attachEvent("onGanttReady",
+ function() {
+ e.tooltipFor({
+ selector: "[" + t.config.task_attribute + "]:not(.gantt_task_row)",
+ html: function(e) {
+ if (!t.config.touch || t.config.touch_tooltip) {
+ var n = t.locate(e);
+ if (t.isTaskExists(n)) {
+ var i = t.getTask(n);
+ return t.templates.tooltip_text(i.start_date, i.end_date, i)
+ }
+ return null
+ }
+ },
+ global: !1
+ })
+ }),
+ t.attachEvent("onDestroy",
+ function() {
+ e.destructor()
+ }),
+ t.attachEvent("onLightbox",
+ function() {
+ e.hideTooltip()
+ }),
+ t.attachEvent("onBeforeTooltip",
+ function() {
+ if (t.getState().link_source_id) return ! 1
+ }),
+ t.attachEvent("onGanttScroll",
+ function() {
+ e.hideTooltip()
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t(t) {
+ var e = this;
+ this.show = function(t, n) {
+ void 0 === n ? e._showForTask(t) : e._showAtCoordinates(t, n)
+ },
+ this.hide = function(t) {
+ var n = e._gantt,
+ i = e._quickInfoBox;
+ e._quickInfoBoxId = 0;
+ var r = e._quickInfoTask;
+ if (e._quickInfoTask = null, i && i.parentNode) {
+ if (n.config.quick_info_detached) return n.callEvent("onAfterQuickInfo", [r]),
+ i.parentNode.removeChild(i);
+ i.className += " gantt_qi_hidden",
+ "auto" === i.style.right ? i.style.left = "-350px": i.style.right = "-350px",
+ t && (i.style.left = i.style.right = "", i.parentNode.removeChild(i)),
+ n.callEvent("onAfterQuickInfo", [r])
+ }
+ },
+ this.getNode = function() {
+ return e._quickInfoBox ? e._quickInfoBox: null
+ },
+ this.setContainer = function(t) {
+ t && (e._container = "string" == typeof t ? document.getElementById(t) : t)
+ },
+ this.setContent = function(t) {
+ var n = e._gantt,
+ i = {
+ taskId: null,
+ header: {
+ title: "",
+ date: ""
+ },
+ content: "",
+ buttons: n.config.quickinfo_buttons
+ };
+ t || (t = i),
+ t.taskId || (t.taskId = i.taskId),
+ t.header || (t.header = i.header),
+ t.header.title || (t.header.title = i.header.title),
+ t.header.date || (t.header.date = i.header.date),
+ t.content || (t.content = i.content),
+ t.buttons || (t.buttons = i.buttons);
+ var r = e.getNode();
+ r || (r = e._createQuickInfoElement()),
+ t.taskId && (e._quickInfoBoxId = t.taskId);
+ var a = r.querySelector(".gantt_cal_qi_title"),
+ o = a.querySelector(".gantt_cal_qi_tcontent"),
+ s = a.querySelector(".gantt_cal_qi_tdate"),
+ l = r.querySelector(".gantt_cal_qi_content"),
+ c = r.querySelector(".gantt_cal_qi_controls");
+ n._waiAria.quickInfoHeader(r, [t.header.title, t.header.date].join(" ")),
+ o.innerHTML = t.header.title,
+ s.innerHTML = t.header.date,
+ t.header.title || t.header.date ? a.style.display = "": a.style.display = "none",
+ l.innerHTML = t.content;
+ var u = t.buttons;
+ u.length ? c.style.display = "": c.style.display = "none";
+ for (var d = "",
+ h = 0; h < u.length; h++) {
+ var f = n._waiAria.quickInfoButtonAttrString(n.locale.labels[u[h]]);
+ d += '<div class="gantt_qi_big_icon ' + u[h] + '" title="' + n.locale.labels[u[h]] + '" ' + f + "><div class='gantt_menu_icon " + u[h] + "'></div><div>" + n.locale.labels[u[h]] + "</div></div>"
+ }
+ c.innerHTML = d,
+ n.eventRemove(r, "click", e._qiButtonClickHandler),
+ n.eventRemove(r, "keypress", e._qiKeyPressHandler),
+ n.event(r, "click", e._qiButtonClickHandler),
+ n.event(r, "keypress", e._qiKeyPressHandler)
+ },
+ this._qiButtonClickHandler = function(t) {
+ t = t || event,
+ e._qi_button_click(t.target || t.srcElement)
+ },
+ this._qiKeyPressHandler = function(t) {
+ var n = (t = t || event).which || event.keyCode;
+ 13 !== n && 32 !== n || setTimeout(function() {
+ e._qi_button_click(t.target || t.srcElement)
+ },
+ 1)
+ },
+ this._gantt = t
+ }
+ return t.prototype._showAtCoordinates = function(t, e) {
+ this.hide(!0),
+ this._quickInfoBoxId = 0,
+ this._quickInfoTask = null,
+ this._quickInfoBox || (this._createQuickInfoElement(), this.setContent()),
+ this._appendAtCoordinates(t, e),
+ this._gantt.callEvent("onQuickInfo", [null])
+ },
+ t.prototype._showForTask = function(t) {
+ var e = this._gantt;
+ if ((t !== this._quickInfoBoxId || !e.utils.dom.isChildOf(this._quickInfoBox, document.body)) && e.config.show_quick_info) {
+ this.hide(!0);
+ var n = this._getContainer(),
+ i = this._get_event_counter_part(t, 6, n.xViewport, n.yViewport);
+ i && (this._quickInfoBox = this._init_quick_info(t), this._quickInfoTask = t, this._quickInfoBox.className = this._prepare_quick_info_classname(t), this._fill_quick_data(t), this._show_quick_info(i, 6), e.callEvent("onQuickInfo", [t]))
+ }
+ },
+ t.prototype._get_event_counter_part = function(t, e, n, i) {
+ var r = this._gantt,
+ a = r.getTaskNode(t);
+ if (!a && !(a = r.getTaskRowNode(t))) return null;
+ var o = 0,
+ s = e + a.offsetTop + a.offsetHeight,
+ l = a;
+ if (r.utils.dom.isChildOf(l, n)) for (; l && l !== n;) o += l.offsetLeft,
+ l = l.offsetParent;
+ var c = r.getScrollState();
+ return l ? {
+ left: o,
+ top: s,
+ dx: o + a.offsetWidth / 2 - c.x > n.offsetWidth / 2 ? 1 : 0,
+ dy: s + a.offsetHeight / 2 - c.y > i.offsetHeight / 2 ? 1 : 0,
+ width: a.offsetWidth,
+ height: a.offsetHeight
+ }: null
+ },
+ t.prototype._createQuickInfoElement = function() {
+ var t = this,
+ e = this._gantt,
+ n = document.createElement("div");
+ n.className += "gantt_cal_quick_info",
+ e._waiAria.quickInfoAttr(n);
+ var i = '<div class="gantt_cal_qi_title" ' + e._waiAria.quickInfoHeaderAttrString() + '><div class="gantt_cal_qi_tcontent"></div><div class="gantt_cal_qi_tdate"></div></div><div class="gantt_cal_qi_content"></div>';
+ if (i += '<div class="gantt_cal_qi_controls">', i += "</div>", n.innerHTML = i, e.config.quick_info_detached) {
+ var r = this._getContainer();
+ e.event(r.parent, "scroll",
+ function() {
+ t.hide()
+ })
+ }
+ return this._quickInfoBox = n,
+ n
+ },
+ t.prototype._init_quick_info = function(t) {
+ var e = this._gantt,
+ n = e.getTask(t);
+ return "boolean" == typeof this._quickInfoReadonly && e.isReadonly(n) !== this._quickInfoReadonly && (this.hide(!0), this._quickInfoBox = null),
+ this._quickInfoReadonly = e.isReadonly(n),
+ this._quickInfoBox || (this._quickInfoBox = this._createQuickInfoElement()),
+ this._quickInfoBox
+ },
+ t.prototype._prepare_quick_info_classname = function(t) {
+ var e = this._gantt,
+ n = e.getTask(t),
+ i = "gantt_cal_quick_info",
+ r = e.templates.quick_info_class(n.start_date, n.end_date, n);
+ return r && (i += " " + r),
+ i
+ },
+ t.prototype._fill_quick_data = function(t) {
+ var e = this._gantt,
+ n = e.getTask(t);
+ this._quickInfoBoxId = t;
+ var i = [];
+ if (this._quickInfoReadonly) for (var r = e.config.quickinfo_buttons,
+ a = {
+ icon_delete: !0,
+ icon_edit: !0
+ },
+ o = 0; o < r.length; o++) this._quickInfoReadonly && a[r[o]] || i.push(r[o]);
+ else i = e.config.quickinfo_buttons;
+ this.setContent({
+ header: {
+ title: e.templates.quick_info_title(n.start_date, n.end_date, n),
+ date: e.templates.quick_info_date(n.start_date, n.end_date, n)
+ },
+ content: e.templates.quick_info_content(n.start_date, n.end_date, n),
+ buttons: i
+ })
+ },
+ t.prototype._appendAtCoordinates = function(t, e) {
+ var n = this._quickInfoBox,
+ i = this._getContainer();
+ n.parentNode && "#document-fragment" !== n.parentNode.nodeName.toLowerCase() || i.parent.appendChild(n),
+ n.style.left = t + "px",
+ n.style.top = e + "px"
+ },
+ t.prototype._show_quick_info = function(t, e) {
+ var n = this._gantt,
+ i = this._quickInfoBox;
+ if (n.config.quick_info_detached) {
+ var r = this._getContainer();
+ i.parentNode && "#document-fragment" !== i.parentNode.nodeName.toLowerCase() || r.parent.appendChild(i);
+ var a = i.offsetWidth,
+ o = i.offsetHeight,
+ s = n.getScrollState(),
+ l = r.xViewport,
+ c = r.yViewport,
+ u = l.offsetWidth + s.x - a,
+ d = t.top - s.y + o,
+ h = t.top;
+ d > c.offsetHeight / 2 && (h = t.top - (o + t.height + 2 * e)) < s.y && d <= c.offsetHeight && (h = t.top),
+ h < s.y && (h = s.y);
+ var f = Math.min(Math.max(s.x, t.left - t.dx * (a - t.width)), u),
+ _ = h;
+ this._appendAtCoordinates(f, _)
+ } else i.style.top = "20px",
+ 1 === t.dx ? (i.style.right = "auto", i.style.left = "-300px", setTimeout(function() {
+ i.style.left = "10px"
+ },
+ 1)) : (i.style.left = "auto", i.style.right = "-300px", setTimeout(function() {
+ i.style.right = "10px"
+ },
+ 1)),
+ i.className += " gantt_qi_" + (1 === t.dx ? "left": "right"),
+ n.$root.appendChild(i)
+ },
+ t.prototype._qi_button_click = function(t) {
+ var e = this._gantt,
+ n = this._quickInfoBox;
+ if (t && t !== n) {
+ var i = t.className;
+ if ( - 1 !== i.indexOf("_icon")) {
+ var r = this._quickInfoBoxId;
+ e.$click.buttons[i.split(" ")[1].replace("icon_", "")](r)
+ } else this._qi_button_click(t.parentNode)
+ }
+ },
+ t.prototype._getContainer = function() {
+ var t = this._gantt,
+ e = this._container ? this._container: t.$task_data;
+ return e && e.offsetHeight && e.offsetWidth ? {
+ parent: e,
+ xViewport: t.$task,
+ yViewport: t.$task_data
+ }: (e = this._container ? this._container: t.$grid_data) && e.offsetHeight && e.offsetWidth ? {
+ parent: e,
+ xViewport: t.$grid,
+ yViewport: t.$grid_data
+ }: {
+ parent: this._container ? this._container: t.$layout,
+ xViewport: t.$layout,
+ yViewport: t.$layout
+ }
+ },
+ t
+ } ();
+ e.QuickInfo = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(257);
+ e.
+ default = function(t) {
+ t.ext || (t.ext = {}),
+ t.ext.quickInfo = new i.QuickInfo(t),
+ t.config.quickinfo_buttons = ["icon_delete", "icon_edit"],
+ t.config.quick_info_detached = !0,
+ t.config.show_quick_info = !0,
+ t.templates.quick_info_title = function(t, e, n) {
+ return n.text.substr(0, 50)
+ },
+ t.templates.quick_info_content = function(t, e, n) {
+ return n.details || n.text
+ },
+ t.templates.quick_info_date = function(e, n, i) {
+ return t.templates.task_time(e, n, i)
+ },
+ t.templates.quick_info_class = function(t, e, n) {
+ return ""
+ },
+ t.attachEvent("onTaskClick",
+ function(e, n) {
+ return t.utils.dom.closest(n.target, ".gantt_add") || setTimeout(function() {
+ t.ext.quickInfo.show(e)
+ },
+ 0),
+ !0
+ });
+ for (var e = ["onViewChange", "onLightbox", "onBeforeTaskDelete", "onBeforeDrag"], n = function() {
+ return t.ext.quickInfo.hide(),
+ !0
+ },
+ r = 0; r < e.length; r++) t.attachEvent(e[r], n);
+ function a() {
+ return t.ext.quickInfo.hide(),
+ t.ext.quickInfo._quickInfoBox = null,
+ !0
+ }
+ t.attachEvent("onEmptyClick",
+ function(e) {
+ var i = !0,
+ r = document.querySelector(".gantt_cal_quick_info");
+ r && t.utils.dom.isChildOf(e.target, r) && (i = !1),
+ i && n()
+ }),
+ t.attachEvent("onGanttReady", a),
+ t.attachEvent("onDestroy", a),
+ t.event(window, "keydown",
+ function(e) {
+ 27 === e.keyCode && t.ext.quickInfo.hide()
+ })
+ }
+ },
+ function(t, e, n) {
+ var i = n(2).replaceValidZeroId;
+ t.exports = function(t) {
+ t.config.multiselect = !0,
+ t.config.multiselect_one_level = !1,
+ t._multiselect = {
+ _selected: {},
+ _one_level: !1,
+ _active: !0,
+ _first_selected_when_shift: null,
+ getDefaultSelected: function() {
+ var t = this.getSelected();
+ return t.length ? t[t.length - 1] : null
+ },
+ setFirstSelected: function(t) {
+ this._first_selected_when_shift = t
+ },
+ getFirstSelected: function() {
+ return this._first_selected_when_shift
+ },
+ isActive: function() {
+ return this.updateState(),
+ this._active
+ },
+ updateState: function() {
+ this._one_level = t.config.multiselect_one_level;
+ var e = this._active;
+ this._active = t.config.select_task,
+ this._active != e && this.reset()
+ },
+ reset: function() {
+ this._selected = {}
+ },
+ setLastSelected: function(e) {
+ t.$data.tasksStore.silent(function() {
+ var n = t.$data.tasksStore;
+ e ? n.select(e + "") : n.unselect(null)
+ })
+ },
+ getLastSelected: function() {
+ var e = t.$data.tasksStore.getSelectedId();
+ return e && t.isTaskExists(e) ? e: null
+ },
+ select: function(e, n) {
+ return !! (e && t.callEvent("onBeforeTaskMultiSelect", [e, !0, n]) && t.callEvent("onBeforeTaskSelected", [e])) && (this._selected[e] = !0, this.setLastSelected(e), this.afterSelect(e), t.callEvent("onTaskMultiSelect", [e, !0, n]), t.callEvent("onTaskSelected", [e]), !0)
+ },
+ toggle: function(t, e) {
+ this._selected[t] ? this.unselect(t, e) : this.select(t, e)
+ },
+ unselect: function(e, n) {
+ e && t.callEvent("onBeforeTaskMultiSelect", [e, !1, n]) && (this._selected[e] = !1, this.getLastSelected() == e && this.setLastSelected(this.getDefaultSelected()), this.afterSelect(e), t.callEvent("onTaskMultiSelect", [e, !1, n]), t.callEvent("onTaskUnselected", [e]))
+ },
+ isSelected: function(e) {
+ return ! (!t.isTaskExists(e) || !this._selected[e])
+ },
+ getSelected: function() {
+ var e = [];
+ for (var n in this._selected) this._selected[n] && t.isTaskExists(n) ? e.push(n) : this._selected[n] = !1;
+ return e.sort(function(e, n) {
+ return t.getGlobalTaskIndex(e) > t.getGlobalTaskIndex(n) ? 1 : -1
+ }),
+ e
+ },
+ forSelected: function(t) {
+ for (var e = this.getSelected(), n = 0; n < e.length; n++) t(e[n])
+ },
+ isSameLevel: function(e) {
+ if (!this._one_level) return ! 0;
+ var n = this.getLastSelected();
+ return ! n || (!t.isTaskExists(n) || !t.isTaskExists(e) || !(t.calculateTaskLevel(t.getTask(n)) != t.calculateTaskLevel(t.getTask(e))))
+ },
+ afterSelect: function(e) {
+ t.isTaskExists(e) && t._quickRefresh(function() {
+ t.refreshTask(e)
+ })
+ },
+ doSelection: function(e) {
+ if (!this.isActive()) return ! 1;
+ if (t._is_icon_open_click(e)) return ! 1;
+ var n = t.locate(e);
+ if (!n) return ! 1;
+ if (!t.callEvent("onBeforeMultiSelect", [e])) return ! 1;
+ var i = this.getSelected(),
+ r = this.getFirstSelected(),
+ a = !1,
+ o = this.getLastSelected(),
+ s = t.config.multiselect,
+ l = function() {
+ var r = t.ext.inlineEditors,
+ a = r.getState(),
+ o = r.locateCell(e.target);
+ t.config.inline_editors_multiselect_open && o && r.getEditorConfig(o.columnName) && (r.isVisible() && a.id == o.id && a.columnName == o.columnName || r.startEdit(o.id, o.columnName)),
+ this.setFirstSelected(n),
+ this.isSelected(n) || this.select(n, e),
+ i = this.getSelected();
+ for (var s = 0; s < i.length; s++) i[s] !== n && this.unselect(i[s], e)
+ }.bind(this),
+ c = function() {
+ if (o) {
+ if (n) {
+ for (var i = t.getGlobalTaskIndex(this.getFirstSelected()), s = t.getGlobalTaskIndex(n), l = t.getGlobalTaskIndex(o), c = o; t.getGlobalTaskIndex(c) !== i;) this.unselect(c, e),
+ c = i > l ? t.getNext(c) : t.getPrev(c);
+ for (c = n; t.getGlobalTaskIndex(c) !== i;) this.select(c, e) && !a && (a = !0, r = c),
+ c = i > s ? t.getNext(c) : t.getPrev(c)
+ }
+ } else o = n
+ }.bind(this);
+ return s && (e.ctrlKey || e.metaKey) ? (this.isSelected(n) || this.setFirstSelected(n), n && this.toggle(n, e)) : s && e.shiftKey ? (t.isTaskExists(this.getFirstSelected()) && null !== this.getFirstSelected() || this.setFirstSelected(n), i.length ? c() : l()) : l(),
+ this.isSelected(n) ? this.setLastSelected(n) : r ? n == o && this.setLastSelected(e.shiftKey ? r: this.getDefaultSelected()) : this.setLastSelected(null),
+ this.getSelected().length || this.setLastSelected(null),
+ this.getLastSelected() && this.isSelected(this.getFirstSelected()) || this.setFirstSelected(this.getLastSelected()),
+ !0
+ }
+ },
+ function() {
+ var e = t.selectTask;
+ t.selectTask = function(n) {
+ if (! (n = i(n, this.config.root_id))) return ! 1;
+ var r = t._multiselect,
+ a = n;
+ return r.isActive() ? (r.select(n, null) && r.setLastSelected(n), r.setFirstSelected(r.getLastSelected())) : a = e.call(this, n),
+ a
+ };
+ var n = t.unselectTask;
+ t.unselectTask = function(e) {
+ var i = t._multiselect,
+ r = i.isActive(); (e = e || i.getLastSelected()) && r && (i.unselect(e, null), e == i.getLastSelected() && i.setLastSelected(null), t.refreshTask(e), i.setFirstSelected(i.getLastSelected()));
+ var a = e;
+ return r || (a = n.call(this, e)),
+ a
+ },
+ t.toggleTaskSelection = function(e) {
+ var n = t._multiselect;
+ e && n.isActive() && (n.toggle(e), n.setFirstSelected(n.getLastSelected()))
+ },
+ t.getSelectedTasks = function() {
+ var e = t._multiselect;
+ return e.isActive(),
+ e.getSelected()
+ },
+ t.eachSelectedTask = function(t) {
+ return this._multiselect.forSelected(t)
+ },
+ t.isSelectedTask = function(t) {
+ return this._multiselect.isSelected(t)
+ },
+ t.getLastSelectedTask = function() {
+ return this._multiselect.getLastSelected()
+ },
+ t.attachEvent("onGanttReady",
+ function() {
+ var e = t.$data.tasksStore.isSelected;
+ t.$data.tasksStore.isSelected = function(n) {
+ return t._multiselect.isActive() ? t._multiselect.isSelected(n) : e.call(this, n)
+ }
+ })
+ } (),
+ t.attachEvent("onTaskIdChange",
+ function(e, n) {
+ var i = t._multiselect;
+ if (!i.isActive()) return ! 0;
+ t.isSelectedTask(e) && (i.unselect(e, null), i.select(n, null))
+ }),
+ t.attachEvent("onAfterTaskDelete",
+ function(e, n) {
+ var i = t._multiselect;
+ if (!i.isActive()) return ! 0;
+ i._selected[e] && (i.unselect(e, null), i._selected[e] = !1, i.setLastSelected(i.getDefaultSelected())),
+ i.forSelected(function(e) {
+ t.isTaskExists(e) || i.unselect(e, null)
+ })
+ }),
+ t.attachEvent("onBeforeTaskMultiSelect",
+ function(e, n, i) {
+ var r = t._multiselect;
+ return ! (n && r.isActive() && r._one_level) || r.isSameLevel(e)
+ }),
+ t.attachEvent("onTaskClick",
+ function(e, n) {
+ return t._multiselect.doSelection(n) && t.callEvent("onMultiSelect", [n]),
+ !0
+ })
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ function e(e) {
+ if (!t.config.show_markers) return ! 1;
+ if (!e.start_date) return ! 1;
+ var n = t.getState();
+ if (! ( + e.start_date > +n.max_date || (!e.end_date || +e.end_date < +n.min_date) && +e.start_date < +n.min_date)) {
+ var i = document.createElement("div");
+ i.setAttribute("data-marker-id", e.id);
+ var r = "gantt_marker";
+ t.templates.marker_class && (r += " " + t.templates.marker_class(e)),
+ e.css && (r += " " + e.css),
+ e.title && (i.title = e.title),
+ i.className = r;
+ var a = t.posFromDate(e.start_date);
+ i.style.left = a + "px";
+ var o = Math.max(t.getRowTop(t.getVisibleTaskCount()), 0) + "px";
+ if (t.config.timeline_placeholder && (o = t.$container.scrollHeight + "px"), i.style.height = o, e.end_date) {
+ var s = t.posFromDate(e.end_date);
+ i.style.width = Math.max(s - a, 0) + "px"
+ }
+ return e.text && (i.innerHTML = "<div class='gantt_marker_content' >" + e.text + "</div>"),
+ i
+ }
+ }
+ function n() {
+ if (t.$task_data) {
+ var e = document.createElement("div");
+ e.className = "gantt_marker_area",
+ t.$task_data.appendChild(e),
+ t.$marker_area = e
+ }
+ }
+ t._markers || (t._markers = t.createDatastore({
+ name: "marker",
+ initItem: function(e) {
+ return e.id = e.id || t.uid(),
+ e
+ }
+ })),
+ t.config.show_markers = !0,
+ t.attachEvent("onBeforeGanttRender",
+ function() {
+ t.$marker_area || n()
+ }),
+ t.attachEvent("onDataRender",
+ function() {
+ t.$marker_area || (n(), t.renderMarkers())
+ }),
+ t.attachEvent("onGanttLayoutReady",
+ function() {
+ t.attachEvent("onBeforeGanttRender",
+ function() {
+ n(),
+ t.$services.getService("layers").createDataRender({
+ name: "marker",
+ defaultContainer: function() {
+ return t.$marker_area
+ }
+ }).addLayer(e)
+ },
+ {
+ once: !0
+ })
+ }),
+ t.getMarker = function(t) {
+ return this._markers ? this._markers.getItem(t) : null
+ },
+ t.addMarker = function(t) {
+ return this._markers.addItem(t)
+ },
+ t.deleteMarker = function(t) {
+ return !! this._markers.exists(t) && (this._markers.removeItem(t), !0)
+ },
+ t.updateMarker = function(t) {
+ this._markers.refresh(t)
+ },
+ t._getMarkers = function() {
+ return this._markers.getItems()
+ },
+ t.renderMarkers = function() {
+ this._markers.refresh()
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.$keyboardNavigation.dispatcher = {
+ isActive: !1,
+ activeNode: null,
+ globalNode: new t.$keyboardNavigation.GanttNode,
+ enable: function() {
+ this.isActive = !0,
+ this.setActiveNode(this.getActiveNode())
+ },
+ disable: function() {
+ this.isActive = !1
+ },
+ isEnabled: function() {
+ return !! this.isActive
+ },
+ getDefaultNode: function() {
+ var e;
+ return (e = t.config.keyboard_navigation_cells ? new t.$keyboardNavigation.TaskCell: new t.$keyboardNavigation.TaskRow).isValid() || (e = e.fallback()),
+ e
+ },
+ setDefaultNode: function() {
+ this.setActiveNode(this.getDefaultNode())
+ },
+ getActiveNode: function() {
+ var t = this.activeNode;
+ return t && !t.isValid() && (t = t.fallback()),
+ t
+ },
+ fromDomElement: function(e) {
+ for (var n = [t.$keyboardNavigation.TaskRow, t.$keyboardNavigation.TaskCell, t.$keyboardNavigation.HeaderCell], i = 0; i < n.length; i++) if (n[i].prototype.fromDomElement) {
+ var r = n[i].prototype.fromDomElement(e);
+ if (r) return r
+ }
+ return null
+ },
+ focusGlobalNode: function() {
+ this.blurNode(this.globalNode),
+ this.focusNode(this.globalNode)
+ },
+ setActiveNode: function(t) {
+ var e = !0;
+ this.activeNode && this.activeNode.compareTo(t) && (e = !1),
+ this.isEnabled() && (e && this.blurNode(this.activeNode), this.activeNode = t, this.focusNode(this.activeNode, !e))
+ },
+ focusNode: function(t, e) {
+ t && t.focus && t.focus(e)
+ },
+ blurNode: function(t) {
+ t && t.blur && t.blur()
+ },
+ keyDownHandler: function(e) {
+ if (!t.$keyboardNavigation.isModal() && this.isEnabled() && !e.defaultPrevented) {
+ var n = this.globalNode,
+ i = t.$keyboardNavigation.shortcuts.getCommandFromEvent(e),
+ r = this.getActiveNode(); ! 1 !== t.$keyboardNavigation.facade.callEvent("onKeyDown", [i, e]) && (r ? r.findHandler(i) ? r.doAction(i, e) : n.findHandler(i) && n.doAction(i, e) : this.setDefaultNode())
+ }
+ },
+ _timeout: null,
+ awaitsFocus: function() {
+ return null !== this._timeout
+ },
+ delay: function(e, n) {
+ clearTimeout(this._timeout),
+ this._timeout = setTimeout(t.bind(function() {
+ this._timeout = null,
+ e()
+ },
+ this), n || 1)
+ },
+ clearDelay: function() {
+ clearTimeout(this._timeout)
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) { !
+ function() {
+ var e = [];
+ function n() {
+ return !! e.length
+ }
+ function i(e) {
+ setTimeout(function() {
+ n() || t.$destroyed || t.focus()
+ },
+ 1)
+ }
+ function r(n) {
+ t.eventRemove(n, "keydown", o),
+ t.event(n, "keydown", o),
+ e.push(n)
+ }
+ function a() {
+ var n = e.pop();
+ n && t.eventRemove(n, "keydown", o),
+ i()
+ }
+ function o(n) {
+ var i = n.currentTarget; (function(t) {
+ return t == e[e.length - 1]
+ })(i) && t.$keyboardNavigation.trapFocus(i, n)
+ }
+ function s() {
+ r(t.getLightbox())
+ }
+ t.attachEvent("onLightbox", s),
+ t.attachEvent("onAfterLightbox", a),
+ t.attachEvent("onLightboxChange",
+ function() {
+ a(),
+ s()
+ }),
+ t.attachEvent("onAfterQuickInfo",
+ function() {
+ i()
+ }),
+ t.attachEvent("onMessagePopup",
+ function(e) {
+ l = t.utils.dom.getActiveElement(),
+ r(e)
+ }),
+ t.attachEvent("onAfterMessagePopup",
+ function() {
+ a(),
+ setTimeout(function() {
+ l && (l.focus(), l = null)
+ },
+ 1)
+ });
+ var l = null;
+ t.$keyboardNavigation.isModal = n
+ } ()
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(1),
+ i = n(2).replaceValidZeroId;
+ t.$keyboardNavigation.TaskCell = function(e, n) {
+ if (! (e = i(e, t.config.root_id))) {
+ var r = t.getChildren(t.config.root_id);
+ r[0] && (e = r[0])
+ }
+ this.taskId = e,
+ this.columnIndex = n || 0,
+ t.isTaskExists(this.taskId) && (this.index = t.getTaskIndex(this.taskId), this.globalIndex = t.getGlobalTaskIndex(this.taskId))
+ },
+ t.$keyboardNavigation.TaskCell.prototype = t._compose(t.$keyboardNavigation.TaskRow, {
+ _handlers: null,
+ isValid: function() {
+ return t.$keyboardNavigation.TaskRow.prototype.isValid.call(this) && !!t.getGridColumns()[this.columnIndex]
+ },
+ fallback: function() {
+ var e = t.$keyboardNavigation.TaskRow.prototype.fallback.call(this),
+ n = e;
+ if (e instanceof t.$keyboardNavigation.TaskRow) {
+ for (var i = t.getGridColumns(), r = this.columnIndex; r >= 0 && !i[r];) r--;
+ i[r] && (n = new t.$keyboardNavigation.TaskCell(e.taskId, r))
+ }
+ return n
+ },
+ fromDomElement: function(n) {
+ if (!t.config.keyboard_navigation_cells) return null;
+ var i = t.locate(n);
+ if (t.isTaskExists(i)) {
+ var r = 0,
+ a = e.locateAttribute(n, "data-column-index");
+ return a && (r = 1 * a.getAttribute("data-column-index")),
+ new t.$keyboardNavigation.TaskCell(i, r)
+ }
+ return null
+ },
+ getNode: function() {
+ if (t.isTaskExists(this.taskId) && t.isTaskVisible(this.taskId)) {
+ if (t.config.show_grid) {
+ var e = t.$grid.querySelector(".gantt_row[" + t.config.task_attribute + "='" + this.taskId + "']");
+ return e ? e.querySelector("[data-column-index='" + this.columnIndex + "']") : null
+ }
+ return t.getTaskNode(this.taskId)
+ }
+ },
+ keys: {
+ up: function() {
+ var e = null,
+ n = t.getPrev(this.taskId);
+ e = t.isTaskExists(n) ? new t.$keyboardNavigation.TaskCell(n, this.columnIndex) : new t.$keyboardNavigation.HeaderCell(this.columnIndex),
+ this.moveTo(e)
+ },
+ down: function() {
+ var e = t.getNext(this.taskId);
+ t.isTaskExists(e) && this.moveTo(new t.$keyboardNavigation.TaskCell(e, this.columnIndex))
+ },
+ left: function() {
+ this.columnIndex > 0 && this.moveTo(new t.$keyboardNavigation.TaskCell(this.taskId, this.columnIndex - 1))
+ },
+ right: function() {
+ var e = t.getGridColumns();
+ this.columnIndex < e.length - 1 && this.moveTo(new t.$keyboardNavigation.TaskCell(this.taskId, this.columnIndex + 1))
+ },
+ end: function() {
+ var e = t.getGridColumns();
+ this.moveTo(new t.$keyboardNavigation.TaskCell(this.taskId, e.length - 1))
+ },
+ home: function() {
+ this.moveTo(new t.$keyboardNavigation.TaskCell(this.taskId, 0))
+ },
+ pagedown: function() {
+ t.getVisibleTaskCount() && this.moveTo(new t.$keyboardNavigation.TaskCell(t.getTaskByIndex(t.getVisibleTaskCount() - 1).id, this.columnIndex))
+ },
+ pageup: function() {
+ t.getVisibleTaskCount() && this.moveTo(new t.$keyboardNavigation.TaskCell(t.getTaskByIndex(0).id, this.columnIndex))
+ }
+ }
+ }),
+ t.$keyboardNavigation.TaskCell.prototype.bindAll(t.$keyboardNavigation.TaskRow.prototype.keys),
+ t.$keyboardNavigation.TaskCell.prototype.bindAll(t.$keyboardNavigation.TaskCell.prototype.keys)
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.$keyboardNavigation.TaskRow = function(e) {
+ if (!e) {
+ var n = t.getChildren(t.config.root_id);
+ n[0] && (e = n[0])
+ }
+ this.taskId = e,
+ t.isTaskExists(this.taskId) && (this.index = t.getTaskIndex(this.taskId), this.globalIndex = t.getGlobalTaskIndex(this.taskId))
+ },
+ t.$keyboardNavigation.TaskRow.prototype = t._compose(t.$keyboardNavigation.KeyNavNode, {
+ _handlers: null,
+ isValid: function() {
+ return t.isTaskExists(this.taskId) && t.getTaskIndex(this.taskId) > -1
+ },
+ fallback: function() {
+ if (!t.getVisibleTaskCount()) {
+ var e = new t.$keyboardNavigation.HeaderCell;
+ return e.isValid() ? e: null
+ }
+ var n = -1;
+ if (t.getTaskByIndex(this.globalIndex - 1)) n = this.globalIndex - 1;
+ else if (t.getTaskByIndex(this.globalIndex + 1)) n = this.globalIndex + 1;
+ else for (var i = this.globalIndex; i >= 0;) {
+ if (t.getTaskByIndex(i)) {
+ n = i;
+ break
+ }
+ i--
+ }
+ if (n > -1) return new t.$keyboardNavigation.TaskRow(t.getTaskByIndex(n).id)
+ },
+ fromDomElement: function(e) {
+ if (t.config.keyboard_navigation_cells) return null;
+ var n = t.locate(e);
+ return t.isTaskExists(n) ? new t.$keyboardNavigation.TaskRow(n) : null
+ },
+ getNode: function() {
+ if (t.isTaskExists(this.taskId) && t.isTaskVisible(this.taskId)) return t.config.show_grid ? t.$grid.querySelector(".gantt_row[" + t.config.task_attribute + "='" + this.taskId + "']") : t.getTaskNode(this.taskId)
+ },
+ focus: function(e) {
+ if (!e) {
+ var n, i, r = t.getTaskPosition(t.getTask(this.taskId)),
+ a = t.getTaskHeight(this.taskId),
+ o = t.getScrollState();
+ n = t.$task ? t.$task.offsetWidth: o.inner_width,
+ i = t.$grid_data || t.$task_data ? (t.$grid_data || t.$task_data).offsetHeight: o.inner_height,
+ r.top < o.y || r.top + a > o.y + i ? t.scrollTo(null, r.top - 5 * a) : t.config.scroll_on_click && t.config.show_chart && (r.left > o.x + n ? t.scrollTo(r.left - t.config.task_scroll_offset) : r.left + r.width < o.x && t.scrollTo(r.left + r.width - t.config.task_scroll_offset))
+ }
+ t.$keyboardNavigation.KeyNavNode.prototype.focus.apply(this, [e]),
+ function() {
+ var e = t.$ui.getView("grid"),
+ n = parseInt(e.$grid.scrollLeft),
+ i = parseInt(e.$grid_data.scrollTop),
+ r = e.$config.scrollX;
+ if (r && e.$config.scrollable) {
+ var a = t.$ui.getView(r);
+ a && a.scrollTo(n, i)
+ }
+ var o = e.$config.scrollY;
+ if (o) {
+ var s = t.$ui.getView(o);
+ s && s.scrollTo(n, i)
+ }
+ } ()
+ },
+ keys: {
+ pagedown: function() {
+ t.getVisibleTaskCount() && this.moveTo(new t.$keyboardNavigation.TaskRow(t.getTaskByIndex(t.getVisibleTaskCount() - 1).id))
+ },
+ pageup: function() {
+ t.getVisibleTaskCount() && this.moveTo(new t.$keyboardNavigation.TaskRow(t.getTaskByIndex(0).id))
+ },
+ up: function() {
+ var e = null,
+ n = t.getPrev(this.taskId);
+ e = t.isTaskExists(n) ? new t.$keyboardNavigation.TaskRow(n) : new t.$keyboardNavigation.HeaderCell,
+ this.moveTo(e)
+ },
+ down: function() {
+ var e = t.getNext(this.taskId);
+ t.isTaskExists(e) && this.moveTo(new t.$keyboardNavigation.TaskRow(e))
+ },
+ "shift+down": function() {
+ t.hasChild(this.taskId) && !t.getTask(this.taskId).$open && t.open(this.taskId)
+ },
+ "shift+up": function() {
+ t.hasChild(this.taskId) && t.getTask(this.taskId).$open && t.close(this.taskId)
+ },
+ "shift+right": function() {
+ if (!t.isReadonly(this)) {
+ var e = t.getPrevSibling(this.taskId);
+ if (t.isTaskExists(e) && !t.isChildOf(this.taskId, e)) t.getTask(e).$open = !0,
+ !1 !== t.moveTask(this.taskId, -1, e) && t.updateTask(this.taskId)
+ }
+ },
+ "shift+left": function() {
+ if (!t.isReadonly(this)) {
+ var e = t.getParent(this.taskId);
+ if (t.isTaskExists(e)) ! 1 !== t.moveTask(this.taskId, t.getTaskIndex(e) + 1, t.getParent(e)) && t.updateTask(this.taskId)
+ }
+ },
+ space: function(e) {
+ t.isSelectedTask(this.taskId) ? t.unselectTask(this.taskId) : t.selectTask(this.taskId)
+ },
+ "ctrl+left": function(e) {
+ t.close(this.taskId)
+ },
+ "ctrl+right": function(e) {
+ t.open(this.taskId)
+ },
+ delete: function(e) {
+ t.isReadonly(this) || t.$click.buttons.delete(this.taskId)
+ },
+ enter: function() {
+ t.isReadonly(this) || t.showLightbox(this.taskId)
+ },
+ "ctrl+enter": function() {
+ t.isReadonly(this) || t.createTask({},
+ this.taskId)
+ }
+ }
+ }),
+ t.$keyboardNavigation.TaskRow.prototype.bindAll(t.$keyboardNavigation.TaskRow.prototype.keys)
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(1);
+ t.$keyboardNavigation.HeaderCell = function(t) {
+ this.index = t || 0
+ },
+ t.$keyboardNavigation.HeaderCell.prototype = t._compose(t.$keyboardNavigation.KeyNavNode, {
+ _handlers: null,
+ isValid: function() {
+ return ! (!t.config.show_grid && t.getVisibleTaskCount()) && ( !! t.getGridColumns()[this.index] || !t.getVisibleTaskCount())
+ },
+ fallback: function() {
+ if (!t.config.show_grid) return t.getVisibleTaskCount() ? new t.$keyboardNavigation.TaskRow: null;
+ for (var e = t.getGridColumns(), n = this.index; n >= 0 && !e[n];) n--;
+ return e[n] ? new t.$keyboardNavigation.HeaderCell(n) : null
+ },
+ fromDomElement: function(n) {
+ var i = e.locateClassName(n, "gantt_grid_head_cell");
+ if (i) {
+ for (var r = 0; i && i.previousSibling;) i = i.previousSibling,
+ r += 1;
+ return new t.$keyboardNavigation.HeaderCell(r)
+ }
+ return null
+ },
+ getNode: function() {
+ return t.$grid_scale.childNodes[this.index]
+ },
+ keys: {
+ left: function() {
+ this.index > 0 && this.moveTo(new t.$keyboardNavigation.HeaderCell(this.index - 1))
+ },
+ right: function() {
+ var e = t.getGridColumns();
+ this.index < e.length - 1 && this.moveTo(new t.$keyboardNavigation.HeaderCell(this.index + 1))
+ },
+ down: function() {
+ var e, n = t.getChildren(t.config.root_id);
+ t.isTaskExists(n[0]) && (e = n[0]),
+ e && (t.config.keyboard_navigation_cells ? this.moveTo(new t.$keyboardNavigation.TaskCell(e, this.index)) : this.moveTo(new t.$keyboardNavigation.TaskRow(e)))
+ },
+ end: function() {
+ var e = t.getGridColumns();
+ this.moveTo(new t.$keyboardNavigation.HeaderCell(e.length - 1))
+ },
+ home: function() {
+ this.moveTo(new t.$keyboardNavigation.HeaderCell(0))
+ },
+ "enter, space": function() {
+ e.getActiveElement().click()
+ },
+ "ctrl+enter": function() {
+ t.isReadonly(this) || t.createTask({},
+ this.taskId)
+ }
+ }
+ }),
+ t.$keyboardNavigation.HeaderCell.prototype.bindAll(t.$keyboardNavigation.HeaderCell.prototype.keys)
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.$keyboardNavigation.KeyNavNode = function() {},
+ t.$keyboardNavigation.KeyNavNode.prototype = t._compose(t.$keyboardNavigation.EventHandler, {
+ isValid: function() {
+ return ! 0
+ },
+ fallback: function() {
+ return null
+ },
+ moveTo: function(e) {
+ t.$keyboardNavigation.dispatcher.setActiveNode(e)
+ },
+ compareTo: function(t) {
+ if (!t) return ! 1;
+ for (var e in this) {
+ if ( !! this[e] != !!t[e]) return ! 1;
+ var n = !(!this[e] || !this[e].toString),
+ i = !(!t[e] || !t[e].toString);
+ if (i != n) return ! 1;
+ if (i && n) {
+ if (t[e].toString() != this[e].toString()) return ! 1
+ } else if (t[e] != this[e]) return ! 1
+ }
+ return ! 0
+ },
+ getNode: function() {},
+ focus: function() {
+ var e = this.getNode();
+ if (e) {
+ var n = t.$keyboardNavigation.facade; ! 1 !== n.callEvent("onBeforeFocus", [e]) && e && (e.setAttribute("tabindex", "-1"), e.$eventAttached || (e.$eventAttached = !0, t.event(e, "focus",
+ function(t) {
+ return t.preventDefault(),
+ !1
+ },
+ !1)), t.utils.dom.isChildOf(document.activeElement, e) && (e = document.activeElement), e.focus && e.focus(), n.callEvent("onFocus", [this.getNode()]))
+ }
+ },
+ blur: function() {
+ var e = this.getNode();
+ e && (t.$keyboardNavigation.facade.callEvent("onBlur", [e]), e.setAttribute("tabindex", "-1"))
+ }
+ })
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.$keyboardNavigation.GanttNode = function() {},
+ t.$keyboardNavigation.GanttNode.prototype = t._compose(t.$keyboardNavigation.EventHandler, {
+ focus: function() {
+ t.focus()
+ },
+ blur: function() {},
+ isEnabled: function() {
+ return t.$container.hasAttribute("tabindex")
+ },
+ scrollHorizontal: function(e) {
+ var n = t.dateFromPos(t.getScrollState().x),
+ i = t.getScale(),
+ r = e < 0 ? -i.step: i.step;
+ n = t.date.add(n, r, i.unit),
+ t.scrollTo(t.posFromDate(n))
+ },
+ scrollVertical: function(e) {
+ var n = t.getScrollState().y,
+ i = t.config.row_height;
+ t.scrollTo(null, n + (e < 0 ? -1 : 1) * i)
+ },
+ keys: {
+ "alt+left": function(t) {
+ this.scrollHorizontal( - 1)
+ },
+ "alt+right": function(t) {
+ this.scrollHorizontal(1)
+ },
+ "alt+up": function(t) {
+ this.scrollVertical( - 1)
+ },
+ "alt+down": function(t) {
+ this.scrollVertical(1)
+ },
+ "ctrl+z": function() {
+ t.undo && t.undo()
+ },
+ "ctrl+r": function() {
+ t.redo && t.redo()
+ }
+ }
+ }),
+ t.$keyboardNavigation.GanttNode.prototype.bindAll(t.$keyboardNavigation.GanttNode.prototype.keys)
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) { !
+ function() {
+ var e = n(1);
+ t.$keyboardNavigation.getFocusableNodes = e.getFocusableNodes,
+ t.$keyboardNavigation.trapFocus = function(n, i) {
+ if (9 != i.keyCode) return ! 1;
+ for (var r = t.$keyboardNavigation.getFocusableNodes(n), a = e.getActiveElement(), o = -1, s = 0; s < r.length; s++) if (r[s] == a) {
+ o = s;
+ break
+ }
+ if (i.shiftKey) {
+ if (o <= 0) {
+ var l = r[r.length - 1];
+ if (l) return l.focus(),
+ i.preventDefault(),
+ !0
+ }
+ } else if (o >= r.length - 1) {
+ var c = r[0];
+ if (c) return c.focus(),
+ i.preventDefault(),
+ !0
+ }
+ return ! 1
+ }
+ } ()
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.$keyboardNavigation.EventHandler = {
+ _handlers: null,
+ findHandler: function(e) {
+ this._handlers || (this._handlers = {});
+ var n = t.$keyboardNavigation.shortcuts.getHash(e);
+ return this._handlers[n]
+ },
+ doAction: function(e, n) {
+ var i = this.findHandler(e);
+ if (i) {
+ if (!1 === t.$keyboardNavigation.facade.callEvent("onBeforeAction", [e, n])) return;
+ i.call(this, n),
+ n.preventDefault ? n.preventDefault() : n.returnValue = !1
+ }
+ },
+ bind: function(e, n) {
+ this._handlers || (this._handlers = {});
+ for (var i = t.$keyboardNavigation.shortcuts,
+ r = i.parse(e), a = 0; a < r.length; a++) this._handlers[i.getHash(r[a])] = n
+ },
+ unbind: function(e) {
+ for (var n = t.$keyboardNavigation.shortcuts,
+ i = n.parse(e), r = 0; r < i.length; r++) this._handlers[n.getHash(i[r])] && delete this._handlers[n.getHash(i[r])]
+ },
+ bindAll: function(t) {
+ for (var e in t) this.bind(e, t[e])
+ },
+ initKeys: function() {
+ this._handlers || (this._handlers = {}),
+ this.keys && this.bindAll(this.keys)
+ }
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ t.$keyboardNavigation.shortcuts = {
+ createCommand: function() {
+ return {
+ modifiers: {
+ shift: !1,
+ alt: !1,
+ ctrl: !1,
+ meta: !1
+ },
+ keyCode: null
+ }
+ },
+ parse: function(t) {
+ for (var e = [], n = this.getExpressions(this.trim(t)), i = 0; i < n.length; i++) {
+ for (var r = this.getWords(n[i]), a = this.createCommand(), o = 0; o < r.length; o++) this.commandKeys[r[o]] ? a.modifiers[r[o]] = !0 : this.specialKeys[r[o]] ? a.keyCode = this.specialKeys[r[o]] : a.keyCode = r[o].charCodeAt(0);
+ e.push(a)
+ }
+ return e
+ },
+ getCommandFromEvent: function(t) {
+ var e = this.createCommand();
+ e.modifiers.shift = !!t.shiftKey,
+ e.modifiers.alt = !!t.altKey,
+ e.modifiers.ctrl = !!t.ctrlKey,
+ e.modifiers.meta = !!t.metaKey,
+ e.keyCode = t.which || t.keyCode,
+ e.keyCode >= 96 && e.keyCode <= 105 && (e.keyCode -= 48);
+ var n = String.fromCharCode(e.keyCode);
+ return n && (e.keyCode = n.toLowerCase().charCodeAt(0)),
+ e
+ },
+ getHashFromEvent: function(t) {
+ return this.getHash(this.getCommandFromEvent(t))
+ },
+ getHash: function(t) {
+ var e = [];
+ for (var n in t.modifiers) t.modifiers[n] && e.push(n);
+ return e.push(t.keyCode),
+ e.join(this.junctionChar)
+ },
+ getExpressions: function(t) {
+ return t.split(this.junctionChar)
+ },
+ getWords: function(t) {
+ return t.split(this.combinationChar)
+ },
+ trim: function(t) {
+ return t.replace(/\s/g, "")
+ },
+ junctionChar: ",",
+ combinationChar: "+",
+ commandKeys: {
+ shift: 16,
+ alt: 18,
+ ctrl: 17,
+ meta: !0
+ },
+ specialKeys: {
+ backspace: 8,
+ tab: 9,
+ enter: 13,
+ esc: 27,
+ space: 32,
+ up: 38,
+ down: 40,
+ left: 37,
+ right: 39,
+ home: 36,
+ end: 35,
+ pageup: 33,
+ pagedown: 34,
+ delete: 46,
+ insert: 45,
+ plus: 107,
+ f1: 112,
+ f2: 113,
+ f3: 114,
+ f4: 115,
+ f5: 116,
+ f6: 117,
+ f7: 118,
+ f8: 119,
+ f9: 120,
+ f10: 121,
+ f11: 122,
+ f12: 123
+ }
+ }
+ }
+ },
+ function(t, e, n) {
+ t.exports = function(t) {
+ var e = n(5); !
+ function(t) {
+ t.config.keyboard_navigation = !0,
+ t.config.keyboard_navigation_cells = !1,
+ t.$keyboardNavigation = {},
+ t._compose = function() {
+ for (var t = Array.prototype.slice.call(arguments, 0), e = {},
+ n = 0; n < t.length; n++) {
+ var i = t[n];
+ for (var r in "function" == typeof i && (i = new i), i) e[r] = i[r]
+ }
+ return e
+ },
+ n(270)(t),
+ n(269)(t),
+ n(268)(t),
+ n(267)(t),
+ n(266)(t),
+ n(265)(t),
+ n(264)(t),
+ n(263)(t),
+ n(262)(t),
+ n(261)(t);
+ var i = n(1); !
+ function() {
+ var n = t.$keyboardNavigation.dispatcher;
+ n.isTaskFocused = function(e) {
+ var i = n.activeNode;
+ return (i instanceof t.$keyboardNavigation.TaskRow || i instanceof t.$keyboardNavigation.TaskCell) && i.taskId == e
+ };
+ var r = function(e) {
+ if (t.config.keyboard_navigation && (t.config.keyboard_navigation_cells || !s(e)) && !l(e) && !
+ function(t) {
+ return !! i.closest(t.target, ".gantt_cal_light")
+ } (e)) return n.keyDownHandler(e)
+ },
+ a = function(e) {
+ if (n.$preventDefault) return e.preventDefault(),
+ t.$container.blur(),
+ !1;
+ n.awaitsFocus() || n.focusGlobalNode()
+ },
+ o = function() {
+ if (n.isEnabled()) {
+ var e = !i.isChildOf(document.activeElement, t.$container) && "body" != document.activeElement.localName,
+ r = n.getActiveNode();
+ if (r && !e) {
+ var a, o, s = r.getNode();
+ s && s.parentNode && (a = s.parentNode.scrollTop, o = s.parentNode.scrollLeft),
+ r.focus(!0),
+ s && s.parentNode && (s.parentNode.scrollTop = a, s.parentNode.scrollLeft = o)
+ }
+ }
+ };
+ function s(t) {
+ return !! i.closest(t.target, ".gantt_grid_editor_placeholder")
+ }
+ function l(t) {
+ return !! i.closest(t.target, ".no_keyboard_navigation")
+ }
+ function c(e) {
+ if (!t.config.keyboard_navigation) return ! 0;
+ if (!t.config.keyboard_navigation_cells && s(e)) return ! 0;
+ if (!l(e)) {
+ var r, a = n.fromDomElement(e);
+ a && (n.activeNode instanceof t.$keyboardNavigation.TaskCell && i.isChildOf(e.target, t.$task) && (a = new t.$keyboardNavigation.TaskCell(a.taskId, n.activeNode.columnIndex)), r = a),
+ r ? n.isEnabled() ? n.delay(function() {
+ n.setActiveNode(r)
+ }) : n.activeNode = r: (n.$preventDefault = !0, setTimeout(function() {
+ n.$preventDefault = !1
+ },
+ 300))
+ }
+ }
+ t.attachEvent("onDataRender",
+ function() {
+ t.config.keyboard_navigation && o()
+ }),
+ t.attachEvent("onGanttRender",
+ function() {
+ t.eventRemove(t.$root, "keydown", r),
+ t.eventRemove(t.$container, "focus", a),
+ t.eventRemove(t.$container, "mousedown", c),
+ t.config.keyboard_navigation ? (t.event(t.$root, "keydown", r), t.event(t.$container, "focus", a), t.event(t.$container, "mousedown", c), t.$container.setAttribute("tabindex", "0")) : t.$container.removeAttribute("tabindex")
+ });
+ var u = t.attachEvent("onGanttReady",
+ function() {
+ if (t.detachEvent(u), t.$data.tasksStore.attachEvent("onStoreUpdated",
+ function(e) {
+ if (t.config.keyboard_navigation && n.isEnabled()) {
+ var i = n.getActiveNode();
+ i && i.taskId == e && o()
+ }
+ }), t._smart_render) {
+ var e = t._smart_render._redrawTasks;
+ t._smart_render._redrawTasks = function(i, r) {
+ if (t.config.keyboard_navigation && n.isEnabled()) {
+ var a = n.getActiveNode();
+ if (a && void 0 !== a.taskId) {
+ for (var o = !1,
+ s = 0; s < r.length; s++) if (r[s].id == a.taskId && r[s].start_date) {
+ o = !0;
+ break
+ }
+ o || r.push(t.getTask(a.taskId))
+ }
+ }
+ return e.apply(this, arguments)
+ }
+ }
+ }),
+ d = null,
+ h = !1;
+ t.attachEvent("onTaskCreated",
+ function(t) {
+ return d = t.id,
+ !0
+ }),
+ t.attachEvent("onAfterTaskAdd",
+ function(e, i) {
+ if (!t.config.keyboard_navigation) return ! 0;
+ if (n.isEnabled()) {
+ if (e == d && (h = !0, setTimeout(function() {
+ h = !1,
+ d = null
+ })), h && i.type == t.config.types.placeholder) return;
+ var r = 0,
+ a = n.activeNode;
+ a instanceof t.$keyboardNavigation.TaskCell && (r = a.columnIndex);
+ var o = t.config.keyboard_navigation_cells ? t.$keyboardNavigation.TaskCell: t.$keyboardNavigation.TaskRow;
+ i.type == t.config.types.placeholder && !1 === t.config.placeholder_task.focusOnCreate || n.setActiveNode(new o(e, r))
+ }
+ }),
+ t.attachEvent("onTaskIdChange",
+ function(e, i) {
+ if (!t.config.keyboard_navigation) return ! 0;
+ var r = n.activeNode;
+ return n.isTaskFocused(e) && (r.taskId = i),
+ !0
+ });
+ var f = setInterval(function() {
+ t.config.keyboard_navigation && (n.isEnabled() || n.enable())
+ },
+ 500);
+ function _(e) {
+ var n = {
+ gantt: t.$keyboardNavigation.GanttNode,
+ headerCell: t.$keyboardNavigation.HeaderCell,
+ taskRow: t.$keyboardNavigation.TaskRow,
+ taskCell: t.$keyboardNavigation.TaskCell
+ };
+ return n[e] || n.gantt
+ }
+ function g(e) {
+ for (var n = t.getGridColumns(), i = 0; i < n.length; i++) if (n[i].name == e) return i;
+ return 0
+ }
+ t.attachEvent("onDestroy",
+ function() {
+ clearInterval(f)
+ });
+ var p = {};
+ e(p),
+ t.mixin(p, {
+ addShortcut: function(t, e, n) {
+ var i = _(n);
+ i && i.prototype.bind(t, e)
+ },
+ getShortcutHandler: function(e, n) {
+ var i = t.$keyboardNavigation.shortcuts.parse(e);
+ if (i.length) return p.getCommandHandler(i[0], n)
+ },
+ getCommandHandler: function(t, e) {
+ var n = _(e);
+ if (n && t) return n.prototype.findHandler(t)
+ },
+ removeShortcut: function(t, e) {
+ var n = _(e);
+ n && n.prototype.unbind(t)
+ },
+ focus: function(t) {
+ var e, i = t ? t.type: null,
+ r = _(i);
+ switch (i) {
+ case "taskCell":
+ e = new r(t.id, g(t.column));
+ break;
+ case "taskRow":
+ e = new r(t.id);
+ break;
+ case "headerCell":
+ e = new r(g(t.column))
+ }
+ n.delay(function() {
+ e ? n.setActiveNode(e) : (n.enable(), n.getActiveNode() ? n.awaitsFocus() || n.enable() : n.setDefaultNode())
+ })
+ },
+ getActiveNode: function() {
+ if (n.isEnabled()) {
+ var e = n.getActiveNode(),
+ i = function(e) {
+ return e instanceof t.$keyboardNavigation.GanttNode ? "gantt": e instanceof t.$keyboardNavigation.HeaderCell ? "headerCell": e instanceof t.$keyboardNavigation.TaskRow ? "taskRow": e instanceof t.$keyboardNavigation.TaskCell ? "taskCell": null
+ } (e),
+ r = t.getGridColumns();
+ switch (i) {
+ case "taskCell":
+ return {
+ type:
+ "taskCell",
+ id: e.taskId,
+ column: r[e.columnIndex].name
+ };
+ case "taskRow":
+ return {
+ type:
+ "taskRow",
+ id: e.taskId
+ };
+ case "headerCell":
+ return {
+ type:
+ "headerCell",
+ column: r[e.index].name
+ }
+ }
+ }
+ return null
+ }
+ }),
+ t.$keyboardNavigation.facade = p,
+ t.ext.keyboardNavigation = p,
+ t.focus = function() {
+ p.focus()
+ },
+ t.addShortcut = p.addShortcut,
+ t.getShortcutHandler = p.getShortcutHandler,
+ t.removeShortcut = p.removeShortcut
+ } ()
+ } (t)
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ e.
+ default = function(t) {
+ function e() {
+ var t = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
+ return ! (!t || t !== document.body)
+ }
+ function n() {
+ try {
+ return document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled
+ } catch(t) {
+ console.error("Fullscreen is not available:", t)
+ }
+ }
+ t.$services.getService("state").registerProvider("fullscreen",
+ function() {
+ return n() ? {
+ fullscreen: e()
+ }: void 0
+ });
+ var i = {
+ overflow: null,
+ padding: null,
+ paddingTop: null,
+ paddingRight: null,
+ paddingBottom: null,
+ paddingLeft: null
+ },
+ r = {
+ width: null,
+ height: null,
+ top: null,
+ left: null,
+ position: null,
+ zIndex: null,
+ modified: !1
+ },
+ a = null;
+ function o(t, e) {
+ e.width = t.width,
+ e.height = t.height,
+ e.top = t.top,
+ e.left = t.left,
+ e.position = t.position,
+ e.zIndex = t.zIndex
+ }
+ var s = !1;
+ function l() {
+ var n;
+ t.$container && (e() ? s && (n = "onExpand",
+ function() {
+ var e = t.ext.fullscreen.getFullscreenElement(),
+ n = document.body;
+ o(e.style, r),
+ i = {
+ overflow: n.style.overflow,
+ padding: n.style.padding ? n.style.padding: null,
+ paddingTop: n.style.paddingTop ? n.style.paddingTop: null,
+ paddingRight: n.style.paddingRight ? n.style.paddingRight: null,
+ paddingBottom: n.style.paddingBottom ? n.style.paddingBottom: null,
+ paddingLeft: n.style.paddingLeft ? n.style.paddingLeft: null
+ },
+ n.style.padding && (n.style.padding = "0"),
+ n.style.paddingTop && (n.style.paddingTop = "0"),
+ n.style.paddingRight && (n.style.paddingRight = "0"),
+ n.style.paddingBottom && (n.style.paddingBottom = "0"),
+ n.style.paddingLeft && (n.style.paddingLeft = "0"),
+ n.style.overflow = "hidden",
+ e.style.width = "100vw",
+ e.style.height = "100vh",
+ e.style.top = "0px",
+ e.style.left = "0px",
+ e.style.position = "absolute",
+ e.style.zIndex = 1,
+ r.modified = !0,
+ a = function(t) {
+ for (var e = t.parentNode,
+ n = []; e && e.style;) n.push({
+ element: e,
+ originalPositioning: e.style.position
+ }),
+ e.style.position = "static",
+ e = e.parentNode;
+ return n
+ } (e)
+ } ()) : s && (s = !1, n = "onCollapse",
+ function() {
+ var e = t.ext.fullscreen.getFullscreenElement(),
+ n = document.body;
+ r.modified && (i.padding && (n.style.padding = i.padding), i.paddingTop && (n.style.paddingTop = i.paddingTop), i.paddingRight && (n.style.paddingRight = i.paddingRight), i.paddingBottom && (n.style.paddingBottom = i.paddingBottom), i.paddingLeft && (n.style.paddingLeft = i.paddingLeft), n.style.overflow = i.overflow, i = {
+ overflow: null,
+ padding: null,
+ paddingTop: null,
+ paddingRight: null,
+ paddingBottom: null,
+ paddingLeft: null
+ },
+ o(r, e.style), r.modified = !1),
+ function(t) {
+ t.forEach(function(t) {
+ t.element.style.position = t.originalPositioning
+ })
+ } (a),
+ a = null
+ } ()), setTimeout(function() {
+ t.render()
+ }), setTimeout(function() {
+ t.callEvent(n, [t.ext.fullscreen.getFullscreenElement()])
+ }))
+ }
+ function c() {
+ return ! t.$container || !t.ext.fullscreen.getFullscreenElement() || !n() && ((console.warning || console.log)("The `fullscreen` feature not being allowed, or full-screen mode not being supported"), !0)
+ }
+ t.ext.fullscreen = {
+ expand: function() {
+ if (!c() && !e() && t.callEvent("onBeforeExpand", [this.getFullscreenElement()])) {
+ s = !0;
+ var n = document.body,
+ i = n.webkitRequestFullscreen ? [Element.ALLOW_KEYBOARD_INPUT] : [],
+ r = n.msRequestFullscreen || n.mozRequestFullScreen || n.webkitRequestFullscreen || n.requestFullscreen;
+ r && r.apply(n, i)
+ }
+ },
+ collapse: function() {
+ if (!c() && e() && t.callEvent("onBeforeCollapse", [this.getFullscreenElement()])) {
+ var n = document.msExitFullscreen || document.mozCancelFullScreen || document.webkitExitFullscreen || document.exitFullscreen;
+ n && n.apply(document)
+ }
+ },
+ toggle: function() {
+ c() || (e() ? this.collapse() : this.expand())
+ },
+ getFullscreenElement: function() {
+ return t.$root
+ }
+ },
+ t.expand = function() {
+ t.ext.fullscreen.expand()
+ },
+ t.collapse = function() {
+ t.ext.fullscreen.collapse()
+ },
+ t.attachEvent("onGanttReady",
+ function() {
+ t.event(document, "webkitfullscreenchange", l),
+ t.event(document, "mozfullscreenchange", l),
+ t.event(document, "MSFullscreenChange", l),
+ t.event(document, "fullscreenChange", l),
+ t.event(document, "fullscreenchange", l)
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ var r = function(t) {
+ switch (i(t)) {
+ case "string":
+ return t;
+ case "boolean":
+ return t ? "true": "false";
+ case "number":
+ return isFinite(t) ? t: "";
+ default:
+ return ""
+ }
+ };
+ t.exports = function(t, e, n, l) {
+ return e = e || "&",
+ n = n || "=",
+ null === t && (t = void 0),
+ "object" === i(t) ? o(s(t),
+ function(i) {
+ var s = encodeURIComponent(r(i)) + n;
+ return a(t[i]) ? o(t[i],
+ function(t) {
+ return s + encodeURIComponent(r(t))
+ }).join(e) : s + encodeURIComponent(r(t[i]))
+ }).join(e) : l ? encodeURIComponent(r(l)) + n + encodeURIComponent(r(t)) : ""
+ };
+ var a = Array.isArray ||
+ function(t) {
+ return "[object Array]" === Object.prototype.toString.call(t)
+ };
+ function o(t, e) {
+ if (t.map) return t.map(e);
+ for (var n = [], i = 0; i < t.length; i++) n.push(e(t[i], i));
+ return n
+ }
+ var s = Object.keys ||
+ function(t) {
+ var e = [];
+ for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && e.push(n);
+ return e
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ function i(t, e) {
+ return Object.prototype.hasOwnProperty.call(t, e)
+ }
+ t.exports = function(t, e, n, a) {
+ e = e || "&",
+ n = n || "=";
+ var o = {};
+ if ("string" != typeof t || 0 === t.length) return o;
+ var s = /\+/g;
+ t = t.split(e);
+ var l = 1e3;
+ a && "number" == typeof a.maxKeys && (l = a.maxKeys);
+ var c = t.length;
+ l > 0 && c > l && (c = l);
+ for (var u = 0; u < c; ++u) {
+ var d, h, f, _, g = t[u].replace(s, "%20"),
+ p = g.indexOf(n);
+ p >= 0 ? (d = g.substr(0, p), h = g.substr(p + 1)) : (d = g, h = ""),
+ f = decodeURIComponent(d),
+ _ = decodeURIComponent(h),
+ i(o, f) ? r(o[f]) ? o[f].push(_) : o[f] = [o[f], _] : o[f] = _
+ }
+ return o
+ };
+ var r = Array.isArray ||
+ function(t) {
+ return "[object Array]" === Object.prototype.toString.call(t)
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ e.decode = e.parse = n(274),
+ e.encode = e.stringify = n(273)
+ },
+ function(t, e, n) {
+ "use strict";
+ function i(t) {
+ "@babel/helpers - typeof";
+ return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ t.exports = {
+ isString: function(t) {
+ return "string" == typeof t
+ },
+ isObject: function(t) {
+ return "object" === i(t) && null !== t
+ },
+ isNull: function(t) {
+ return null === t
+ },
+ isNullOrUndefined: function(t) {
+ return null == t
+ }
+ }
+ },
+ function(t, e) {
+ t.exports = function(t) {
+ return t.webpackPolyfill || (t.deprecate = function() {},
+ t.paths = [], t.children || (t.children = []), Object.defineProperty(t, "loaded", {
+ enumerable: !0,
+ get: function() {
+ return t.l
+ }
+ }), Object.defineProperty(t, "id", {
+ enumerable: !0,
+ get: function() {
+ return t.i
+ }
+ }), t.webpackPolyfill = 1),
+ t
+ }
+ },
+ function(t, e, n) { (function(t, i) {
+ var r;
+ function a(t) {
+ "@babel/helpers - typeof";
+ return (a = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ?
+ function(t) {
+ return typeof t
+ }: function(t) {
+ return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol": typeof t
+ })(t)
+ }
+ /*! https://mths.be/punycode v1.4.1 by @mathias */
+ !
+ function(o) {
+ var s = "object" == a(e) && e && !e.nodeType && e,
+ l = "object" == a(t) && t && !t.nodeType && t,
+ c = "object" == (void 0 === i ? "undefined": a(i)) && i;
+ c.global !== c && c.window !== c && c.self !== c || (o = c);
+ var u, d, h = 2147483647,
+ f = 36,
+ _ = 1,
+ g = 26,
+ p = 38,
+ v = 700,
+ m = 72,
+ y = 128,
+ k = "-",
+ b = /^xn--/,
+ x = /[^\x20-\x7E]/,
+ w = /[\x2E\u3002\uFF0E\uFF61]/g,
+ S = {
+ overflow: "Overflow: input needs wider integers to process",
+ "not-basic": "Illegal input >= 0x80 (not a basic code point)",
+ "invalid-input": "Invalid input"
+ },
+ T = f - _,
+ $ = Math.floor,
+ C = String.fromCharCode;
+ function E(t) {
+ throw new RangeError(S[t])
+ }
+ function A(t, e) {
+ for (var n = t.length,
+ i = []; n--;) i[n] = e(t[n]);
+ return i
+ }
+ function D(t, e) {
+ var n = t.split("@"),
+ i = "";
+ return n.length > 1 && (i = n[0] + "@", t = n[1]),
+ i + A((t = t.replace(w, ".")).split("."), e).join(".")
+ }
+ function M(t) {
+ for (var e, n, i = [], r = 0, a = t.length; r < a;)(e = t.charCodeAt(r++)) >= 55296 && e <= 56319 && r < a ? 56320 == (64512 & (n = t.charCodeAt(r++))) ? i.push(((1023 & e) << 10) + (1023 & n) + 65536) : (i.push(e), r--) : i.push(e);
+ return i
+ }
+ function I(t) {
+ return A(t,
+ function(t) {
+ var e = "";
+ return t > 65535 && (e += C((t -= 65536) >>> 10 & 1023 | 55296), t = 56320 | 1023 & t),
+ e += C(t)
+ }).join("")
+ }
+ function P(t) {
+ return t - 48 < 10 ? t - 22 : t - 65 < 26 ? t - 65 : t - 97 < 26 ? t - 97 : f
+ }
+ function N(t, e) {
+ return t + 22 + 75 * (t < 26) - ((0 != e) << 5)
+ }
+ function O(t, e, n) {
+ var i = 0;
+ for (t = n ? $(t / v) : t >> 1, t += $(t / e); t > T * g >> 1; i += f) t = $(t / T);
+ return $(i + (T + 1) * t / (t + p))
+ }
+ function L(t) {
+ var e, n, i, r, a, o, s, l, c, u, d = [],
+ p = t.length,
+ v = 0,
+ b = y,
+ x = m;
+ for ((n = t.lastIndexOf(k)) < 0 && (n = 0), i = 0; i < n; ++i) t.charCodeAt(i) >= 128 && E("not-basic"),
+ d.push(t.charCodeAt(i));
+ for (r = n > 0 ? n + 1 : 0; r < p;) {
+ for (a = v, o = 1, s = f; r >= p && E("invalid-input"), ((l = P(t.charCodeAt(r++))) >= f || l > $((h - v) / o)) && E("overflow"), v += l * o, !(l < (c = s <= x ? _: s >= x + g ? g: s - x)); s += f) o > $(h / (u = f - c)) && E("overflow"),
+ o *= u;
+ x = O(v - a, e = d.length + 1, 0 == a),
+ $(v / e) > h - b && E("overflow"),
+ b += $(v / e),
+ v %= e,
+ d.splice(v++, 0, b)
+ }
+ return I(d)
+ }
+ function R(t) {
+ var e, n, i, r, a, o, s, l, c, u, d, p, v, b, x, w = [];
+ for (p = (t = M(t)).length, e = y, n = 0, a = m, o = 0; o < p; ++o)(d = t[o]) < 128 && w.push(C(d));
+ for (i = r = w.length, r && w.push(k); i < p;) {
+ for (s = h, o = 0; o < p; ++o)(d = t[o]) >= e && d < s && (s = d);
+ for (s - e > $((h - n) / (v = i + 1)) && E("overflow"), n += (s - e) * v, e = s, o = 0; o < p; ++o) if ((d = t[o]) < e && ++n > h && E("overflow"), d == e) {
+ for (l = n, c = f; ! (l < (u = c <= a ? _: c >= a + g ? g: c - a)); c += f) x = l - u,
+ b = f - u,
+ w.push(C(N(u + x % b, 0))),
+ l = $(x / b);
+ w.push(C(N(l, 0))),
+ a = O(n, v, i == r),
+ n = 0,
+ ++i
+ }++n,
+ ++e
+ }
+ return w.join("")
+ }
+ if (u = {
+ version: "1.4.1",
+ ucs2: {
+ decode: M,
+ encode: I
+ },
+ decode: L,
+ encode: R,
+ toASCII: function(t) {
+ return D(t,
+ function(t) {
+ return x.test(t) ? "xn--" + R(t) : t
+ })
+ },
+ toUnicode: function(t) {
+ return D(t,
+ function(t) {
+ return b.test(t) ? L(t.slice(4).toLowerCase()) : t
+ })
+ }
+ },
+ "object" == a(n(53)) && n(53)) void 0 === (r = function() {
+ return u
+ }.call(e, n, e, t)) || (t.exports = r);
+ else if (s && l) if (t.exports == s) l.exports = u;
+ else for (d in u) u.hasOwnProperty(d) && (s[d] = u[d]);
+ else o.punycode = u
+ } (this)
+ }).call(this, n(277)(t), n(4))
+ },
+ function(t, e) {
+ t.exports = {
+ 100 : "Continue",
+ 101 : "Switching Protocols",
+ 102 : "Processing",
+ 200 : "OK",
+ 201 : "Created",
+ 202 : "Accepted",
+ 203 : "Non-Authoritative Information",
+ 204 : "No Content",
+ 205 : "Reset Content",
+ 206 : "Partial Content",
+ 207 : "Multi-Status",
+ 208 : "Already Reported",
+ 226 : "IM Used",
+ 300 : "Multiple Choices",
+ 301 : "Moved Permanently",
+ 302 : "Found",
+ 303 : "See Other",
+ 304 : "Not Modified",
+ 305 : "Use Proxy",
+ 307 : "Temporary Redirect",
+ 308 : "Permanent Redirect",
+ 400 : "Bad Request",
+ 401 : "Unauthorized",
+ 402 : "Payment Required",
+ 403 : "Forbidden",
+ 404 : "Not Found",
+ 405 : "Method Not Allowed",
+ 406 : "Not Acceptable",
+ 407 : "Proxy Authentication Required",
+ 408 : "Request Timeout",
+ 409 : "Conflict",
+ 410 : "Gone",
+ 411 : "Length Required",
+ 412 : "Precondition Failed",
+ 413 : "Payload Too Large",
+ 414 : "URI Too Long",
+ 415 : "Unsupported Media Type",
+ 416 : "Range Not Satisfiable",
+ 417 : "Expectation Failed",
+ 418 : "I'm a teapot",
+ 421 : "Misdirected Request",
+ 422 : "Unprocessable Entity",
+ 423 : "Locked",
+ 424 : "Failed Dependency",
+ 425 : "Unordered Collection",
+ 426 : "Upgrade Required",
+ 428 : "Precondition Required",
+ 429 : "Too Many Requests",
+ 431 : "Request Header Fields Too Large",
+ 451 : "Unavailable For Legal Reasons",
+ 500 : "Internal Server Error",
+ 501 : "Not Implemented",
+ 502 : "Bad Gateway",
+ 503 : "Service Unavailable",
+ 504 : "Gateway Timeout",
+ 505 : "HTTP Version Not Supported",
+ 506 : "Variant Also Negotiates",
+ 507 : "Insufficient Storage",
+ 508 : "Loop Detected",
+ 509 : "Bandwidth Limit Exceeded",
+ 510 : "Not Extended",
+ 511 : "Network Authentication Required"
+ }
+ },
+ function(t, e) {
+ t.exports = function() {
+ for (var t = {},
+ e = 0; e < arguments.length; e++) {
+ var i = arguments[e];
+ for (var r in i) n.call(i, r) && (t[r] = i[r])
+ }
+ return t
+ };
+ var n = Object.prototype.hasOwnProperty
+ },
+ function(t, e, n) {
+ var i = n(13).Buffer;
+ t.exports = function(t) {
+ if (t instanceof Uint8Array) {
+ if (0 === t.byteOffset && t.byteLength === t.buffer.byteLength) return t.buffer;
+ if ("function" == typeof t.buffer.slice) return t.buffer.slice(t.byteOffset, t.byteOffset + t.byteLength)
+ }
+ if (i.isBuffer(t)) {
+ for (var e = new Uint8Array(t.length), n = t.length, r = 0; r < n; r++) e[r] = t[r];
+ return e.buffer
+ }
+ throw new Error("Argument must be a Buffer")
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ t.exports = a;
+ var i = n(55),
+ r = n(17);
+ function a(t) {
+ if (! (this instanceof a)) return new a(t);
+ i.call(this, t)
+ }
+ r.inherits = n(8),
+ r.inherits(a, i),
+ a.prototype._transform = function(t, e, n) {
+ n(null, t)
+ }
+ },
+ function(t, e, n) { (function(e) {
+ function n(t) {
+ try {
+ if (!e.localStorage) return ! 1
+ } catch(t) {
+ return ! 1
+ }
+ var n = e.localStorage[t];
+ return null != n && "true" === String(n).toLowerCase()
+ }
+ t.exports = function(t, e) {
+ if (n("noDeprecation")) return t;
+ var i = !1;
+ return function() {
+ if (!i) {
+ if (n("throwDeprecation")) throw new Error(e);
+ n("traceDeprecation") ? console.trace(e) : console.warn(e),
+ i = !0
+ }
+ return t.apply(this, arguments)
+ }
+ }
+ }).call(this, n(4))
+ },
+ function(t, e, n) { (function(t, e) { !
+ function(t, n) {
+ "use strict";
+ if (!t.setImmediate) {
+ var i, r = 1,
+ a = {},
+ o = !1,
+ s = t.document,
+ l = Object.getPrototypeOf && Object.getPrototypeOf(t);
+ l = l && l.setTimeout ? l: t,
+ "[object process]" === {}.toString.call(t.process) ? i = function(t) {
+ e.nextTick(function() {
+ u(t)
+ })
+ }: function() {
+ if (t.postMessage && !t.importScripts) {
+ var e = !0,
+ n = t.onmessage;
+ return t.onmessage = function() {
+ e = !1
+ },
+ t.postMessage("", "*"),
+ t.onmessage = n,
+ e
+ }
+ } () ?
+ function() {
+ var e = "setImmediate$" + Math.random() + "$",
+ n = function(n) {
+ n.source === t && "string" == typeof n.data && 0 === n.data.indexOf(e) && u( + n.data.slice(e.length))
+ };
+ t.addEventListener ? t.addEventListener("message", n, !1) : t.attachEvent("onmessage", n),
+ i = function(n) {
+ t.postMessage(e + n, "*")
+ }
+ } () : t.MessageChannel ?
+ function() {
+ var t = new MessageChannel;
+ t.port1.onmessage = function(t) {
+ u(t.data)
+ },
+ i = function(e) {
+ t.port2.postMessage(e)
+ }
+ } () : s && "onreadystatechange" in s.createElement("script") ?
+ function() {
+ var t = s.documentElement;
+ i = function(e) {
+ var n = s.createElement("script");
+ n.onreadystatechange = function() {
+ u(e),
+ n.onreadystatechange = null,
+ t.removeChild(n),
+ n = null
+ },
+ t.appendChild(n)
+ }
+ } () : i = function(t) {
+ setTimeout(u, 0, t)
+ },
+ l.setImmediate = function(t) {
+ "function" != typeof t && (t = new Function("" + t));
+ for (var e = new Array(arguments.length - 1), n = 0; n < e.length; n++) e[n] = arguments[n + 1];
+ var o = {
+ callback: t,
+ args: e
+ };
+ return a[r] = o,
+ i(r),
+ r++
+ },
+ l.clearImmediate = c
+ }
+ function c(t) {
+ delete a[t]
+ }
+ function u(t) {
+ if (o) setTimeout(u, 0, t);
+ else {
+ var e = a[t];
+ if (e) {
+ o = !0;
+ try { !
+ function(t) {
+ var e = t.callback,
+ i = t.args;
+ switch (i.length) {
+ case 0:
+ e();
+ break;
+ case 1:
+ e(i[0]);
+ break;
+ case 2:
+ e(i[0], i[1]);
+ break;
+ case 3:
+ e(i[0], i[1], i[2]);
+ break;
+ default:
+ e.apply(n, i)
+ }
+ } (e)
+ } finally {
+ c(t),
+ o = !1
+ }
+ }
+ }
+ }
+ } ("undefined" == typeof self ? void 0 === t ? this: t: self)
+ }).call(this, n(4), n(9))
+ },
+ function(t, e) {},
+ function(t, e, n) {
+ "use strict";
+ var i = n(22).Buffer,
+ r = n(285);
+ function a(t, e, n) {
+ t.copy(e, n)
+ }
+ t.exports = function() {
+ function t() { !
+ function(t, e) {
+ if (! (t instanceof e)) throw new TypeError("Cannot call a class as a function")
+ } (this, t),
+ this.head = null,
+ this.tail = null,
+ this.length = 0
+ }
+ return t.prototype.push = function(t) {
+ var e = {
+ data: t,
+ next: null
+ };
+ this.length > 0 ? this.tail.next = e: this.head = e,
+ this.tail = e,
+ ++this.length
+ },
+ t.prototype.unshift = function(t) {
+ var e = {
+ data: t,
+ next: this.head
+ };
+ 0 === this.length && (this.tail = e),
+ this.head = e,
+ ++this.length
+ },
+ t.prototype.shift = function() {
+ if (0 !== this.length) {
+ var t = this.head.data;
+ return 1 === this.length ? this.head = this.tail = null: this.head = this.head.next,
+ --this.length,
+ t
+ }
+ },
+ t.prototype.clear = function() {
+ this.head = this.tail = null,
+ this.length = 0
+ },
+ t.prototype.join = function(t) {
+ if (0 === this.length) return "";
+ for (var e = this.head,
+ n = "" + e.data; e = e.next;) n += t + e.data;
+ return n
+ },
+ t.prototype.concat = function(t) {
+ if (0 === this.length) return i.alloc(0);
+ if (1 === this.length) return this.head.data;
+ for (var e = i.allocUnsafe(t >>> 0), n = this.head, r = 0; n;) a(n.data, e, r),
+ r += n.data.length,
+ n = n.next;
+ return e
+ },
+ t
+ } (),
+ r && r.inspect && r.inspect.custom && (t.exports.prototype[r.inspect.custom] = function() {
+ var t = r.inspect({
+ length: this.length
+ });
+ return this.constructor.name + " " + t
+ })
+ },
+ function(t, e) {},
+ function(t, e, n) { (function(e, i, r) {
+ var a = n(65),
+ o = n(8),
+ s = n(64),
+ l = n(63),
+ c = n(281),
+ u = s.IncomingMessage,
+ d = s.readyStates;
+ var h = t.exports = function(t) {
+ var n, i = this;
+ l.Writable.call(i),
+ i._opts = t,
+ i._body = [],
+ i._headers = {},
+ t.auth && i.setHeader("Authorization", "Basic " + new e(t.auth).toString("base64")),
+ Object.keys(t.headers).forEach(function(e) {
+ i.setHeader(e, t.headers[e])
+ });
+ var r = !0;
+ if ("disable-fetch" === t.mode || "requestTimeout" in t && !a.abortController) r = !1,
+ n = !0;
+ else if ("prefer-streaming" === t.mode) n = !1;
+ else if ("allow-wrong-content-type" === t.mode) n = !a.overrideMimeType;
+ else {
+ if (t.mode && "default" !== t.mode && "prefer-fast" !== t.mode) throw new Error("Invalid value for opts.mode");
+ n = !0
+ }
+ i._mode = function(t, e) {
+ return a.fetch && e ? "fetch": a.mozchunkedarraybuffer ? "moz-chunked-arraybuffer": a.msstream ? "ms-stream": a.arraybuffer && t ? "arraybuffer": a.vbArray && t ? "text:vbarray": "text"
+ } (n, r),
+ i._fetchTimer = null,
+ i.on("finish",
+ function() {
+ i._onFinish()
+ })
+ };
+ o(h, l.Writable),
+ h.prototype.setHeader = function(t, e) {
+ var n = t.toLowerCase(); - 1 === f.indexOf(n) && (this._headers[n] = {
+ name: t,
+ value: e
+ })
+ },
+ h.prototype.getHeader = function(t) {
+ var e = this._headers[t.toLowerCase()];
+ return e ? e.value: null
+ },
+ h.prototype.removeHeader = function(t) {
+ delete this._headers[t.toLowerCase()]
+ },
+ h.prototype._onFinish = function() {
+ var t = this;
+ if (!t._destroyed) {
+ var n = t._opts,
+ o = t._headers,
+ s = null;
+ "GET" !== n.method && "HEAD" !== n.method && (s = a.arraybuffer ? c(e.concat(t._body)) : a.blobConstructor ? new i.Blob(t._body.map(function(t) {
+ return c(t)
+ }), {
+ type: (o["content-type"] || {}).value || ""
+ }) : e.concat(t._body).toString());
+ var l = [];
+ if (Object.keys(o).forEach(function(t) {
+ var e = o[t].name,
+ n = o[t].value;
+ Array.isArray(n) ? n.forEach(function(t) {
+ l.push([e, t])
+ }) : l.push([e, n])
+ }), "fetch" === t._mode) {
+ var u = null;
+ if (a.abortController) {
+ var h = new AbortController;
+ u = h.signal,
+ t._fetchAbortController = h,
+ "requestTimeout" in n && 0 !== n.requestTimeout && (t._fetchTimer = i.setTimeout(function() {
+ t.emit("requestTimeout"),
+ t._fetchAbortController && t._fetchAbortController.abort()
+ },
+ n.requestTimeout))
+ }
+ i.fetch(t._opts.url, {
+ method: t._opts.method,
+ headers: l,
+ body: s || void 0,
+ mode: "cors",
+ credentials: n.withCredentials ? "include": "same-origin",
+ signal: u
+ }).then(function(e) {
+ t._fetchResponse = e,
+ t._connect()
+ },
+ function(e) {
+ i.clearTimeout(t._fetchTimer),
+ t._destroyed || t.emit("error", e)
+ })
+ } else {
+ var f = t._xhr = new i.XMLHttpRequest;
+ try {
+ f.open(t._opts.method, t._opts.url, !0)
+ } catch(e) {
+ return void r.nextTick(function() {
+ t.emit("error", e)
+ })
+ }
+ "responseType" in f && (f.responseType = t._mode.split(":")[0]),
+ "withCredentials" in f && (f.withCredentials = !!n.withCredentials),
+ "text" === t._mode && "overrideMimeType" in f && f.overrideMimeType("text/plain; charset=x-user-defined"),
+ "requestTimeout" in n && (f.timeout = n.requestTimeout, f.ontimeout = function() {
+ t.emit("requestTimeout")
+ }),
+ l.forEach(function(t) {
+ f.setRequestHeader(t[0], t[1])
+ }),
+ t._response = null,
+ f.onreadystatechange = function() {
+ switch (f.readyState) {
+ case d.LOADING:
+ case d.DONE:
+ t._onXHRProgress()
+ }
+ },
+ "moz-chunked-arraybuffer" === t._mode && (f.onprogress = function() {
+ t._onXHRProgress()
+ }),
+ f.onerror = function() {
+ t._destroyed || t.emit("error", new Error("XHR error"))
+ };
+ try {
+ f.send(s)
+ } catch(e) {
+ return void r.nextTick(function() {
+ t.emit("error", e)
+ })
+ }
+ }
+ }
+ },
+ h.prototype._onXHRProgress = function() { (function(t) {
+ try {
+ var e = t.status;
+ return null !== e && 0 !== e
+ } catch(t) {
+ return ! 1
+ }
+ })(this._xhr) && !this._destroyed && (this._response || this._connect(), this._response._onXHRProgress())
+ },
+ h.prototype._connect = function() {
+ var t = this;
+ t._destroyed || (t._response = new u(t._xhr, t._fetchResponse, t._mode, t._fetchTimer), t._response.on("error",
+ function(e) {
+ t.emit("error", e)
+ }), t.emit("response", t._response))
+ },
+ h.prototype._write = function(t, e, n) {
+ this._body.push(t),
+ n()
+ },
+ h.prototype.abort = h.prototype.destroy = function() {
+ this._destroyed = !0,
+ i.clearTimeout(this._fetchTimer),
+ this._response && (this._response._destroyed = !0),
+ this._xhr ? this._xhr.abort() : this._fetchAbortController && this._fetchAbortController.abort()
+ },
+ h.prototype.end = function(t, e, n) {
+ "function" == typeof t && (n = t, t = void 0),
+ l.Writable.prototype.end.call(this, t, e, n)
+ },
+ h.prototype.flushHeaders = function() {},
+ h.prototype.setTimeout = function() {},
+ h.prototype.setNoDelay = function() {},
+ h.prototype.setSocketKeepAlive = function() {};
+ var f = ["accept-charset", "accept-encoding", "access-control-request-headers", "access-control-request-method", "connection", "content-length", "cookie", "cookie2", "date", "dnt", "expect", "host", "keep-alive", "origin", "referer", "te", "trailer", "transfer-encoding", "upgrade", "via"]
+ }).call(this, n(13).Buffer, n(4), n(9))
+ },
+ function(t, e, n) {
+ var i = n(66),
+ r = n(54),
+ a = t.exports;
+ for (var o in i) i.hasOwnProperty(o) && (a[o] = i[o]);
+ function s(t) {
+ if ("string" == typeof t && (t = r.parse(t)), t.protocol || (t.protocol = "https:"), "https:" !== t.protocol) throw new Error('Protocol "' + t.protocol + '" not supported. Expected "https:"');
+ return t
+ }
+ a.request = function(t, e) {
+ return t = s(t),
+ i.request.call(this, t, e)
+ },
+ a.get = function(t, e) {
+ return t = s(t),
+ i.get.call(this, t, e)
+ }
+ },
+ function(t, e) {
+ e.read = function(t, e, n, i, r) {
+ var a, o, s = 8 * r - i - 1,
+ l = (1 << s) - 1,
+ c = l >> 1,
+ u = -7,
+ d = n ? r - 1 : 0,
+ h = n ? -1 : 1,
+ f = t[e + d];
+ for (d += h, a = f & (1 << -u) - 1, f >>= -u, u += s; u > 0; a = 256 * a + t[e + d], d += h, u -= 8);
+ for (o = a & (1 << -u) - 1, a >>= -u, u += i; u > 0; o = 256 * o + t[e + d], d += h, u -= 8);
+ if (0 === a) a = 1 - c;
+ else {
+ if (a === l) return o ? NaN: 1 / 0 * (f ? -1 : 1);
+ o += Math.pow(2, i),
+ a -= c
+ }
+ return (f ? -1 : 1) * o * Math.pow(2, a - i)
+ },
+ e.write = function(t, e, n, i, r, a) {
+ var o, s, l, c = 8 * a - r - 1,
+ u = (1 << c) - 1,
+ d = u >> 1,
+ h = 23 === r ? Math.pow(2, -24) - Math.pow(2, -77) : 0,
+ f = i ? 0 : a - 1,
+ _ = i ? 1 : -1,
+ g = e < 0 || 0 === e && 1 / e < 0 ? 1 : 0;
+ for (e = Math.abs(e), isNaN(e) || e === 1 / 0 ? (s = isNaN(e) ? 1 : 0, o = u) : (o = Math.floor(Math.log(e) / Math.LN2), e * (l = Math.pow(2, -o)) < 1 && (o--, l *= 2), (e += o + d >= 1 ? h / l: h * Math.pow(2, 1 - d)) * l >= 2 && (o++, l /= 2), o + d >= u ? (s = 0, o = u) : o + d >= 1 ? (s = (e * l - 1) * Math.pow(2, r), o += d) : (s = e * Math.pow(2, d - 1) * Math.pow(2, r), o = 0)); r >= 8; t[n + f] = 255 & s, f += _, s /= 256, r -= 8);
+ for (o = o << r | s, c += r; c > 0; t[n + f] = 255 & o, f += _, o /= 256, c -= 8);
+ t[n + f - _] |= 128 * g
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ e.byteLength = function(t) {
+ var e = c(t),
+ n = e[0],
+ i = e[1];
+ return 3 * (n + i) / 4 - i
+ },
+ e.toByteArray = function(t) {
+ for (var e, n = c(t), i = n[0], o = n[1], s = new a(function(t, e, n) {
+ return 3 * (e + n) / 4 - n
+ } (0, i, o)), l = 0, u = o > 0 ? i - 4 : i, d = 0; d < u; d += 4) e = r[t.charCodeAt(d)] << 18 | r[t.charCodeAt(d + 1)] << 12 | r[t.charCodeAt(d + 2)] << 6 | r[t.charCodeAt(d + 3)],
+ s[l++] = e >> 16 & 255,
+ s[l++] = e >> 8 & 255,
+ s[l++] = 255 & e;
+ 2 === o && (e = r[t.charCodeAt(d)] << 2 | r[t.charCodeAt(d + 1)] >> 4, s[l++] = 255 & e);
+ 1 === o && (e = r[t.charCodeAt(d)] << 10 | r[t.charCodeAt(d + 1)] << 4 | r[t.charCodeAt(d + 2)] >> 2, s[l++] = e >> 8 & 255, s[l++] = 255 & e);
+ return s
+ },
+ e.fromByteArray = function(t) {
+ for (var e, n = t.length,
+ r = n % 3,
+ a = [], o = 0, s = n - r; o < s; o += 16383) a.push(d(t, o, o + 16383 > s ? s: o + 16383));
+ 1 === r ? (e = t[n - 1], a.push(i[e >> 2] + i[e << 4 & 63] + "==")) : 2 === r && (e = (t[n - 2] << 8) + t[n - 1], a.push(i[e >> 10] + i[e >> 4 & 63] + i[e << 2 & 63] + "="));
+ return a.join("")
+ };
+ for (var i = [], r = [], a = "undefined" != typeof Uint8Array ? Uint8Array: Array, o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s = 0, l = o.length; s < l; ++s) i[s] = o[s],
+ r[o.charCodeAt(s)] = s;
+ function c(t) {
+ var e = t.length;
+ if (e % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
+ var n = t.indexOf("=");
+ return - 1 === n && (n = e),
+ [n, n === e ? 0 : 4 - n % 4]
+ }
+ function u(t) {
+ return i[t >> 18 & 63] + i[t >> 12 & 63] + i[t >> 6 & 63] + i[63 & t]
+ }
+ function d(t, e, n) {
+ for (var i, r = [], a = e; a < n; a += 3) i = (t[a] << 16 & 16711680) + (t[a + 1] << 8 & 65280) + (255 & t[a + 2]),
+ r.push(u(i));
+ return r.join("")
+ }
+ r["-".charCodeAt(0)] = 62,
+ r["_".charCodeAt(0)] = 63
+ },
+ function(t, e, n) {
+ "use strict"; (function(t) {
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ e.
+ default = function(e) {
+ e.ext = e.ext || {},
+ e.ext.export_api = e.ext.export_api || {
+ _apiUrl: "https://export.dhtmlx.com/gantt",
+ getNodeJSTransport: function(t) {
+ var e, i, r = t.split("://")[0];
+ switch (r) {
+ case "https":
+ e = n(289),
+ i = 443;
+ break;
+ case "http":
+ e = n(66),
+ i = 80;
+ break;
+ default:
+ throw new Error("Unsupported protocol: " + r + ", url: " + t)
+ }
+ return {
+ module: e,
+ defaultPort: i
+ }
+ },
+ _prepareConfigPDF: function(t, n) {
+ if (t && t.raw) {
+ var i = null;
+ t.start && t.end && (i = {
+ start_date: e.config.start_date,
+ end_date: e.config.end_date
+ },
+ e.config.start_date = e.date.str_to_date(e.config.date_format)(t.start), e.config.end_date = e.date.str_to_date(e.config.date_format)(t.end)),
+ t = e.mixin(t, {
+ name: "gantt." + n,
+ data: e.ext.export_api._serializeHtml()
+ }),
+ i && (e.config.start_date = i.start_date, e.config.end_date = i.end_date)
+ } else t = e.mixin(t || {},
+ {
+ name: "gantt." + n,
+ data: e.ext.export_api._serializeAll(),
+ config: e.config
+ }),
+ e.ext.export_api._fixColumns(t.config.columns);
+ t.version = e.version,
+ e.ext.export_api._sendToExport(t, n)
+ },
+ exportToPDF: function(t) {
+ e.ext.export_api._prepareConfigPDF(t, "pdf")
+ },
+ exportToPNG: function(t) {
+ e.ext.export_api._prepareConfigPDF(t, "png")
+ },
+ exportToICal: function(t) {
+ t = e.mixin(t || {},
+ {
+ name: "gantt.ical",
+ data: e.ext.export_api._serializePlain().data,
+ version: e.version
+ }),
+ e.ext.export_api._sendToExport(t, "ical")
+ },
+ exportToExcel: function(t) {
+ var n, i, r, a;
+ t = t || {};
+ var o = e.config.smart_rendering;
+ if ("base-colors" === t.visual && (e.config.smart_rendering = !1), t.start || t.end) {
+ r = e.getState(),
+ i = [e.config.start_date, e.config.end_date],
+ a = e.getScrollState();
+ var s = e.date.str_to_date(e.config.date_format);
+ n = e.eachTask,
+ t.start && (e.config.start_date = s(t.start)),
+ t.end && (e.config.end_date = s(t.end)),
+ e.render(),
+ e.config.smart_rendering = o,
+ e.eachTask = e.ext.export_api._eachTaskTimed(e.config.start_date, e.config.end_date)
+ } else "base-colors" === t.visual && (e.render(), e.config.smart_rendering = o);
+ e._no_progress_colors = "base-colors" === t.visual;
+ var l = null;
+ e.env.isNode || (l = e.ext.export_api._serializeTable(t).data),
+ (t = e.mixin(t, {
+ name: "gantt.xlsx",
+ title: "Tasks",
+ data: l,
+ columns: e.ext.export_api._serializeColumns({
+ rawDates: !0
+ }),
+ version: e.version
+ })).visual && (t.scales = e.ext.export_api._serializeScales(t)),
+ e.ext.export_api._sendToExport(t, "excel"),
+ (t.start || t.end) && (e.config.start_date = r.min_date, e.config.end_date = r.max_date, e.eachTask = n, e.render(), e.scrollTo(a.x, a.y), e.config.start_date = i[0], e.config.end_date = i[1])
+ },
+ exportToJSON: function(t) {
+ t = e.mixin(t || {},
+ {
+ name: "gantt.json",
+ data: e.ext.export_api._serializeAll(),
+ config: e.config,
+ columns: e.ext.export_api._serializeColumns(),
+ worktime: e.ext.export_api._getWorktimeSettings(),
+ version: e.version
+ }),
+ e.ext.export_api._sendToExport(t, "json")
+ },
+ importFromExcel: function(t) {
+ try {
+ var n = t.data;
+ if (n instanceof FormData);
+ else if (n instanceof File) {
+ var i = new FormData;
+ i.append("file", n),
+ t.data = i
+ }
+ } catch(t) {}
+ e.env.isNode ? e.ext.export_api._nodejsImportExcel(t) : e.ext.export_api._sendImportAjaxExcel(t)
+ },
+ importFromMSProject: function(t) {
+ var n = t.data;
+ try {
+ if (n instanceof FormData);
+ else if (n instanceof File) {
+ var i = new FormData;
+ i.append("file", n),
+ t.data = i
+ }
+ } catch(t) {}
+ e.env.isNode ? e.ext.export_api._nodejsImportMSP(t) : e.ext.export_api._sendImportAjaxMSP(t)
+ },
+ importFromPrimaveraP6: function(t) {
+ return t.type = "primaveraP6-parse",
+ e.importFromMSProject(t)
+ },
+ exportToMSProject: function(t) { (t = t || {}).skip_circular_links = void 0 === t.skip_circular_links || !!t.skip_circular_links;
+ var n = e.templates.xml_format,
+ i = e.templates.format_date,
+ r = e.config.xml_date,
+ a = e.config.date_format;
+ e.config.xml_date = "%d-%m-%Y %H:%i:%s",
+ e.config.date_format = "%d-%m-%Y %H:%i:%s",
+ e.templates.xml_format = e.date.date_to_str("%d-%m-%Y %H:%i:%s"),
+ e.templates.format_date = e.date.date_to_str("%d-%m-%Y %H:%i:%s");
+ var o = e.ext.export_api._serializeAll();
+ e.ext.export_api._customProjectProperties(o, t),
+ e.ext.export_api._customTaskProperties(o, t),
+ t.skip_circular_links && e.ext.export_api._clearRecLinks(o),
+ t = e.ext.export_api._exportConfig(o, t),
+ e.ext.export_api._sendToExport(t, t.type || "msproject"),
+ e.config.xml_date = r,
+ e.config.date_format = a,
+ e.templates.xml_format = n,
+ e.templates.format_date = i,
+ e.config.$custom_data = null,
+ e.config.custom = null
+ },
+ exportToPrimaveraP6: function(t) {
+ return (t = t || {}).type = "primaveraP6",
+ e.exportToMSProject(t)
+ },
+ _nodejsImportExcel: function(t) {
+ var i = n(52),
+ r = t.server || e.ext.export_api._apiUrl,
+ a = e.ext.export_api.getNodeJSTransport(r),
+ o = r.split("://")[1],
+ s = o.split("/")[0].split(":"),
+ l = o.split("/"),
+ c = {
+ hostname: s[0],
+ port: s[1] || a.defaultPort,
+ path: "/" + l.slice(1).join("/"),
+ method: "POST",
+ headers: {
+ "X-Requested-With": "XMLHttpRequest"
+ }
+ },
+ u = new i;
+ u.append("file", t.data),
+ u.append("type", "excel-parse"),
+ u.append("data", JSON.stringify({
+ sheet: t.sheet || 0
+ })),
+ c.headers["Content-Type"] = u.getHeaders()["content-type"];
+ var d = a.module.request(c,
+ function(e) {
+ var n = "";
+ e.on("data",
+ function(t) {
+ n += t
+ }),
+ e.on("end",
+ function(e) {
+ t.callback(n.toString())
+ })
+ });
+ d.on("error",
+ function(t) {
+ console.error(t)
+ }),
+ u.pipe(d)
+ },
+ _nodejsImportMSP: function(t) {
+ var i = n(52),
+ r = t.server || e.ext.export_api._apiUrl,
+ a = e.ext.export_api.getNodeJSTransport(r),
+ o = r.split("://")[1],
+ s = o.split("/")[0].split(":"),
+ l = o.split("/"),
+ c = {
+ hostname: s[0],
+ port: s[1] || a.defaultPort,
+ path: "/" + l.slice(1).join("/"),
+ method: "POST",
+ headers: {
+ "X-Requested-With": "XMLHttpRequest"
+ }
+ },
+ u = {
+ durationUnit: t.durationUnit || void 0,
+ projectProperties: t.projectProperties || void 0,
+ taskProperties: t.taskProperties || void 0
+ },
+ d = new i;
+ d.append("file", t.data),
+ d.append("type", t.type || "msproject-parse"),
+ d.append("data", JSON.stringify(u), c),
+ c.headers["Content-Type"] = d.getHeaders()["content-type"];
+ var h = a.module.request(c,
+ function(e) {
+ var n = "";
+ e.on("data",
+ function(t) {
+ n += t
+ }),
+ e.on("end",
+ function(e) {
+ t.callback(n.toString())
+ })
+ });
+ h.on("error",
+ function(t) {
+ console.error(t)
+ }),
+ d.pipe(h)
+ },
+ _fixColumns: function(t) {
+ for (var n = 0; n < t.length; n++) t[n].label = t[n].label || e.locale.labels["column_" + t[n].name],
+ "string" == typeof t[n].width && (t[n].width = 1 * t[n].width)
+ },
+ _xdr: function(t, n, i) {
+ e.env.isNode ? e.ext.export_api._nodejsPostRequest(t, n, i) : e.ajax.post(t, n, i)
+ },
+ _nodejsPostRequest: function(n, i, r) {
+ var a = e.ext.export_api.getNodeJSTransport(n),
+ o = n.split("://")[1],
+ s = o.split("/")[0].split(":"),
+ l = o.split("/"),
+ c = {
+ hostname: s[0],
+ port: s[1] || a.defaultPort,
+ path: "/" + l.slice(1).join("/"),
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "Content-Length": JSON.stringify(i).length
+ }
+ },
+ u = a.module.request(c,
+ function(e) {
+ var n = [];
+ e.on("data",
+ function(t) {
+ n.push(t)
+ }),
+ e.on("end",
+ function(e) {
+ r(t.concat(n))
+ })
+ });
+ u.on("error",
+ function(t) {
+ console.error(t)
+ }),
+ u.write(JSON.stringify(i)),
+ u.end()
+ },
+ _markColumns: function(t) {
+ var e = t.config.columns;
+ if (e) for (var n = 0; n < e.length; n++) e[n].template && (e[n].$template = !0)
+ },
+ _sendImportAjaxExcel: function(t) {
+ var n = t.server || e.ext.export_api._apiUrl,
+ i = t.store || 0,
+ r = t.data,
+ a = t.callback;
+ r.append("type", "excel-parse"),
+ r.append("data", JSON.stringify({
+ sheet: t.sheet || 0
+ })),
+ i && r.append("store", i);
+ var o = new XMLHttpRequest;
+ o.onreadystatechange = function(t) {
+ 4 === o.readyState && 0 === o.status && a && a(null)
+ },
+ o.onload = function() {
+ var t = null;
+ if (! (o.status > 400)) try {
+ t = JSON.parse(o.responseText)
+ } catch(t) {}
+ a && a(t)
+ },
+ o.open("POST", n, !0),
+ o.setRequestHeader("X-Requested-With", "XMLHttpRequest"),
+ o.send(r)
+ },
+ _ajaxToExport: function(t, n, i) {
+ delete t.callback;
+ var r = t.server || e.ext.export_api._apiUrl,
+ a = "type=" + n + "&store=1&data=" + encodeURIComponent(JSON.stringify(t));
+ e.ext.export_api._xdr(r, a,
+ function(t) {
+ var e = t.xmlDoc || t,
+ n = null;
+ if (! (e.status > 400)) try {
+ n = JSON.parse(e.responseText)
+ } catch(t) {}
+ i(n)
+ })
+ },
+ _serializableGanttConfig: function(t) {
+ var n = e.mixin({},
+ t);
+ return n.columns && (n.columns = n.columns.map(function(t) {
+ var n = e.mixin({},
+ t);
+ return delete n.editor,
+ n
+ })),
+ delete n.editor_types,
+ n
+ },
+ _sendToExport: function(t, n) {
+ var i = e.date.date_to_str(e.config.date_format || e.config.xml_date);
+ if (t.config && (t.config = e.copy(e.ext.export_api._serializableGanttConfig(t.config)), e.ext.export_api._markColumns(t, n), t.config.start_date && t.config.end_date && (t.config.start_date instanceof Date && (t.config.start_date = i(t.config.start_date)), t.config.end_date instanceof Date && (t.config.end_date = i(t.config.end_date)))), e.env.isNode) {
+ var r = t.server || e.ext.export_api._apiUrl,
+ a = {
+ type: n,
+ store: 0,
+ data: JSON.stringify(t)
+ },
+ o = t.callback ||
+ function(t) {
+ console.log(t)
+ };
+ return e.ext.export_api._xdr(r, a, o)
+ }
+ if (t.callback) return e.ext.export_api._ajaxToExport(t, n, t.callback);
+ var s = e.ext.export_api._createHiddenForm();
+ s.firstChild.action = t.server || e.ext.export_api._apiUrl,
+ s.firstChild.childNodes[0].value = JSON.stringify(t),
+ s.firstChild.childNodes[1].value = n,
+ s.firstChild.submit()
+ },
+ _createHiddenForm: function() {
+ if (!e.ext.export_api._hidden_export_form) {
+ var t = e.ext.export_api._hidden_export_form = document.createElement("div");
+ t.style.display = "none",
+ t.innerHTML = "<form method='POST' target='_blank'><textarea name='data' style='width:0px; height:0px;' readonly='true'></textarea><input type='hidden' name='type' value=''></form>",
+ document.body.appendChild(t)
+ }
+ return e.ext.export_api._hidden_export_form
+ },
+ _copyObjectBase: function(t) {
+ var n = {
+ start_date: void 0,
+ end_date: void 0
+ };
+ for (var i in t)"$" !== i.charAt(0) && (n[i] = t[i]);
+ var r = e.templates.xml_format || e.templates.format_date;
+ return n.start_date = r(n.start_date),
+ n.end_date && (n.end_date = r(n.end_date)),
+ n
+ },
+ _color_box: null,
+ _color_hash: {},
+ _getStyles: function(t) {
+ if (e.ext.export_api._color_box || (e.ext.export_api._color_box = document.createElement("DIV"), e.ext.export_api._color_box.style.cssText = "position:absolute; display:none;", document.body.appendChild(e.ext.export_api._color_box)), e.ext.export_api._color_hash[t]) return e.ext.export_api._color_hash[t];
+ e.ext.export_api._color_box.className = t;
+ var n = e.ext.export_api._getColor(e.ext.export_api._color_box, "color"),
+ i = e.ext.export_api._getColor(e.ext.export_api._color_box, "backgroundColor");
+ return e.ext.export_api._color_hash[t] = n + ";" + i
+ },
+ _getMinutesWorktimeSettings: function(t) {
+ var e = [];
+ return t.forEach(function(t) {
+ e.push(t.startMinute),
+ e.push(t.endMinute)
+ }),
+ e
+ },
+ _getWorktimeSettings: function() {
+ var t, n = {
+ hours: [0, 24],
+ minutes: null,
+ dates: {
+ 0 : !0,
+ 1 : !0,
+ 2 : !0,
+ 3 : !0,
+ 4 : !0,
+ 5 : !0,
+ 6 : !0
+ }
+ };
+ if (e.config.work_time) {
+ var i = e._working_time_helper;
+ if (i && i.get_calendar) t = i.get_calendar();
+ else if (i) t = {
+ hours: i.hours,
+ minutes: null,
+ dates: i.dates
+ };
+ else if (e.config.worktimes && e.config.worktimes.global) {
+ var r = e.config.worktimes.global;
+ if (r.parsed) {
+ var a = e.ext.export_api._getMinutesWorktimeSettings(r.parsed.hours);
+ for (var o in t = {
+ hours: null,
+ minutes: a,
+ dates: {}
+ },
+ r.parsed.dates) Array.isArray(r.parsed.dates[o]) ? t.dates[o] = e.ext.export_api._getMinutesWorktimeSettings(r.parsed.dates[o]) : t.dates[o] = r.parsed.dates[o]
+ } else t = {
+ hours: r.hours,
+ minutes: null,
+ dates: r.dates
+ }
+ } else t = n
+ } else t = n;
+ return t
+ },
+ _eachTaskTimed: function(t, n) {
+ return function(i, r, a) {
+ r = r || e.config.root_id,
+ a = a || e;
+ var o = e.getChildren(r);
+ if (o) for (var s = 0; s < o.length; s++) {
+ var l = e._pull[o[s]]; (!t || l.end_date > t) && (!n || l.start_date < n) && i.call(a, l),
+ e.hasChild(l.id) && e.eachTask(i, l.id, a)
+ }
+ }
+ },
+ _originalCopyObject: e.json._copyObject,
+ _copyObjectPlain: function(t) {
+ var n = e.templates.task_text(t.start_date, t.end_date, t),
+ i = e.ext.export_api._copyObjectBase(t);
+ return i.text = n || i.text,
+ i
+ },
+ _getColor: function(t, e) {
+ var n = t.currentStyle ? t.currentStyle[e] : getComputedStyle(t, null)[e],
+ i = n.replace(/\s/g, "").match(/^rgba?\((\d+),(\d+),(\d+)/i);
+ return (i && 4 === i.length ? ("0" + parseInt(i[1], 10).toString(16)).slice( - 2) + ("0" + parseInt(i[2], 10).toString(16)).slice( - 2) + ("0" + parseInt(i[3], 10).toString(16)).slice( - 2) : n).replace("#", "")
+ },
+ _copyObjectTable: function(t) {
+ var n = e.date.date_to_str("%Y-%m-%dT%H:%i:%s.000Z"),
+ i = e.ext.export_api._copyObjectColumns(t, e.ext.export_api._copyObjectPlain(t));
+ i.start_date && (i.start_date = n(t.start_date)),
+ i.end_date && (i.end_date = n(t.end_date));
+ var r = e._day_index_by_date ? e._day_index_by_date: e.columnIndexByDate;
+ i.$start = r.call(e, t.start_date),
+ i.$end = r.call(e, t.end_date);
+ var a = 0,
+ o = e.getScale().width;
+ if (o.indexOf(0) > -1) {
+ for (var s = 0; s < i.$start; s++) o[s] || a++;
+ for (i.$start -= a; s < i.$end; s++) o[s] || a++;
+ i.$end -= a
+ }
+ i.$level = t.$level,
+ i.$type = t.$rendered_type;
+ var l = e.templates;
+ return i.$text = l.task_text(t.start, t.end_date, t),
+ i.$left = l.leftside_text ? l.leftside_text(t.start, t.end_date, t) : "",
+ i.$right = l.rightside_text ? l.rightside_text(t.start, t.end_date, t) : "",
+ i
+ },
+ _copyObjectColors: function(t) {
+ var n = e.ext.export_api._copyObjectTable(t),
+ i = e.getTaskNode(t.id);
+ if (i && i.firstChild) {
+ var r = e.ext.export_api._getColor(e._no_progress_colors ? i: i.firstChild, "backgroundColor");
+ "363636" === r && (r = e.ext.export_api._getColor(i, "backgroundColor")),
+ n.$color = r
+ } else t.color && (n.$color = t.color);
+ return n
+ },
+ _copyObjectColumns: function(t, n) {
+ for (var i = 0; i < e.config.columns.length; i++) {
+ var r = e.config.columns[i].template;
+ if (r) {
+ var a = r(t);
+ a instanceof Date && (a = e.templates.date_grid(a, t)),
+ n["_" + i] = a
+ }
+ }
+ return n
+ },
+ _copyObjectAll: function(t) {
+ for (var n = e.ext.export_api._copyObjectBase(t), i = ["leftside_text", "rightside_text", "task_text", "progress_text", "task_class"], r = 0; r < i.length; r++) {
+ var a = e.templates[i[r]];
+ a && (n["$" + r] = a(t.start_date, t.end_date, t))
+ }
+ return e.ext.export_api._copyObjectColumns(t, n),
+ n.open = t.$open,
+ n
+ },
+ _serializeHtml: function() {
+ var t = e.config.smart_scales,
+ n = e.config.smart_rendering; (t || n) && (e.config.smart_rendering = !1, e.config.smart_scales = !1, e.render());
+ var i = e.$container.parentNode.innerHTML;
+ return (t || n) && (e.config.smart_scales = t, e.config.smart_rendering = n, e.render()),
+ i
+ },
+ _serializeAll: function() {
+ e.json._copyObject = e.ext.export_api._copyObjectAll;
+ var t = e.ext.export_api._exportSerialize();
+ return e.json._copyObject = e.ext.export_api._originalCopyObject,
+ t
+ },
+ _serializePlain: function() {
+ var t = e.templates.xml_format,
+ n = e.templates.format_date;
+ e.templates.xml_format = e.date.date_to_str("%Y%m%dT%H%i%s", !0),
+ e.templates.format_date = e.date.date_to_str("%Y%m%dT%H%i%s", !0),
+ e.json._copyObject = e.ext.export_api._copyObjectPlain;
+ var i = e.ext.export_api._exportSerialize();
+ return e.templates.xml_format = t,
+ e.templates.format_date = n,
+ e.json._copyObject = e.ext.export_api._originalCopyObject,
+ delete i.links,
+ i
+ },
+ _getRaw: function() {
+ if (e._scale_helpers) {
+ var t = e._get_scales(),
+ n = e.config.min_column_width,
+ i = e._get_resize_options().x ? Math.max(e.config.autosize_min_width, 0) : e.config.$task.offsetWidth,
+ r = e.config.config.scale_height - 1;
+ return e._scale_helpers.prepareConfigs(t, n, i, r)
+ }
+ var a = e.$ui.getView("timeline");
+ if (a) {
+ var o = a.$config.width;
+ "x" !== e.config.autosize && "xy" !== e.config.autosize || (o = Math.max(e.config.autosize_min_width, 0));
+ var s = e.getState(),
+ l = (t = a._getScales(), n = e.config.min_column_width, r = e.config.scale_height - 1, e.config.rtl);
+ return a.$scaleHelper.prepareConfigs(t, n, o, r, s.min_date, s.max_date, l)
+ }
+ },
+ _serializeTable: function(t) {
+ e.json._copyObject = t.visual ? e.ext.export_api._copyObjectColors: e.ext.export_api._copyObjectTable;
+ var n = e.ext.export_api._exportSerialize();
+ if (e.json._copyObject = e.ext.export_api._originalCopyObject, delete n.links, t.cellColors) {
+ var i = e.templates.timeline_cell_class || e.templates.task_cell_class;
+ if (i) {
+ for (var r = e.ext.export_api._getRaw(), a = r[0].trace_x, o = 1; o < r.length; o++) r[o].trace_x.length > a.length && (a = r[o].trace_x);
+ for (o = 0; o < n.data.length; o++) {
+ n.data[o].styles = [];
+ for (var s = e.getTask(n.data[o].id), l = 0; l < a.length; l++) {
+ var c = i(s, a[l]);
+ c && n.data[o].styles.push({
+ index: l,
+ styles: e.ext.export_api._getStyles(c)
+ })
+ }
+ }
+ }
+ }
+ return n
+ },
+ _serializeScales: function(t) {
+ for (var n = [], i = e.ext.export_api._getRaw(), r = 1 / 0, a = 0, o = 0; o < i.length; o++) r = Math.min(r, i[o].col_width);
+ for (o = 0; o < i.length; o++) {
+ var s = 0,
+ l = 0,
+ c = [];
+ n.push(c);
+ var u = i[o];
+ a = Math.max(a, u.trace_x.length);
+ for (var d = u.format || u.template || (u.date ? e.date.date_to_str(u.date) : e.config.date_scale), h = 0; h < u.trace_x.length; h++) {
+ var f = u.trace_x[h];
+ l = s + Math.round(u.width[h] / r);
+ var _ = {
+ text: d(f),
+ start: s,
+ end: l,
+ styles: ""
+ };
+ if (t.cellColors) {
+ var g = u.css || e.templates.scaleCell_class;
+ if (g) {
+ var p = g(f);
+ p && (_.styles = e.ext.export_api._getStyles(p))
+ }
+ }
+ c.push(_),
+ s = l
+ }
+ }
+ return {
+ width: a,
+ height: n.length,
+ data: n
+ }
+ },
+ _serializeColumns: function(t) {
+ e.exportMode = !0;
+ for (var n = [], i = e.config.columns, r = 0, a = 0; a < i.length; a++)"add" !== i[a].name && "buttons" !== i[a].name && (n[r] = {
+ id: i[a].template ? "_" + a: i[a].name,
+ header: i[a].label || e.locale.labels["column_" + i[a].name],
+ width: i[a].width ? Math.floor(i[a].width / 4) : ""
+ },
+ "duration" === i[a].name && (n[r].type = "number"), "start_date" !== i[a].name && "end_date" !== i[a].name || (n[r].type = "date", t && t.rawDates && (n[r].id = i[a].name)), r++);
+ return e.exportMode = !1,
+ n
+ },
+ _exportSerialize: function() {
+ e.exportMode = !0;
+ var t = e.templates.xml_format,
+ n = e.templates.format_date;
+ e.templates.xml_format = e.templates.format_date = e.date.date_to_str(e.config.date_format || e.config.xml_date);
+ var i = e.serialize();
+ return e.templates.xml_format = t,
+ e.templates.format_date = n,
+ e.exportMode = !1,
+ i
+ },
+ _setLevel: function(t) {
+ for (var e = 0; e < t.length; e++) {
+ 0 == t[e].parent && (t[e]._lvl = 1);
+ for (var n = e + 1; n < t.length; n++) t[e].id == t[n].parent && (t[n]._lvl = t[e]._lvl + 1)
+ }
+ },
+ _clearLevel: function(t) {
+ for (var e = 0; e < t.length; e++) delete t[e]._lvl
+ },
+ _clearRecLinks: function(t) {
+ e.ext.export_api._setLevel(t.data);
+ for (var n = {},
+ i = 0; i < t.data.length; i++) n[t.data[i].id] = t.data[i];
+ var r = {};
+ for (i = 0; i < t.links.length; i++) {
+ var a = t.links[i];
+ e.isTaskExists(a.source) && e.isTaskExists(a.target) && n[a.source] && n[a.target] && (r[a.id] = a)
+ }
+ for (var o in r) e.ext.export_api._makeLinksSameLevel(r[o], n);
+ var s = {};
+ for (var o in n) e.ext.export_api._clearCircDependencies(n[o], r, n, {},
+ s, null);
+ for (Object.keys(r) && e.ext.export_api._clearLinksSameLevel(r, n), i = 0; i < t.links.length; i++) r[t.links[i].id] || (t.links.splice(i, 1), i--);
+ e.ext.export_api._clearLevel(t.data)
+ },
+ _clearCircDependencies: function(t, n, i, r, a, o) {
+ var s = t.$_source;
+ if (s) {
+ r[t.id] && e.ext.export_api._onCircDependencyFind(o, n, r, a),
+ r[t.id] = !0;
+ for (var l = {},
+ c = 0; c < s.length; c++) if (!a[s[c]]) {
+ var u = n[s[c]],
+ d = i[u._target];
+ l[d.id] && e.ext.export_api._onCircDependencyFind(u, n, r, a),
+ l[d.id] = !0,
+ e.ext.export_api._clearCircDependencies(d, n, i, r, a, u)
+ }
+ r[t.id] = !1
+ }
+ },
+ _onCircDependencyFind: function(t, n, i, r) {
+ t && (e.callEvent("onExportCircularDependency", [t.id, t]) && delete n[t.id], delete i[t._source], delete i[t._target], r[t.id] = !0)
+ },
+ _makeLinksSameLevel: function(t, e) {
+ var n, i, r = {
+ target: e[t.target],
+ source: e[t.source]
+ };
+ if (r.target._lvl != r.source._lvl) {
+ r.target._lvl < r.source._lvl ? (n = "source", i = r.target._lvl) : (n = "target", i = r.source._lvl);
+ do {
+ var a = e[r[n].parent];
+ if (!a) break;
+ r[n] = a
+ } while ( r [ n ]._lvl < i);
+ for (var o = e[r.source.parent], s = e[r.target.parent]; o && s && o.id != s.id;) r.source = o,
+ r.target = s,
+ o = e[r.source.parent],
+ s = e[r.target.parent]
+ }
+ t._target = r.target.id,
+ t._source = r.source.id,
+ r.target.$_target || (r.target.$_target = []),
+ r.target.$_target.push(t.id),
+ r.source.$_source || (r.source.$_source = []),
+ r.source.$_source.push(t.id)
+ },
+ _clearLinksSameLevel: function(t, e) {
+ for (var n in t) delete t[n]._target,
+ delete t[n]._source;
+ for (var i in e) delete e[i].$_source,
+ delete e[i].$_target
+ },
+ _customProjectProperties: function(t, n) {
+ if (n && n.project) {
+ for (var i in n.project) e.config.$custom_data || (e.config.$custom_data = {}),
+ e.config.$custom_data[i] = "function" == typeof n.project[i] ? n.project[i](e.config) : n.project[i];
+ delete n.project
+ }
+ },
+ _customTaskProperties: function(t, n) {
+ n && n.tasks && (t.data.forEach(function(t) {
+ for (var i in n.tasks) t.$custom_data || (t.$custom_data = {}),
+ t.$custom_data[i] = "function" == typeof n.tasks[i] ? n.tasks[i](t, e.config) : n.tasks[i]
+ }), delete n.tasks)
+ },
+ _exportConfig: function(t, n) {
+ var i = n.name || "gantt.xml";
+ delete n.name,
+ e.config.custom = n;
+ var r = e.ext.export_api._getWorktimeSettings(),
+ a = e.getSubtaskDates();
+ if (a.start_date && a.end_date) {
+ var o = e.templates.format_date || e.templates.xml_format;
+ e.config.start_end = {
+ start_date: o(a.start_date),
+ end_date: o(a.end_date)
+ }
+ }
+ var s = void 0 !== n.auto_scheduling && !!n.auto_scheduling,
+ l = {
+ callback: n.callback || null,
+ config: e.config,
+ data: t,
+ manual: s,
+ name: i,
+ worktime: r
+ };
+ for (var c in n) l[c] = n[c];
+ return l
+ },
+ _sendImportAjaxMSP: function(t) {
+ var n = t.server || e.ext.export_api._apiUrl,
+ i = t.store || 0,
+ r = t.data,
+ a = t.callback,
+ o = {
+ durationUnit: t.durationUnit || void 0,
+ projectProperties: t.projectProperties || void 0,
+ taskProperties: t.taskProperties || void 0
+ };
+ r.append("type", t.type || "msproject-parse"),
+ r.append("data", JSON.stringify(o)),
+ i && r.append("store", i);
+ var s = new XMLHttpRequest;
+ s.onreadystatechange = function(t) {
+ 4 === s.readyState && 0 === s.status && a && a(null)
+ },
+ s.onload = function() {
+ var t = null;
+ if (! (s.status > 400)) try {
+ t = JSON.parse(s.responseText)
+ } catch(t) {}
+ a && a(t)
+ },
+ s.open("POST", n, !0),
+ s.setRequestHeader("X-Requested-With", "XMLHttpRequest"),
+ s.send(r)
+ }
+ },
+ e.exportToPDF = e.ext.export_api.exportToPDF,
+ e.exportToPNG = e.ext.export_api.exportToPNG,
+ e.exportToICal = e.ext.export_api.exportToICal,
+ e.exportToExcel = e.ext.export_api.exportToExcel,
+ e.exportToJSON = e.ext.export_api.exportToJSON,
+ e.importFromExcel = e.ext.export_api.importFromExcel,
+ e.importFromMSProject = e.ext.export_api.importFromMSProject,
+ e.exportToMSProject = e.ext.export_api.exportToMSProject,
+ e.importFromPrimaveraP6 = e.ext.export_api.importFromPrimaveraP6,
+ e.exportToPrimaveraP6 = e.ext.export_api.exportToPrimaveraP6
+ }
+ }).call(this, n(13).Buffer)
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = function() {
+ function t(t) {
+ var e = this;
+ this._mouseDown = !1,
+ this._calculateDirectionVector = function() {
+ if (e._trace.length >= 10) {
+ for (var t = e._trace.slice(e._trace.length - 10), n = [], i = 1; i < t.length; i++) n.push({
+ x: t[i].x - t[i - 1].x,
+ y: t[i].y - t[i - 1].y
+ });
+ var r = {
+ x: 0,
+ y: 0
+ };
+ return n.forEach(function(t) {
+ r.x += t.x,
+ r.y += t.y
+ }),
+ {
+ magnitude: Math.sqrt(r.x * r.x + r.y * r.y),
+ angleDegrees: 180 * Math.atan2(Math.abs(r.y), Math.abs(r.x)) / Math.PI
+ }
+ }
+ return null
+ },
+ this._applyDndReadyStyles = function() {
+ e._timeline.$task.classList.add("gantt_timeline_move_available")
+ },
+ this._clearDndReadyStyles = function() {
+ e._timeline.$task.classList.remove("gantt_timeline_move_available")
+ },
+ this._getScrollPosition = function(t) {
+ var n = e._gantt;
+ return {
+ x: n.$ui.getView(t.$config.scrollX).getScrollState().position,
+ y: n.$ui.getView(t.$config.scrollY).getScrollState().position
+ }
+ },
+ this._countNewScrollPosition = function(t) {
+ var n = e._calculateDirectionVector(),
+ i = e._startPoint.x - t.x,
+ r = e._startPoint.y - t.y;
+ return n && (n.angleDegrees < 15 ? r = 0 : n.angleDegrees > 75 && (i = 0)),
+ {
+ x: e._scrollState.x + i,
+ y: e._scrollState.y + r
+ }
+ },
+ this._setScrollPosition = function(t, n) {
+ var i = e._gantt;
+ requestAnimationFrame(function() {
+ i.scrollLayoutCell(t.$id, n.x, n.y)
+ })
+ },
+ this._stopDrag = function(t) {
+ var n = e._gantt;
+ if (e._trace = [], n.$root.classList.remove("gantt_noselect"), void 0 !== e._originalReadonly && (n.config.readonly = e._originalReadonly), void 0 !== e._originAutoscroll && (n.config.autoscroll = e._originAutoscroll), n.config.drag_timeline) {
+ var i = n.config.drag_timeline.useKey;
+ if (i && !0 !== t[i]) return
+ }
+ e._mouseDown = !1
+ },
+ this._startDrag = function(t) {
+ var n = e._gantt;
+ e._originAutoscroll = n.config.autoscroll,
+ n.config.autoscroll = !1,
+ n.$root.classList.add("gantt_noselect"),
+ e._originalReadonly = n.config.readonly,
+ n.config.readonly = !0,
+ e._trace = [],
+ e._mouseDown = !0;
+ var i = e._getScrollPosition(e._timeline),
+ r = i.x,
+ a = i.y;
+ e._scrollState = {
+ x: r,
+ y: a
+ },
+ e._startPoint = {
+ x: t.clientX,
+ y: t.clientY
+ },
+ e._trace.push(e._startPoint)
+ },
+ this._gantt = t,
+ this._domEvents = t._createDomEventScope(),
+ this._trace = []
+ }
+ return t.create = function(e) {
+ return new t(e)
+ },
+ t.prototype.destructor = function() {
+ this._domEvents.detachAll()
+ },
+ t.prototype.attach = function(t) {
+ var e = this;
+ this._timeline = t;
+ var n = this._gantt;
+ this._domEvents.attach(t.$task, "mousedown",
+ function(t) {
+ if (n.config.drag_timeline) {
+ var i = n.config.drag_timeline,
+ r = i.useKey,
+ a = i.ignore;
+ if (!1 !== i.enabled) {
+ var o = ".gantt_task_line, .gantt_task_link";
+ void 0 !== a && (o = a instanceof Array ? a.join(", ") : a),
+ o && n.utils.dom.closest(t.target, o) || r && !0 !== t[r] || e._startDrag(t)
+ }
+ }
+ }),
+ this._domEvents.attach(document, "keydown",
+ function(t) {
+ if (n.config.drag_timeline) {
+ var i = n.config.drag_timeline.useKey;
+ i && !0 === t[i] && e._applyDndReadyStyles()
+ }
+ }),
+ this._domEvents.attach(document, "keyup",
+ function(t) {
+ if (n.config.drag_timeline) {
+ var i = n.config.drag_timeline.useKey;
+ i && !1 === t[i] && (e._clearDndReadyStyles(), e._stopDrag(t))
+ }
+ }),
+ this._domEvents.attach(document, "mouseup",
+ function(t) {
+ e._stopDrag(t)
+ }),
+ this._domEvents.attach(n.$root, "mouseup",
+ function(t) {
+ e._stopDrag(t)
+ }),
+ this._domEvents.attach(document, "mouseleave",
+ function(t) {
+ e._stopDrag(t)
+ }),
+ this._domEvents.attach(n.$root, "mouseleave",
+ function(t) {
+ e._stopDrag(t)
+ }),
+ this._domEvents.attach(n.$root, "mousemove",
+ function(i) {
+ if (n.config.drag_timeline) {
+ var r = n.config.drag_timeline.useKey;
+ if (!r || !0 === i[r]) {
+ var a = e._gantt.ext.clickDrag,
+ o = (e._gantt.config.click_drag || {}).useKey;
+ if ((!a || !o || r || !i[o]) && !0 === e._mouseDown) {
+ e._trace.push({
+ x: i.clientX,
+ y: i.clientY
+ });
+ var s = e._countNewScrollPosition({
+ x: i.clientX,
+ y: i.clientY
+ });
+ e._setScrollPosition(t, s),
+ e._scrollState = s,
+ e._startPoint = {
+ x: i.clientX,
+ y: i.clientY
+ }
+ }
+ }
+ }
+ })
+ },
+ t
+ } ();
+ e.EventsManager = i
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(293);
+ e.
+ default = function(t) {
+ t.ext || (t.ext = {}),
+ t.ext.dragTimeline = {
+ create: function() {
+ return i.EventsManager.create(t)
+ }
+ },
+ t.config.drag_timeline = {
+ enabled: !0
+ }
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(5),
+ r = n(2),
+ a = function() {
+ function t(t, e, n) {
+ var a = this;
+ this._el = document.createElement("div"),
+ this.defaultRender = function(t, e) {
+ a._el || (a._el = document.createElement("div"));
+ var n = a._el,
+ i = Math.min(t.relative.top, e.relative.top),
+ r = Math.max(t.relative.top, e.relative.top),
+ o = Math.min(t.relative.left, e.relative.left),
+ s = Math.max(t.relative.left, e.relative.left);
+ if (a._singleRow) {
+ var l = a._getTaskPositionByTop(a._startPoint.relative.top);
+ n.style.height = l.height + "px",
+ n.style.top = l.top + "px"
+ } else n.style.height = Math.abs(r - i) + "px",
+ n.style.top = i + "px";
+ return n.style.width = Math.abs(s - o) + "px",
+ n.style.left = o + "px",
+ n
+ },
+ this._gantt = e,
+ this._view = n,
+ this._viewPort = t.viewPort,
+ this._el.classList.add(t.className),
+ "function" == typeof t.callback && (this._callback = t.callback),
+ this.render = function() {
+ var e; (e = t.render ? t.render(a._startPoint, a._endPoint) : a.defaultRender(a._startPoint, a._endPoint)) !== a._el && (a._el && a._el.parentNode && a._el.parentNode.removeChild(a._el), a._el = e),
+ "" !== t.className && a._el.classList.add(t.className),
+ a.draw()
+ },
+ r.isEventable(this._viewPort) || i(this._viewPort),
+ this._singleRow = t.singleRow,
+ this._useRequestAnimationFrame = t.useRequestAnimationFrame
+ }
+ return t.prototype.draw = function() {
+ var t = this;
+ if (this._useRequestAnimationFrame) return requestAnimationFrame(function() {
+ t._viewPort.appendChild(t.getElement())
+ });
+ this._viewPort.appendChild(this.getElement())
+ },
+ t.prototype.clear = function() {
+ var t = this;
+ if (this._useRequestAnimationFrame) return requestAnimationFrame(function() {
+ t._el.parentNode && t._viewPort.removeChild(t._el)
+ });
+ this._el.parentNode && this._viewPort.removeChild(this._el)
+ },
+ t.prototype.getElement = function() {
+ return this._el
+ },
+ t.prototype.getViewPort = function() {
+ return this._viewPort
+ },
+ t.prototype.setStart = function(t) {
+ var e = this._gantt;
+ this._startPoint = t,
+ this._startDate = e.dateFromPos(this._startPoint.relative.left),
+ this._viewPort.callEvent("onBeforeDrag", [this._startPoint])
+ },
+ t.prototype.setEnd = function(t) {
+ var e = this._gantt;
+ if (this._endPoint = t, this._singleRow) {
+ var n = this._getTaskPositionByTop(this._startPoint.relative.top);
+ this._endPoint.relative.top = n.top
+ }
+ this._endDate = e.dateFromPos(this._endPoint.relative.left),
+ this._startPoint.relative.left > this._endPoint.relative.left && (this._positionPoint = {
+ relative: {
+ left: this._endPoint.relative.left,
+ top: this._positionPoint.relative.top
+ },
+ absolute: {
+ left: this._endPoint.absolute.left,
+ top: this._positionPoint.absolute.top
+ }
+ }),
+ this._startPoint.relative.top > this._endPoint.relative.top && (this._positionPoint = {
+ relative: {
+ left: this._positionPoint.relative.left,
+ top: this._endPoint.relative.top
+ },
+ absolute: {
+ left: this._positionPoint.absolute.left,
+ top: this._endPoint.absolute.top
+ }
+ }),
+ this._viewPort.callEvent("onDrag", [this._startPoint, this._endPoint])
+ },
+ t.prototype.setPosition = function(t) {
+ this._positionPoint = t
+ },
+ t.prototype.dragEnd = function(t) {
+ var e, n = this._gantt;
+ t.relative.left < 0 && (t.relative.left = 0),
+ this._viewPort.callEvent("onBeforeDragEnd", [this._startPoint, t]),
+ this.setEnd(t),
+ this._endDate = this._endDate || n.getState().max_date,
+ this._startDate.valueOf() > this._endDate.valueOf() && (e = [this._endDate, this._startDate], this._startDate = e[0], this._endDate = e[1]),
+ this.clear();
+ var i = n.getTaskByTime(this._startDate, this._endDate),
+ r = this._getTasksByTop(this._startPoint.relative.top, this._endPoint.relative.top);
+ this._viewPort.callEvent("onDragEnd", [this._startPoint, this._endPoint]),
+ this._callback && this._callback(this._startPoint, this._endPoint, this._startDate, this._endDate, i, r)
+ },
+ t.prototype.getInBounds = function() {
+ return this._singleRow
+ },
+ t.prototype._getTasksByTop = function(t, e) {
+ var n = this._gantt,
+ i = t,
+ r = e;
+ t > e && (i = e, r = t);
+ for (var a = this._getTaskPositionByTop(i).index, o = this._getTaskPositionByTop(r).index, s = [], l = a; l <= o; l++) {
+ n.getTaskByIndex(l) && s.push(n.getTaskByIndex(l))
+ }
+ return s
+ },
+ t.prototype._getTaskPositionByTop = function(t) {
+ var e = this._gantt,
+ n = this._view,
+ i = n.getItemIndexByTopPosition(t),
+ r = e.getTaskByIndex(i);
+ if (r) {
+ var a = n.getItemHeight(r.id);
+ return {
+ top: n.getItemTop(r.id) || 0,
+ height: a || 0,
+ index: i
+ }
+ }
+ var o = n.getTotalHeight();
+ return {
+ top: t > o ? o: 0,
+ height: e.config.row_height,
+ index: t > o ? e.getTaskCount() : 0
+ }
+ },
+ t
+ } ();
+ e.SelectedRegion = a
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(1),
+ r = function() {
+ function t(t) {
+ this._mouseDown = !1,
+ this._gantt = t,
+ this._domEvents = t._createDomEventScope()
+ }
+ return t.prototype.attach = function(t, e, n) {
+ var r = this,
+ a = this._gantt,
+ o = t.getViewPort();
+ this._originPosition = window.getComputedStyle(o).display,
+ this._restoreOriginPosition = function() {
+ o.style.position = r._originPosition
+ },
+ "static" === this._originPosition && (o.style.position = "relative");
+ var s = a.$services.getService("state");
+ s.registerProvider("clickDrag",
+ function() {
+ return {
+ autoscroll: !1
+ }
+ });
+ var l = null;
+ this._domEvents.attach(o, "mousedown",
+ function(i) {
+ l = null;
+ var o = ".gantt_task_line, .gantt_task_link";
+ void 0 !== n && (o = n instanceof Array ? n.join(", ") : n),
+ o && a.utils.dom.closest(i.target, o) || (s.registerProvider("clickDrag",
+ function() {
+ return {
+ autoscroll: r._mouseDown
+ }
+ }), e && !0 !== i[e] || (l = r._getCoordinates(i, t)))
+ });
+ var c = i.getRootNode(a.$root) || document.body;
+ this._domEvents.attach(c, "mouseup",
+ function(n) {
+ if (l = null, (!e || !0 === n[e]) && !0 === r._mouseDown) {
+ r._mouseDown = !1;
+ var i = r._getCoordinates(n, t);
+ t.dragEnd(i)
+ }
+ }),
+ this._domEvents.attach(o, "mousemove",
+ function(n) {
+ if (!e || !0 === n[e]) {
+ var i = r._gantt.ext.clickDrag,
+ o = (r._gantt.config.drag_timeline || {}).useKey;
+ if (!i || !o || e || !n[o]) {
+ var s = null;
+ if (!r._mouseDown && l) return s = r._getCoordinates(n, t),
+ void(Math.abs(l.relative.left - s.relative.left) > 5 && l && (r._mouseDown = !0, t.setStart(a.copy(l)), t.setPosition(a.copy(l)), t.setEnd(a.copy(l)), l = null)); ! 0 === r._mouseDown && (s = r._getCoordinates(n, t), t.setEnd(s), t.render())
+ }
+ }
+ })
+ },
+ t.prototype.detach = function() {
+ var t = this._gantt;
+ this._domEvents.detachAll(),
+ this._restoreOriginPosition && this._restoreOriginPosition(),
+ t.$services.getService("state").unregisterProvider("clickDrag")
+ },
+ t.prototype.destructor = function() {
+ this.detach()
+ },
+ t.prototype._getCoordinates = function(t, e) {
+ var n = e.getViewPort(),
+ i = n.getBoundingClientRect(),
+ r = t.clientX,
+ a = t.clientY;
+ return {
+ absolute: {
+ left: r,
+ top: a
+ },
+ relative: {
+ left: r - i.left + n.scrollLeft,
+ top: a - i.top + n.scrollTop
+ }
+ }
+ },
+ t
+ } ();
+ e.EventsManager = r
+ },
+ function(t, e, n) {
+ "use strict";
+ var i = this && this.__assign ||
+ function() {
+ return (i = Object.assign ||
+ function(t) {
+ for (var e, n = 1,
+ i = arguments.length; n < i; n++) for (var r in e = arguments[n]) Object.prototype.hasOwnProperty.call(e, r) && (t[r] = e[r]);
+ return t
+ }).apply(this, arguments)
+ };
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = n(296),
+ a = n(295);
+ e.
+ default = function(t) {
+ t.ext || (t.ext = {});
+ var e = {
+ className: "gantt_click_drag_rect",
+ useRequestAnimationFrame: !0,
+ callback: void 0,
+ singleRow: !1
+ },
+ n = new r.EventsManager(t);
+ t.ext.clickDrag = n,
+ t.attachEvent("onGanttReady",
+ function() {
+ var n = i({
+ viewPort: t.$task_data
+ },
+ e);
+ if (t.config.click_drag) {
+ var r = t.config.click_drag;
+ n.render = r.render || e.render,
+ n.className = r.className || e.className,
+ n.callback = r.callback || e.callback,
+ n.viewPort = r.viewPort || t.$task_data,
+ n.useRequestAnimationFrame = void 0 === r.useRequestAnimationFrame ? e.useRequestAnimationFrame: r.useRequestAnimationFrame,
+ n.singleRow = void 0 === r.singleRow ? e.singleRow: r.singleRow;
+ var o = t.$ui.getView("timeline"),
+ s = new a.SelectedRegion(n, t, o);
+ t.ext.clickDrag.attach(s, r.useKey, r.ignore)
+ }
+ }),
+ t.attachEvent("onDestroy",
+ function() {
+ n.destructor()
+ })
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(297),
+ r = n(294),
+ a = n(292),
+ o = n(272),
+ s = n(271),
+ l = n(260),
+ c = n(259),
+ u = n(258),
+ d = n(256),
+ h = n(253);
+ e.
+ default = {
+ click_drag: i.
+ default,
+ drag_timeline: r.
+ default,
+ fullscreen: o.
+ default,
+ keyboard_navigation: s,
+ quick_info: u.
+ default,
+ tooltip: d.
+ default,
+ undo: h.
+ default,
+ marker: l,
+ multiselect: c,
+ export_api: a.
+ default
+ }
+ },
+ function(t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var i = n(298),
+ r = n(250),
+ a = n(21).gantt = r(i.
+ default);
+ e.gantt = a,
+ e.
+ default = a
+ }])
+ });
+//# sourceMappingURL=dhtmlxgantt.js.map
diff --git a/src/components/dhtmlxGantt/codebase/dhtmlxgantt.js.map b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.js.map
new file mode 100644
index 0000000..aeb1a57
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/dhtmlxgantt.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack://dhtmlxgantt/webpack/universalModuleDefinition","webpack://dhtmlxgantt/webpack/bootstrap","webpack://dhtmlxgantt/./sources/utils/utils.js","webpack://dhtmlxgantt/./sources/core/ui/utils/dom_helpers.js","webpack://dhtmlxgantt/./sources/utils/helpers.js","webpack://dhtmlxgantt/./sources/utils/extends.js","webpack://dhtmlxgantt/(webpack)/buildin/global.js","webpack://dhtmlxgantt/./sources/utils/eventable.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/get_visible_bars_range.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/base_control.js","webpack://dhtmlxgantt/./node_modules/inherits/inherits_browser.js","webpack://dhtmlxgantt/./node_modules/process/browser.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/editors/base.js","webpack://dhtmlxgantt/./sources/utils/env.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/_stream_duplex.js","webpack://dhtmlxgantt/./node_modules/buffer/index.js","webpack://dhtmlxgantt/./sources/core/ui/layout/cell.js","webpack://dhtmlxgantt/./sources/utils/is_headless.js","webpack://dhtmlxgantt/./sources/utils/placeholder_task.js","webpack://dhtmlxgantt/./node_modules/core-util-is/lib/util.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/select_control.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/is_bar_in_viewport.js","webpack://dhtmlxgantt/./sources/core/ui/render/is_legacy_smart_render.js","webpack://dhtmlxgantt/./sources/utils/global.js","webpack://dhtmlxgantt/./node_modules/safe-buffer/index.js","webpack://dhtmlxgantt/./node_modules/process-nextick-args/index.js","webpack://dhtmlxgantt/./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/drop_target.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/is_column_visible.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/get_visible_cells_range.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/get_bg_row_rectangle.js","webpack://dhtmlxgantt/./sources/core/ui/render/task_bar_render.js","webpack://dhtmlxgantt/./sources/core/ui/timeline/timeline.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/get_grid_row_rectangle.js","webpack://dhtmlxgantt/./sources/core/ui/mouse_event_container.js","webpack://dhtmlxgantt/./sources/core/ui/grid/grid.js","webpack://dhtmlxgantt/./sources/core/ui/timeline/scales.js","webpack://dhtmlxgantt/./sources/core/ui/utils/html_helpers.js","webpack://dhtmlxgantt/./sources/core/resource_timetable_builder.js","webpack://dhtmlxgantt/./sources/core/ui/layout/layout.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/is_link_in_viewport.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/factory/get_visible_link_range.js","webpack://dhtmlxgantt/./sources/core/worktime/strategy/work_unit_cache/index.ts","webpack://dhtmlxgantt/./sources/core/worktime/calendar_arguments_helper.js","webpack://dhtmlxgantt/./sources/core/ui/row_position_mixin.js","webpack://dhtmlxgantt/./sources/core/common/duration_formatter_numeric.ts","webpack://dhtmlxgantt/./sources/utils/task_tree_helpers.js","webpack://dhtmlxgantt/./sources/core/gantt_data_range.js","webpack://dhtmlxgantt/./sources/core/datastore/treedatastore.js","webpack://dhtmlxgantt/./sources/core/datastore/power_array.js","webpack://dhtmlxgantt/./sources/core/datastore/datastore.js","webpack://dhtmlxgantt/./sources/utils/timeout.js","webpack://dhtmlxgantt/./sources/core/ui/utils/dom_event_scope.js","webpack://dhtmlxgantt/./node_modules/form-data/lib/browser.js","webpack://dhtmlxgantt/(webpack)/buildin/amd-options.js","webpack://dhtmlxgantt/./node_modules/url/url.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/_stream_transform.js","webpack://dhtmlxgantt/./node_modules/string_decoder/lib/string_decoder.js","webpack://dhtmlxgantt/./node_modules/timers-browserify/main.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/_stream_writable.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/internal/streams/destroy.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/internal/streams/stream-browser.js","webpack://dhtmlxgantt/./node_modules/events/events.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/_stream_readable.js","webpack://dhtmlxgantt/./node_modules/readable-stream/readable-browser.js","webpack://dhtmlxgantt/./node_modules/stream-http/lib/response.js","webpack://dhtmlxgantt/./node_modules/stream-http/lib/capability.js","webpack://dhtmlxgantt/./node_modules/stream-http/index.js","webpack://dhtmlxgantt/./node_modules/isarray/index.js","webpack://dhtmlxgantt/./sources/core/ui/wai_aria.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/lightbox_optional_time.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/typeselect_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/constraint_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/parent_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/duration_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/radio_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/checkbox_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/time_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/textarea_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/controls/template_control.js","webpack://dhtmlxgantt/./sources/core/ui/lightbox/index.js","webpack://dhtmlxgantt/./sources/core/ui/touch.js","webpack://dhtmlxgantt/./sources/core/ui/plugins/timeline_zoom.ts","webpack://dhtmlxgantt/./sources/core/ui/plugins/dhtmlx_hooks.js","webpack://dhtmlxgantt/./sources/core/ui/plugins/jquery_hooks.js","webpack://dhtmlxgantt/./sources/core/ui/plugins/autoscroll.js","webpack://dhtmlxgantt/./sources/core/ui/plugins/index.js","webpack://dhtmlxgantt/./sources/css/skins/contrast_white.js","webpack://dhtmlxgantt/./sources/css/skins/contrast_black.js","webpack://dhtmlxgantt/./sources/css/skins/material.js","webpack://dhtmlxgantt/./sources/css/skins/broadway.js","webpack://dhtmlxgantt/./sources/css/skins/terrace.js","webpack://dhtmlxgantt/./sources/css/skins/meadow.js","webpack://dhtmlxgantt/./sources/css/skins/skyblue.js","webpack://dhtmlxgantt/./sources/core/ui/skin.js","webpack://dhtmlxgantt/./sources/core/facades/layout.js","webpack://dhtmlxgantt/./sources/core/data_task_layers.gpl.js","webpack://dhtmlxgantt/./sources/core/ui/main_layout_initializer.js","webpack://dhtmlxgantt/./sources/core/ui/timeline/links_dnd.js","webpack://dhtmlxgantt/./sources/core/ui/timeline/tasks_dnd.js","webpack://dhtmlxgantt/./sources/core/ui/timeline/main_timeline_initializer.js","webpack://dhtmlxgantt/./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/highlight.js","webpack://dhtmlxgantt/./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/multi_level.js","webpack://dhtmlxgantt/./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/locked_level.js","webpack://dhtmlxgantt/./sources/core/ui/grid/tasks_grid_dnd_marker.js","webpack://dhtmlxgantt/./sources/core/ui/grid/tasks_grid_dnd.js","webpack://dhtmlxgantt/./sources/core/ui/grid/main_grid_initializer.js","webpack://dhtmlxgantt/./sources/core/ui/render/task_grid_row_resize_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/resource_histogram_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/resource_matrix_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/task_grid_line_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/link_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/prerender/task_bg_placeholder.js","webpack://dhtmlxgantt/./sources/core/ui/render/task_bg_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/task_rollup_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/is_split_task_in_viewport.js","webpack://dhtmlxgantt/./sources/core/ui/render/task_split_render.js","webpack://dhtmlxgantt/./sources/core/ui/render/task_bar_smart_render.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/linked_properties.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/editors/duration.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/editors/predecessor.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/editors/date.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/editors/select.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/editors/number.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/editors/text.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/keyboard_mappings/keyboard_navigation.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/keyboard_mappings/default.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/keyboard_mappings.js","webpack://dhtmlxgantt/./sources/core/ui/grid/editors/controller.js","webpack://dhtmlxgantt/./sources/core/ui/timeline/tasks_canvas_render.gpl.js","webpack://dhtmlxgantt/./sources/core/ui/layout/scrollbar_cell.js","webpack://dhtmlxgantt/./sources/core/ui/layout/resizer_cell.gpl.js","webpack://dhtmlxgantt/./sources/core/ui/layout/view_cell.js","webpack://dhtmlxgantt/./sources/core/ui/layout/view_layout.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/get_bar_rectangle.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/get_link_rectangle.js","webpack://dhtmlxgantt/./sources/core/ui/render/viewport/is_in_viewport.js","webpack://dhtmlxgantt/./sources/core/ui/render/render_factory.js","webpack://dhtmlxgantt/./sources/core/ui/render/layer_engine.js","webpack://dhtmlxgantt/./sources/core/ui/gantt_layers.js","webpack://dhtmlxgantt/./sources/core/ui/mouse.js","webpack://dhtmlxgantt/./sources/core/ui/configurable.js","webpack://dhtmlxgantt/./sources/core/ui/ui_factory.js","webpack://dhtmlxgantt/./sources/core/ui/index.js","webpack://dhtmlxgantt/./sources/core/ui/message.js","webpack://dhtmlxgantt/./sources/core/ui_core.js","webpack://dhtmlxgantt/./sources/locale/locale_ua.ts","webpack://dhtmlxgantt/./sources/locale/locale_tr.ts","webpack://dhtmlxgantt/./sources/locale/locale_sv.ts","webpack://dhtmlxgantt/./sources/locale/locale_sk.ts","webpack://dhtmlxgantt/./sources/locale/locale_si.ts","webpack://dhtmlxgantt/./sources/locale/locale_ru.ts","webpack://dhtmlxgantt/./sources/locale/locale_ro.ts","webpack://dhtmlxgantt/./sources/locale/locale_pt.ts","webpack://dhtmlxgantt/./sources/locale/locale_pl.ts","webpack://dhtmlxgantt/./sources/locale/locale_no.ts","webpack://dhtmlxgantt/./sources/locale/locale_nl.ts","webpack://dhtmlxgantt/./sources/locale/locale_nb.ts","webpack://dhtmlxgantt/./sources/locale/locale_manager.ts","webpack://dhtmlxgantt/./sources/locale/locale_kr.ts","webpack://dhtmlxgantt/./sources/locale/locale_jp.ts","webpack://dhtmlxgantt/./sources/locale/locale_it.ts","webpack://dhtmlxgantt/./sources/locale/locale_id.ts","webpack://dhtmlxgantt/./sources/locale/locale_hu.ts","webpack://dhtmlxgantt/./sources/locale/locale_hr.ts","webpack://dhtmlxgantt/./sources/locale/locale_he.ts","webpack://dhtmlxgantt/./sources/locale/locale_fr.ts","webpack://dhtmlxgantt/./sources/locale/locale_fi.ts","webpack://dhtmlxgantt/./sources/locale/locale_fa.ts","webpack://dhtmlxgantt/./sources/locale/locale_es.ts","webpack://dhtmlxgantt/./sources/locale/locale_en.ts","webpack://dhtmlxgantt/./sources/locale/locale_el.ts","webpack://dhtmlxgantt/./sources/locale/locale_de.ts","webpack://dhtmlxgantt/./sources/locale/locale_da.ts","webpack://dhtmlxgantt/./sources/locale/locale_cs.ts","webpack://dhtmlxgantt/./sources/locale/locale_cn.ts","webpack://dhtmlxgantt/./sources/locale/locale_ca.ts","webpack://dhtmlxgantt/./sources/locale/locale_be.ts","webpack://dhtmlxgantt/./sources/locale/locale_ar.ts","webpack://dhtmlxgantt/./sources/locale/index.ts","webpack://dhtmlxgantt/./sources/publish_helpers/void_script_third.ts","webpack://dhtmlxgantt/./sources/core/destructor.js","webpack://dhtmlxgantt/./sources/core/common/assert.js","webpack://dhtmlxgantt/./sources/core/ui/resize_listener.js","webpack://dhtmlxgantt/./sources/core/gantt_core.js","webpack://dhtmlxgantt/./sources/core/cached_functions.js","webpack://dhtmlxgantt/./sources/core/data_task_types.js","webpack://dhtmlxgantt/./sources/publish_helpers/void_script_second.ts","webpack://dhtmlxgantt/./sources/core/data.js","webpack://dhtmlxgantt/./sources/core/facades/worktime_calendars.js","webpack://dhtmlxgantt/./sources/core/worktime/strategy/no_work_time.js","webpack://dhtmlxgantt/./sources/core/worktime/time_calculator.js","webpack://dhtmlxgantt/./sources/core/worktime/dynamic_resource_calendars.js","webpack://dhtmlxgantt/./sources/core/worktime/legacy_resource_config.js","webpack://dhtmlxgantt/./sources/core/worktime/strategy/work_unit_cache/date_duration_cache.ts","webpack://dhtmlxgantt/./sources/core/worktime/strategy/work_unit_cache/larger_units_helper.ts","webpack://dhtmlxgantt/./sources/core/worktime/strategy/work_unit_cache/workunit_object_cache.ts","webpack://dhtmlxgantt/./sources/core/worktime/strategy/work_unit_cache/workunit_map_cache.ts","webpack://dhtmlxgantt/./sources/core/worktime/strategy/calendar_strategy.js","webpack://dhtmlxgantt/./sources/core/worktime/strategy/work_calendar_merger.js","webpack://dhtmlxgantt/./sources/core/worktime/calendar_manager.js","webpack://dhtmlxgantt/./sources/core/worktime/work_time.js","webpack://dhtmlxgantt/./sources/core/load.js","webpack://dhtmlxgantt/./sources/core/tasks.js","webpack://dhtmlxgantt/./sources/core/grid_column_api.gpl.js","webpack://dhtmlxgantt/./sources/core/ui/plugins/column_grid_dnd/scrollable_grid.ts","webpack://dhtmlxgantt/./sources/core/ui/plugins/column_grid_dnd/column_grid_dnd.ts","webpack://dhtmlxgantt/./sources/core/ui/plugins/column_grid_dnd/index.ts","webpack://dhtmlxgantt/./sources/core/ui/grid/task_grid_row_resize.js","webpack://dhtmlxgantt/./sources/core/ui/row_position_fixed_height.js","webpack://dhtmlxgantt/./sources/core/ui/grid/grid_resize.gpl.js","webpack://dhtmlxgantt/./sources/core/grid_column_api.js","webpack://dhtmlxgantt/./sources/core/dynamic_loading.js","webpack://dhtmlxgantt/./sources/core/plugins/empty_state_screen.ts","webpack://dhtmlxgantt/./sources/core/common/link_formatter_simple.ts","webpack://dhtmlxgantt/./sources/core/plugins/formatters.js","webpack://dhtmlxgantt/./sources/core/plugins/auto_task_types.js","webpack://dhtmlxgantt/./sources/core/plugins/new_task_placeholder.js","webpack://dhtmlxgantt/./sources/core/plugins/resource_assignments.js","webpack://dhtmlxgantt/./sources/core/plugins/resources.js","webpack://dhtmlxgantt/./sources/core/plugins/wbs.js","webpack://dhtmlxgantt/./sources/core/plugins/batch_update.js","webpack://dhtmlxgantt/./sources/core/plugins/index.js","webpack://dhtmlxgantt/./sources/core/dataprocessor/simple_storage.ts","webpack://dhtmlxgantt/./sources/core/dataprocessor/extend_gantt.ts","webpack://dhtmlxgantt/./sources/core/dataprocessor/data_processor_events.ts","webpack://dhtmlxgantt/./sources/core/dataprocessor/data_processor.ts","webpack://dhtmlxgantt/./sources/core/dataprocessor/index.js","webpack://dhtmlxgantt/./sources/core/datastore/datastore_render.js","webpack://dhtmlxgantt/./sources/core/datastore/select.js","webpack://dhtmlxgantt/./sources/core/facades/datastore_links.js","webpack://dhtmlxgantt/./sources/core/facades/datastore_tasks.js","webpack://dhtmlxgantt/./sources/core/facades/datastore.js","webpack://dhtmlxgantt/./sources/core/datastore/datastore_hooks.js","webpack://dhtmlxgantt/./node_modules/bluebird/js/browser/bluebird.js","webpack://dhtmlxgantt/./sources/utils/promise.js","webpack://dhtmlxgantt/./sources/core/common/state.js","webpack://dhtmlxgantt/./sources/core/common/templates.js","webpack://dhtmlxgantt/./sources/core/common/dnd.js","webpack://dhtmlxgantt/./node_modules/remote-client/dist/remote.es6.js","webpack://dhtmlxgantt/./sources/core/remote/remote_events.js","webpack://dhtmlxgantt/./sources/core/common/date_parsers/csp_compliant_version.ts","webpack://dhtmlxgantt/./sources/core/common/date_parsers/fast_version.ts","webpack://dhtmlxgantt/./sources/core/common/date.js","webpack://dhtmlxgantt/./sources/core/common/serialize.ts","webpack://dhtmlxgantt/./sources/core/common/ajax.js","webpack://dhtmlxgantt/./sources/core/common/config.ts","webpack://dhtmlxgantt/./sources/core/common/services.js","webpack://dhtmlxgantt/./sources/ext/extension_manager.ts","webpack://dhtmlxgantt/./sources/constants/index.js","webpack://dhtmlxgantt/./sources/factory/make_instance_common.js","webpack://dhtmlxgantt/./sources/factory/make_instance_web.js","webpack://dhtmlxgantt/./sources/ext/undo/undo.ts","webpack://dhtmlxgantt/./sources/ext/undo/monitor.ts","webpack://dhtmlxgantt/./sources/ext/undo/index.ts","webpack://dhtmlxgantt/./sources/ext/tooltip/tooltip.ts","webpack://dhtmlxgantt/./sources/ext/tooltip/tooltipManager.ts","webpack://dhtmlxgantt/./sources/ext/tooltip/index.ts","webpack://dhtmlxgantt/./sources/ext/quick_info/quickInfo.ts","webpack://dhtmlxgantt/./sources/ext/quick_info/index.ts","webpack://dhtmlxgantt/./sources/ext/multiselect.js","webpack://dhtmlxgantt/./sources/ext/marker.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/core.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/modals.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/elements/task_cell.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/elements/task_row.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/elements/header_cell.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/elements/nav_node.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/elements/gantt_node.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/common/trap_modal_focus.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/common/eventhandler.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation/common/keyboard_shortcuts.js","webpack://dhtmlxgantt/./sources/ext/keyboard_navigation.js","webpack://dhtmlxgantt/./sources/ext/fullscreen/index.ts","webpack://dhtmlxgantt/./node_modules/querystring-es3/encode.js","webpack://dhtmlxgantt/./node_modules/querystring-es3/decode.js","webpack://dhtmlxgantt/./node_modules/querystring-es3/index.js","webpack://dhtmlxgantt/./node_modules/url/util.js","webpack://dhtmlxgantt/(webpack)/buildin/module.js","webpack://dhtmlxgantt/./node_modules/punycode/punycode.js","webpack://dhtmlxgantt/./node_modules/builtin-status-codes/browser.js","webpack://dhtmlxgantt/./node_modules/xtend/immutable.js","webpack://dhtmlxgantt/./node_modules/to-arraybuffer/index.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/_stream_passthrough.js","webpack://dhtmlxgantt/./node_modules/util-deprecate/browser.js","webpack://dhtmlxgantt/./node_modules/setimmediate/setImmediate.js","webpack://dhtmlxgantt/./node_modules/readable-stream/lib/internal/streams/BufferList.js","webpack://dhtmlxgantt/./node_modules/stream-http/lib/request.js","webpack://dhtmlxgantt/./node_modules/https-browserify/index.js","webpack://dhtmlxgantt/./node_modules/ieee754/index.js","webpack://dhtmlxgantt/./node_modules/base64-js/index.js","webpack://dhtmlxgantt/./sources/ext/export_api/index.ts","webpack://dhtmlxgantt/./sources/ext/drag_timeline/eventsManager.ts","webpack://dhtmlxgantt/./sources/ext/drag_timeline/index.ts","webpack://dhtmlxgantt/./sources/ext/click_drag/selectedRegion.ts","webpack://dhtmlxgantt/./sources/ext/click_drag/eventsManager.ts","webpack://dhtmlxgantt/./sources/ext/click_drag/index.ts","webpack://dhtmlxgantt/./sources/ext/extensions_gpl.ts","webpack://dhtmlxgantt/./sources/dhtmlxgantt.gpl.ts"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","_typeof","obj","iterator","constructor","seed","helpers","plainObjectConstructor","toString","copy","result","isDate","Date","isArray","Array","length","isCustomType","apply","defined","mixin","target","source","force","f","undefined","uid","valueOf","functor","arguments","event","el","handler","capture","addEventListener","attachEvent","eventRemove","removeEventListener","detachEvent","elementPosition","elem","top","left","right","bottom","getBoundingClientRect","box","body","document","docElem","documentElement","parentNode","scrollTop","pageYOffset","scrollLeft","pageXOffset","clientTop","clientLeft","offsetWidth","offsetHeight","parseInt","offsetTop","offsetLeft","offsetParent","y","Math","round","x","width","height","isVisible","node","display","visibility","getComputedStyle","style","currentStyle","hasNonNegativeTabIndex","isNaN","getAttribute","hasHref","a","area","nodeName","loLowerCase","isEnabled","input","select","textarea","button","toLowerCase","hasAttribute","getClassName","className","baseVal","indexOf","_trimString","_slave","getTargetNode","e","trg","tagName","srcElement","shadowRoot","composedPath","str","String","trim","this","replace","isShadowDomSupported","head","createShadowRoot","attachShadow","getRootNode","element","ShadowRoot","host","getNodePosition","getFocusableNodes","nodes","querySelectorAll","join","nodesArray","slice","$position","sort","b","tabIndex","splice","getScrollSize","div","createElement","cssText","appendChild","clientWidth","removeChild","addClassName","removeClassName","split","regEx","RegExp","insertNode","newone","innerHTML","child","firstChild","removeNode","getChildNodes","css","ch","childNodes","len","out","push","toNode","getElementById","querySelector","locateClassName","classname","strict","ind","charAt","locateAttribute","attribute","getRelativeEventPosition","ev","clientX","clientY","isChildOf","parent","hasClass","classList","contains","test","closest","selector","matches","msMatchesSelector","webkitMatchesSelector","parentElement","nodeType","console","error","hasShadowParent","getActiveElement","activeElement","getSelection","focusNode","units","second","minute","hour","day","week","month","quarter","year","getFullYear","getMonth","getDate","arrayFilter","arr","callback","filter","checkZeroId","id","getSecondsInUnit","unit","forEach","workArray","arrayMap","map","resArray","arrayIncludes","item","includes","arrayFind","find","arrayDifference","arraySome","hashToArray","hash","sortArrayOfHash","field","desc","compare","throttle","timeout","wait","setTimeout","pop","isValidDate","getTime","isStringObject","Function","isNumberObject","isBooleanObject","delay","timer","$cancelTimeout","$pending","args","clearTimeout","$execute","objectKeys","keys","isEventable","replaceValidZeroId","rootId","findBinary","array","prev","low","high","floor","__","g","eval","EventHost","_silent_mode","listeners","_silentStart","_silentEnd","createEventStorage","handlers","index","eventStorage","combinedResult","handlerResult","addEvent","settings","handlerId","once","originalHandler","removeEvent","clear","eventHost","eventName","thisObject","attachAll","callEvent","eventArguments","handlerName","concat","checkEvent","list","eventId","detachAllEvents","gantt","view","config","datastore","viewport","start","getItemIndexByTopPosition","end","y_end","count","max","min","dummy","log","BaseControl","render","set_value","get_value","focus","ctor","superCtor","super_","writable","configurable","TempCtor","cachedSetTimeout","cachedClearTimeout","process","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","run","marker","runClearTimeout","Item","noop","nextTick","title","browser","env","argv","version","versions","on","addListener","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","BaseEditor","show","column","placeholder","hide","get_input","is_changed","currentValue","is_valid","save","isWindowAwailable","isIE","navigator","userAgent","isIE6","XMLHttpRequest","isIE7","isIE8","isOpera","isChrome","isKHTML","isFF","isIPad","search","isEdge","isNode","pna","Duplex","util","inherits","Readable","Writable","v","method","options","readable","allowHalfOpen","onend","_writableState","ended","onEndNT","self","highWaterMark","_readableState","destroyed","set","_destroy","err","cb","global","base64","ieee754","kMaxLength","Buffer","TYPED_ARRAY_SUPPORT","createBuffer","that","RangeError","Uint8Array","__proto__","arg","encodingOrOffset","allocUnsafe","from","TypeError","ArrayBuffer","byteOffset","byteLength","fromArrayLike","fromArrayBuffer","string","encoding","isEncoding","actual","write","fromString","isBuffer","checked","buffer","val","isnan","type","data","fromObject","assertSize","size","isView","loweredCase","utf8ToBytes","base64ToBytes","swap","bidirectionalIndexOf","arrayIndexOf","lastIndexOf","indexSize","arrLength","valLength","read","buf","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","substr","utf8Write","blitBuffer","asciiWrite","byteArray","charCodeAt","asciiToBytes","latin1Write","base64Write","ucs2Write","hi","lo","utf16leToBytes","base64Slice","fromByteArray","utf8Slice","res","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","decodeCodePointsArray","SlowBuffer","alloc","INSPECT_MAX_BYTES","foo","subarray","typedArraySupport","poolSize","_augment","species","fill","allocUnsafeSlow","_isBuffer","pos","swap16","swap32","swap64","hexSlice","asciiSlice","latin1Slice","utf16leSlice","equals","inspect","match","thisStart","thisEnd","thisCopy","targetCopy","isFinite","toJSON","_arr","ret","toHex","bytes","checkOffset","ext","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","code","INVALID_BASE64_RE","Infinity","leadSurrogate","toByteArray","stringtrim","base64clean","src","dst","utils","eventable","domHelpers","Cell","$container","$parent","$config","headerHeight","$gantt","$domEvents","_createDomEventScope","$id","$name","$factory","destructor","$view","$services","getService","detach","_headerClickHandler","detachAll","cell","scrollTo","html","getNode","padding","resize","_final","$preResize","topCont","topSize","getSize","minWidth","maxWidth","minHeight","maxHeight","setSize","_hide","cellIndex","moveView","hidden","$toHTML","content","header","raw","canCollapse","$fill","init","toggle","delegate","collapsed","gravity","getContentSize","$lastSize","contentX","contentY","_getBorderSizes","borders","horizontal","vertical","_currentBorders","_borders","_sizeHeader","_sizeContent","_setBorders","cssHash","xLayout","transform","$root","store","placeholder_task","exists","getItem","types","objectToString","isBoolean","isNull","isNullOrUndefined","isNumber","isString","isSymbol","isUndefined","isRegExp","re","isObject","isError","isFunction","isPrimitive","__extends","htmlHelpers","_super","SelectControl","sns","getHtmlSelect","_dhx_onchange","onchange","_focus","start_date","end_date","getItemTop","getItemHeight","startCoord","posFromDate","endCoord","x_end","smart_rendering","_smart_render","globalScope","copyProps","SafeBuffer","fn","arg1","arg2","arg3","createDropTargetObject","targetParent","targetIndex","targetId","nextSibling","prevSibling","nextSiblingTarget","dndTaskId","targetTaskId","getParent","getBranchIndex","prevSiblingTarget","firstChildTarget","lastChildTarget","children","getChildren","isLegacyRender","columnIndex","scale","viewPort","cellLeftCoord","cellRightCoord","firstCellIndex","lastCellIndex","_task_default_render","task","_isAllowedUnscheduledTask","_isTaskInTimelineLimits","getItemPosition","cfg","templates","$getTemplates","taskType","getTaskType","getBarHeight","milestone","controlsMargin","padd","item_attribute","setAttribute","show_progress","done","progress","pr","progressColor","backgroundColor","opacity","progress_text","rtl","position","wrapper","drag_progress","isReadonly","drag","markerPos","_render_task_progress","task_text","_render_task_content","textColor","color","basic","template","itemId","$getConfig","state","getState","getTask","project","isSummaryTask","isSplitTask","open_split_tasks","$open","select_task","isSelectedTask","drag_id","drag_mode","touch_drag","link_source_id","link_target_id","highlight_critical_path","isCriticalTask","link_landing_area","from_id","from_start","link_from_start","to_start","link_to_start","allowDrag","isLinkAllowed","dragClass","_combine_item_class","task_class","styles","side","margin","_get_link_crossing_css","marginStyle","_render_side_content","leftside_text","_render_leftside_content","rightside_text","_render_rightside_content","_waiAria","setTaskBarAttr","drag_resize","_render_pair","drag_links","show_links","outer","inner","showLinkPoints","touch","cssClass","text","abs","cond","leftside","$source","links","start_to_start","$target","finish_to_start","finish_to_finish","_get_conditions","ln","link","getLink","tp","min_date","marginLeft","max_date","marginRight","renderer","type_renderers","defaultRenderer","ScaleHelper","topPositionMixin","canvasRender","Timeline","$scaleHelper","_posFromDateCache","_timelineDragScroll","container","$task","$task_scale","$task_data","$task_bg","$task_links","$task_bars","_tasks","col_width","full_width","trace_x","rendered","attr","linksAttr","bindLinks","link_attribute","layers","_createLayerConfig","tasks","linkLayers","_attachLayers","dragTimeline","attach","dataHeight","scale_height","refresh","backgroundImage","rowStore","getTotalHeight","data_els","contentHeight","contentWidth","scrollHeight","scrollWidth","scrolled","_refreshScales","smart_scales","getViewPort","scales","_scales","_getScaleChunkHtml","taskFilter","expose","$ui","taskBar","hide_bar","taskSplitBar","append","taskRollupBar","taskBg","_taskLayers","_linkLayers","_bindStore","taskRenderer","getDataRender","createDataRender","defaultContainer","taskLayers","layer","update","bar_layer","addLayer","_taskRenderer","getLayer","_initStaticBackgroundRender","linkStore","getDatastore","linkRenderer","linkLayer","_linkRenderer","staticRender","_staticBgHandler","static_background","timeline_placeholder","staticBgContainer","$task_bg_static","insertBefore","staticBackgroundHeight","getScale","destroy","_clearLayers","removeLayer","_render_tasks_scales","scales_html","outer_width","_getScales","availWidth","autosize","autosize_min_width","cfgs","prepareConfigs","min_column_width","fromPos","toPos","scale_row_class","tplClass","_prepareScaleHtml","globalConfig","globalTemplates","cells","date","format","date_to_str","startIndex","endIndex","inherit_scale_class","scale_cell_class","cssclass","getTimelineCellAttr","dateFromPos","summ","part","_getColumnDuration","dateValue","columnIndexByDate","assert","wholeCells","partCell","roundPos","_getNextVisibleColumn","columns","ignores","visibleDateIndex","_getPrevVisibleColumn","_getClosestVisibleColumn","days","trace_x_ascending","ignore_x","dateIndex","visibleIndex","visibleDate","transition","trace_index_transition","xLeft","xRight","rowHeight","taskId","isMilestoneRender","task_height","bar_height","task_height_offset","sqrt","primaryScale","getSubScales","sortScales","add","step","_timelineCacheAttached","_resetTopPositionHeight","_unbindStore","_resetHeight","events","mouseEvents","h","gridResize","rowResize","ColumnDnd","Grid","$state","gridAriaAttr","gridAttrString","gridDataAriaAttr","gridDataAttrString","_ganttConfig","reorderColumns","reorder_grid_columns","$grid","gridScaleRowAttrString","$grid_scale","$grid_data","resizer","_renderHeaderResizers","doOnRender","_mouseDelegates","_addLayers","_initEvents","_columnDND","_validateColumnWidth","numericWidth","outerWidth","getGridColumns","innerWidth","elasticColumns","grid_elastic_columns","scrollable","_setColumnsWidth","columnProperty","newColumnWidth","col","min_grid_column_width","columnsWidth","grid_width","_getGridWidth","_gridCacheAttached","_initSmartRenderingPlaceholder","_calculateGridWidth","_renderGridHeader","getColumnIndex","excludeHidden","hiddenIndexShift","getColumn","gridLine","gridTaskRowResizer","resize_rows","_refreshPlaceholderOnStoreUpdate","scrollY","scroll","getView","getScrollState","scrollSize","$rowsPlaceholder","close","open","_getColumnWidth","min_width","new_width","max_width","_checkGridColumnMinWidthLimits","_getGridWidthLimits","min_limit","max_limit","newWidth","start_index","columns_width","final_width","extra_width","start_width","share","curExtra","_getColsTotalWidth","cols_width","parseFloat","unknown","gridWidth","autofit","diff","delta","changed","_setContentSize","locale","reverse","labels","lineHeigth","last","colWidth","_sort","direction","grid_header_class","label","gridScaleCellAttrString","lineHeight","dateHelper","services","getSum","sizes","to","setSumWidth","sum_width","parts","adjustSize","splitSize","full","cellSize","_isLegacyMode","scaleConfig","scale_unit","date_scale","subscales","_prepareScaleObject","legacyMode","initTemplate","min_coll_width","container_width","minDate","maxDate","heights","configs","main_scale","initScaleConfig","processIgnores","initColSizes","limitVisibleRange","unshift","alineScaleColumns","reverseScale","setPosSettings","indexes","trace_indexes","_ignore_time_config","skip_off_time","skip","probe","isWorkTime","display_count","min_col_width","line_height","cont_width","column_count","eachColumn","iterateScales","lower_scale","upper_scale","upper_dates","lower_dates","prevUpper","up","target_index","upper_start","upper_end","lower_start","lower_end","targetWidth","curr","tzOffset","getTimezoneOffset","_correct_dst_change","dates","lastDate","outDate","shared","attributes","_this","entry","_attributes","getHtmlOption","_getHtmlContainer","getHtmlButton","getHtmlDiv","getHtmlLabel","getHtmlInput","_getHtmlAttributes","tag","resourceTaskCache","$data","tasksStore","resource","resourceProperty","timeline","cacheKey","items","assignmentsPassed","timegrid","process_resource_assignments","resource_property","$role","getResourceAssignments","$resource_id","$task_id","getTaskBy","assignments","scaleUnit","scaleStep","precalculatedTimes","task_id","firstColumn","currDate","calendar","work_time","getTaskCalendar","cachedTimes","timestamp","calculateResourceLoadFromAssignments","timetable","resource_render_empty_cells","calculateResourceLoad","Layout","_parseConfig","$cells","_resizeScrollbars","scrollbars","scrollbar","scrollChanged","visibleScrollbars","hiddenScrollbars","scrollbarsToHide","showScrollbar","hideScrollbar","shouldHide","shouldShow","visibleGroups","group","$scrollbarRepaint","_syncCellSizes","groupName","newSize","groups","_eachChild","_syncGroupSize","_xLayout","getNextSibling","newSizeValue","isGravity","ownSize","resizeSibling","getPrevSibling","siblingSize","totalGravity","totalSize","k","mainGrid","$content","startStage","mainCall","_resizeInProgress","contentViews","getCellsByType","setContentSize","_getAutosizeMode","$originalWidthStored","$originalWidth","$originalHeightStored","$originalHeight","isChild","cellId","alert","rows","cols","views","initUI","getCells","_cleanElSize","_getBoxStyles","computed","properties","boxSizing","clientHeight","MozBoxSizing","horPaddings","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","vertPaddings","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","borderBox","innerHeight","outerHeight","boxSizes","contentSizes","_sizes","_calcFreeSpace","_free","_gravity","_calcSize","_configureBorders","borderClass","lastVisibleIndex","lastCell","borderColorClass","_updateCellVisibility","oldVisibleCells","_visibleCells","firstCall","visibleCells","parentVisibility","hide_empty","hideCell","cellView","marginSide","dx","dy","sourceTop","sourceHeight","targetTop","targetHeight","sourceLeft","sourceRight","targetLeft","targetRight","tmp","getLinkRectangle","coordinates","calculated","clearCache","initialized","getVisibleItems","rec","buildCache","visibleBoxes","ids","workunit_map_cache_1","workunit_object_cache_1","larger_units_helper_1","LargerUnitsCache","createCacheObject","Map","WorkUnitsMapCache","WorkUnitsObjectCache","IsWorkTimeArgument","ClosestWorkTimeArgument","CalculateEndDateArgument","duration","GetDurationArgument","getWorkHoursArguments","setWorkTimeArguments","unsetWorkTimeArguments","isWorkTimeArguments","processedConfig","duration_unit","getClosestWorkTimeArguments","_getStartEndConfig","param","argumentType","duration_step","getDurationArguments","hasDurationArguments","calculateEndDateArguments","quickPositionHelperFactory","getItemTopCache","getRowTopCache","getItemHeightCache","totalHeightCache","getItemHeightCacheState","quickPosition","resetCache","newState","getCacheStateTotalHeight","shouldClearHeightCache","getRowTop","canUseSimpleCalculation","all","getIndexRange","itemIndex","getIndexById","parentId","_fillHeightCache","defaultHeight","row_height","eachItem","globalHeight","itemHeightCache","sumHeight","oldState","newValue","getHeight","totalHeight","countVisible","current","next","getIdByIndex","DurationFormatterNumeric","canParse","parse","copyLinkIdsArray","linkIds","targetHash","isLinkExists","copyLinkIds","getSubtreeLinks","isTaskExists","eachTask","getSubtreeTasks","PrimaryScaleHelper","_init_tasks_range","scale_offset_minimal","helper","_scale_range_unit","range","start_interval","resolveConfigRange","onlyProjectTasks","getTaskByTime","getSubtaskDates","calculateEndDate","_min_date","_max_date","fit_tasks","old_min","old_max","_adjust_scales","powerArray","DataStore","isPlaceholderTask","TreeDataStore","_branches","pull","$initItem","loadedItem","initItem","existingItem","move","$index","root_id","$parentProperty","parentProperty","$getRootId","$openInitially","openInitially","visibleOrder","$create","fullOrder","_searchVisibleOrder","_indexRangeCache","_eachItemMainRangeCache","_getItemsCache","_skip_refresh","getConfig","splitParents","splitItems","taskOpenState","taskVisibility","haveSplitItems","_attachDataChange","_isSplitItem","canOpenSplitTasks","$split_subtask","$expanded_branch","_buildTree","setParent","_add_branch","$level","calculateItemLevel","$local_index","_updateOrder","hasChild","loaded","_parseInner","_addItemInner","_move_branch","$rendered_parent","_changeIdInner","oldId","newId","_replace_branch_child","_traverseBranches","branch","_removeItemInner","sid","tindex","source_pid","tbranch","placeholderIds","tid","_moveInner","childId","pid","getSiblings","siblings","previousSibling","clearAll","level","eachParent","_setParentInner","new_pid","silent","_eachItemCached","cache","_eachItemIterate","startId","itemsStack","useCache","startItem","parentsHash","old_parent","new_parent","old_id","new_id","newbranch","criteria","original_criteria","els","temp","rule","renderedParent","actualParent","_skipTaskRecalculation","$powerArray","$removeAt","$remove","$find","$insertAt","$each","master","$map","$filter","_filterRule","copyOnParse","isSilent","updateItem","removeItem","order","data_size","addItem","changeId","sindex","$destroyed","unselect","alreadySilent","arraysEqual","arr1","arr2","quick","skipFilter","_quick_refresh","_mark_recompute","oldOrder","serialize","filteredOrder","getItems","_getNullIfUndefined","getFirst","getLast","getNext","getPrev","updPerSecond","_on_timeout","ceil","createScope","eventScope","staticArray","extend","FormData","__webpack_amd_options__","punycode","Url","protocol","slashes","auth","port","hostname","query","pathname","path","href","urlParse","resolve","relative","resolveObject","protocolPattern","portPattern","simplePathPattern","unwise","autoEscape","nonHostChars","hostEndingChars","hostnamePartPattern","hostnamePartStart","unsafeProtocol","javascript","javascript:","hostlessProtocol","slashedProtocol","http","https","ftp","gopher","file","http:","https:","ftp:","gopher:","file:","querystring","url","parseQueryString","slashesDenoteHost","u","queryIndex","splitter","uSplit","rest","simplePath","exec","proto","lowerProto","atSign","hostEnd","hec","decodeURIComponent","parseHost","ipv6Hostname","hostparts","newpart","validParts","notHost","bit","toASCII","ae","esc","encodeURIComponent","escape","qm","stringify","rel","tkeys","tk","tkey","rkeys","rk","rkey","relPath","shift","isSourceAbs","isRelAbs","mustEndAbs","removeAllDots","srcPath","psychotic","authInHost","hasTrailingSlash","isAbsolute","Transform","_transformState","afterTransform","er","ts","transforming","writecb","writechunk","rs","reading","needReadable","_read","needTransform","writeencoding","sync","_transform","flush","_flush","prefinish","stream","chunk","_write","_this2","err2","StringDecoder","nb","enc","nenc","retried","_normalizeEncoding","normalizeEncoding","utf16Text","utf16End","fillLast","utf8FillLast","base64Text","base64End","simpleWrite","simpleEnd","lastNeed","lastTotal","lastChar","utf8CheckByte","_byte","utf8CheckExtraBytes","total","utf8CheckIncomplete","scope","Timeout","clearFn","_id","_clearFn","setInterval","clearInterval","unref","ref","enroll","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","setImmediate","clearImmediate","CorkedRequest","finish","corkReq","pendingcb","corkedRequestsFree","onCorkedFinish","asyncWrite","WritableState","internalUtil","deprecate","Stream","OurUint8Array","realHasInstance","destroyImpl","nop","isDuplex","objectMode","writableObjectMode","hwm","writableHwm","writableHighWaterMark","defaultHwm","finalCalled","needDrain","ending","finished","noDecode","decodeStrings","defaultEncoding","writing","corked","bufferProcessing","onwrite","writelen","onwriteStateUpdate","finishMaybe","errorEmitted","onwriteError","needFinish","bufferedRequest","clearBuffer","afterWrite","lastBufferedRequest","prefinished","bufferedRequestCount","writev","_writev","doWrite","onwriteDrain","holder","allBuffers","isBuf","callFinal","need","getBuffer","_","hasInstance","pipe","_isUint8Array","_uint8ArrayToBuffer","writeAfterEnd","valid","validChunk","newChunk","decodeChunk","writeOrBuffer","cork","uncork","setDefaultEncoding","endWritable","_undestroy","undestroy","emitErrorNT","readableDestroyed","writableDestroyed","endEmitted","EventEmitter","_events","_maxListeners","defaultMaxListeners","setMaxListeners","context","listener","newListener","warned","trace","fired","listenerCount","evlistener","emitter","ReadableState","EElistenerCount","debugUtil","debug","debuglog","BufferList","kProxyEvents","readableObjectMode","readableHwm","readableHighWaterMark","pipes","pipesCount","flowing","emittedReadable","readableListening","resumeScheduled","awaitDrain","readingMore","decoder","readableAddChunk","addToFront","skipChunkCheck","emitReadable","onEofChunk","chunkInvalid","getPrototypeOf","addChunk","maybeReadMore","needMoreData","isPaused","setEncoding","MAX_HWM","howMuchToRead","computeNewHighWaterMark","emitReadable_","flow","maybeReadMore_","nReadingNextTick","resume_","fromList","hasStrings","tail","copyFromBufferString","copyFromBuffer","fromListPartial","endReadable","endReadableNT","xs","nOrig","doRead","dest","pipeOpts","endFn","stdout","stderr","unpipe","onunpipe","unpipeInfo","hasUnpiped","onclose","onfinish","ondrain","onerror","ondata","cleanedUp","pipeOnDrain","increasedAwaitDrain","pause","resume","dests","wrap","paused","_fromList","PassThrough","capability","rStates","readyStates","UNSENT","OPENED","HEADERS_RECEIVED","LOADING","DONE","IncomingMessage","xhr","response","fetchTimer","_mode","headers","rawHeaders","trailers","rawTrailers","_fetchResponse","statusCode","status","statusMessage","statusText","writableStream","WritableStream","Promise","reject","_destroyed","_resumeFetch","abort","pipeTo","reader","getReader","then","_xhr","_pos","responseURL","getAllResponseHeaders","_charset","overrideMimeType","mimeType","charsetMatch","_onXHRProgress","readyState","VBArray","responseBody","toArray","responseText","newData","MSStreamReader","onprogress","onload","readAsArrayBuffer","fetch","ReadableStream","abortController","AbortController","blobConstructor","Blob","getXHR","XDomainRequest","checkTypeSupport","responseType","haveArrayBuffer","haveSlice","arraybuffer","msstream","mozchunkedarraybuffer","vbArray","ClientRequest","statusCodes","request","opts","defaultProtocol","location","toUpperCase","req","Agent","defaultMaxSockets","globalAgent","STATUS_CODES","METHODS","htmlTags","extraSpaces","stripHTMLLite","htmlText","singleQuotes","escapeQuotes","getAttributeString","dateString","aria-label","_taskCommonAttr","tooltip_text","$dataprocessor_class","drag_move","taskRowAttr","order_branch","linkAttr","linkTypes","toStart","fromStart","start_to_finish","drag_link","gridSeparatorAttr","rowResizerAttr","lightboxHiddenAttr","lightboxVisibleAttr","lightboxAttr","lightboxButtonAttrString","buttonName","role","tabindex","lightboxHeader","headerText","lightboxSelectAttrString","time_option","years","months","hours","minutes","lightboxDurationInputAttrString","section","column_duration","aria-valuemin","inlineEditorAttr","multiselect","attrs","new_task","reorderMarkerAttr","removeAttribute","gridCellAttrString","textValue","editor","gridAddButtonAttrString","messageButtonAttrString","buttonLabel","messageInfoAttr","messageModalAttr","quickInfoAttr","quickInfoHeaderAttrString","quickInfoHeader","quickInfoButtonAttrString","tooltipAttr","tooltipVisibleAttr","tooltipHiddenAttr","payload","wai_aria_attributes","_extend_to_optional","lightbox_block","optional_time","mapping","_resolve_default_mapping","disable","enable","disabled","update_block","_lightbox_id","button_text","resizeLightbox","button_click","_get_typed_lightbox_config","form_blocks","duration_optional","time_optional","time","TypeselectControl","typeKey","typeValue","oldOnChange","changeLightboxType","_lightbox_new_type","ConstraintControl","isNonTimedConstraint","constraint_types","ASAP","ALAP","toggleTimeSelect","timeSelects","isNonTimed","getTimePicker","typeSelect","_time_format_order","_eventsInitialized","constraintDate","constraint_date","_fill_lightbox_select","constraintType","constraint_type","getConstraintType","getTimePickerValue","ParentControl","_display","item_id","allow_root","root_label","_filter","map_to","tmpDom","newOptions","onselect","replaceChild","DurationControl","getFormatter","formatter","_getStartDate","getElementsByTagName","_getDuration","singleDate","single_date","readonly","ariaAttr","durationInputClass","duration_val","inps","btns","endspan","_calc_date","task_end_date","task_date","_change_duration","onclick","onkeydown","charCode","keyCode","which","constants","KEY_CODES","DOWN","UP","calculateDuration","startDate","endDate","RadioControl","radio","default_value","CheckboxControl","single_value","checkboxes","TimeControl","auto_end_date","_update_lightbox_select","selects","autofix_end","_get_timepicker_step","_getEndDate","TextareaControl","_get_input","TemplateControl","ResourcesControl","getHtmlButtons","buttons","floatRight","_migrate_buttons","getHtmlTimePickerOptions","start_year","end_year","tdate","timeFormat","year_range","month_full","first","_time_values","time_picker","setTime","getHours","getMinutes","_lightbox_methods","_lightbox_template","_lightbox_root","registerProvider","lightbox","showLightbox","getLightbox","_center_lightbox","showCover","_fill_lightbox","round_dnd_dates","_is_chart_visible","time_step","getLabel","sections","updateCollection","list_name","collection","serverList","resetLightbox","getLightboxType","_lightbox_type","lightboxDiv","fullWidth","ds","classNames","cspEnvironment","csp","salesforceEnvironment","setParentNode","_lightbox","_is_lightbox_timepicker","wide_form","buttons_left","buttons_right","drag_lightbox","onmousedown","_ready_to_dnd","onselectstart","cursor","_init_dnd_events","_render_sections","backup_overflow","overflow","labelBlock","inputBlock","inputId","bindLabelsToInputs","_init_lightbox_events","block","con","lightbox_additional_height","scroll_top","scroll_left","view_height","_cover","lightbox_events","gantt_save_btn","_save_lightbox","gantt_delete_btn","$click","hideLightbox","gantt_cancel_btn","_cancel_lightbox","sec","buttonTarget","SPACE","shiftKey","click","edit_save","edit_cancel","getLightboxValues","$new","_update_flags","refreshData","addTask","getTaskIndex","refreshTask","updateTask","hideCover","_custom_lightbox","_set_lightbox_values","lightbox_header","task_time","getLightboxSection","getValue","setValue","get_template_control","control","get_select_control","get_textarea_control","get_time_control","eventElement","_move_while_dnd","_finish_dnd","_dnd_start_lb","gantt_unselectable","lb","now","pageX","pageY","_lb_start","ariaAttrs","date_part","time_format","getTimeFormat","limit_time_select","first_hour","last_hour","setHours","needSetTime","mapOffset","checkbox","resources","constraint","typeselect","_simple_confirm","message","ok","confirm","type_value","_silent_redraw_lightbox","oldType","formData","updTask","scrollX","scrollState","visible","getTaskDND","tasksDnD","_tasks_dnd","touch_feedback","touch_feedback_duration","_prevent_touch_scroll","_touch_feedback","vibrate","platform","maxTouchPoints","touchEventsSupported","createEvent","_touch_events","touches","pointerEnabled","pointerType","msPointerEnabled","MSPOINTER_TYPE_MOUSE","touchHandlers","names","accessor","ignore","dblclicktime","actionMode","scrollMode","actionStart","longTapTimer","currentDndId","dndNodes","targetView","start_drag","on_mouse_move","preventDefault","cancelBubble","newScrollState","scrollView","block_action","allViews","$layout","findTargetView","_locate_css","locate","on_mouse_down","renders","_getTaskLayers","isTaskVisible","task_attribute","cloneNode","cloneTaskRendered","_start_dnd","_touch_drag","remove","on_mouse_up","onDoubleClick","USE_KEY","_defaultScales","TimelineZoom","zoomIn","getCurrentLevel","setLevel","zoomOut","_levels","_activeLevelIndex","getLevels","zoomLevel","_getZoomIndexByName","_setLevel","levelName","_getVisibleDate","scrollPos","_visibleDate","cursorOffset","nextConfig","chartConfig","cursorDate","newPosition","middleDate","_attachWheelEvent","_domEvents","_useKey","_handler","passive","_defaultHandler","timelineOffset","wheelUp","deltaY","wheelDelta","stopPropagation","_setScaleSettings","_setScaleDates","_initialStartDate","_initialEndDate","activeLevelIndex","_mapScales","levels","_minColumnWidth","minColumnWidth","_maxColumnWidth","maxColumnWidth","_widthStep","widthStep","useKey","_initialized","trigger","_stepUp","_stepDown","nextLevel","dhtmlx","attaches","attachGantt","cmp","attachObject","dataType","dataObj","vs","av","grid","border","gridId","gridObj","dhtmlXCellObject","jQuery","$","methods","dhx_gantt","each","newgantt","Gantt","getGanttInstance","isHeadless","scrollRange","scrollStep","scrollDelay","scrollSpeed","interval","isMove","delayTimeout","startPos","started","eventPos","isDisplayed","isScrollState","dragMarker","isResize","isLink","isClickDrag","autoscroll","defineDelayTimeout","speed","autoscroll_speed","tick","autoscroll_delay","defineScrollInterval","autoscrollInterval","isScroll","targetTouches","gridDrag","posX","posY","need_scroll","currentScrollTop","scrollOuterHeight","inner_height","scrollInnerHeight","currentScrollLeft","scrollOuterWidth","inner_width","scrollInnerWidth","autoscroll_step","boxSize","zoom","skins","link_line_width","link_arrow_size","_second_column_width","_third_column_width","material","_redefine_lightbox_buttons","getTaskNode","indx","broadway","_config_buttons_left","_config_buttons_right","terrace","meadow","skyblue","_get_skin","skin","skinset","_configure","resetSkin","getTimeline","getGrid","getBaseCell","getVerticalScrollbar","baseCell","getAttachedScrollbar","getHorizontalScrollbar","attachedScrollbar","DEFAULT_VALUE","tryCall","fallback","getTaskTop","getTaskPosition","getTaskBarHeight","getTaskHeight","roundTaskDates","domAttr","getLinkNode","oldH","oldV","scrollHorizontal","scrollVertical","verticalViews","_getLinkedViews","horizontalViews","commonViews","viewId","$skipSmartRenderOnScroll","newV","newH","showDate","date_x","scroll_to","task_scroll_offset","showTask","leftPos","_scroll_state","gridCell","timelineCell","x_pos","y_pos","scroll_size","x_inner","y_inner","scrollVer","scrollHor","horState","verState","getLayoutView","cellName","scrollLayoutCell","horizontalScroll","verticalScroll","addTaskLayer","addLinkLayer","initializer","_legacyGridResizerClass","layout","resizers","gridResizer","onCreated","mainTimeline","show_chart","colsWidth","hideGrid","show_grid","grid_limits","ganttContainerWidth","verticalScrollbarWidth","gridOverflow","original_grid_width","skinSettings","_initScrollStateEvents","_getVerticalScrollbar","_getHorizontalScrollbar","oldPos","newPos","$scroll_ver","$scroll_hor","_findGridResizer","gridFirst","_getSiblings","_behind","_front","onInitialized","resizeInfo","initialWidth","prevCellWidth","nextCellWidth","viewCell","limits","newBehindSize","newFrontSize","oldBackSize","oldFrontSize","newBackSize","oldSize","onDestroyed","initLinksDND","_link_landing","_link_target_task","_link_target_task_start","_link_source_task","_link_source_task_start","markerDefaultOffset","scrollDefaultSize","getDndState","DnD","dnd","sensitivity","updates_per_second","mousemoveContainer","getLinePos","isStart","taskPos","xEnd","yEnd","milestoneWidth","origWidth","getVisibleMilestoneWidth","getMilestonePosition","isMilestone","getPosition","markerSize","getMarkerSize","viewportSize","getVieportSize","offsetX","tooltip_offset_x","offsetY","tooltip_offset_y","ganttOffsetY","updateMarkedHtml","drag_link_class","resetDndState","showDirectingLine","s_x","s_y","e_x","e_y","_direction","getDirectionLine","link_direction_class","dist","tan","angle","atan","coordinateCircleQuarter","PI","sin","cos","ieTransform","shiftLeft","shiftTop","sX","eX","sY","eY","_dir_start","dd","advanceMarker","landing","prevTarget","prevLanding","prevToStart","targ","eventTarget","_dir_end","targetChanged","_get_link_type","addLink","createLinkDND","createTaskDND","round_task_dates","dragMultiple","before_start","before_finish","after_finish","_handlers","clear_drag_state","set_actions","drag_from_start","evs","stage","_move","_resize","_resize_progress","start_x","start_y","coords_x","_drag_task_coords","minDurationInUnits","_calculateMinDuration","min_duration","_init_task_timing","diffValue","_find_max_shift","dragItems","correctShift","minX","maxX","maxShift","minShift","multipleDragShift","new_start","new_end","obj_s_x","obj_e_x","_mouse_position_change","_is_number","_update_on_move","_update_item_on_move","original","curr_date","dragHash","_isMultiselect","getSelectedTasks","dragProject","drag_project","initialDrag","childDrag","_bulk_dnd","_update_parents","_get_drag_mode","_fix_dnd_scale_time","fixStart","correct_work_time","roundDate","fixEnd","_fix_working_times","getClosestWorkTime","correctTaskWorkTime","_finalize_mouse_up","_fireEvent","_dhx_changed","finalizingBulkMove","moveCount","doFinalize","batchUpdate","modes","dragProperty","selectedTasksIds","selectedTask","_addSubtasksToDragMultiple","params","drag_state","drag_multiple","summaryId","taskDnD","linkDnD","_linksDnD","_tasksDnD","_attachDomEvents","_attachStateProvider","extendDom","_clearDomEvents","_clearStateProvider","_delete_link_handler","question","link_description","confirm_link_deleting","deleteLink","coll","coll_date","scale_step","unregisterProvider","gridToPageCoordinates","gridPos","setWidthWithinContainer","containerSize","removeLineHighlight","markerLine","highlightPosition","ePos","gridHeight","getTaskMarkerPosition","pointerEvents","markerFolder","maxBottom","folderHighlightWidth","highlightFolder","linePos","indentNode","indent","itemTop","itemHeight","childCount","getLineMarkerPosition","markerLineTop","highlightRow","dropTarget","relTargetPos","eventTop","findClosesTarget","allowedLevel","targetLevel","findTargetAbove","findTargetBelow","targetTask","targetAbove","targetBelow","rootLevel","getLockedLevelTarget","getMultiLevelTarget","higlighter","dnd_sensitivity","hideQuickInfo","_hideQuickInfo","checkPlaceholderTask","initial_open_state","outerHTML","drop_target","$transparent","getDropPosition","$drop_target","doctype","minTop","firstVisibleTaskIndex","firstVisibleTaskId","firstVisibleTaskPos","hiddenTaskPart","gridPosition","gridBottom","placeholderRowHeight","getTargetTaskId","lockLevel","order_branch_free","getStore","lastTaskOfLevel","last_item","_getGridPos","_getTargetY","_getTaskByY","dropIndex","gridDataSizes","targetY","over","nextId","prevId","rowDnd","rowDndMarker","extendGantt","inlineEditors","_inlineEditors","createEditors","initEvents","clearEvents","scroll_on_click","_is_icon_open_click","conf","sorting_method","callHandler","createTask","totalWidth","getRowRectangle","getVisibleRange","resize_el","task_grid_row_resizer_attribute","getRectangle","getVisibleCellsRange","isColumnVisible","resourceTimetable","renderBar","renderConnection","prevLevel","getResourceLoad","renderedHistogramCells","renderedHistogramRows","renderedHistogramCapacity","detachRenderedHistogramCell","renderedRow","renderCapacityElement","capacityMatrix","maxCapacity","renderedElement","capacityElement","capacity","colStart","colEnd","bar","connection","renderHistogramLine","renderHistogramCell","histogram_cell_class","histogram_cell_label","histogram_cell_allocated","smartRendering","histogram_cell_capacity","row","checkedColumns","renderedCell","renderedResourceLines","renderResourceLineCell","resource_cell_class","resource_cell_value","detachRenderedResourceLine","aria","date_grid","tree","grid_indent","grid_blank","grid_file","grid_open","grid_folder","align","justifyContent","center","getGlobalTaskIndex","grid_row_class","css_template","isSelected","onrender","rowNode","cellNode","external_render","adapter","isElement","renderElement","isInViewPort","drawer","current_pos","dirs","down","point","get_lines","dots","line_to","get_path","line","_get_line","get_wrapper_sizes","wrapper_size","link_wrapper_width","get_line_sizes","line_size","marginTop","render_line","innerPos","get_direction","vect","path_builder","point_to","get_points","pt","get_endpoint","xy","shiftX","lineType","get_line_type","forward","sign","milestoneHeight","lines","cssTemplate","link_class","isCriticalLink","endpoint","_render_link_arrow","borderColor","placeholderConfig","lastTaskId","placeholderTask","unscheduled","calendar_id","bgPlaceholder","renderedCells","isRendered","detachRenderedCell","getCellClassTemplate","task_cell_class","warn","timeline_cell_class","getCellContentTemplate","timeline_cell_content","renderOneCell","contentTemplate","cssTemplateContent","htmlTemplateContent","customCell","static_background_cells","cellCssTemplate","cellHtmlTemplate","show_task_cells","odd","task_row_class","placeholderTop","placeholderHeight","prepareData","createBaseBarRender","defaultRender","renderedNodes","checkVisibility","generateChildElement","childCopy","$rendered_at","getKey","renderParentId","rollup","$rollup","itemNode","rollupKey","isBarInViewport","isInViewPortParent","isInViewPortChild","isProject","resetProjectDates","shouldUseSplitRendering","splitKey","mapTo","keepDatesOnEdit","decreaseStartDate","keepDurationOnEdit","schedule_from_end","defaultActionOnEdit","TextEditor","formatters","durationFormatter","PredecessorEditor","linkFormatter","parseInputString","predecessors","delimiter","formatPredecessors","formatLinkKey","lag","getLinksDiff","predecessorCodes","selectedLinks","getSelectedLinks","existingLinksSearch","linkId","linksToAdd","linkKey","linksToDelete","linksDiff","autoSchedule","inputPredecessors","taskPredecessors","html5DateFormat","dateToStr","strToDate","DateEditor","str_to_date","minValue","maxValue","minAttr","maxAttr","SelectEditor","optionsHtml","NumberEditor","controller","onBlurDelay","keyNav","keyboardNavigation","activeCell","locateCell","columnName","editorState","getEditorConfig","startEdit","command","hasEditor","keyboard","preventKeyNav","ENTER","ctrlKey","metaKey","ESC","LEFT","RIGHT","editorType","DELETE","TAB","editPrevCell","editNextCell","modifiers","anyModifier","alt","ctrl","meta","getCommandHandler","onShow","onHide","isChanged","defaultPrevented","shouldPrevent","defaultMapping","keyNavMappings","setMapping","getMapping","keyboard_navigation_cells","getKeyboardMapping","textEditorFactory","numberEditorFactory","selectEditorFactory","dateEditorFactory","predecessorEditorFactory","durationEditorFactory","linkedPropertiesProcessor","initConfigs","editor_types","number","predecessor","keyboardMapping","eventBus","inlineEditController","_createPlaceholder","_getEditorPosition","findVisibleIndex","updateTaskDateProperties","ganttHandlers","_itemId","_columnName","_editor","_editorType","_placeholder","batch_update","editorConfig","_getItemValue","oldValue","inline_editors_date_processing","_findEditableCell","nextIndex","nextColumn","getNextCell","getFirstCell","getLastCell","canChangeRow","moveRow","moveTask","nextItem","editNextRow","skipReadonly","editPrevRow","ScrollbarCell","SCROLL_MODIFIER_KEYS","_scrollHorizontalHandler","_scrollVerticalHandler","_outerScrollVerticalHandler","_outerScrollHorizontalHandler","_mouseWheelHandler","_isHorizontal","scrollPosition","_isVertical","_initVertical","_initHorizontal","_initMouseWheel","_initLinkedViews","_getRootParent","_eachView","eachCell","_updateLinkedViews","scrollHorizontally","_scrolling","codeScrollLeft","scrollVertically","_wheel_time","_oldLeft","_getScrollSize","outerSize","isHorizontal","linked","scrollProperty","innerSizeProperty","outerProperty","_getScrollOffset","cellScrollSize","nonScrollableSize","outerScroll","innerScroll","scrollSizes","_setScrollSize","toggleVisibility","_getScaleOffset","parentLayout","_oldTop","_checkWheelTarget","targetNode","connectedViews","wheelSpeed","wheelSpeedConfig","wheel_scroll_sensitivity","ff","deltaX","wheelDeltaX","multiplier","deltaMode","wx","wy","horizontalScrollModifier","horizontal_scroll_key","oldLeft","detail","oldTop","ViewCell","childConfig","createView","$initialized","unload","outerX","outerY","childSize","ViewLayout","$cell","byMaxSize","otherCell","barRectangle","sourceBox","targetBox","genericViewPortChecker","basicGetRectangle","basicGetRange","task_area_pulls","task_area_renderers","getRenderer","renderMethod","updateMethod","renderCallbackMethod","specializedViewPortChecker","layer_attribute","render_item","layerView","viewConfig","rendererViewPort","dom","useBuffer","remove_item","clear_container","get_visible_range","prepare_data","render_items","createDocumentFragment","vis","itemsSearch","renderedItems","newElements","update_items","nodesToRemove","renderCalledFor","restore","replace_item","newNode","change_id","oldid","newid","clearRenderers","renderFactoryProvider","mergeFilters","filter_methods","filter_method","renderFactory","createGroup","getContainer","relativeRoot","defaultFilters","initLayer","renderGroup","tempCollection","renderers","filters","getLayers","_add","pending","topmost","requestUpdate","onUpdateRequest","eachLayer","createLayerFactory","getVisibleTaskRange","getVisibleLinksRangeFactory","isLinkInViewport","previusSiblingContainer","defaultContainerSibling","setService","rangeFunction","removeTaskLayer","_clearTaskLayers","_getLinkLayers","removeLinkLayer","_clearLinkLayers","createMouseHandler","eventHandlers","doubleclick","contextMenu","addEventTarget","onClick","findEventHandlers","callEventHandlers","_multiselect","selectTask","onContextMenu","returnValue","delegateHandlers","details_on_dblclick","onMouseMove","_last_move_event","domEvents","reset","elementHandlers","extendSettings","parentSettings","own","$extendedConfig","setPrototypeOf","parentView","parentConfig","parentTemplates","createFactory","createdViews","creator","configure","registerView","viewConstructor","uiFactory","createLayers","Resizer","Scrollbar","ResourceGrid","ResourceTimeline","ResourceHistogram","gridEditorsFactory","renderTaskBar","renderSplitTaskBar","renderRollupTaskBar","renderTaskBg","renderLink","gridRenderer","resourceMatrixRenderer","resourceHistogramRenderer","gridTaskRowResizerRenderer","mainGridInitializer","mainTimelineInitializer","mainLayoutInitializer","attachInitializer","layersEngine","layersApi","resourceRow","resourceHistogram","layersService","boxAttribute","_dhx_msg_cfg","usercall","modalBox","modal_key","messageBox","modality","cover","info","expire","timers","getFirstDefined","values","_createBox","cancel","contentId","message_ok","message_cancel","btn","_boxStructure","alertPopup","confirmPopup","boxPopup","box_params","focusable","hideAll","popups","modalbox","codeHelpers","_eventRemoveAll","uiApi","$mouseEvents","createLayoutFacade","targetAttribute","_locateHTML","initial_scroll","firstTask","getTaskByIndex","activePlugins","plugins","availablePlugins","auto_scheduling","click_drag","clickDrag","critical_path","drag_timeline","export_api","exportToPDF","fullscreen","grouping","groupBy","keyboard_navigation","addMarker","eachSelectedTask","overlay","quick_info","quick_info_content","tooltip","tooltips","undo","plugin","default","month_short","day_full","day_short","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_wbs","column_text","column_start_date","column_add","link_start","link_end","type_task","type_project","type_milestone","weeks","section_constraint","asap","alap","snet","snlt","fnet","fnlt","mso","mfo","resources_filter_placeholder","resources_filter_label","empty_state_text_link","empty_state_text_description","LocaleManager","addLocale","_locales","getLocale","locale_ar_1","locale_be_1","locale_ca_1","locale_cn_1","locale_cs_1","locale_da_1","locale_de_1","locale_el_1","locale_en_1","locale_es_1","locale_fa_1","locale_fi_1","locale_fr_1","locale_he_1","locale_hr_1","locale_hu_1","locale_id_1","locale_it_1","locale_jp_1","locale_kr_1","locale_manager_1","locale_nb_1","locale_nl_1","locale_no_1","locale_pl_1","locale_pt_1","locale_ro_1","locale_ru_1","locale_si_1","locale_sk_1","locale_sv_1","locale_tr_1","locale_ua_1","en","ar","be","ca","cn","cs","da","de","es","fa","fi","fr","he","hr","hu","it","jp","kr","nl","no","pl","ro","ru","si","sk","sv","tr","ua","_dp","check","show_errors","listenWindowResize","resizeDelay","resizeTimeout","container_resize_timeout","container_resize_method","lowlevelResizeWatcher","repaintGantt","previousHeight","previousWidth","getPropertyValue","resizeWatcher","contentWindow","addResizeListener","calculateScaleRange","invalidContainerMessage","validateNode","isHTMLElement","_reinit","_quickRefresh","stores","_getDatastores","dropLayout","rebuildLayout","storeNames","resetLayout","initTemplates","edit","delete","confirm_deleting_title","deleteTask","preserveScroll","preserve_scroll","new_pos","verticalScrollbar","setSizes","getTaskRowNode","prevOffset","time_unit","offsetChanged","activate","_cached_functions","update_if_changed","critical_path_mode","wrap_methods","_prefetch_originals","prefetch","methodname","optimizer","argumentsArray","get_arguments_hash","cached_values","has_cached_value","get_cached_value","cache_value","arguments_hash","is_date","getUTCDate","stringify_argument","deactivate","setup","override_gantt","gantt_methods","optimize_render","deactivTimeout","checkType","isUnscheduledTask","show_unscheduled","taskStart","taskEnd","_getProjectEnd","project_end","_getProjectStart","project_start","getDefaultTaskDate","parent_id","_set_default_task_timing","details_on_create","parseDate","getSelectedId","getTaskTimingMode","task_type","$no_start","$no_end","$rendered_type","updateTaskTiming","$effective_calendar","getSubtaskInfo","task_mode","dirty","$calculate_duration","effectiveCalendar","inherit_calendar","taskMode","taskTiming","getSubtaskDuration","updateAll","has_changed","oldStart","oldEnd","upper","lower","colIndex","steps","calendarManager","timeCalculator","getWorkHours","setWorkTime","unsetWorkTime","_hasDuration","hasDuration","mergeCalendars","createCalendar","addCalendar","getCalendar","getCalendars","getResourceCalendar","deleteCalendar","CalendarDisabledTimeStrategy","argumentsHelper","_calculateDuration","fixedUnits","hasWorkTime","createArgumentsHelper","NoWorkTimeCalendar","TimeCalculator","$disabledCalendar","_getCalendar","manager","dynamicCalendars","getCalendarIdFromMultipleResources","resourceAssignments","resource_id","getResourcesCalendarKey","tempCalendar","assignment","resourceId","mergeResourceCalendars","isLegacyResourceCalendarFormat","resourceCalendarsProperty","getResourceProperty","resourceCalendarsConfig","resource_calendars","propertyName","getCalendarIdFromLegacyConfig","calendarId","DateDurationCache","_getCacheObject","_cache","unitCache","stepCache","yearCache","durations","endDates","_endDateCacheKey","_durationCacheKey","getEndDate","compute","startDateTimestamp","resultTimestamp","getDuration","endDateTimestamp","getMinutesPerWeek","weekStart","_weekCache","has","_calendar","minutesPerWeek","week_start","getHoursPerDay","getMinutesPerMonth","monthStart","_monthCache","minutesPerMonth","nextMonth","subCache","setItem","rawValue","CalendarWorkTimeStrategy","_workingUnitsCache","_largeUnitsCache","_dateDurationCache","_worktime","_cached_timestamps","_cached_timestamps_count","_clearCaches","_getUnitOrder","_resetTimestampCache","_timestamp","UTC","_checkIfWorkingUnit","_is_work_day","_getWorkHours","_is_work_hour","startHour","endHour","_getTimeOfDayStamp","dayEnd","_is_work_minute","checkTime","_nextDate","_getWorkUnitsBetweenGeneric","stepStart","stepEnd","checkFirst","checkLast","isLastStep","_isWorkTime","unitOrder","biggerTimeUnit","_getClosestWorkTimeFuture","_getMinutesPerHour","hourStart","hourEnd","worktimes","_getMinutesPerDay","durationMinutes","durationHours","_getWorkUnitsForRange","getUnitsPerDay","_getMinutesBetweenSingleDay","_getIntervalTimestamp","minuteFrom","minuteTo","_getMinutesBetween","firstDayStart","firstDayEnd","day_start","lastDayStart","lastDayEnd","startPart","endPart","_getHoursBetween","_setConfig","_parseSettings","haveCustomWeeks","customWeeks","customWeeksRangeStart","customWeeksRangeEnd","customWeeksBoundaries","_parseHours","minCustomRangeStart","maxCustomRangeEnd","customTime","rangeStart","rangeEnd","fromReadable","toReadable","currentWeek","_tryChangeCalendarSettings","backup","JSON","_arraysEqual","_compareSettings","mySettings","thatSettings","myDays","otherDates","myHours","otherHours","myWeek","thatWeek","getDay","getSeconds","endHours","timestampRanges","timerangeConfig","startMinute","endMinute","durationSeconds","calendarConfig","reset_calendar","isWorkUnit","dateKey","mult","_calculateEndDate","_calculateMinuteEndDate","_subtractMinuteDate","_calculateHourEndDate","_addInterval","stopAction","added","dstShift","_addHoursUntilDayEnd","rangeHours","addHours","intervalEnd","durationLeft","setMinutes","setSeconds","hoursPerDay","_addMinutesUntilHourEnd","hour_start","rangeMinutes","addMinutes","_subtractMinutesUntilHourStart","hourStartTimestamp","initialDateTimestamp","minutePrecision","_isMinutePrecision","addedInterval","calculatedDay","daySchedule","minutesInDay","dayStart","iterateFromDayEnd","isWorkHour","workInterval","prevInterval","minutesInHour","_getClosestWorkTimePast","times","lastInterval","_getClosestWorkTime","inputDate","closestFuture","closestPast","_getClosestWorkTimeGeneric","_findClosestTimeInDay","resultDate","fromDayEnd","_getClosestWorkMinute","increment","worktime","exceptions","hasRegularHours","_checkWorkHours","dayConfig","hoursArray","WorkTimeCalendarMerger","_getIntervals","_toHoursArray","intervalsArray","formatHHMM","secondsValue","minutePart","toFixed","_intersectHourRanges","baseArray","overridesArray","base","_mergeAdjacentIntervals","_mergeHoursConfig","firstHours","secondHours","merge","firstConfig","secondConfig","mergedSettings","firstDate","secondDate","CalendarMergeHelper","legacyResourceCalendarConfig","dynamicResourceCalendars","CalendarManager","_calendars","_legacyConfig","_isLegacyConfig","createDefaultCalendars","_convertWorkTimeSettings","calendars","mergeHelper","_createCalendarFromConfig","apiCore","preparedConfig","parentCalendar","defaults","fulltime","_getOwnCalendar","calendar_property","dynamic_resource_calendars","calendarsConfig","taskObject","groupMode","group_mode","currentTask","isCalendar","restoreConfigCalendars","possibleCalendar","every","worktimeFacadeFactory","facade","jsonParseError","load","_load_url","cl","_load_type","ajax","on_load","xmlDoc","resp","_process_loading","collections","_load_collections","resourcesStore","assignmentsByTasks","attachAssignmentsToTasks","linksStore","collections_loaded","option","option_key","$ignore","json","dhx_security","security_key","serializeTask","_copyObject","serializeLink","_copyLink","xml_format","format_date","rawLinks","getLinks","xml","_xmlNodeToJSON","attrs_only","nodeValue","_getCollections","loader","xpath","itms","_getXML","toptag","getXMLTopNode","xmltop","xmlParseError","skey","oldxml","startdate","est","enddate","predecessortasks","editable_property","readonly_property","getGridColumn","ScrollableGrid","_scrollOrder","getCurrentX","_dnd","_scrollView","attachEvents","isScrollable","gridBoundingRect","maxLeft","minLeft","currentX","autoscrollRight","autoscrollStart","autoscrollLeft","autoscrollStop","getCorrection","scrollable_grid_1","ColumnsGridDnd","_targetMarker","calculateCurrentPosition","eventX","DND","_scrollableGrid","_draggedCell","draggedColumn","draggedIndex","_gridConfig","_originAutoscroll","_dragX","columnIndexes","findColumnsIndexes","targetColumn","cleanTargetMarker","setMarkerPosition","drawTargetMarker","_a","xBefore","xAfter","columnRelativePos","draggedId","currentColumn","startX","endX","relativeX","gridOffset","_obj","nextPosition","column_grid_dnd_1","_task_grid_row_resize","row_before_start","row_id","row_after_start","row_drag_move","pointerPosition","markerStartPosition","marker_height","minPointerPosition","min_task_grid_row_height","row_drag_end","oldItemHeight","finalHeight","cachedRowHeight","canUseSimpleCalc","_getRowHeight","_refreshState","globalRowHeight","visibleColumns","loadedBranches","oldHasChildren","branch_loading","branch_loading_property","needLoading","requestData","show_empty_state","emptyStateElement","isGanttEmpty","renderContent","placeholderContainer","clickEvents","attachAddTaskEvent","detachAddTaskEvents","oldNodes","emptyStateElementNode","LinkFormatterSimple","_getWBSCode","_linkReg","linkPart","_findSource","_gantt","pred","getWBSCode","reqTemplate","wbs","getTaskByWBSCode","DurationFormatter","LinkFormatter","enter","callIfEnabled","auto_types","checkTaskType","changedTypes","targetType","getTaskTypeToUpdate","$needsUpdate","updateParentTypes","getUpdatedTypes","applyChanges","delTaskParent","allTypes","hasChildren","originalRowDndParent","originalMoveTaskParent","isParsingDone","updateAfterRemoveChild","updateTaskType","insertPlaceholder","placeholders","afterEdit","newTask","dataProcessor","_silencedPlaceholder","setUpdated","ready","isPlaceholderLink","action","commands","entity","resourceAssignmentsProperty","resource_assignment_store","resourceAssignmentFormats","auto","singleValue","valueArray","resourceValueArray","assignmentsArray","resourceAssignmentFormat","assignmentModes","fixedDates","fixedDuration","initAssignmentFields","initDelay","timing","_assignmentTimeFromTask","resourceAssignmentsStore","createDatastore","_makeAssignmentsFromTask","detectFormat","usedIds","defaultMode","_updateTaskBack","_assignAssignments","getTaskAssignments","_loadAssignmentsFromTask","taskAssignments","_syncAssignments","storeAssignments","taskValues","assignmentsStoreValues","inBoth","inTaskNotInStore","inStoreNotInTask","taskOwner","ownerId","foundOwnerAssignment","taskSearch","storeSearch","processedIds","inTask","inStore","diffAssignments","ignoreFields","assignmentHasChanged","updateAssignment","_syncOnTaskUpdate","assignmentsStore","totalAssignments","needUpdate","needUpdateFor","undoBatchCancel","assignmentsHash","deleteIds","idsSearch","_syncOnTaskDelete","resourceAssignmentsCache","resourceTaskAssignmentsCache","taskAssignmentsCache","searchTaskId","resourceTaskCacheKey","getTaskResources","uniqueResources","updateTaskAssignments","createResourceMethods","singleResourceCacheBuilt","falsyValuePrefix","random","resourceHashFunction","getCacheKey","resourceIds","typeFilter","getResourceTasks","matchingResources","resourceValue","selectAssignments","owners","propertyValue","filterResourceTasks","resourcePlugin","renderEditableLabel","editable","renderSummaryLabel","sum","reduce","editableResourceCellTemplate","editableResourceCellClass","getSummaryResourceAssignments","resource_store","childResource","initEditableDiagram","timeoutId","makeEditable","cancelAnimationFrame","requestAnimationFrame","contentEditable","assignmentEditInProcess","blur","strValue","innerText","rowId","assignmentId","parse_date","assignmentStore","saveState","nextChunk","createHelper","dataprocessor_assignments","dataprocessor_resources","editable_resource_diagram","fetchTasks","lightbox_resources","lightboxOptions","resourceStoreConfig","initItems","storeType","$resourcesStore","lightboxOptionsFnc","defaultResourceCellClass","defaultResourceCellTemplate","_needRecalc","_isRecalcNeeded","_isGroupSort","_calcWBS","$virtual","$wbs","_setWBSCode","getByWBSCode","currentNode","_isFirst","_prevSibling","_wbs","_parent","createWbs","createMethod","isActive","disableMethod","methodName","dummyMethod","restoreMethod","restoreMethods","batchUpdatePayload","noRedraw","dp_mode","call_dp","updateMode","setUpdateMode","resetProjects","refreshLink","methodsHash","setGanttMode","sendData","SimpleStorage","_storage","storeItem","getStoredItem","dp","getUserData","userdata","setUserData","_change_id","_ganttMode","changeTaskId","changeLinkId","_row_style","_delete_task","_sendTaskOrder","setDp","DataProcessorEvents","$dp","_dataProcessorHandlers","treeHelper","cascadeDelete","clientSideDelete","cascade_delete","deleteAfterConfirmation","needDbDelete","needCascadeDelete","dpMode","cascade","sendAllData","_tSend","_waitMode","itemLinks","_links","getTaskLinks","updateLink","_tMode","_serverProcessor","substring","serverProcessor","pluralizedMode","urlSeparator","upd","isExist","objData","xml_date","handleResourceCRUD","handleResourceAssignmentCRUD","updated","updatedRows","clientOnly","_in_progress","insertedTasks","pendingAssignments","putAssignmentToQueue","insertResourceAssignment","insertResource","data_processor_events_1","extend_gantt_1","simple_storage_1","createDataProcessor","router","tMode","DataProcessor","setTransactionMode","serverProcessorURL","action_param","autoUpdate","_headers","_payload","_postDelim","_routerParametersFormat","_invalid","messages","inserted","deleted","invalid","invalid_cell","enableUTFencoding","_serializeAsJson","_router","_utf","getSyncState","findRow","existing","set_invalid","is_invalid","markRow","_methods","details","getActionByState","checkBeforeUpdate","editStop","pendingUpdateModes_1","_beforeSendData","_getRowData","_serializeAsJSON","serialize_one","stack","pref","serialized","_forEachUpdatedRow","_sendData","_getAllData","pattern","defineAction","_uActions","afterUpdateCallback","btag","ganttMode","correct","originalSid","afterUpdate","_xml","getGanttMode","reqUrl","filePath","processCallback","finalizeUpdate","cleanUpdate","atag","_dp_init","_setDefaultTransactionMode","delete_confirmation","dataProcessorEvents","setOnAfterUpdate","setOnBeforeUpdateHandler","setAutoUpdate","user","_user","_needUpdate","_updateBusy","afterAutoUpdate","fullSync","loadUpdate","xml_node","getUpdates","vers","_getXmlNodeValue","updates","status_1","parent_1","_applyPayload","_cleanupArgumentsBeforeSend","dataToSend","processedData","_cleanupItemBeforeSend","updatedItem","output","queryParams","dhxVersion","urlParams","preprocessedData","taskState_1","taskAction","ganttMode_1","_onResolvedCreateUpdate_1","actionPromise","errorMsgStart","errorMsgEnd","catch","hasOne","_prepareDate","_prepareArray","traversedObjects","_prepareObject","rawItem","processedItem","_prepareDataItem","dataItem","DEPRECATED_api","server","getDataProcessorModes","getAvailableModes","bindDataStore","itemRepainter","allData","loadedRanges","_i","layerData","skipRepaint","refreshId","selectedId","deleteItem","_unselect","subItem","getLinkCount","newLink","getTaskCount","getVisibleTaskCount","startTask","calculateTaskLevel","createTasksFacade","createLinksFacade","createDatastoreSelect","datastoreRender","getDatastores","createDatastoreFacade","$StoreType","open_tree_initially","deepcopy_on_parse","storeAccessName","dropService","storeList","refresh_links","refreshLinks","hasSplitParent","_clear_data","oldSelectId","_skipResourceRepaint","unselectTask","facadeFactory","originalTask","checkLinkedTaskVisibility","sync_link","sourceTask","sync_link_delete","sync_links","mapEvents","mapFrom","sourceEvent","targetEvent","taskLinks","existingLink","sourceMatch","targetMatch","typeMatch","show_tasks_outside_timescale","changedTask","sourceVisible","targetVisible","deletedLinks","onItemLoading","onBeforeAdd","onAfterAdd","onBeforeUpdate","onAfterUpdate","onBeforeDelete","onAfterDelete","onIdChange","onBeforeItemMove","onAfterItemMove","onFilterItem","onItemOpen","onItemClose","onBeforeSelect","onAfterSelect","onAfterUnselect","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_dereq_","1","SomePromiseArray","_SomePromiseArray","any","promises","promise","setHowMany","setUnwrap","2","firstLineError","schedule","Queue","Async","_customScheduler","_isTickUsed","_lateQueue","_normalQueue","_haveDrainedQueues","_trampolineEnabled","drainQueues","_drainQueues","_schedule","AsyncInvokeLater","receiver","_queueTick","AsyncInvoke","AsyncSettlePromises","_pushOne","_drainQueue","_drainQueueStep","_settlePromises","setScheduler","hasCustomScheduler","enableTrampoline","disableTrampolineIfNecessary","hasDevTools","haveItemsQueued","fatalError","exit","throwLater","invokeLater","invoke","settlePromises","_reset","./queue","./schedule","./util","3","INTERNAL","tryConvertToPromise","calledBind","rejectThis","_reject","targetRejected","promiseRejectionQueued","bindingPromise","_then","bindingResolved","thisArg","_bitField","_resolveCallback","bindingRejected","_propagateFrom","propagateFromFunction","_boundValue","boundValueFunction","maybePromise","_target","_setBoundTo","_setOnCancel","_boundTo","_isBound","4","old","bluebird","noConflict","./promise","5","cr","callerCache","getterCache","canEvaluate","isIdentifier","caller","classString","ensureMethod","namedGetter","indexedGetter","maybeGetter","getGetter","6","PromiseArray","apiRejection","tryCatch","errorObj","async","_async","cancellation","_warn","_isCancellable","_cancelBy","_isFollowing","_followee","_cancelBranched","_cancellationParent","_setWillBeCancelled","_branchHasCancelled","_branchesRemainingToCancel","_enoughBranchesHaveCancelled","canceller","_invokeOnCancel","_cancel","_setCancelled","_cancelPromises","_length","_unsetOnCancel","_onCancelField","isPending","_isCancelled","isCancellable","isCancelled","_doInvokeOnCancel","onCancelCallback","internalOnly","_attachExtraTrace","_resultCancelled","_onCancel","_invokeInternalOnCancel","7","NEXT_FILTER","getKeys","instances","boundTo","predicateLoop","matchesPredicate","./es5","8","longStackTraces","contextStack","Context","_trace","CapturedTrace","peekContext","lastIndex","_promiseCreated","_pushContext","_popContext","_peekContext","deactivateLongStackTraces","activateLongStackTraces","Promise_pushContext","Promise_popContext","Promise_PeekContext","Promise_peekContext","Promise_promiseCreated","ctx","9","unhandledRejectionHandled","possiblyUnhandledRejection","printWarning","getDomain","_getDomain","Warning","es5","canAttachTrace","bluebirdFramePattern","nodeFramePattern","parseLinePattern","stackFramePattern","formatStack","indentStackFrames","debugging","warnings","wForgottenReturn","suppressUnhandledRejections","_ensurePossibleRejectionHandled","_setRejectionIsUnhandled","_notifyUnhandledRejection","_notifyUnhandledRejectionIsHandled","fireRejectionEvent","_setReturnedNonUndefined","_returnedNonUndefined","_isRejectionUnhandled","reason","_settledValue","_setUnhandledRejectionIsNotified","_unsetUnhandledRejectionIsNotified","_isUnhandledRejectionNotified","_unsetRejectionIsUnhandled","shouldUseOwnTrace","onPossiblyUnhandledRejection","domain","domainBind","onUnhandledRejectionHandled","disableLongStackTraces","longStackTracesIsSupported","Promise_captureStackTrace","_captureStackTrace","Promise_attachExtraTrace","Promise_dereferenceTrace","_dereferenceTrace","longStackTracesCaptureStackTrace","longStackTracesAttachExtraTrace","longStackTracesDereferenceTrace","hasLongStackTraces","fireDomEvent","CustomEvent","dispatchEvent","eventData","cancelable","domEvent","Event","initCustomEvent","fireGlobalEvent","generatePromiseLifecycleEventObject","eventToObjectGenerator","promiseCreated","promiseFulfilled","promiseRejected","promiseResolved","promiseCancelled","promiseChained","warning","_warning","unhandledRejection","rejectionHandled","activeFireEvent","globalEventFired","domEventFired","defaultFireEvent","cancellationExecute","executor","onCancel","_attachCancellationCallback","cancellationAttachCancellationCallback","previousOnCancel","cancellationOnCancel","cancellationSetOnCancel","cancellationClearCancellationData","cancellationPropagateFrom","flags","branchesRemainingToCancel","warningsOption","_clearCancellationData","_execute","_propagateFromFunction","monitoring","_boundValueFunction","isFulfilled","ignoreSelf","attachExtraTrace","__stackCleaned__","parseStackAndMessage","notEnumerableProp","formatAndLogError","cleanStack","isTraceLine","isInternalFrame","shouldIgnore","stackFramesAsArray","isSoft","localHandler","localEventFired","formatNonError","maxChars","snip","captureStackTrace","parseLineInfoRegex","parseLineInfo","fileName","_promisesCreated","uncycle","stackToIndex","cycleEdgeNode","currentChildLength","stacks","currentLastIndex","currentLastLine","commonRootMeetPoint","removeCommonRoots","removeDuplicateOrEmptyJumps","reconstructStack","v8stackFramePattern","v8stackFormatter","stackTraceLimit","ignoreUntil","hasStackAfterThrow","isTTY","checkForgottenReturns","handlerLine","creatorLine","traceLines","lineMatches","firstUserLine","msg","setBounds","lastLineError","firstFileName","lastFileName","firstStackLines","lastStackLines","firstIndex","deprecated","replacement","./errors","10","returner","thrower","thenReturn","thenThrow","catchThrow","_reason","caught","catchReturn","_value","11","PromiseReduce","PromiseAll","promiseAllThis","mapSeries","12","_TypeError","_RangeError","Objectfreeze","freeze","subError","nameProperty","defaultMessage","SubError","CancellationError","TimeoutError","AggregateError","OperationalError","cause","errorTypes","RejectionError","13","isES5","getDescriptor","getOwnPropertyDescriptor","getOwnPropertyNames","propertyIsWritable","prop","descriptor","ObjectKeys","14","PromiseMap","15","catchFilter","PassThroughHandlerContext","called","cancelPromise","FinallyHandlerCancelReaction","finallyHandler","checkCancel","succeed","fail","reasonOrValue","isFinallyHandler","isRejected","_passThrough","success","lastly","tap","tapCatch","handlerOrPredicate","catchInstances","./catch_filter","16","Proxyable","yieldHandlers","PromiseSpawn","generatorFunction","yieldHandler","internal","_finallyPromise","_promise","_stack","_generatorFunction","_receiver","_generator","_yieldHandlers","_yieldedPromise","_cancellationPhase","_isResolved","_cleanup","_fulfill","_promiseCancelled","coroutine","returnSentinel","_continue","_promiseFulfilled","_promiseRejected","_run","_rejectCallback","traceParent","promiseFromYieldHandler","bitField","_proxy","PromiseSpawn$","generator","spawn","addYieldHandler","17","spread","18","MappingPromiseArray","constructor$","_callback","_preservedValues","_limit","_inFlight","_queue","_asyncInit","concurrency","_init$","_init","_values","preservedValues","_totalResolved","_resolve","booleans","19","_resolveFromSyncValue","attempt","20","maybeWrapAsError","rErrorKey","wrapAsOperationalError","isUntypedError","markAsOriginatingFromRejection","multiArgs","wrapped","21","spreadAdapter","nodeback","successAdapter","errorAdapter","newReason","asCallback","nodeify","22","makeSelfResolutionError","reflectHandler","PromiseInspection","UNDEFINED_BINDING","errors","APPLY","createContext","nodebackForPromise","_fulfillmentHandler0","_rejectionHandler0","_promise0","_receiver0","_resolveFromExecutor","deferResolve","deferReject","fillTypes","reflect","didFulfill","didReject","_setIsFinal","fulfillmentValue","rejectionReason","originatesFromRejection","getNewLibraryCopy","is","fromNode","fromCallback","_isFateSealed","_setAsyncGuaranteed","cast","_setFulfilled","fulfilled","rejected","internalData","haveInternalData","settler","_settlePromiseCtx","_settlePromiseLateCancellationObserver","_addCallbacks","_setLength","_setRejected","_setFollowing","_isFinal","_unsetCancelled","_receiverAt","_promiseAt","_fulfillmentHandlerAt","_rejectionHandlerAt","_migrateCallback0","follower","fulfill","_migrateCallbackAt","proxyable","shouldBind","_setFollowee","synchronous","ignoreNonErrorWarnings","ensureErrorObject","hasStack","_settlePromiseFromHandler","_settlePromise","isPromise","asyncGuaranteed","_settlePromise0","_clearCallbackDataAtIndex","_fulfillPromises","_rejectPromises","defer","toFastProperties","./any.js","./async","./bind","./call_get.js","./cancel","./context","./debuggability","./direct_resolve","./each.js","./filter.js","./finally","./generators.js","./join","./map.js","./method","./nodeback","./nodeify.js","./promise_array","./promisify.js","./props.js","./race.js","./reduce.js","./settle.js","./some.js","./synchronous_inspection","./thenables","./timers.js","./using.js","23","resolveValueIfEmpty","asArray","_iterate","_resolveEmptyArray","toResolutionValue","getActualLength","shouldCopyValues","isResolved","24","THIS","withAppended","defaultPromisified","__isPromisified__","noCopyPropsPattern","defaultFilter","propsFilter","isPromisified","hasPromisified","suffix","getDataPropertyOrDefault","promisifiableMethods","suffixRegexp","inheritedDataKeys","passesDefaultFilter","keyWithoutAsyncSuffix","checkValid","escapeIdentRegex","makeNodePromisified","makeNodePromisifiedEval","defaultThis","promisified","promisifyAll","promisifier","promisifiedKey","promisify","copyDescriptors","isClass","25","Es6Map","mapToEntries","extractEntry","PropertiesPromiseArray","entries","isMap","_isMap","props","castValue","entriesToMap","keyOffset","26","_capacity","_willBeOverCapacity","_checkCapacity","wrapMask","front","_resizeTo","oldCapacity","srcIndex","dstIndex","arrayMove","27","raceLater","race","28","ReductionPromiseArray","initialValue","_each","_fn","_initialValue","_currentCancellable","_eachValues","completed","valueOrReason","gotAccum","accum","_gotAccum","gotValue","_eachComplete","sender","_resultCancelled$","29","NativePromise","getNativePromise","MutationObserver","GlobalSetImmediate","ProcessNextTick","isRecentNode","nativePromise","standalone","cordova","toggleScheduled","div2","observe","disconnect","30","SettledPromiseArray","_promiseResolved","inspection","_settledValueField","settle","31","CANCELLATION","_howMany","_unwrap","some","howMany","isArrayResolved","_canPossiblyFulfill","_getRangeError","_addFulfilled","_fulfilled","_addRejected","_checkOutcome","_rejected","32","__isCancelled","33","hasProp","doGetThen","getThen","isAnyBluebirdPromise","doThenable","34","HandleWrapper","handle","afterValue","ms","successClear","failureClear","handleWrapper","afterTimeout","35","NULL","dispose","thenable","_isDisposable","_getDisposer","_setDisposable","castPreservingDisposable","tryDispose","Disposer","_data","_context","FunctionDisposer","maybeUnwrapDisposer","isDisposer","ResourceList","doDispose","_unsetDisposable","using","spreadArgs","disposer","reflectedResources","resultPromise","inspections","_disposer","36","tryCatchTarget","globalObject","tryCatcher","Child","Parent","T","maybeError","safeToString","appendee","defaultValue","excludedPrototypes","isExcludedProto","visitedKeys","enumeration","thisAssignmentPattern","hasMethods","hasMethodsOtherThanConstructor","hasThisAssignmentAndStaticMethods","FakeConstructor","ic","rident","filledRange","prefix","ArrayFrom","itResult","hasEnvVariables","chrome","loadTimes","P","stateProviders","provider","regTemplates","initial","template_name","date_format","server_utc","task_unscheduled_time","grid_date_format","tooltip_date_format","copyDomEvent","altKey","_settings","inputMethods","getInputMethods","_drag_start_timer","clearDragTimer","eventParams","timeStamp","original_target","dragStart","traceDragEvents","domElement","inputMethod","mousemove","dragMove","dragScroll","limited_mousemove","dndActive","mouseup","dragEnd","checkPositionChange","diff_x","diff_y","initDnDMarker","backupEventTarget","getEvent","backup_element","elementFromPoint","_defineProperties","__webpack_exports__","_t","instance","Constructor","_classCallCheck","token","_url","_token","_seed","api","protoProps","staticProps","_createClass","Accept","Content-Type","Remote-Token","_fetch","_x","_x2","_t2","credentials","_t3","_t4","_t5","_t6","websocket","_e","_e2","_s","_t29","_wrapper","connect","_t8","_socket","WebSocket","onmessage","fire","_send","_resubscribe","onError","_t9","_this3","_uid","onCall","_t10","_this4","_t11","_t12","_t13","_t14","send","_t15","_e3","_t30","_t31","_e4","onResponse","_t18","_t32","_t20","_t34","_t23","_t33","_t24","_t35","_t26","_t27","_t28","remote_client","remoteEvents","remote","Client","_ready","back","_remote","cspVersion","utc","to_fixed","getUTCMonth","getUTCFullYear","getUTCDay","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCISOWeek","getISOWeek","mask","month_short_hash","month_full_hash","fastVersion","dateToStrFn","getWeek","splt","strToDateFn","cspCompliantVersion","canUseCsp","useCsp","cspAutoCheck","time_part","start_on_monday","month_start","setDate","quarter_start","res_month","setMonth","year_start","minute_start","getMilliseconds","setMilliseconds","_add_days","modifiedDate","inc","originalDate","incCondition","getHoursCondition","getDateCondition","ndate","setYear","add_quarter","num","_getWeekNumber","isoWeek","nday","first_thursday","year_number","ordinal_date","convert_to_utc","createConfig","DOMParser","ActiveXObject","loadXML","parseFromString","tagname","responseXML","xpathExp","docObj","selectNodes","ownerDocument","evaluate","XPathResult","ANY_TYPE","iterateNext","_call","onLoad","getSync","put","postData","del","post","postSync","isQt","onreadystatechange","noCache","setRequestHeader","show_loading","dhx_save_btn","dhx_cancel_btn","dhx_delete_btn","project_sections","milestone_sections","grid_resizer_column_attribute","keep_grid_width","grid_resize","prevent_default_scroll","service","ExtensionsManager","addExtension","_extensions","getExtension","supportedExtensions","license","extensionManager","ExtensionManager","RemoteEvents","templatesLoader","stateService","selected_task","i18n","setLocale","localeObject","MAX_UNDO_STEPS","Undo","maxSteps","undoEnabled","redoEnabled","invert","revert","inverseCommands","_undoStack","_redoStack","getUndoStack","setUndoStack","getRedoStack","setRedoStack","clearUndoStack","clearRedoStack","updateConfigs","undo_steps","undo_types","undo_actions","redo","_pop","_reorderCommands","_applyAction","_push","logAction","weights","actionWeights","weightA","entities","actions","isExists","getMethod","startsWith","noTrack","onBeforeUndo","onBeforeRedo","batchActions","Monitor","_batchAction","_batchMode","_ignore","_ignoreMoveEvents","_initialTasks","_initialLinks","_nestedTasks","_nestedLinks","_undo","_attachEvents","overwrite","_storeTask","_storeLink","isMoveEventsIgnored","toggleIgnoreMoveEvents","startIgnore","stopIgnore","startBatchAction","_timeout","stopBatchAction","onTaskAdded","_storeTaskCommand","onTaskUpdated","onTaskMoved","getInitialTask","_storeEntityCommand","onTaskDeleted","childrenLinks","_storeLinkCommand","onLinkAdded","onLinkUpdated","onLinkDeleted","setNestedTasks","taskIds","_getLinks","setInitialTask","uniqueLinks","setInitialLink","setInitialTaskObject","clearInitialTasks","getInitialLink","clearInitialLinks","deleteCacheCooldown","saveInitialAll","getMoveObjectByTaskId","nested","_storeCommand","actionType","entityType","monitor_1","undo_1","monitor","changeTaskCommandId","updLink","oldTaskId","newTaskId","changeLinkCommandId","updateTasksIds","updateLinksIds","getInitialState","Tooltip","_tooltipNode","setViewport","_root","_isLikeMouseEvent","_calculateTooltipPosition","setContent","_getViewPort","_getViewPortSize","tooltipNode","mouse","containerPos","domEventsScope","tooltip_1","TooltipManager","_listeners","_initDelayedFunctions","hideTooltip","delayHide","watchableTarget","doOnMouseEnter","onmouseenter","onmousemove","onmouseleave","tooltipFor","cloneDomEvent","clone","delayShow","tooltip_timeout","tooltip_hide_timeout","tooltipManager_1","tooltipManager","touch_tooltip","QuickInfo","_showForTask","_showAtCoordinates","forced","qi","_quickInfoBox","_quickInfoBoxId","_quickInfoTask","quick_info_detached","setContainer","_container","defaultContent","quickinfo_buttons","_createQuickInfoElement","titleBox","titleContent","titleDate","main","controls","_qiButtonClickHandler","_qiKeyPressHandler","_qi_button_click","_appendAtCoordinates","show_quick_info","_getContainer","_get_event_counter_part","xViewport","yViewport","_init_quick_info","_prepare_quick_info_classname","_fill_quick_data","_show_quick_info","domEv","_quickInfoReadonly","quick_info_class","allowedButtons","isEditor","quick_info_title","quick_info_date","popupHeight","scrolls","screenWidth","relativePopupBottom","top_1","quickInfo_1","quickInfo","hidingFunction","clearQuickInfo","multiselect_one_level","_selected","_one_level","_active","_first_selected_when_shift","getDefaultSelected","selected","getSelected","setFirstSelected","getFirstSelected","updateState","setLastSelected","getLastSelected","afterSelect","forSelected","isSameLevel","doSelection","target_ev","defaultLast","isLast","multiSelect","singleSelection","inline_editors_multiselect_open","blockSelection","first_indx","target_indx","last_indx","old_selectTask","old_unselectTask","toggleTaskSelection","getLastSelectedTask","old_isSelected","render_marker","show_markers","marker_class","markerHeight","initMarkerArea","markerArea","$marker_area","_markers","renderMarkers","getMarker","deleteMarker","updateMarker","_getMarkers","$keyboardNavigation","dispatcher","activeNode","globalNode","GanttNode","setActiveNode","getActiveNode","getDefaultNode","TaskCell","TaskRow","isValid","setDefaultNode","fromDomElement","inputs","HeaderCell","focusGlobalNode","blurNode","focusChanged","compareTo","keptFocus","keyDownHandler","isModal","ganttNode","shortcuts","getCommandFromEvent","findHandler","doAction","awaitsFocus","_delay","clearDelay","modalsStack","afterPopup","startModal","trapFocus","endModal","currentTarget","isTopModal","traceLightbox","focusElement","globalIndex","_compose","cellElement","nextElement","prevTask","moveTo","nextTask","home","pagedown","pageup","bindAll","KeyNavNode","viewWidth","viewHeight","scrollPositionX","scrollPositionY","attachedScrollbarHorizontal","scrollbarHorizontal","attachedScrollbarVertical","scrollbarVertical","scrollGrid","shift+down","shift+up","shift+right","shift+left","space","ctrl+left","ctrl+right","ctrl+enter","taskRow","enter, space","EventHandler","canStringifyThis","canStringifyThat","eventFacade","$eventAttached","alt+left","alt+right","alt+up","alt+down","ctrl+z","ctrl+r","currentFocus","currentIndex","lastItem","firstItem","getHash","shortcut","unbind","initKeys","createCommand","expr","getExpressions","words","getWords","commandKeys","specialKeys","printableKey","getHashFromEvent","junctionChar","term","combinationChar","backspace","tab","insert","plus","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10","f11","f12","isTaskFocused","isInlineEditorCell","isNoKeyboardNavigationElement","isLightboxElement","focusHandler","$preventDefault","reFocusActiveNode","outsideGantt","localName","mousedownHandler","locateTask","onReady","updateRender","_redrawTasks","focusedItemVisible","createdTaskId","keepFocusOnNewTask","nodeConstructor","focusOnCreate","getScope","scopes","headerCell","taskCell","findVisibleColumnIndex","keyNavFacade","addShortcut","scopeObject","getShortcutHandler","removeShortcut","getScopeName","setupKeyNav","isExpanded","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullscreenAvailable","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","backupBodyPadding","backupElementSizes","zIndex","modified","backupPositioning","updateSizes","expandGantt","onFullScreenChange","getFullscreenElement","positions","originalPositioning","resetParentPositioning","setFullScreenSizes","record","restoreParentPositioning","restoreSizes","cantFullscreen","expand","requestArguments","webkitRequestFullscreen","Element","ALLOW_KEYBOARD_INPUT","requestFullscreen","msRequestFullscreen","mozRequestFullScreen","collapse","requestExitFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen","exitFullscreen","stringifyPrimitive","sep","eq","ks","qs","regexp","maxKeys","kstr","vstr","idx","decode","encode","webpackPolyfill","paths","freeExports","freeModule","freeGlobal","maxInt","tMin","tMax","skew","damp","initialBias","initialN","regexPunycode","regexNonASCII","regexSeparators","not-basic","invalid-input","baseMinusTMin","stringFromCharCode","mapDomain","ucs2decode","extra","counter","ucs2encode","basicToDigit","digitToBasic","digit","flag","adapt","numPoints","firstTime","oldi","w","baseMinusT","inputLength","bias","handledCPCount","basicLength","q","handledCPCountPlusOne","qMinusT","ucs2","toUnicode","100","101","102","200","201","202","203","204","205","206","207","208","226","300","301","302","303","304","305","307","308","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","421","422","423","424","425","426","428","429","431","451","500","501","502","503","504","505","506","507","508","509","510","511","arrayCopy","localStorage","registerImmediate","nextHandle","tasksByHandle","currentlyRunningATask","doc","attachTo","runIfPresent","postMessage","importScripts","postMessageIsAsynchronous","oldOnMessage","canUsePostMessage","messagePrefix","onGlobalMessage","installPostMessageImplementation","MessageChannel","channel","port1","port2","installMessageChannelImplementation","script","installReadyStateChangeImplementation","copyBuffer","custom","toArrayBuffer","preferBinary","_opts","_body","setHeader","useFetch","decideMode","_fetchTimer","_onFinish","lowerName","unsafeHeaders","getHeader","removeHeader","headersObj","headersList","keyName","signal","_fetchAbortController","requestTimeout","withCredentials","_connect","ontimeout","_response","statusValid","flushHeaders","setNoDelay","setSocketKeepAlive","validateParams","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","rt","LN2","b64","lens","getLens","validLen","placeHoldersLen","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","len2","encodeChunk","lookup","tripletToBase64","_apiUrl","getNodeJSTransport","defaultPort","_prepareConfigPDF","previousDateRage","_serializeHtml","_serializeAll","_fixColumns","_sendToExport","exportToPNG","exportToICal","_serializePlain","exportToExcel","visual","convert","_eachTaskTimed","_no_progress_colors","_serializeTable","_serializeColumns","rawDates","_serializeScales","exportToJSON","_getWorktimeSettings","importFromExcel","File","_nodejsImportExcel","_sendImportAjaxExcel","importFromMSProject","_nodejsImportMSP","_sendImportAjaxMSP","importFromPrimaveraP6","exportToMSProject","skip_circular_links","oldXmlFormat","oldFormatDate","oldXmlDate","oldDateFormat","_customProjectProperties","_customTaskProperties","_clearRecLinks","_exportConfig","$custom_data","exportToPrimaveraP6","formDataInstance","network","parts1","parts2","parts3","X-Requested-With","sheet","getHeaders","resData","durationUnit","projectProperties","taskProperties","_xdr","pack","_nodejsPostRequest","Content-Length","_markColumns","$template","_ajaxToExport","xdoc","_serializableGanttConfig","callbackFunction","form","_createHiddenForm","submit","_hidden_export_form","_copyObjectBase","formatDate","_color_box","_color_hash","_getStyles","_getColor","_getMinutesWorktimeSettings","parsedRanges","defaultWorkTimes","0","wTime","_working_time_helper","get_calendar","_pull","_originalCopyObject","_copyObjectPlain","rgb","_copyObjectTable","toISOstring","_copyObjectColumns","getDayIndex","_day_index_by_date","$start","$end","hiddenCells","scaleCellsWidth","$type","tmps","$text","$left","$right","_copyObjectColors","$color","ct","_copyObjectAll","smartScales","_exportSerialize","_getRaw","_scale_helpers","_get_scales","autosizeMinWidth","_get_resize_options","cellColors","cellCss","scaleCell","scaleCell_class","scaleCss","exportMode","ccount","xmlFormat","_lvl","_clearLevel","_makeLinksSameLevel","skippedLinks","_clearCircDependencies","_clearLinksSameLevel","usedTasks","prevLink","sources","$_source","_onCircDependencyFind","targets","curLink","_source","targetLvl","linkT","sourceParent","$_target","projectName","projectDates","start_end","manual","EventsManager","_mouseDown","_calculateDirectionVector","vectors","resultVector_1","vector","magnitude","angleDegrees","atan2","_applyDndReadyStyles","_timeline","_clearDndReadyStyles","_getScrollPosition","_countNewScrollPosition","coords","_startPoint","shiftY","_scrollState","_setScrollPosition","_stopDrag","_originalReadonly","_startDrag","enabled","filterTargets","clickDragUseKey","eventsManager_1","helpers_1","SelectedRegion","_el","_singleRow","_getTaskPositionByTop","_view","_viewPort","_endPoint","draw","singleRow","_useRequestAnimationFrame","useRequestAnimationFrame","getElement","setStart","startPoint","_startDate","setEnd","endPoint","_endDate","_positionPoint","absolute","setPosition","positionPoint","tasksByTime","tasksByIndex","_getTasksByTop","getInBounds","startValue","endValue","selectedRegion","_originPosition","_restoreOriginPosition","scheduledDndCoordinates","_getCoordinates","dragTimelineUseKey","viewPortBounds","selectedRegion_1","defaultConfig","eventsManager","__assign","click_drag_1","drag_timeline_1","export_api_1","fullscreen_1","quick_info_1","extensions_gpl_1"],"mappings":"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","file":"dhtmlxgantt.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"dhtmlxgantt\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"dhtmlxgantt\"] = factory();\n\telse\n\t\troot[\"dhtmlxgantt\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/codebase/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 299);\n","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar helpers = require(\"./helpers\");\n\nvar plainObjectConstructor = {}.constructor.toString();\n\nfunction isCustomType(object) {\n var constructorString = object.constructor.toString();\n return constructorString !== plainObjectConstructor;\n}\n\nfunction copy(object) {\n var i, result; // iterator, types array, result\n\n if (object && _typeof(object) == \"object\") {\n switch (true) {\n case helpers.isDate(object):\n result = new Date(object);\n break;\n\n case helpers.isArray(object):\n result = new Array(object.length);\n\n for (i = 0; i < object.length; i++) {\n result[i] = copy(object[i]);\n }\n\n break;\n\n /*\t\tcase (helpers.isStringObject(object)):\r\n \t\t\tresult = new String(object);\r\n \t\t\tbreak;\r\n \t\tcase (helpers.isNumberObject(object)):\r\n \t\t\tresult = new Number(object);\r\n \t\t\tbreak;\r\n \t\tcase (helpers.isBooleanObject(object)):\r\n \t\t\tresult = new Boolean(object);\r\n \t\t\tbreak;*/\n\n default:\n if (isCustomType(object)) {\n result = Object.create(object);\n } else {\n result = {};\n }\n\n for (i in object) {\n if (Object.prototype.hasOwnProperty.apply(object, [i])) result[i] = copy(object[i]);\n }\n\n break;\n }\n }\n\n return result || object;\n}\n\nfunction mixin(target, source, force) {\n for (var f in source) {\n if (target[f] === undefined || force) target[f] = source[f];\n }\n\n return target;\n}\n\nfunction defined(obj) {\n return typeof obj != \"undefined\";\n}\n\nvar seed;\n\nfunction uid() {\n if (!seed) seed = new Date().valueOf();\n seed++;\n return seed;\n} //creates function with specified \"this\" pointer\n\n\nfunction bind(functor, object) {\n if (functor.bind) return functor.bind(object);else return function () {\n return functor.apply(object, arguments);\n };\n}\n\nfunction event(el, event, handler, capture) {\n if (el.addEventListener) el.addEventListener(event, handler, capture === undefined ? false : capture);else if (el.attachEvent) el.attachEvent(\"on\" + event, handler);\n}\n\nfunction eventRemove(el, event, handler, capture) {\n if (el.removeEventListener) el.removeEventListener(event, handler, capture === undefined ? false : capture);else if (el.detachEvent) el.detachEvent(\"on\" + event, handler);\n}\n\nmodule.exports = {\n copy: copy,\n defined: defined,\n mixin: mixin,\n uid: uid,\n bind: bind,\n event: event,\n eventRemove: eventRemove\n};","//returns position of html element on the page\nfunction elementPosition(elem) {\n var top = 0,\n left = 0,\n right = 0,\n bottom = 0;\n\n if (elem.getBoundingClientRect) {\n //HTML5 method\n var box = elem.getBoundingClientRect();\n var body = document.body;\n var docElem = document.documentElement || document.body.parentNode || document.body;\n var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;\n var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;\n var clientTop = docElem.clientTop || body.clientTop || 0;\n var clientLeft = docElem.clientLeft || body.clientLeft || 0;\n top = box.top + scrollTop - clientTop;\n left = box.left + scrollLeft - clientLeft;\n right = document.body.offsetWidth - box.right;\n bottom = document.body.offsetHeight - box.bottom;\n } else {\n //fallback to naive approach\n while (elem) {\n top = top + parseInt(elem.offsetTop, 10);\n left = left + parseInt(elem.offsetLeft, 10);\n elem = elem.offsetParent;\n }\n\n right = document.body.offsetWidth - elem.offsetWidth - left;\n bottom = document.body.offsetHeight - elem.offsetHeight - top;\n }\n\n return {\n y: Math.round(top),\n x: Math.round(left),\n width: elem.offsetWidth,\n height: elem.offsetHeight,\n right: Math.round(right),\n bottom: Math.round(bottom)\n };\n}\n\nfunction isVisible(node) {\n var display = false,\n visibility = false;\n\n if (window.getComputedStyle) {\n var style = window.getComputedStyle(node, null);\n display = style[\"display\"];\n visibility = style[\"visibility\"];\n } else if (node.currentStyle) {\n display = node.currentStyle[\"display\"];\n visibility = node.currentStyle[\"visibility\"];\n }\n\n return display != \"none\" && visibility != \"hidden\";\n}\n\nfunction hasNonNegativeTabIndex(node) {\n return !isNaN(node.getAttribute(\"tabindex\")) && node.getAttribute(\"tabindex\") * 1 >= 0;\n}\n\nfunction hasHref(node) {\n var canHaveHref = {\n \"a\": true,\n \"area\": true\n };\n\n if (canHaveHref[node.nodeName.loLowerCase()]) {\n return !!node.getAttribute(\"href\");\n }\n\n return true;\n}\n\nfunction isEnabled(node) {\n var canDisable = {\n \"input\": true,\n \"select\": true,\n \"textarea\": true,\n \"button\": true,\n \"object\": true\n };\n\n if (canDisable[node.nodeName.toLowerCase()]) {\n return !node.hasAttribute(\"disabled\");\n }\n\n return true;\n}\n\nfunction getFocusableNodes(root) {\n var nodes = root.querySelectorAll([\"a[href]\", \"area[href]\", \"input\", \"select\", \"textarea\", \"button\", \"iframe\", \"object\", \"embed\", \"[tabindex]\", \"[contenteditable]\"].join(\", \"));\n var nodesArray = Array.prototype.slice.call(nodes, 0);\n\n for (var i = 0; i < nodesArray.length; i++) {\n nodesArray[i].$position = i; // we remember original nodes order, \n // so when we sort them by tabindex we ensure order of nodes with same tabindex is preserved, \n // since some browsers do unstable sort\n } // use tabindex to sort focusable nodes\n\n\n nodesArray.sort(function (a, b) {\n if (a.tabIndex === 0 && b.tabIndex !== 0) {\n return 1;\n }\n\n if (a.tabIndex !== 0 && b.tabIndex === 0) {\n return -1;\n }\n\n if (a.tabIndex === b.tabIndex) {\n // ensure we do stable sort\n return a.$position - b.$position;\n }\n\n if (a.tabIndex < b.tabIndex) {\n return -1;\n }\n\n return 1;\n });\n\n for (var i = 0; i < nodesArray.length; i++) {\n var node = nodesArray[i];\n var isValid = (hasNonNegativeTabIndex(node) || isEnabled(node) || hasHref(node)) && isVisible(node);\n\n if (!isValid) {\n nodesArray.splice(i, 1);\n i--;\n }\n }\n\n return nodesArray;\n}\n\nfunction getScrollSize() {\n var div = document.createElement(\"div\");\n div.style.cssText = \"visibility:hidden;position:absolute;left:-1000px;width:100px;padding:0px;margin:0px;height:110px;min-height:100px;overflow-y:scroll;\";\n document.body.appendChild(div);\n var width = div.offsetWidth - div.clientWidth;\n document.body.removeChild(div);\n return width;\n}\n\nfunction getClassName(node) {\n if (!node) return \"\";\n var className = node.className || \"\";\n if (className.baseVal) //'className' exist but not a string - IE svg element in DOM\n className = className.baseVal;\n if (!className.indexOf) className = \"\";\n return _trimString(className);\n}\n\nfunction addClassName(node, className) {\n if (className && node.className.indexOf(className) === -1) {\n node.className += \" \" + className;\n }\n}\n\nfunction removeClassName(node, name) {\n name = name.split(\" \");\n\n for (var i = 0; i < name.length; i++) {\n var regEx = new RegExp(\"\\\\s?\\\\b\" + name[i] + \"\\\\b(?![-_.])\", \"\");\n node.className = node.className.replace(regEx, \"\");\n }\n}\n\nfunction hasClass(element, className) {\n if ('classList' in element) {\n return element.classList.contains(className);\n } else {\n return new RegExp(\"\\\\b\" + className + \"\\\\b\").test(element.className);\n }\n}\n\nfunction toNode(node) {\n if (typeof node === \"string\") {\n return document.getElementById(node) || document.querySelector(node) || document.body;\n }\n\n return node || document.body;\n}\n\nvar _slave;\n\nfunction insert(node, newone) {\n if (!_slave) {\n _slave = document.createElement(\"div\");\n }\n\n _slave.innerHTML = newone;\n var child = _slave.firstChild;\n node.appendChild(child);\n return child;\n}\n\nfunction remove(node) {\n if (node && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\n\nfunction getChildren(node, css) {\n var ch = node.childNodes;\n var len = ch.length;\n var out = [];\n\n for (var i = 0; i < len; i++) {\n var obj = ch[i];\n\n if (obj.className && obj.className.indexOf(css) !== -1) {\n out.push(obj);\n }\n }\n\n return out;\n}\n\nfunction getTargetNode(e) {\n var trg;\n if (e.tagName) trg = e;else {\n e = e || window.event;\n trg = e.target || e.srcElement;\n\n if (trg.shadowRoot && e.composedPath) {\n trg = e.composedPath()[0];\n }\n }\n return trg;\n}\n\nfunction locateAttribute(e, attribute) {\n if (!attribute) return;\n var trg = getTargetNode(e);\n\n while (trg) {\n if (trg.getAttribute) {\n //text nodes has not getAttribute\n var test = trg.getAttribute(attribute);\n if (test) return trg;\n }\n\n trg = trg.parentNode;\n }\n\n return null;\n}\n\nfunction _trimString(str) {\n var func = String.prototype.trim || function () {\n return this.replace(/^\\s+|\\s+$/g, \"\");\n };\n\n return func.apply(str);\n}\n\nfunction locateClassName(e, classname, strict) {\n var trg = getTargetNode(e);\n var css = \"\";\n if (strict === undefined) strict = true;\n\n while (trg) {\n css = getClassName(trg);\n\n if (css) {\n var ind = css.indexOf(classname);\n\n if (ind >= 0) {\n if (!strict) return trg; //check that we have exact match\n\n var left = ind === 0 || !_trimString(css.charAt(ind - 1));\n var right = ind + classname.length >= css.length || !_trimString(css.charAt(ind + classname.length));\n if (left && right) return trg;\n }\n }\n\n trg = trg.parentNode;\n }\n\n return null;\n}\n/*\r\nevent position relatively to DOM element\r\n */\n\n\nfunction getRelativeEventPosition(ev, node) {\n var d = document.documentElement;\n var box = elementPosition(node);\n return {\n x: ev.clientX + d.scrollLeft - d.clientLeft - box.x + node.scrollLeft,\n y: ev.clientY + d.scrollTop - d.clientTop - box.y + node.scrollTop\n };\n}\n\nfunction isChildOf(child, parent) {\n if (!child || !parent) {\n return false;\n }\n\n while (child && child != parent) {\n child = child.parentNode;\n }\n\n return child === parent;\n}\n\nfunction closest(element, selector) {\n if (element.closest) {\n return element.closest(selector);\n } else if (element.matches || element.msMatchesSelector || element.webkitMatchesSelector) {\n var el = element;\n if (!document.documentElement.contains(el)) return null;\n\n do {\n var method = el.matches || el.msMatchesSelector || el.webkitMatchesSelector;\n if (method.call(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Your browser is not supported\");\n return null;\n }\n}\n\nfunction isShadowDomSupported() {\n return document.head.createShadowRoot || document.head.attachShadow;\n}\n/**\r\n * Returns element that has the browser focus, or null if no element has focus.\r\n * Works with shadow DOM, so it's prefereed to use this function instead of document.activeElement directly.\r\n * @returns HTMLElement\r\n */\n\n\nfunction getActiveElement() {\n var activeElement = document.activeElement;\n\n if (activeElement.shadowRoot) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n\n if (activeElement === document.body && document.getSelection) {\n activeElement = document.getSelection().focusNode || document.body;\n }\n\n return activeElement;\n}\n/**\r\n * Returns document.body or the host node of the ShadowRoot, if the element is attached to ShadowDom\r\n * @param {HTMLElement} element \r\n * @returns HTMLElement\r\n */\n\n\nfunction getRootNode(element) {\n if (!element) {\n return document.body;\n }\n\n if (!isShadowDomSupported()) {\n return document.body;\n }\n\n while (element.parentNode && (element = element.parentNode)) {\n if (element instanceof ShadowRoot) {\n return element.host;\n }\n }\n\n return document.body;\n}\n\nfunction hasShadowParent(element) {\n return !!getRootNode(element);\n}\n\nmodule.exports = {\n getNodePosition: elementPosition,\n getFocusableNodes: getFocusableNodes,\n getScrollSize: getScrollSize,\n getClassName: getClassName,\n addClassName: addClassName,\n removeClassName: removeClassName,\n insertNode: insert,\n removeNode: remove,\n getChildNodes: getChildren,\n toNode: toNode,\n locateClassName: locateClassName,\n locateAttribute: locateAttribute,\n getTargetNode: getTargetNode,\n getRelativeEventPosition: getRelativeEventPosition,\n isChildOf: isChildOf,\n hasClass: hasClass,\n closest: closest,\n getRootNode: getRootNode,\n hasShadowParent: hasShadowParent,\n isShadowDomSupported: isShadowDomSupported,\n getActiveElement: getActiveElement\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar units = {\n \"second\": 1,\n \"minute\": 60,\n \"hour\": 60 * 60,\n \"day\": 60 * 60 * 24,\n \"week\": 60 * 60 * 24 * 7,\n \"month\": 60 * 60 * 24 * 30,\n \"quarter\": 60 * 60 * 24 * 30 * 3,\n \"year\": 60 * 60 * 24 * 365\n};\n\nfunction getSecondsInUnit(unit) {\n return units[unit] || units.hour;\n}\n\nfunction forEach(arr, callback) {\n if (arr.forEach) {\n arr.forEach(callback);\n } else {\n var workArray = arr.slice();\n\n for (var i = 0; i < workArray.length; i++) {\n callback(workArray[i], i);\n }\n }\n}\n\nfunction arrayMap(arr, callback) {\n if (arr.map) {\n return arr.map(callback);\n } else {\n var workArray = arr.slice();\n var resArray = [];\n\n for (var i = 0; i < workArray.length; i++) {\n resArray.push(callback(workArray[i], i));\n }\n\n return resArray;\n }\n}\n\nfunction arrayFind(arr, callback) {\n if (arr.find) {\n return arr.find(callback);\n } else {\n for (var i = 0; i < arr.length; i++) {\n if (callback(arr[i], i)) {\n return arr[i];\n }\n }\n }\n}\n\nfunction arrayIncludes(arr, item) {\n if (arr.includes) {\n return arr.includes(item);\n } else {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] === item) {\n return true;\n }\n }\n\n return false;\n }\n} // iframe-safe array type check instead of using instanceof\n\n\nfunction isArray(obj) {\n if (Array.isArray) {\n return Array.isArray(obj);\n } else {\n // close enough\n return obj && obj.length !== undefined && obj.pop && obj.push;\n }\n} // non-primitive string object, e.g. new String(\"abc\")\n\n\nfunction isStringObject(obj) {\n return obj && _typeof(obj) === \"object\" && Function.prototype.toString.call(obj.constructor) === \"function String() { [native code] }\";\n} // non-primitive number object, e.g. new Number(5)\n\n\nfunction isNumberObject(obj) {\n return obj && _typeof(obj) === \"object\" && Function.prototype.toString.call(obj.constructor) === \"function Number() { [native code] }\";\n} // non-primitive number object, e.g. new Boolean(true)\n\n\nfunction isBooleanObject(obj) {\n return obj && _typeof(obj) === \"object\" && Function.prototype.toString.call(obj.constructor) === \"function Boolean() { [native code] }\";\n}\n\nfunction isDate(obj) {\n if (obj && _typeof(obj) === \"object\") {\n return !!(obj.getFullYear && obj.getMonth && obj.getDate);\n } else {\n return false;\n }\n}\n\nfunction isValidDate(obj) {\n return isDate(obj) && !isNaN(obj.getTime());\n}\n\nfunction arrayFilter(arr, callback) {\n var result = [];\n\n if (arr.filter) {\n return arr.filter(callback);\n } else {\n for (var i = 0; i < arr.length; i++) {\n if (callback(arr[i], i)) {\n result[result.length] = arr[i];\n }\n }\n\n return result;\n }\n}\n\nfunction hashToArray(hash) {\n var result = [];\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n result.push(hash[key]);\n }\n }\n\n return result;\n}\n\nfunction arraySome(arr, callback) {\n if (arr.length === 0) return false;\n\n for (var i = 0; i < arr.length; i++) {\n if (callback(arr[i], i, arr)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction arrayDifference(arr, callback) {\n return arrayFilter(arr, function (item, i) {\n return !callback(item, i);\n });\n}\n\nfunction throttle(callback, timeout) {\n var wait = false;\n return function () {\n if (!wait) {\n callback.apply(null, arguments);\n wait = true;\n setTimeout(function () {\n wait = false;\n }, timeout);\n }\n };\n}\n\nfunction delay(callback, timeout) {\n var timer;\n\n var result = function result() {\n result.$cancelTimeout();\n result.$pending = true;\n var args = Array.prototype.slice.call(arguments);\n timer = setTimeout(function () {\n callback.apply(this, args);\n result.$pending = false;\n }, timeout);\n };\n\n result.$pending = false;\n\n result.$cancelTimeout = function () {\n clearTimeout(timer);\n result.$pending = false;\n };\n\n result.$execute = function () {\n var args = Array.prototype.slice.call(arguments);\n callback.apply(this, args);\n result.$cancelTimeout();\n };\n\n return result;\n}\n\nfunction sortArrayOfHash(arr, field, desc) {\n var compare = function compare(a, b) {\n return a < b;\n };\n\n arr.sort(function (a, b) {\n if (a[field] === b[field]) return 0;\n return desc ? compare(a[field], b[field]) : compare(b[field], a[field]);\n });\n}\n\nfunction objectKeys(obj) {\n if (Object.keys) {\n return Object.keys(obj);\n }\n\n var result = [];\n var key;\n\n for (key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result.push(key);\n }\n }\n\n return result;\n}\n\nfunction isEventable(obj) {\n return obj.attachEvent && obj.detachEvent;\n} //GS-1090: A task should be able to have the id = 0\n\n\nfunction replaceValidZeroId(id, rootId) {\n if (checkZeroId(id) && !checkZeroId(rootId)) {\n id = \"0\";\n }\n\n return id;\n}\n\nfunction checkZeroId(id) {\n if (id === 0) {\n return true;\n }\n\n return false;\n}\n\nfunction findBinary(array, target) {\n // modified binary search, target value not exactly match array elements, looking for closest one\n var low = 0,\n high = array.length - 1,\n i,\n item,\n prev;\n\n while (low <= high) {\n i = Math.floor((low + high) / 2);\n item = +array[i];\n prev = +array[i - 1];\n\n if (item < target) {\n low = i + 1;\n continue;\n }\n\n if (item > target) {\n if (!(!isNaN(prev) && prev < target)) {\n high = i - 1;\n continue;\n } else {\n // if target is between 'i' and 'i-1' return 'i - 1'\n return i - 1;\n }\n }\n\n while (+array[i] == +array[i + 1]) {\n i++;\n }\n\n return i;\n }\n\n return array.length - 1;\n}\n\nmodule.exports = {\n getSecondsInUnit: getSecondsInUnit,\n forEach: forEach,\n arrayMap: arrayMap,\n arrayIncludes: arrayIncludes,\n arrayFind: arrayFind,\n arrayFilter: arrayFilter,\n arrayDifference: arrayDifference,\n arraySome: arraySome,\n hashToArray: hashToArray,\n sortArrayOfHash: sortArrayOfHash,\n throttle: throttle,\n isArray: isArray,\n isDate: isDate,\n isValidDate: isValidDate,\n isStringObject: isStringObject,\n isNumberObject: isNumberObject,\n isBooleanObject: isBooleanObject,\n delay: delay,\n objectKeys: objectKeys,\n isEventable: isEventable,\n replaceValidZeroId: replaceValidZeroId,\n checkZeroId: checkZeroId,\n findBinary: findBinary\n};","module.exports = function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar g; // This works in non-strict mode\n\ng = function () {\n return this;\n}();\n\ntry {\n // This works if eval is allowed (see CSP)\n g = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n // This works if the window reference is available\n if ((typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\") g = window;\n} // g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\n\nmodule.exports = g;","var EventHost = function EventHost() {\n this._silent_mode = false;\n this.listeners = {};\n};\n\nEventHost.prototype = {\n _silentStart: function _silentStart() {\n this._silent_mode = true;\n },\n _silentEnd: function _silentEnd() {\n this._silent_mode = false;\n }\n};\n\nvar createEventStorage = function createEventStorage(obj) {\n var handlers = {};\n var index = 0;\n\n var eventStorage = function eventStorage() {\n var combinedResult = true;\n\n for (var i in handlers) {\n var handlerResult = handlers[i].apply(obj, arguments);\n combinedResult = combinedResult && handlerResult;\n }\n\n return combinedResult;\n };\n\n eventStorage.addEvent = function (handler, settings) {\n if (typeof handler == \"function\") {\n var handlerId;\n\n if (settings && settings.id) {\n handlerId = settings.id;\n } else {\n handlerId = index;\n index++;\n }\n\n if (settings && settings.once) {\n var originalHandler = handler;\n\n handler = function handler() {\n originalHandler();\n eventStorage.removeEvent(handlerId);\n };\n }\n\n handlers[handlerId] = handler;\n return handlerId;\n }\n\n return false;\n };\n\n eventStorage.removeEvent = function (id) {\n delete handlers[id];\n };\n\n eventStorage.clear = function () {\n handlers = {};\n };\n\n return eventStorage;\n};\n\nfunction makeEventable(obj) {\n var eventHost = new EventHost();\n\n obj.attachEvent = function (eventName, handler, settings) {\n eventName = 'ev_' + eventName.toLowerCase();\n\n if (!eventHost.listeners[eventName]) {\n eventHost.listeners[eventName] = createEventStorage(this);\n }\n\n if (settings && settings.thisObject) {\n handler = handler.bind(settings.thisObject);\n }\n\n var innerId = eventHost.listeners[eventName].addEvent(handler, settings);\n var handlerId = eventName + ':' + innerId; //return ID (ev_eventname:1)\n\n if (settings && settings.id) {\n handlerId = settings.id;\n }\n\n return handlerId;\n };\n\n obj.attachAll = function (callback) {\n this.attachEvent('listen_all', callback);\n };\n\n obj.callEvent = function (name, eventArguments) {\n if (eventHost._silent_mode) return true;\n var handlerName = 'ev_' + name.toLowerCase();\n var listeners = eventHost.listeners;\n\n if (listeners['ev_listen_all']) {\n listeners['ev_listen_all'].apply(this, [name].concat(eventArguments));\n }\n\n if (listeners[handlerName]) return listeners[handlerName].apply(this, eventArguments);\n return true;\n };\n\n obj.checkEvent = function (name) {\n var listeners = eventHost.listeners;\n return !!listeners['ev_' + name.toLowerCase()];\n };\n\n obj.detachEvent = function (id) {\n if (id) {\n var listeners = eventHost.listeners;\n\n for (var i in listeners) {\n listeners[i].removeEvent(id); //remove event\n }\n\n var list = id.split(':'); //get EventName and ID\n\n var listeners = eventHost.listeners;\n\n if (list.length === 2) {\n var eventName = list[0];\n var eventId = list[1];\n\n if (listeners[eventName]) {\n listeners[eventName].removeEvent(eventId); //remove event\n }\n }\n }\n };\n\n obj.detachAllEvents = function () {\n for (var name in eventHost.listeners) {\n eventHost.listeners[name].clear();\n }\n };\n}\n\nmodule.exports = makeEventable;","module.exports = function getVisibleTasksRange(gantt, view, config, datastore, viewport) {\n var buffer = 1;\n var start = view.getItemIndexByTopPosition(viewport.y) || 0;\n var end = view.getItemIndexByTopPosition(viewport.y_end) || datastore.count();\n var indexStart = Math.max(0, start - buffer);\n var indexEnd = Math.min(datastore.count(), end + buffer);\n return {\n start: indexStart,\n end: indexEnd\n };\n};","function dummy() {\n // eslint-disable-next-line\n console.log(\"Method is not implemented.\");\n}\n\nfunction BaseControl() {} // base methods will be runned in gantt context\n\n\nBaseControl.prototype.render = dummy; // arguments: sns\n\nBaseControl.prototype.set_value = dummy; // arguments: node, value, ev, sns(config)\n\nBaseControl.prototype.get_value = dummy; // arguments node, ev, sns(config)\n\nBaseControl.prototype.focus = dummy; // arguments: node\n\nmodule.exports = function (gantt) {\n // we could send current instance of gantt to module\n return BaseControl;\n};","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor;\n\n var TempCtor = function TempCtor() {};\n\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n };\n}","// shim for using process in browser\nvar process = module.exports = {}; // cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\n\nfunction defaultClearTimeout() {\n throw new Error('clearTimeout has not been defined');\n}\n\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n})();\n\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n } // if setTimeout wasn't available but was latter defined\n\n\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n}\n\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n } // if clearTimeout wasn't available but was latter defined\n\n\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n}\n\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n\n draining = false;\n\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n var len = queue.length;\n\n while (len) {\n currentQueue = queue;\n queue = [];\n\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n\n queueIndex = -1;\n len = queue.length;\n }\n\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n\n queue.push(new Item(fun, args));\n\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n}; // v8 likes predictible objects\n\n\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\n\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\n\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\n\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) {\n return [];\n};\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () {\n return '/';\n};\n\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\n\nprocess.umask = function () {\n return 0;\n};","module.exports = function (gantt) {\n var BaseEditor = function BaseEditor() {};\n\n BaseEditor.prototype = {\n show: function show(id, column, config, placeholder) {},\n hide: function hide() {},\n set_value: function set_value(value, id, column, node) {\n this.get_input(node).value = value;\n },\n get_value: function get_value(id, column, node) {\n return this.get_input(node).value || \"\";\n },\n is_changed: function is_changed(value, id, column, node) {\n var currentValue = this.get_value(id, column, node);\n\n if (currentValue && value && currentValue.valueOf && value.valueOf) {\n return currentValue.valueOf() != value.valueOf();\n } else {\n return currentValue != value;\n }\n },\n is_valid: function is_valid(value, id, column, node) {\n return true;\n },\n save: function save(id, column, node) {},\n get_input: function get_input(node) {\n return node.querySelector(\"input\");\n },\n focus: function focus(node) {\n var input = this.get_input(node);\n\n if (!input) {\n return;\n }\n\n if (input.focus) {\n input.focus();\n }\n\n if (input.select) {\n input.select();\n }\n }\n };\n return BaseEditor;\n};","/* eslint-disable no-restricted-globals */\nvar isWindowAwailable = typeof window !== \"undefined\";\n/* eslint-enable no-restricted-globals */\n\nvar env = {\n isIE: isWindowAwailable && (navigator.userAgent.indexOf(\"MSIE\") >= 0 || navigator.userAgent.indexOf(\"Trident\") >= 0),\n isIE6: isWindowAwailable && !XMLHttpRequest && navigator.userAgent.indexOf(\"MSIE\") >= 0,\n isIE7: isWindowAwailable && navigator.userAgent.indexOf(\"MSIE 7.0\") >= 0 && navigator.userAgent.indexOf(\"Trident\") < 0,\n isIE8: isWindowAwailable && navigator.userAgent.indexOf(\"MSIE 8.0\") >= 0 && navigator.userAgent.indexOf(\"Trident\") >= 0,\n isOpera: isWindowAwailable && navigator.userAgent.indexOf(\"Opera\") >= 0,\n isChrome: isWindowAwailable && navigator.userAgent.indexOf(\"Chrome\") >= 0,\n isKHTML: isWindowAwailable && (navigator.userAgent.indexOf(\"Safari\") >= 0 || navigator.userAgent.indexOf(\"Konqueror\") >= 0),\n isFF: isWindowAwailable && navigator.userAgent.indexOf(\"Firefox\") >= 0,\n isIPad: isWindowAwailable && navigator.userAgent.search(/iPad/gi) >= 0,\n isEdge: isWindowAwailable && navigator.userAgent.indexOf(\"Edge\") != -1,\n isNode: !isWindowAwailable || typeof navigator == \"undefined\"\n};\nmodule.exports = env;","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n'use strict';\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n\n for (var key in obj) {\n keys.push(key);\n }\n\n return keys;\n};\n/*</replacement>*/\n\n\nmodule.exports = Duplex;\n/*<replacement>*/\n\nvar util = require('core-util-is');\n\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Readable = require('./_stream_readable');\n\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n{\n // avoid scope creep, the keys array can then be collected\n var keys = objectKeys(Writable.prototype);\n\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\n\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n Readable.call(this, options);\n Writable.call(this, options);\n if (options && options.readable === false) this.readable = false;\n if (options && options.writable === false) this.writable = false;\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n}); // the no-half-open enforcer\n\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written.\n // But allow more writes to happen in this tick.\n\n pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n get: function get() {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n } // backward compatibility, the user is explicitly\n // managing destroyed\n\n\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n this.push(null);\n this.end();\n pna.nextTick(cb, err);\n};","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license MIT\n */\n\n/* eslint-disable no-proto */\n'use strict';\n\nvar base64 = require('base64-js');\n\nvar ieee754 = require('ieee754');\n\nvar isArray = require('isarray');\n\nexports.Buffer = Buffer;\nexports.SlowBuffer = SlowBuffer;\nexports.INSPECT_MAX_BYTES = 50;\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\n\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport();\n/*\n * Export kMaxLength after typed array support is determined.\n */\n\nexports.kMaxLength = kMaxLength();\n\nfunction typedArraySupport() {\n try {\n var arr = new Uint8Array(1);\n arr.__proto__ = {\n __proto__: Uint8Array.prototype,\n foo: function foo() {\n return 42;\n }\n };\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0; // ie10 has broken `subarray`\n } catch (e) {\n return false;\n }\n}\n\nfunction kMaxLength() {\n return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff;\n}\n\nfunction createBuffer(that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length');\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length);\n that.__proto__ = Buffer.prototype;\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length);\n }\n\n that.length = length;\n }\n\n return that;\n}\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\n\nfunction Buffer(arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length);\n } // Common case.\n\n\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error('If encoding is specified then the first argument must be a string');\n }\n\n return allocUnsafe(this, arg);\n }\n\n return from(this, arg, encodingOrOffset, length);\n}\n\nBuffer.poolSize = 8192; // not used by this implementation\n// TODO: Legacy, not needed anymore. Remove in next major version.\n\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype;\n return arr;\n};\n\nfunction from(that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number');\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length);\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset);\n }\n\n return fromObject(that, value);\n}\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\n\n\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length);\n};\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype;\n Buffer.__proto__ = Uint8Array;\n\n if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n });\n }\n}\n\nfunction assertSize(size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number');\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative');\n }\n}\n\nfunction alloc(that, size, fill, encoding) {\n assertSize(size);\n\n if (size <= 0) {\n return createBuffer(that, size);\n }\n\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill);\n }\n\n return createBuffer(that, size);\n}\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\n\n\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding);\n};\n\nfunction allocUnsafe(that, size) {\n assertSize(size);\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);\n\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0;\n }\n }\n\n return that;\n}\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\n\n\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size);\n};\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\n\n\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size);\n};\n\nfunction fromString(that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8';\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding');\n }\n\n var length = byteLength(string, encoding) | 0;\n that = createBuffer(that, length);\n var actual = that.write(string, encoding);\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual);\n }\n\n return that;\n}\n\nfunction fromArrayLike(that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0;\n that = createBuffer(that, length);\n\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255;\n }\n\n return that;\n}\n\nfunction fromArrayBuffer(that, array, byteOffset, length) {\n array.byteLength; // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds');\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds');\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array);\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset);\n } else {\n array = new Uint8Array(array, byteOffset, length);\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array;\n that.__proto__ = Buffer.prototype;\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array);\n }\n\n return that;\n}\n\nfunction fromObject(that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0;\n that = createBuffer(that, len);\n\n if (that.length === 0) {\n return that;\n }\n\n obj.copy(that, 0, 0, len);\n return that;\n }\n\n if (obj) {\n if (typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0);\n }\n\n return fromArrayLike(that, obj);\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data);\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.');\n}\n\nfunction checked(length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes');\n }\n\n return length | 0;\n}\n\nfunction SlowBuffer(length) {\n if (+length != length) {\n // eslint-disable-line eqeqeq\n length = 0;\n }\n\n return Buffer.alloc(+length);\n}\n\nBuffer.isBuffer = function isBuffer(b) {\n return !!(b != null && b._isBuffer);\n};\n\nBuffer.compare = function compare(a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers');\n }\n\n if (a === b) return 0;\n var x = a.length;\n var y = b.length;\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break;\n }\n }\n\n if (x < y) return -1;\n if (y < x) return 1;\n return 0;\n};\n\nBuffer.isEncoding = function isEncoding(encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true;\n\n default:\n return false;\n }\n};\n\nBuffer.concat = function concat(list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0);\n }\n\n var i;\n\n if (length === undefined) {\n length = 0;\n\n for (i = 0; i < list.length; ++i) {\n length += list[i].length;\n }\n }\n\n var buffer = Buffer.allocUnsafe(length);\n var pos = 0;\n\n for (i = 0; i < list.length; ++i) {\n var buf = list[i];\n\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n }\n\n buf.copy(buffer, pos);\n pos += buf.length;\n }\n\n return buffer;\n};\n\nfunction byteLength(string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length;\n }\n\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength;\n }\n\n if (typeof string !== 'string') {\n string = '' + string;\n }\n\n var len = string.length;\n if (len === 0) return 0; // Use a for loop to avoid recursion\n\n var loweredCase = false;\n\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len;\n\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length;\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2;\n\n case 'hex':\n return len >>> 1;\n\n case 'base64':\n return base64ToBytes(string).length;\n\n default:\n if (loweredCase) return utf8ToBytes(string).length; // assume utf8\n\n encoding = ('' + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n}\n\nBuffer.byteLength = byteLength;\n\nfunction slowToString(encoding, start, end) {\n var loweredCase = false; // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n\n if (start === undefined || start < 0) {\n start = 0;\n } // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n\n\n if (start > this.length) {\n return '';\n }\n\n if (end === undefined || end > this.length) {\n end = this.length;\n }\n\n if (end <= 0) {\n return '';\n } // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n\n\n end >>>= 0;\n start >>>= 0;\n\n if (end <= start) {\n return '';\n }\n\n if (!encoding) encoding = 'utf8';\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end);\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end);\n\n case 'ascii':\n return asciiSlice(this, start, end);\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end);\n\n case 'base64':\n return base64Slice(this, start, end);\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end);\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);\n encoding = (encoding + '').toLowerCase();\n loweredCase = true;\n }\n }\n} // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\n\n\nBuffer.prototype._isBuffer = true;\n\nfunction swap(b, n, m) {\n var i = b[n];\n b[n] = b[m];\n b[m] = i;\n}\n\nBuffer.prototype.swap16 = function swap16() {\n var len = this.length;\n\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits');\n }\n\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1);\n }\n\n return this;\n};\n\nBuffer.prototype.swap32 = function swap32() {\n var len = this.length;\n\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits');\n }\n\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3);\n swap(this, i + 1, i + 2);\n }\n\n return this;\n};\n\nBuffer.prototype.swap64 = function swap64() {\n var len = this.length;\n\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits');\n }\n\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7);\n swap(this, i + 1, i + 6);\n swap(this, i + 2, i + 5);\n swap(this, i + 3, i + 4);\n }\n\n return this;\n};\n\nBuffer.prototype.toString = function toString() {\n var length = this.length | 0;\n if (length === 0) return '';\n if (arguments.length === 0) return utf8Slice(this, 0, length);\n return slowToString.apply(this, arguments);\n};\n\nBuffer.prototype.equals = function equals(b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer');\n if (this === b) return true;\n return Buffer.compare(this, b) === 0;\n};\n\nBuffer.prototype.inspect = function inspect() {\n var str = '';\n var max = exports.INSPECT_MAX_BYTES;\n\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');\n if (this.length > max) str += ' ... ';\n }\n\n return '<Buffer ' + str + '>';\n};\n\nBuffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer');\n }\n\n if (start === undefined) {\n start = 0;\n }\n\n if (end === undefined) {\n end = target ? target.length : 0;\n }\n\n if (thisStart === undefined) {\n thisStart = 0;\n }\n\n if (thisEnd === undefined) {\n thisEnd = this.length;\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index');\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0;\n }\n\n if (thisStart >= thisEnd) {\n return -1;\n }\n\n if (start >= end) {\n return 1;\n }\n\n start >>>= 0;\n end >>>= 0;\n thisStart >>>= 0;\n thisEnd >>>= 0;\n if (this === target) return 0;\n var x = thisEnd - thisStart;\n var y = end - start;\n var len = Math.min(x, y);\n var thisCopy = this.slice(thisStart, thisEnd);\n var targetCopy = target.slice(start, end);\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i];\n y = targetCopy[i];\n break;\n }\n }\n\n if (x < y) return -1;\n if (y < x) return 1;\n return 0;\n}; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\n\n\nfunction bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1; // Normalize byteOffset\n\n if (typeof byteOffset === 'string') {\n encoding = byteOffset;\n byteOffset = 0;\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff;\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000;\n }\n\n byteOffset = +byteOffset; // Coerce to Number.\n\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : buffer.length - 1;\n } // Normalize byteOffset: negative offsets start from the end of the buffer\n\n\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset;\n\n if (byteOffset >= buffer.length) {\n if (dir) return -1;else byteOffset = buffer.length - 1;\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0;else return -1;\n } // Normalize val\n\n\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding);\n } // Finally, search either indexOf (if dir is true) or lastIndexOf\n\n\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1;\n }\n\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir);\n } else if (typeof val === 'number') {\n val = val & 0xFF; // Search for a byte value [0-255]\n\n if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);\n }\n }\n\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir);\n }\n\n throw new TypeError('val must be string, number or Buffer');\n}\n\nfunction arrayIndexOf(arr, val, byteOffset, encoding, dir) {\n var indexSize = 1;\n var arrLength = arr.length;\n var valLength = val.length;\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase();\n\n if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1;\n }\n\n indexSize = 2;\n arrLength /= 2;\n valLength /= 2;\n byteOffset /= 2;\n }\n }\n\n function read(buf, i) {\n if (indexSize === 1) {\n return buf[i];\n } else {\n return buf.readUInt16BE(i * indexSize);\n }\n }\n\n var i;\n\n if (dir) {\n var foundIndex = -1;\n\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i;\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize;\n } else {\n if (foundIndex !== -1) i -= i - foundIndex;\n foundIndex = -1;\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n\n for (i = byteOffset; i >= 0; i--) {\n var found = true;\n\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false;\n break;\n }\n }\n\n if (found) return i;\n }\n }\n\n return -1;\n}\n\nBuffer.prototype.includes = function includes(val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1;\n};\n\nBuffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true);\n};\n\nBuffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false);\n};\n\nfunction hexWrite(buf, string, offset, length) {\n offset = Number(offset) || 0;\n var remaining = buf.length - offset;\n\n if (!length) {\n length = remaining;\n } else {\n length = Number(length);\n\n if (length > remaining) {\n length = remaining;\n }\n } // must be an even number of digits\n\n\n var strLen = string.length;\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string');\n\n if (length > strLen / 2) {\n length = strLen / 2;\n }\n\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16);\n if (isNaN(parsed)) return i;\n buf[offset + i] = parsed;\n }\n\n return i;\n}\n\nfunction utf8Write(buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);\n}\n\nfunction asciiWrite(buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length);\n}\n\nfunction latin1Write(buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length);\n}\n\nfunction base64Write(buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length);\n}\n\nfunction ucs2Write(buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);\n}\n\nBuffer.prototype.write = function write(string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8';\n length = this.length;\n offset = 0; // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset;\n length = this.length;\n offset = 0; // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0;\n\n if (isFinite(length)) {\n length = length | 0;\n if (encoding === undefined) encoding = 'utf8';\n } else {\n encoding = length;\n length = undefined;\n } // legacy write(string, encoding, offset, length) - remove in v0.13\n\n } else {\n throw new Error('Buffer.write(string, encoding, offset[, length]) is no longer supported');\n }\n\n var remaining = this.length - offset;\n if (length === undefined || length > remaining) length = remaining;\n\n if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds');\n }\n\n if (!encoding) encoding = 'utf8';\n var loweredCase = false;\n\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length);\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length);\n\n case 'ascii':\n return asciiWrite(this, string, offset, length);\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length);\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length);\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length);\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);\n encoding = ('' + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n};\n\nBuffer.prototype.toJSON = function toJSON() {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n };\n};\n\nfunction base64Slice(buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf);\n } else {\n return base64.fromByteArray(buf.slice(start, end));\n }\n}\n\nfunction utf8Slice(buf, start, end) {\n end = Math.min(buf.length, end);\n var res = [];\n var i = start;\n\n while (i < end) {\n var firstByte = buf[i];\n var codePoint = null;\n var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint;\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte;\n }\n\n break;\n\n case 2:\n secondByte = buf[i + 1];\n\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;\n\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint;\n }\n }\n\n break;\n\n case 3:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;\n\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint;\n }\n }\n\n break;\n\n case 4:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n fourthByte = buf[i + 3];\n\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;\n\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint;\n }\n }\n\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD;\n bytesPerSequence = 1;\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000;\n res.push(codePoint >>> 10 & 0x3FF | 0xD800);\n codePoint = 0xDC00 | codePoint & 0x3FF;\n }\n\n res.push(codePoint);\n i += bytesPerSequence;\n }\n\n return decodeCodePointsArray(res);\n} // Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\n\n\nvar MAX_ARGUMENTS_LENGTH = 0x1000;\n\nfunction decodeCodePointsArray(codePoints) {\n var len = codePoints.length;\n\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints); // avoid extra slice()\n } // Decode in chunks to avoid \"call stack size exceeded\".\n\n\n var res = '';\n var i = 0;\n\n while (i < len) {\n res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));\n }\n\n return res;\n}\n\nfunction asciiSlice(buf, start, end) {\n var ret = '';\n end = Math.min(buf.length, end);\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F);\n }\n\n return ret;\n}\n\nfunction latin1Slice(buf, start, end) {\n var ret = '';\n end = Math.min(buf.length, end);\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i]);\n }\n\n return ret;\n}\n\nfunction hexSlice(buf, start, end) {\n var len = buf.length;\n if (!start || start < 0) start = 0;\n if (!end || end < 0 || end > len) end = len;\n var out = '';\n\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i]);\n }\n\n return out;\n}\n\nfunction utf16leSlice(buf, start, end) {\n var bytes = buf.slice(start, end);\n var res = '';\n\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n }\n\n return res;\n}\n\nBuffer.prototype.slice = function slice(start, end) {\n var len = this.length;\n start = ~~start;\n end = end === undefined ? len : ~~end;\n\n if (start < 0) {\n start += len;\n if (start < 0) start = 0;\n } else if (start > len) {\n start = len;\n }\n\n if (end < 0) {\n end += len;\n if (end < 0) end = 0;\n } else if (end > len) {\n end = len;\n }\n\n if (end < start) end = start;\n var newBuf;\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end);\n newBuf.__proto__ = Buffer.prototype;\n } else {\n var sliceLen = end - start;\n newBuf = new Buffer(sliceLen, undefined);\n\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start];\n }\n }\n\n return newBuf;\n};\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\n\n\nfunction checkOffset(offset, ext, length) {\n if (offset % 1 !== 0 || offset < 0) throw new RangeError('offset is not uint');\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length');\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset(offset, byteLength, this.length);\n var val = this[offset];\n var mul = 1;\n var i = 0;\n\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul;\n }\n\n return val;\n};\n\nBuffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length);\n }\n\n var val = this[offset + --byteLength];\n var mul = 1;\n\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul;\n }\n\n return val;\n};\n\nBuffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length);\n return this[offset];\n};\n\nBuffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n return this[offset] | this[offset + 1] << 8;\n};\n\nBuffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n return this[offset] << 8 | this[offset + 1];\n};\n\nBuffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;\n};\n\nBuffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);\n};\n\nBuffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset(offset, byteLength, this.length);\n var val = this[offset];\n var mul = 1;\n var i = 0;\n\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul;\n }\n\n mul *= 0x80;\n if (val >= mul) val -= Math.pow(2, 8 * byteLength);\n return val;\n};\n\nBuffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset(offset, byteLength, this.length);\n var i = byteLength;\n var mul = 1;\n var val = this[offset + --i];\n\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul;\n }\n\n mul *= 0x80;\n if (val >= mul) val -= Math.pow(2, 8 * byteLength);\n return val;\n};\n\nBuffer.prototype.readInt8 = function readInt8(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length);\n if (!(this[offset] & 0x80)) return this[offset];\n return (0xff - this[offset] + 1) * -1;\n};\n\nBuffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n var val = this[offset] | this[offset + 1] << 8;\n return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\n\nBuffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n var val = this[offset + 1] | this[offset] << 8;\n return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\n\nBuffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;\n};\n\nBuffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];\n};\n\nBuffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return ieee754.read(this, offset, true, 23, 4);\n};\n\nBuffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return ieee754.read(this, offset, false, 23, 4);\n};\n\nBuffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length);\n return ieee754.read(this, offset, true, 52, 8);\n};\n\nBuffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length);\n return ieee754.read(this, offset, false, 52, 8);\n};\n\nfunction checkInt(buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds');\n if (offset + ext > buf.length) throw new RangeError('Index out of range');\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n byteLength = byteLength | 0;\n\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1;\n checkInt(this, value, offset, byteLength, maxBytes, 0);\n }\n\n var mul = 1;\n var i = 0;\n this[offset] = value & 0xFF;\n\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = value / mul & 0xFF;\n }\n\n return offset + byteLength;\n};\n\nBuffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n byteLength = byteLength | 0;\n\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1;\n checkInt(this, value, offset, byteLength, maxBytes, 0);\n }\n\n var i = byteLength - 1;\n var mul = 1;\n this[offset + i] = value & 0xFF;\n\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = value / mul & 0xFF;\n }\n\n return offset + byteLength;\n};\n\nBuffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);\n this[offset] = value & 0xff;\n return offset + 1;\n};\n\nfunction objectWriteUInt16(buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1;\n\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & 0xff << 8 * (littleEndian ? i : 1 - i)) >>> (littleEndian ? i : 1 - i) * 8;\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = value & 0xff;\n this[offset + 1] = value >>> 8;\n } else {\n objectWriteUInt16(this, value, offset, true);\n }\n\n return offset + 2;\n};\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = value >>> 8;\n this[offset + 1] = value & 0xff;\n } else {\n objectWriteUInt16(this, value, offset, false);\n }\n\n return offset + 2;\n};\n\nfunction objectWriteUInt32(buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1;\n\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = value >>> (littleEndian ? i : 3 - i) * 8 & 0xff;\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = value >>> 24;\n this[offset + 2] = value >>> 16;\n this[offset + 1] = value >>> 8;\n this[offset] = value & 0xff;\n } else {\n objectWriteUInt32(this, value, offset, true);\n }\n\n return offset + 4;\n};\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = value >>> 24;\n this[offset + 1] = value >>> 16;\n this[offset + 2] = value >>> 8;\n this[offset + 3] = value & 0xff;\n } else {\n objectWriteUInt32(this, value, offset, false);\n }\n\n return offset + 4;\n};\n\nBuffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1);\n checkInt(this, value, offset, byteLength, limit - 1, -limit);\n }\n\n var i = 0;\n var mul = 1;\n var sub = 0;\n this[offset] = value & 0xFF;\n\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1;\n }\n\n this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n }\n\n return offset + byteLength;\n};\n\nBuffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1);\n checkInt(this, value, offset, byteLength, limit - 1, -limit);\n }\n\n var i = byteLength - 1;\n var mul = 1;\n var sub = 0;\n this[offset + i] = value & 0xFF;\n\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1;\n }\n\n this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n }\n\n return offset + byteLength;\n};\n\nBuffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);\n if (value < 0) value = 0xff + value + 1;\n this[offset] = value & 0xff;\n return offset + 1;\n};\n\nBuffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = value & 0xff;\n this[offset + 1] = value >>> 8;\n } else {\n objectWriteUInt16(this, value, offset, true);\n }\n\n return offset + 2;\n};\n\nBuffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = value >>> 8;\n this[offset + 1] = value & 0xff;\n } else {\n objectWriteUInt16(this, value, offset, false);\n }\n\n return offset + 2;\n};\n\nBuffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = value & 0xff;\n this[offset + 1] = value >>> 8;\n this[offset + 2] = value >>> 16;\n this[offset + 3] = value >>> 24;\n } else {\n objectWriteUInt32(this, value, offset, true);\n }\n\n return offset + 4;\n};\n\nBuffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);\n if (value < 0) value = 0xffffffff + value + 1;\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = value >>> 24;\n this[offset + 1] = value >>> 16;\n this[offset + 2] = value >>> 8;\n this[offset + 3] = value & 0xff;\n } else {\n objectWriteUInt32(this, value, offset, false);\n }\n\n return offset + 4;\n};\n\nfunction checkIEEE754(buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range');\n if (offset < 0) throw new RangeError('Index out of range');\n}\n\nfunction writeFloat(buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38);\n }\n\n ieee754.write(buf, value, offset, littleEndian, 23, 4);\n return offset + 4;\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert);\n};\n\nBuffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert);\n};\n\nfunction writeDouble(buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308);\n }\n\n ieee754.write(buf, value, offset, littleEndian, 52, 8);\n return offset + 8;\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert);\n};\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert);\n}; // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\n\n\nBuffer.prototype.copy = function copy(target, targetStart, start, end) {\n if (!start) start = 0;\n if (!end && end !== 0) end = this.length;\n if (targetStart >= target.length) targetStart = target.length;\n if (!targetStart) targetStart = 0;\n if (end > 0 && end < start) end = start; // Copy 0 bytes; we're done\n\n if (end === start) return 0;\n if (target.length === 0 || this.length === 0) return 0; // Fatal error conditions\n\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds');\n }\n\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds');\n if (end < 0) throw new RangeError('sourceEnd out of bounds'); // Are we oob?\n\n if (end > this.length) end = this.length;\n\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start;\n }\n\n var len = end - start;\n var i;\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start];\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start];\n }\n } else {\n Uint8Array.prototype.set.call(target, this.subarray(start, start + len), targetStart);\n }\n\n return len;\n}; // Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\n\n\nBuffer.prototype.fill = function fill(val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start;\n start = 0;\n end = this.length;\n } else if (typeof end === 'string') {\n encoding = end;\n end = this.length;\n }\n\n if (val.length === 1) {\n var code = val.charCodeAt(0);\n\n if (code < 256) {\n val = code;\n }\n }\n\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string');\n }\n\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding);\n }\n } else if (typeof val === 'number') {\n val = val & 255;\n } // Invalid ranges are not set to a default, so can range check early.\n\n\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index');\n }\n\n if (end <= start) {\n return this;\n }\n\n start = start >>> 0;\n end = end === undefined ? this.length : end >>> 0;\n if (!val) val = 0;\n var i;\n\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val;\n }\n } else {\n var bytes = Buffer.isBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString());\n var len = bytes.length;\n\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len];\n }\n }\n\n return this;\n}; // HELPER FUNCTIONS\n// ================\n\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g;\n\nfunction base64clean(str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, ''); // Node converts strings with length < 2 to ''\n\n if (str.length < 2) return ''; // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n\n while (str.length % 4 !== 0) {\n str = str + '=';\n }\n\n return str;\n}\n\nfunction stringtrim(str) {\n if (str.trim) return str.trim();\n return str.replace(/^\\s+|\\s+$/g, '');\n}\n\nfunction toHex(n) {\n if (n < 16) return '0' + n.toString(16);\n return n.toString(16);\n}\n\nfunction utf8ToBytes(string, units) {\n units = units || Infinity;\n var codePoint;\n var length = string.length;\n var leadSurrogate = null;\n var bytes = [];\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i); // is surrogate component\n\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n continue;\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n continue;\n } // valid lead\n\n\n leadSurrogate = codePoint;\n continue;\n } // 2 leads in a row\n\n\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n leadSurrogate = codePoint;\n continue;\n } // valid surrogate pair\n\n\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n }\n\n leadSurrogate = null; // encode utf8\n\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break;\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break;\n bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break;\n bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break;\n bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n } else {\n throw new Error('Invalid code point');\n }\n }\n\n return bytes;\n}\n\nfunction asciiToBytes(str) {\n var byteArray = [];\n\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF);\n }\n\n return byteArray;\n}\n\nfunction utf16leToBytes(str, units) {\n var c, hi, lo;\n var byteArray = [];\n\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break;\n c = str.charCodeAt(i);\n hi = c >> 8;\n lo = c % 256;\n byteArray.push(lo);\n byteArray.push(hi);\n }\n\n return byteArray;\n}\n\nfunction base64ToBytes(str) {\n return base64.toByteArray(base64clean(str));\n}\n\nfunction blitBuffer(src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if (i + offset >= dst.length || i >= src.length) break;\n dst[i + offset] = src[i];\n }\n\n return i;\n}\n\nfunction isnan(val) {\n return val !== val; // eslint-disable-line no-self-compare\n}","var utils = require(\"../../../utils/utils\"),\n eventable = require(\"../../../utils/eventable\"),\n domHelpers = require(\"../utils/dom_helpers\");\n\nvar Cell = function () {\n \"use strict\";\n\n function Cell(parent, config, factory, gantt) {\n if (parent) {\n this.$container = domHelpers.toNode(parent);\n this.$parent = parent;\n } // save config\n\n\n this.$config = utils.mixin(config, {\n headerHeight: 33\n });\n this.$gantt = gantt;\n this.$domEvents = gantt._createDomEventScope(); // set id\n\n this.$id = config.id || \"c\" + utils.uid();\n this.$name = \"cell\";\n this.$factory = factory;\n eventable(this);\n }\n\n Cell.prototype.destructor = function () {\n this.$parent = this.$container = this.$view = null;\n var mouse = this.$gantt.$services.getService(\"mouseEvents\");\n mouse.detach(\"click\", \"gantt_header_arrow\", this._headerClickHandler);\n this.$domEvents.detachAll();\n this.callEvent(\"onDestroy\", []);\n this.detachAllEvents();\n };\n\n Cell.prototype.cell = function (id) {\n return null;\n };\n\n Cell.prototype.scrollTo = function (left, top) {\n //GS-333 Add a way to scroll the HTML views:\n var cell = this.$view;\n if (this.$config.html) cell = this.$view.firstChild;\n\n if (left * 1 == left) {\n cell.scrollLeft = left;\n }\n\n if (top * 1 == top) {\n cell.scrollTop = top;\n }\n };\n\n Cell.prototype.clear = function () {\n this.getNode().innerHTML = \"\";\n this.getNode().className = \"gantt_layout_content\";\n this.getNode().style.padding = \"0\";\n };\n\n Cell.prototype.resize = function (_final) {\n if (this.$parent) {\n return this.$parent.resize(_final);\n }\n\n if (_final === false) {\n this.$preResize = true;\n }\n\n var topCont = this.$container;\n var x = topCont.offsetWidth;\n var y = topCont.offsetHeight;\n var topSize = this.getSize();\n\n if (topCont === document.body) {\n x = document.body.offsetWidth;\n y = document.body.offsetHeight;\n }\n\n if (x < topSize.minWidth) {\n x = topSize.minWidth;\n }\n\n if (x > topSize.maxWidth) {\n x = topSize.maxWidth;\n }\n\n if (y < topSize.minHeight) {\n y = topSize.minHeight;\n }\n\n if (y > topSize.maxHeight) {\n y = topSize.maxHeight;\n }\n\n this.setSize(x, y);\n\n if (!this.$preResize) {//\tself.callEvent(\"onResize\", [x, y]);\n }\n\n this.$preResize = false;\n };\n\n Cell.prototype.hide = function () {\n this._hide(true);\n\n this.resize();\n };\n\n Cell.prototype.show = function (force) {\n this._hide(false);\n\n if (force && this.$parent) {\n this.$parent.show();\n }\n\n this.resize();\n };\n\n Cell.prototype._hide = function (mode) {\n if (mode === true && this.$view.parentNode) {\n this.$view.parentNode.removeChild(this.$view);\n } else if (mode === false && !this.$view.parentNode) {\n var index = this.$parent.cellIndex(this.$id);\n this.$parent.moveView(this, index);\n }\n\n this.$config.hidden = mode;\n };\n\n Cell.prototype.$toHTML = function (content, css) {\n if (content === void 0) {\n content = \"\";\n }\n\n css = [css || \"\", this.$config.css || \"\"].join(\" \");\n var obj = this.$config;\n var header = \"\";\n\n if (obj.raw) {\n content = typeof obj.raw === \"string\" ? obj.raw : \"\";\n } else {\n if (!content) {\n content = \"<div class='gantt_layout_content' \" + (css ? \" class='\" + css + \"' \" : \"\") + \" >\" + (obj.html || \"\") + \"</div>\";\n }\n\n if (obj.header) {\n var collapseIcon = obj.canCollapse ? \"<div class='gantt_layout_header_arrow'></div>\" : \"\";\n header = \"<div class='gantt_layout_header'>\" + collapseIcon + \"<div class='gantt_layout_header_content'>\" + obj.header + \"</div></div>\";\n }\n }\n\n return \"<div class='gantt_layout_cell \" + css + \"' data-cell-id='\" + this.$id + \"'>\" + header + content + \"</div>\";\n };\n\n Cell.prototype.$fill = function (node, parent) {\n this.$view = node;\n this.$parent = parent;\n this.init();\n };\n\n Cell.prototype.getNode = function () {\n return this.$view.querySelector(\"gantt_layout_cell\") || this.$view;\n };\n\n Cell.prototype.init = function () {\n // [NOT-GOOD] code is executed for each component, while it still has only one handler, it is no good\n var self = this;\n\n this._headerClickHandler = function (e) {\n var cellId = domHelpers.locateAttribute(e, \"data-cell-id\");\n\n if (cellId == self.$id) {\n self.toggle();\n }\n };\n\n var mouse = this.$gantt.$services.getService(\"mouseEvents\");\n mouse.delegate(\"click\", \"gantt_header_arrow\", this._headerClickHandler);\n this.callEvent(\"onReady\", []);\n };\n\n Cell.prototype.toggle = function () {\n this.$config.collapsed = !this.$config.collapsed;\n this.resize();\n };\n\n Cell.prototype.getSize = function () {\n var size = {\n height: this.$config.height || 0,\n width: this.$config.width || 0,\n gravity: this.$config.gravity || 1,\n minHeight: this.$config.minHeight || 0,\n minWidth: this.$config.minWidth || 0,\n maxHeight: this.$config.maxHeight || 100000000000,\n maxWidth: this.$config.maxWidth || 100000000000\n };\n\n if (this.$config.collapsed) {\n var mode = this.$config.mode === \"x\";\n size[mode ? \"width\" : \"height\"] = size[mode ? \"maxWidth\" : \"maxHeight\"] = this.$config.headerHeight;\n }\n\n return size;\n };\n\n Cell.prototype.getContentSize = function () {\n var width = this.$lastSize.contentX;\n\n if (width !== width * 1) {\n width = this.$lastSize.width;\n }\n\n var height = this.$lastSize.contentY;\n\n if (height !== height * 1) {\n height = this.$lastSize.height;\n }\n\n return {\n width: width,\n height: height\n };\n };\n\n Cell.prototype._getBorderSizes = function () {\n var borders = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n horizontal: 0,\n vertical: 0\n };\n\n if (this._currentBorders) {\n if (this._currentBorders[this._borders.left]) {\n borders.left = 1;\n borders.horizontal++;\n }\n\n if (this._currentBorders[this._borders.right]) {\n borders.right = 1;\n borders.horizontal++;\n }\n\n if (this._currentBorders[this._borders.top]) {\n borders.top = 1;\n borders.vertical++;\n }\n\n if (this._currentBorders[this._borders.bottom]) {\n borders.bottom = 1;\n borders.vertical++;\n }\n }\n\n return borders;\n };\n\n Cell.prototype.setSize = function (x, y) {\n this.$view.style.width = x + \"px\";\n this.$view.style.height = y + \"px\";\n\n var borders = this._getBorderSizes();\n\n var contentY = y - borders.vertical;\n var contentX = x - borders.horizontal;\n this.$lastSize = {\n x: x,\n y: y,\n contentX: contentX,\n contentY: contentY\n };\n\n if (this.$config.header) {\n this._sizeHeader();\n } else {\n this._sizeContent();\n }\n };\n\n Cell.prototype._borders = {\n \"left\": \"gantt_layout_cell_border_left\",\n \"right\": \"gantt_layout_cell_border_right\",\n \"top\": \"gantt_layout_cell_border_top\",\n \"bottom\": \"gantt_layout_cell_border_bottom\"\n };\n\n Cell.prototype._setBorders = function (css, view) {\n if (!view) {\n view = this;\n }\n\n var node = view.$view;\n\n for (var i in this._borders) {\n domHelpers.removeClassName(node, this._borders[i]);\n }\n\n if (typeof css == \"string\") {\n css = [css];\n }\n\n var cssHash = {};\n\n for (var i = 0; i < css.length; i++) {\n domHelpers.addClassName(node, css[i]);\n cssHash[css[i]] = true;\n }\n\n view._currentBorders = cssHash;\n };\n\n Cell.prototype._sizeContent = function () {\n var content = this.$view.childNodes[0];\n\n if (content && content.className == \"gantt_layout_content\") {\n content.style.height = this.$lastSize.contentY + \"px\";\n }\n };\n\n Cell.prototype._sizeHeader = function () {\n var size = this.$lastSize;\n size.contentY -= this.$config.headerHeight;\n var header = this.$view.childNodes[0];\n var content = this.$view.childNodes[1];\n var xLayout = this.$config.mode === \"x\";\n\n if (this.$config.collapsed) {\n content.style.display = \"none\";\n\n if (xLayout) {\n header.className = \"gantt_layout_header collapsed_x\";\n header.style.width = size.y + \"px\";\n var d = Math.floor(size.y / 2 - size.x / 2);\n header.style.transform = \"rotate(90deg) translate(\" + d + \"px, \" + d + \"px)\";\n content.style.display = \"none\";\n } else {\n header.className = \"gantt_layout_header collapsed_y\";\n }\n } else {\n if (xLayout) {\n header.className = \"gantt_layout_header\";\n } else {\n header.className = \"gantt_layout_header vertical\";\n }\n\n header.style.width = 'auto';\n header.style.transform = '';\n content.style.display = \"\";\n content.style.height = size.contentY + \"px\";\n }\n\n header.style.height = this.$config.headerHeight + \"px\";\n };\n\n return Cell;\n}();\n\nmodule.exports = Cell;","var utils = require(\"./env\");\n\nmodule.exports = function (gantt) {\n return utils.isNode || !gantt.$root;\n};","/**\r\n * Check the over task or draggble task is placeholder task\r\n */\nmodule.exports = function isPlaceholderTask(id, gantt, store, config) {\n // return false;\n var config = gantt ? gantt.config : config;\n\n if (config && config.placeholder_task) {\n if (store.exists(id)) {\n var item = store.getItem(id);\n return item.type === config.types.placeholder;\n }\n }\n\n return false;\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n\n return objectToString(arg) === '[object Array]';\n}\n\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\n\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\n\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\n\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\n\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return _typeof(arg) === 'symbol';\n}\n\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\n\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return _typeof(arg) === 'object' && arg !== null;\n}\n\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\n\nexports.isDate = isDate;\n\nfunction isError(e) {\n return objectToString(e) === '[object Error]' || e instanceof Error;\n}\n\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || _typeof(arg) === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\n\nexports.isPrimitive = isPrimitive;\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}","var __extends = require(\"../../../../utils/extends\");\n\nvar htmlHelpers = require(\"../../utils/html_helpers\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function SelectControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(SelectControl, _super);\n\n SelectControl.prototype.render = function (sns) {\n var height = (sns.height || \"23\") + \"px\";\n var html = \"<div class='gantt_cal_ltext' style='height:\" + height + \";'>\";\n html += htmlHelpers.getHtmlSelect(sns.options, [{\n key: \"style\",\n value: \"width:100%;\"\n }, {\n key: \"title\",\n value: sns.name\n }]);\n html += \"</div>\";\n return html;\n };\n\n SelectControl.prototype.set_value = function (node, value, ev, sns) {\n var select = node.firstChild;\n\n if (!select._dhx_onchange && sns.onchange) {\n select.onchange = sns.onchange;\n select._dhx_onchange = true;\n }\n\n if (typeof value === \"undefined\") value = (select.options[0] || {}).value;\n select.value = value || \"\";\n };\n\n SelectControl.prototype.get_value = function (node) {\n return node.firstChild.value;\n };\n\n SelectControl.prototype.focus = function (node) {\n var a = node.firstChild;\n\n gantt._focus(a, true);\n };\n\n return SelectControl;\n};","// optimized checker for task bars smart rendering\n// first check the vertical position since it's easier to calculate\nmodule.exports = function isBarInViewport(item, viewport, view, config, gantt) {\n if (!item.start_date || !item.end_date) {\n return null;\n }\n\n var top = view.getItemTop(item.id);\n var height = view.getItemHeight(item.id);\n\n if (top > viewport.y_end || top + height < viewport.y) {\n return false;\n }\n\n var padding = 200;\n var startCoord = view.posFromDate(item.start_date);\n var endCoord = view.posFromDate(item.end_date);\n var left = Math.min(startCoord, endCoord) - padding;\n var right = Math.max(startCoord, endCoord) + padding;\n\n if (left > viewport.x_end || right < viewport.x) {\n return false;\n }\n\n return true;\n};","module.exports = function (gantt) {\n return gantt.config.smart_rendering && gantt._smart_render;\n};","/* eslint-disable no-restricted-globals */\nvar globalScope;\n\nif (typeof window !== \"undefined\") {\n globalScope = window;\n} else {\n globalScope = global;\n}\n/* eslint-enable no-restricted-globals */\n\n\nmodule.exports = globalScope;","/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer');\n\nvar Buffer = buffer.Buffer; // alternative to using Object.keys for old browsers\n\nfunction copyProps(src, dst) {\n for (var key in src) {\n dst[key] = src[key];\n }\n}\n\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer;\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports);\n exports.Buffer = SafeBuffer;\n}\n\nfunction SafeBuffer(arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length);\n} // Copy static methods from Buffer\n\n\ncopyProps(Buffer, SafeBuffer);\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number');\n }\n\n return Buffer(arg, encodingOrOffset, length);\n};\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number');\n }\n\n var buf = Buffer(size);\n\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding);\n } else {\n buf.fill(fill);\n }\n } else {\n buf.fill(0);\n }\n\n return buf;\n};\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number');\n }\n\n return Buffer(size);\n};\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number');\n }\n\n return buffer.SlowBuffer(size);\n};","'use strict';\n\nif (!process.version || process.version.indexOf('v0.') === 0 || process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n module.exports = {\n nextTick: nextTick\n };\n} else {\n module.exports = process;\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n if (typeof fn !== 'function') {\n throw new TypeError('\"callback\" argument must be a function');\n }\n\n var len = arguments.length;\n var args, i;\n\n switch (len) {\n case 0:\n case 1:\n return process.nextTick(fn);\n\n case 2:\n return process.nextTick(function afterTickOne() {\n fn.call(null, arg1);\n });\n\n case 3:\n return process.nextTick(function afterTickTwo() {\n fn.call(null, arg1, arg2);\n });\n\n case 4:\n return process.nextTick(function afterTickThree() {\n fn.call(null, arg1, arg2, arg3);\n });\n\n default:\n args = new Array(len - 1);\n i = 0;\n\n while (i < args.length) {\n args[i++] = arguments[i];\n }\n\n return process.nextTick(function afterTick() {\n fn.apply(null, args);\n });\n }\n}","/**\r\n * The state object for order branch drag and drop\r\n */\nvar utils = require(\"../../../../utils/utils\");\n\nmodule.exports = {\n createDropTargetObject: function createDropTargetObject(parent) {\n var res = {\n targetParent: null,\n targetIndex: 0,\n targetId: null,\n child: false,\n nextSibling: false,\n prevSibling: false\n };\n\n if (parent) {\n utils.mixin(res, parent, true);\n }\n\n return res;\n },\n nextSiblingTarget: function nextSiblingTarget(dndTaskId, targetTaskId, store) {\n var result = this.createDropTargetObject();\n result.targetId = targetTaskId;\n result.nextSibling = true;\n result.targetParent = store.getParent(result.targetId);\n result.targetIndex = store.getBranchIndex(result.targetId);\n\n if (store.getParent(dndTaskId) != result.targetParent || result.targetIndex < store.getBranchIndex(dndTaskId)) {\n result.targetIndex += 1;\n }\n\n return result;\n },\n prevSiblingTarget: function prevSiblingTarget(dndTaskId, targetTaskId, store) {\n var result = this.createDropTargetObject();\n result.targetId = targetTaskId;\n result.prevSibling = true;\n result.targetParent = store.getParent(result.targetId);\n result.targetIndex = store.getBranchIndex(result.targetId);\n\n if (store.getParent(dndTaskId) == result.targetParent && result.targetIndex > store.getBranchIndex(dndTaskId)) {\n result.targetIndex -= 1;\n }\n\n return result;\n },\n firstChildTarget: function firstChildTarget(dndTaskId, targetTaskId, store) {\n var result = this.createDropTargetObject();\n result.targetId = targetTaskId;\n result.targetParent = result.targetId;\n result.targetIndex = 0;\n result.child = true;\n return result;\n },\n lastChildTarget: function lastChildTarget(dndTaskId, targetTaskId, store) {\n var children = store.getChildren(targetTaskId);\n var result = this.createDropTargetObject();\n result.targetId = children[children.length - 1];\n result.targetParent = targetTaskId;\n result.targetIndex = children.length;\n result.nextSibling = true;\n return result;\n }\n};","var isLegacyRender = require(\"../is_legacy_smart_render\");\n\nmodule.exports = function isColumnVisible(columnIndex, scale, viewPort, gantt) {\n var width = scale.width[columnIndex];\n\n if (width <= 0) {\n return false;\n }\n\n if (!gantt.config.smart_rendering || isLegacyRender(gantt)) {\n return true;\n }\n\n var cellLeftCoord = scale.left[columnIndex] - width;\n var cellRightCoord = scale.left[columnIndex] + width;\n return cellLeftCoord <= viewPort.x_end && cellRightCoord >= viewPort.x; //do not render skipped columns\n};","module.exports = function getVisibleCellsRange(scale, viewport) {\n var firstCellIndex = 0;\n var lastCellIndex = scale.left.length - 1;\n\n if (viewport) {\n for (var i = 0; i < scale.left.length; i++) {\n var left = scale.left[i];\n\n if (left < viewport.x) {\n firstCellIndex = i;\n }\n\n if (left > viewport.x_end) {\n lastCellIndex = i;\n break;\n }\n }\n }\n\n return {\n start: firstCellIndex,\n end: lastCellIndex\n };\n};","module.exports = function (item, view, config) {\n return {\n top: view.getItemTop(item.id),\n height: view.getItemHeight(item.id),\n left: 0,\n right: Infinity\n };\n};","function createTaskRenderer(gantt) {\n function _render_task_element(task, view, config) {\n var config = view.$getConfig();\n var painters = config.type_renderers;\n var renderer = painters[gantt.getTaskType(task.type)],\n defaultRenderer = _task_default_render;\n\n if (!renderer) {\n return defaultRenderer.call(gantt, task, view, config);\n } else {\n return renderer.call(gantt, task, function (task) {\n return defaultRenderer.call(gantt, task, view, config);\n }, view);\n }\n }\n\n function _task_default_render(task, view, config) {\n if (gantt._isAllowedUnscheduledTask(task)) return;\n\n if (!gantt._isTaskInTimelineLimits(task)) {\n return;\n }\n\n var pos = view.getItemPosition(task);\n var cfg = config,\n templates = view.$getTemplates();\n var taskType = gantt.getTaskType(task.type);\n var height = view.getBarHeight(task.id, taskType == cfg.types.milestone);\n var controlsMargin = 0;\n\n if (taskType == cfg.types.milestone) {\n controlsMargin = (height - pos.height) / 2;\n }\n\n var padd = Math.floor((view.getItemHeight(task.id) - height) / 2); //\tif(task.type == cfg.types.milestone){\n //\t\tpadd -= 1;\n //\t}\n //\tif (taskType == cfg.types.milestone && cfg.link_line_width > 1) {\n //\t\t//little adjust milestone position, so horisontal corners would match link arrow when thickness of link line is more than 1px\n //\t\tpadd += 1;\n //\t}\n\n if (taskType == cfg.types.milestone) {\n pos.left -= Math.round(height / 2);\n pos.width = height;\n }\n\n var div = document.createElement(\"div\");\n var width = Math.round(pos.width);\n\n if (view.$config.item_attribute) {\n div.setAttribute(view.$config.item_attribute, task.id);\n div.setAttribute(view.$config.bind + \"_id\", task.id); // 'task_id'/'resource_id' for backward compatibility\n }\n\n if (cfg.show_progress && taskType != cfg.types.milestone) {\n _render_task_progress(task, div, width, cfg, templates);\n } //use separate div to display content above progress bar\n\n\n var content = _render_task_content(task, width, templates);\n\n if (task.textColor) {\n content.style.color = task.textColor;\n }\n\n div.appendChild(content);\n\n var css = _combine_item_class(\"gantt_task_line\", templates.task_class(task.start_date, task.end_date, task), task.id, view);\n\n if (task.color || task.progressColor || task.textColor) {\n css += \" gantt_task_inline_color\";\n }\n\n if (pos.width < 20) {\n css += \" gantt_thin_task\";\n }\n\n div.className = css;\n var styles = [\"left:\" + pos.left + \"px\", \"top:\" + (padd + pos.top) + 'px', \"height:\" + (taskType == cfg.types.milestone ? pos.height : height) + 'px', \"line-height:\" + Math.max(height < 30 ? height - 2 : height, 0) + 'px', \"width:\" + width + 'px'];\n\n if (task.color) {\n styles.push(\"background-color:\" + task.color);\n }\n\n if (task.textColor) {\n styles.push(\"color:\" + task.textColor);\n }\n\n div.style.cssText = styles.join(\";\");\n\n var side = _render_leftside_content(task, cfg, templates, controlsMargin);\n\n if (side) div.appendChild(side);\n side = _render_rightside_content(task, cfg, templates, controlsMargin);\n if (side) div.appendChild(side);\n\n gantt._waiAria.setTaskBarAttr(task, div);\n\n var state = gantt.getState();\n\n if (!gantt.isReadonly(task)) {\n if (cfg.drag_resize && !gantt.isSummaryTask(task) && taskType != cfg.types.milestone) {\n _render_pair(div, \"gantt_task_drag\", task, function (css) {\n var el = document.createElement(\"div\");\n el.className = css;\n return el;\n }, cfg);\n }\n\n if (cfg.drag_links && cfg.show_links) {\n _render_pair(div, \"gantt_link_control\", task, function (css) {\n var outer = document.createElement(\"div\");\n outer.className = css;\n outer.style.cssText = [\"height:\" + height + 'px', \"line-height:\" + height + 'px'].join(\";\");\n var inner = document.createElement(\"div\");\n inner.className = \"gantt_link_point\";\n var showLinkPoints = false;\n\n if (state.link_source_id && cfg.touch) {\n showLinkPoints = true;\n }\n\n inner.style.display = showLinkPoints ? \"block\" : \"\";\n outer.appendChild(inner);\n return outer;\n }, cfg, controlsMargin);\n }\n }\n\n return div;\n }\n\n function _render_side_content(task, template, cssClass, marginStyle) {\n if (!template) return null;\n var text = template(task.start_date, task.end_date, task);\n if (!text) return null;\n var content = document.createElement(\"div\");\n content.className = \"gantt_side_content \" + cssClass;\n content.innerHTML = text;\n\n if (marginStyle) {\n content.style[marginStyle.type] = Math.abs(marginStyle.value) + \"px\";\n }\n\n return content;\n }\n\n function _render_leftside_content(task, cfg, templates, margin) {\n var css = \"gantt_left \" + _get_link_crossing_css(!cfg.rtl ? true : false, task, cfg);\n\n var marginStyle = null;\n\n if (margin) {\n marginStyle = {\n type: \"marginRight\",\n value: margin\n };\n }\n\n return _render_side_content(task, templates.leftside_text, css, marginStyle);\n }\n\n function _render_rightside_content(task, cfg, templates, margin) {\n var css = \"gantt_right \" + _get_link_crossing_css(!cfg.rtl ? false : true, task, cfg);\n\n var marginStyle = null;\n\n if (margin) {\n marginStyle = {\n type: \"marginLeft\",\n value: margin\n };\n }\n\n return _render_side_content(task, templates.rightside_text, css, marginStyle);\n }\n\n function _get_link_crossing_css(left, task) {\n var cond = _get_conditions(left);\n\n for (var i in cond) {\n var links = task[i];\n\n for (var ln = 0; ln < links.length; ln++) {\n var link = gantt.getLink(links[ln]);\n\n for (var tp = 0; tp < cond[i].length; tp++) {\n if (link.type == cond[i][tp]) {\n return \"gantt_link_crossing\";\n }\n }\n }\n }\n\n return \"\";\n }\n\n function _render_task_content(task, width, templates) {\n var content = document.createElement(\"div\");\n\n if (gantt.getTaskType(task.type) != gantt.config.types.milestone) {\n content.innerHTML = templates.task_text(task.start_date, task.end_date, task);\n } else if (gantt.getTaskType(task.type) == gantt.config.types.milestone && width) {\n content.style.height = content.style.width = width + \"px\";\n }\n\n content.className = \"gantt_task_content\"; //content.style.width = width + 'px';\n\n return content;\n }\n\n function _render_task_progress(task, element, maxWidth, cfg, templates) {\n var done = task.progress * 1 || 0;\n maxWidth = Math.max(maxWidth - 2, 0); //2px for borders\n\n var pr = document.createElement(\"div\");\n var width = Math.round(maxWidth * done);\n width = Math.min(maxWidth, width);\n\n if (task.progressColor) {\n pr.style.backgroundColor = task.progressColor;\n pr.style.opacity = 1;\n }\n\n pr.style.width = width + 'px';\n pr.className = \"gantt_task_progress\";\n pr.innerHTML = templates.progress_text(task.start_date, task.end_date, task);\n\n if (cfg.rtl) {\n pr.style.position = \"absolute\";\n pr.style.right = \"0px\";\n }\n\n var wrapper = document.createElement(\"div\");\n wrapper.className = \"gantt_task_progress_wrapper\";\n wrapper.appendChild(pr);\n element.appendChild(wrapper);\n\n if (gantt.config.drag_progress && !gantt.isReadonly(task)) {\n var drag = document.createElement(\"div\");\n var markerPos = width;\n\n if (cfg.rtl) {\n markerPos = maxWidth - width;\n }\n\n drag.style.left = markerPos + 'px';\n drag.className = \"gantt_task_progress_drag\";\n pr.appendChild(drag);\n element.appendChild(drag);\n }\n }\n\n function _get_conditions(leftside) {\n if (leftside) {\n return {\n $source: [gantt.config.links.start_to_start],\n $target: [gantt.config.links.start_to_start, gantt.config.links.finish_to_start]\n };\n } else {\n return {\n $source: [gantt.config.links.finish_to_start, gantt.config.links.finish_to_finish],\n $target: [gantt.config.links.finish_to_finish]\n };\n }\n }\n\n function _combine_item_class(basic, template, itemId, view) {\n var cfg = view.$getConfig();\n var css = [basic];\n if (template) css.push(template);\n var state = gantt.getState();\n var task = gantt.getTask(itemId);\n\n if (gantt.getTaskType(task.type) == cfg.types.milestone) {\n css.push(\"gantt_milestone\");\n } else if (gantt.getTaskType(task.type) == cfg.types.project) {\n css.push(\"gantt_project\");\n }\n\n css.push(\"gantt_bar_\" + gantt.getTaskType(task.type));\n if (gantt.isSummaryTask(task)) css.push(\"gantt_dependent_task\");\n\n if (gantt.isSplitTask(task) && (cfg.open_split_tasks && !task.$open || !cfg.open_split_tasks)) {\n css.push(\"gantt_split_parent\");\n }\n\n if (cfg.select_task && gantt.isSelectedTask(itemId)) {\n css.push(\"gantt_selected\");\n }\n\n if (itemId == state.drag_id) {\n css.push(\"gantt_drag_\" + state.drag_mode);\n\n if (state.touch_drag) {\n css.push(\"gantt_touch_\" + state.drag_mode);\n }\n }\n\n if (state.link_source_id == itemId) css.push(\"gantt_link_source\");\n if (state.link_target_id == itemId) css.push(\"gantt_link_target\");\n\n if (cfg.highlight_critical_path && gantt.isCriticalTask) {\n if (gantt.isCriticalTask(task)) css.push(\"gantt_critical_task\");\n }\n\n if (state.link_landing_area && state.link_target_id && state.link_source_id && state.link_target_id != state.link_source_id && (state.link_target_id == itemId || state.link_source_id == itemId)) {\n var from_id = state.link_source_id;\n var from_start = state.link_from_start;\n var to_start = state.link_to_start;\n var allowDrag = gantt.isLinkAllowed(from_id, itemId, from_start, to_start);\n var dragClass = \"\";\n\n if (allowDrag) {\n if (to_start) dragClass = \"link_start_allow\";else dragClass = \"link_finish_allow\";\n } else {\n if (to_start) dragClass = \"link_start_deny\";else dragClass = \"link_finish_deny\";\n }\n\n css.push(dragClass);\n }\n\n return css.join(\" \");\n }\n\n function _render_pair(parent, css, task, content, config, margin) {\n var state = gantt.getState();\n var className, element;\n\n if (+task.start_date >= +state.min_date) {\n className = [css, config.rtl ? \"task_right\" : \"task_left\", \"task_start_date\"];\n element = content(className.join(\" \"));\n element.setAttribute(\"data-bind-property\", \"start_date\");\n\n if (margin) {\n element.style.marginLeft = margin + \"px\";\n }\n\n parent.appendChild(element);\n }\n\n if (+task.end_date <= +state.max_date) {\n className = [css, config.rtl ? \"task_left\" : \"task_right\", \"task_end_date\"];\n element = content(className.join(\" \"));\n element.setAttribute(\"data-bind-property\", \"end_date\");\n\n if (margin) {\n element.style.marginRight = margin + \"px\";\n }\n\n parent.appendChild(element);\n }\n }\n\n return _render_task_element;\n}\n\nmodule.exports = createTaskRenderer;","var ScaleHelper = require(\"./scales_ignore\");\n\nvar eventable = require(\"../../../utils/eventable\");\n\nvar utils = require(\"../../../utils/utils\");\n\nvar helpers = require(\"../../../utils/helpers\");\n\nvar topPositionMixin = require(\"../row_position_mixin\");\n\nvar canvasRender = require(\"./tasks_canvas_render\");\n\nvar Timeline = function Timeline(parent, config, factory, gantt) {\n this.$config = utils.mixin({}, config || {});\n this.$scaleHelper = new ScaleHelper(gantt);\n this.$gantt = gantt;\n this._posFromDateCache = {};\n this._timelineDragScroll = null;\n utils.mixin(this, topPositionMixin(this));\n eventable(this);\n};\n\nTimeline.prototype = {\n init: function init(container) {\n container.innerHTML += \"<div class='gantt_task' style='width:inherit;height:inherit;'></div>\";\n this.$task = container.childNodes[0];\n this.$task.innerHTML = \"<div class='gantt_task_scale'></div><div class='gantt_data_area'></div>\";\n this.$task_scale = this.$task.childNodes[0];\n this.$task_data = this.$task.childNodes[1];\n this.$task_data.innerHTML = \"<div class='gantt_task_bg'></div><div class='gantt_links_area'></div><div class='gantt_bars_area'></div>\";\n this.$task_bg = this.$task_data.childNodes[0];\n this.$task_links = this.$task_data.childNodes[1];\n this.$task_bars = this.$task_data.childNodes[2];\n this._tasks = {\n col_width: 0,\n width: [],\n // width of each column\n full_width: 0,\n // width of all columns\n trace_x: [],\n rendered: {}\n };\n var config = this.$getConfig();\n var attr = config[this.$config.bind + \"_attribute\"];\n var linksAttr = config[this.$config.bindLinks + \"_attribute\"];\n\n if (!attr && this.$config.bind) {\n attr = \"data-\" + this.$config.bind + \"-id\";\n }\n\n if (!linksAttr && this.$config.bindLinks) {\n linksAttr = \"data-\" + this.$config.bindLinks + \"-id\";\n }\n\n this.$config.item_attribute = attr || null;\n this.$config.link_attribute = linksAttr || null;\n\n var layers = this._createLayerConfig();\n\n if (!this.$config.layers) {\n this.$config.layers = layers.tasks;\n }\n\n if (!this.$config.linkLayers) {\n this.$config.linkLayers = layers.links;\n }\n\n this._attachLayers(this.$gantt);\n\n this.callEvent(\"onReady\", []); //this.refresh();\n\n if (this.$gantt.ext.dragTimeline) {\n this._timelineDragScroll = this.$gantt.ext.dragTimeline.create();\n\n this._timelineDragScroll.attach(this);\n }\n },\n setSize: function setSize(width, height) {\n var config = this.$getConfig();\n\n if (width * 1 === width) {\n this.$config.width = width;\n }\n\n if (height * 1 === height) {\n this.$config.height = height;\n var dataHeight = Math.max(this.$config.height - config.scale_height);\n this.$task_data.style.height = dataHeight + 'px';\n }\n\n this.refresh();\n this.$task_bg.style.backgroundImage = \"\";\n\n if (config.smart_rendering && this.$config.rowStore) {\n this.$task_bg.style.height = this.getTotalHeight() + \"px\";\n } else {\n this.$task_bg.style.height = \"\";\n }\n\n var scale = this._tasks; //timeline area layers\n\n var data_els = this.$task_data.childNodes;\n\n for (var i = 0, len = data_els.length; i < len; i++) {\n var el = data_els[i];\n if (el.hasAttribute(\"data-layer\") && el.style) el.style.width = scale.full_width + \"px\";\n }\n },\n isVisible: function isVisible() {\n if (this.$parent && this.$parent.$config) {\n return !this.$parent.$config.hidden;\n } else {\n return this.$task.offsetWidth;\n }\n },\n getSize: function getSize() {\n var config = this.$getConfig();\n var store = this.$config.rowStore;\n var contentHeight = store ? this.getTotalHeight() : 0,\n contentWidth = this.isVisible() ? this._tasks.full_width : 0;\n return {\n x: this.isVisible() ? this.$config.width : 0,\n y: this.isVisible() ? this.$config.height : 0,\n contentX: this.isVisible() ? contentWidth : 0,\n contentY: this.isVisible() ? config.scale_height + contentHeight : 0,\n scrollHeight: this.isVisible() ? contentHeight : 0,\n scrollWidth: this.isVisible() ? contentWidth : 0\n };\n },\n scrollTo: function scrollTo(left, top) {\n if (!this.isVisible()) return;\n var scrolled = false;\n this.$config.scrollTop = this.$config.scrollTop || 0;\n this.$config.scrollLeft = this.$config.scrollLeft || 0;\n\n if (top * 1 === top) {\n this.$config.scrollTop = top;\n this.$task_data.scrollTop = this.$config.scrollTop;\n scrolled = true;\n }\n\n if (left * 1 === left) {\n this.$task.scrollLeft = left;\n this.$config.scrollLeft = this.$task.scrollLeft;\n\n this._refreshScales();\n\n scrolled = true;\n }\n\n if (scrolled) {\n this.callEvent(\"onScroll\", [this.$config.scrollLeft, this.$config.scrollTop]);\n }\n },\n _refreshScales: function _refreshScales() {\n if (!this.isVisible()) return;\n var config = this.$getConfig();\n if (!config.smart_scales) return;\n var viewPort = this.getViewPort();\n var scales = this._scales;\n this.$task_scale.innerHTML = this._getScaleChunkHtml(scales, viewPort.x, viewPort.x_end);\n },\n getViewPort: function getViewPort() {\n var scrollLeft = this.$config.scrollLeft || 0;\n var scrollTop = this.$config.scrollTop || 0;\n var height = this.$config.height || 0;\n var width = this.$config.width || 0;\n return {\n y: scrollTop,\n y_end: scrollTop + height,\n x: scrollLeft,\n x_end: scrollLeft + width,\n height: height,\n width: width\n };\n },\n _createLayerConfig: function _createLayerConfig() {\n var self = this;\n\n var taskFilter = function taskFilter() {\n return self.isVisible();\n };\n\n var barVisible = function barVisible(id, task) {\n return !task.hide_bar;\n };\n\n var taskLayers = [{\n expose: true,\n renderer: this.$gantt.$ui.layers.taskBar(),\n container: this.$task_bars,\n filter: [taskFilter, barVisible]\n }, {\n renderer: this.$gantt.$ui.layers.taskSplitBar(),\n filter: [taskFilter],\n container: this.$task_bars,\n append: true\n }, {\n renderer: this.$gantt.$ui.layers.taskRollupBar(),\n filter: [taskFilter],\n container: this.$task_bars,\n append: true\n }, {\n renderer: this.$gantt.$ui.layers.taskBg(),\n container: this.$task_bg,\n filter: [//function(){\n //\treturn !self.$getConfig().static_background;\n //},\n taskFilter]\n }];\n var linkLayers = [{\n expose: true,\n renderer: this.$gantt.$ui.layers.link(),\n container: this.$task_links,\n filter: [taskFilter]\n }];\n return {\n tasks: taskLayers,\n links: linkLayers\n };\n },\n _attachLayers: function _attachLayers(gantt) {\n this._taskLayers = [];\n this._linkLayers = [];\n var self = this;\n var layers = this.$gantt.$services.getService(\"layers\");\n\n if (this.$config.bind) {\n this._bindStore();\n\n var taskRenderer = layers.getDataRender(this.$config.bind);\n\n if (!taskRenderer) {\n taskRenderer = layers.createDataRender({\n name: this.$config.bind,\n defaultContainer: function defaultContainer() {\n return self.$task_data;\n }\n });\n }\n\n taskRenderer.container = function () {\n return self.$task_data;\n };\n\n var taskLayers = this.$config.layers;\n\n for (var i = 0; taskLayers && i < taskLayers.length; i++) {\n var layer = taskLayers[i];\n\n if (typeof layer == \"string\") {\n layer = this.$gantt.$ui.layers[layer]();\n }\n\n if (typeof layer == \"function\" || layer && layer.render && layer.update) {\n layer = {\n renderer: layer\n };\n }\n\n layer.view = this;\n var bar_layer = taskRenderer.addLayer(layer);\n\n this._taskLayers.push(bar_layer);\n\n if (layer.expose) {\n this._taskRenderer = taskRenderer.getLayer(bar_layer);\n }\n }\n\n this._initStaticBackgroundRender();\n }\n\n if (this.$config.bindLinks) {\n self.$config.linkStore = self.$gantt.getDatastore(self.$config.bindLinks);\n var linkRenderer = layers.getDataRender(this.$config.bindLinks);\n\n if (!linkRenderer) {\n linkRenderer = layers.createDataRender({\n name: this.$config.bindLinks,\n defaultContainer: function defaultContainer() {\n return self.$task_data;\n }\n });\n }\n\n var linkLayers = this.$config.linkLayers;\n\n for (var i = 0; linkLayers && i < linkLayers.length; i++) {\n if (typeof layer == \"string\") {\n layer = this.$gantt.$ui.layers[layer]();\n }\n\n var layer = linkLayers[i];\n layer.view = this; //\tlayer.getViewPort = getViewPort;\n //\tsubscribeSmartRender(layer);\n\n var linkLayer = linkRenderer.addLayer(layer);\n\n this._taskLayers.push(linkLayer);\n\n if (linkLayers[i].expose) {\n this._linkRenderer = linkRenderer.getLayer(linkLayer);\n }\n }\n }\n },\n _initStaticBackgroundRender: function _initStaticBackgroundRender() {\n var self = this;\n var staticRender = canvasRender.create();\n var store = self.$config.rowStore;\n if (!store) return;\n this._staticBgHandler = store.attachEvent(\"onStoreUpdated\", function (id, item, mode) {\n if (id !== null) {\n return;\n }\n\n if (!self.isVisible()) return;\n var config = self.$getConfig();\n\n if (config.static_background || config.timeline_placeholder) {\n var store = self.$gantt.getDatastore(self.$config.bind);\n var staticBgContainer = self.$task_bg_static;\n\n if (!staticBgContainer) {\n staticBgContainer = document.createElement(\"div\");\n staticBgContainer.className = \"gantt_task_bg\";\n self.$task_bg_static = staticBgContainer;\n\n if (self.$task_bg.nextSibling) {\n self.$task_data.insertBefore(staticBgContainer, self.$task_bg.nextSibling);\n } else {\n self.$task_data.appendChild(staticBgContainer);\n }\n }\n\n if (store) {\n var staticBackgroundHeight = self.getTotalHeight();\n\n if (config.timeline_placeholder) {\n staticBackgroundHeight = config.timeline_placeholder.height || self.$task_data.offsetHeight || 99999;\n }\n\n staticRender.render(staticBgContainer, config, self.getScale(), staticBackgroundHeight, self.getItemHeight(item ? item.id : null));\n }\n } else if (config.static_background) {\n if (self.$task_bg_static && self.$task_bg_static.parentNode) {\n self.$task_bg_static.parentNode.removeChild(self.$task_bg_static);\n }\n }\n });\n this.attachEvent(\"onDestroy\", function () {\n staticRender.destroy();\n });\n\n this._initStaticBackgroundRender = function () {}; //init once\n\n },\n _clearLayers: function _clearLayers(gantt) {\n var layers = this.$gantt.$services.getService(\"layers\");\n var taskRenderer = layers.getDataRender(this.$config.bind);\n var linkRenderer = layers.getDataRender(this.$config.bindLinks);\n\n if (this._taskLayers) {\n for (var i = 0; i < this._taskLayers.length; i++) {\n taskRenderer.removeLayer(this._taskLayers[i]);\n }\n }\n\n if (this._linkLayers) {\n for (var i = 0; i < this._linkLayers.length; i++) {\n linkRenderer.removeLayer(this._linkLayers[i]);\n }\n }\n\n this._linkLayers = [];\n this._taskLayers = [];\n },\n _render_tasks_scales: function _render_tasks_scales() {\n var config = this.$getConfig();\n var scales_html = \"\",\n outer_width = 0,\n scale_height = 0;\n var state = this.$gantt.getState();\n\n if (this.isVisible()) {\n var helpers = this.$scaleHelper;\n\n var scales = this._getScales();\n\n scale_height = config.scale_height;\n var availWidth = this.$config.width;\n\n if (config.autosize == \"x\" || config.autosize == \"xy\") {\n availWidth = Math.max(config.autosize_min_width, 0);\n }\n\n var cfgs = helpers.prepareConfigs(scales, config.min_column_width, availWidth, scale_height - 1, state.min_date, state.max_date, config.rtl);\n var cfg = this._tasks = cfgs[cfgs.length - 1];\n this._scales = cfgs;\n this._posFromDateCache = {};\n scales_html = this._getScaleChunkHtml(cfgs, 0, this.$config.width);\n outer_width = cfg.full_width + \"px\"; //cfg.full_width + (this._scroll_sizes().y ? scrollSizes.scroll_size : 0) + \"px\";\n\n scale_height += \"px\";\n }\n\n this.$task_scale.style.height = scale_height;\n this.$task_data.style.width = this.$task_scale.style.width = outer_width;\n this.$task_scale.innerHTML = scales_html;\n },\n _getScaleChunkHtml: function _get_scale_chunk_html(scales, fromPos, toPos) {\n var templates = this.$gantt.templates;\n var html = [];\n var css = templates.scale_row_class;\n\n for (var i = 0; i < scales.length; i++) {\n var cssClass = \"gantt_scale_line\";\n var tplClass = css(scales[i]);\n\n if (tplClass) {\n cssClass += \" \" + tplClass;\n }\n\n html.push(\"<div class=\\\"\" + cssClass + \"\\\" style=\\\"height:\" + scales[i].height + \"px;position:relative;line-height:\" + scales[i].height + \"px\\\">\" + this._prepareScaleHtml(scales[i], fromPos, toPos) + \"</div>\");\n }\n\n return html.join(\"\");\n },\n _prepareScaleHtml: function _prepare_scale_html(config, fromPos, toPos) {\n var globalConfig = this.$getConfig();\n var globalTemplates = this.$gantt.templates;\n var cells = [];\n var date = null,\n css = null;\n var content = config.format || config.template || config.date;\n\n if (typeof content === \"string\") {\n content = this.$gantt.date.date_to_str(content);\n }\n\n var startIndex = 0,\n endIndex = config.count;\n\n if (globalConfig.smart_scales && !isNaN(fromPos) && !isNaN(toPos)) {\n startIndex = helpers.findBinary(config.left, fromPos);\n endIndex = helpers.findBinary(config.left, toPos) + 1;\n }\n\n css = config.css || function () {};\n\n if (!config.css && globalConfig.inherit_scale_class) {\n css = globalTemplates.scale_cell_class;\n }\n\n for (var i = startIndex; i < endIndex; i++) {\n if (!config.trace_x[i]) break;\n date = new Date(config.trace_x[i]);\n var value = content.call(this, date),\n width = config.width[i],\n height = config.height,\n left = config.left[i],\n style = \"\",\n template = \"\",\n cssclass = \"\";\n\n if (width) {\n var position = globalConfig.smart_scales ? \"position:absolute;left:\" + left + \"px\" : \"\";\n style = \"width:\" + width + \"px;height:\" + height + \"px;\" + position;\n cssclass = \"gantt_scale_cell\" + (i == config.count - 1 ? \" gantt_last_cell\" : \"\");\n template = css.call(this, date);\n if (template) cssclass += \" \" + template;\n\n var ariaAttr = this.$gantt._waiAria.getTimelineCellAttr(value);\n\n var cell = \"<div class='\" + cssclass + \"'\" + ariaAttr + \" style='\" + style + \"'>\" + value + \"</div>\";\n cells.push(cell);\n } else {//do not render ignored cells\n }\n }\n\n return cells.join(\"\");\n },\n dateFromPos: function dateFromPos(x) {\n var scale = this._tasks;\n\n if (x < 0 || x > scale.full_width || !scale.full_width) {\n return null;\n }\n\n var ind = helpers.findBinary(this._tasks.left, x);\n var summ = this._tasks.left[ind];\n var col_width = scale.width[ind] || scale.col_width;\n var part = 0;\n\n if (col_width) {\n part = (x - summ) / col_width;\n\n if (scale.rtl) {\n part = 1 - part;\n }\n }\n\n var unit = 0;\n\n if (part) {\n unit = this._getColumnDuration(scale, scale.trace_x[ind]);\n }\n\n var date = new Date(scale.trace_x[ind].valueOf() + Math.round(part * unit));\n return date;\n },\n posFromDate: function posFromDate(date) {\n if (!this.isVisible()) return 0;\n\n if (!date) {\n return 0;\n }\n\n var dateValue = String(date.valueOf());\n\n if (this._posFromDateCache[dateValue] !== undefined) {\n return this._posFromDateCache[dateValue];\n }\n\n var ind = this.columnIndexByDate(date);\n this.$gantt.assert(ind >= 0, \"Invalid day index\");\n var wholeCells = Math.floor(ind);\n var partCell = ind % 1;\n\n var pos = this._tasks.left[Math.min(wholeCells, this._tasks.width.length - 1)];\n\n if (wholeCells == this._tasks.width.length) pos += this._tasks.width[this._tasks.width.length - 1]; //for(var i=1; i <= wholeCells; i++)\n //\tpos += gantt._tasks.width[i-1];\n\n if (partCell) {\n if (wholeCells < this._tasks.width.length) {\n pos += this._tasks.width[wholeCells] * (partCell % 1);\n } else {\n pos += 1;\n }\n }\n\n var roundPos = Math.round(pos);\n this._posFromDateCache[dateValue] = roundPos;\n return Math.round(roundPos);\n },\n _getNextVisibleColumn: function _getNextVisibleColumn(startIndex, columns, ignores) {\n // iterate columns to the right\n var date = +columns[startIndex];\n var visibleDateIndex = startIndex;\n\n while (ignores[date]) {\n visibleDateIndex++;\n date = +columns[visibleDateIndex];\n }\n\n return visibleDateIndex;\n },\n _getPrevVisibleColumn: function _getPrevVisibleColumn(startIndex, columns, ignores) {\n // iterate columns to the left\n var date = +columns[startIndex];\n var visibleDateIndex = startIndex;\n\n while (ignores[date]) {\n visibleDateIndex--;\n date = +columns[visibleDateIndex];\n }\n\n return visibleDateIndex;\n },\n _getClosestVisibleColumn: function _getClosestVisibleColumn(startIndex, columns, ignores) {\n var visibleDateIndex = this._getNextVisibleColumn(startIndex, columns, ignores);\n\n if (!columns[visibleDateIndex]) {\n visibleDateIndex = this._getPrevVisibleColumn(startIndex, columns, ignores);\n }\n\n return visibleDateIndex;\n },\n columnIndexByDate: function columnIndexByDate(date) {\n var pos = new Date(date).valueOf();\n var days = this._tasks.trace_x_ascending,\n ignores = this._tasks.ignore_x;\n var state = this.$gantt.getState();\n\n if (pos <= state.min_date) {\n if (this._tasks.rtl) {\n return days.length;\n } else {\n return 0;\n }\n }\n\n if (pos >= state.max_date) {\n if (this._tasks.rtl) {\n return 0;\n } else {\n return days.length;\n }\n }\n\n var dateIndex = helpers.findBinary(days, pos);\n\n var visibleIndex = this._getClosestVisibleColumn(dateIndex, days, ignores);\n\n var visibleDate = days[visibleIndex];\n var transition = this._tasks.trace_index_transition;\n\n if (!visibleDate) {\n if (transition) {\n return transition[0];\n } else {\n return 0;\n }\n }\n\n var part = (date - days[visibleIndex]) / this._getColumnDuration(this._tasks, days[visibleIndex]);\n\n if (transition) {\n return transition[visibleIndex] + (1 - part);\n } else {\n return visibleIndex + part;\n }\n },\n getItemPosition: function getItemPosition(task, start_date, end_date) {\n var xLeft, xRight, width;\n\n if (this._tasks.rtl) {\n xRight = this.posFromDate(start_date || task.start_date);\n xLeft = this.posFromDate(end_date || task.end_date);\n } else {\n xLeft = this.posFromDate(start_date || task.start_date);\n xRight = this.posFromDate(end_date || task.end_date);\n }\n\n width = Math.max(xRight - xLeft, 0);\n var y = this.getItemTop(task.id);\n var height = this.getBarHeight(task.id);\n var rowHeight = this.getItemHeight(task.id);\n return {\n left: xLeft,\n top: y,\n height: height,\n width: width,\n rowHeight: rowHeight\n };\n },\n getBarHeight: function getBarHeight(taskId, isMilestoneRender) {\n var config = this.$getConfig();\n var task = this.$config.rowStore.getItem(taskId); // height of the bar item\n\n var height = task.task_height || task.bar_height || config.bar_height || config.task_height;\n var rowHeight = this.getItemHeight(taskId);\n\n if (height == \"full\") {\n var offset = config.task_height_offset || 5;\n height = rowHeight - offset;\n } //item height cannot be bigger than row height\n\n\n height = Math.min(height, rowHeight);\n\n if (isMilestoneRender) {\n // to get correct height for addapting Milestone to the row\n height = Math.round(height / Math.sqrt(2));\n }\n\n return Math.max(height, 0);\n },\n getScale: function getScale() {\n return this._tasks;\n },\n _getScales: function _get_scales() {\n var config = this.$getConfig();\n var helpers = this.$scaleHelper;\n var scales = [helpers.primaryScale(config)].concat(helpers.getSubScales(config));\n helpers.sortScales(scales);\n return scales;\n },\n _getColumnDuration: function _get_coll_duration(scale, date) {\n return this.$gantt.date.add(date, scale.step, scale.unit) - date;\n },\n _bindStore: function _bindStore() {\n if (this.$config.bind) {\n var rowStore = this.$gantt.getDatastore(this.$config.bind);\n this.$config.rowStore = rowStore;\n\n if (rowStore && !rowStore._timelineCacheAttached) {\n var self = this;\n rowStore._timelineCacheAttached = rowStore.attachEvent(\"onBeforeFilter\", function () {\n self._resetTopPositionHeight();\n });\n }\n }\n },\n _unbindStore: function _unbindStore() {\n if (this.$config.bind) {\n var rowStore = this.$gantt.getDatastore(this.$config.bind);\n\n if (rowStore && rowStore._timelineCacheAttached) {\n rowStore.detachEvent(rowStore._timelineCacheAttached);\n rowStore._timelineCacheAttached = false;\n }\n }\n },\n refresh: function refresh() {\n this._bindStore();\n\n if (this.$config.bindLinks) {\n this.$config.linkStore = this.$gantt.getDatastore(this.$config.bindLinks);\n }\n\n this._resetTopPositionHeight();\n\n this._resetHeight();\n\n this._initStaticBackgroundRender();\n\n this._render_tasks_scales();\n },\n destructor: function destructor() {\n var gantt = this.$gantt;\n\n this._clearLayers(gantt);\n\n this._unbindStore();\n\n this.$task = null;\n this.$task_scale = null;\n this.$task_data = null;\n this.$task_bg = null;\n this.$task_links = null;\n this.$task_bars = null;\n this.$gantt = null;\n\n if (this.$config.rowStore) {\n this.$config.rowStore.detachEvent(this._staticBgHandler);\n this.$config.rowStore = null;\n }\n\n if (this.$config.linkStore) {\n this.$config.linkStore = null;\n }\n\n if (this._timelineDragScroll) {\n this._timelineDragScroll.destructor();\n\n this._timelineDragScroll = null;\n }\n\n this.callEvent(\"onDestroy\", []);\n this.detachAllEvents();\n }\n};\nmodule.exports = Timeline;","module.exports = function (item, view, config) {\n return {\n top: view.getItemTop(item.id),\n height: view.getItemHeight(item.id),\n left: 0,\n right: Infinity\n };\n};","function create(gantt) {\n var events = [];\n return {\n delegate: function delegate(event, className, handler, root) {\n events.push([event, className, handler, root]);\n var helper = gantt.$services.getService(\"mouseEvents\");\n helper.delegate(event, className, handler, root);\n },\n destructor: function destructor() {\n var mouseEvents = gantt.$services.getService(\"mouseEvents\");\n\n for (var i = 0; i < events.length; i++) {\n var h = events[i];\n mouseEvents.detach(h[0], h[1], h[2], h[3]);\n }\n\n events = [];\n }\n };\n}\n\nmodule.exports = create;","var domHelpers = require(\"../utils/dom_helpers\"),\n utils = require(\"../../../utils/utils\"),\n eventable = require(\"../../../utils/eventable\"),\n gridResize = require(\"./grid_resize\"),\n topPositionMixin = require(\"../row_position_mixin\"),\n rowResize = require(\"./task_grid_row_resize\");\n\nvar ColumnDnd = require(\"../plugins/column_grid_dnd\")[\"default\"];\n\nvar Grid = function Grid(parent, config, factory, gantt) {\n this.$config = utils.mixin({}, config || {});\n this.$gantt = gantt;\n this.$parent = parent;\n eventable(this);\n this.$state = {};\n utils.mixin(this, topPositionMixin(this));\n};\n\nGrid.prototype = {\n init: function init(container) {\n var gantt = this.$gantt;\n\n var gridAriaAttr = gantt._waiAria.gridAttrString();\n\n var gridDataAriaAttr = gantt._waiAria.gridDataAttrString();\n\n var _ganttConfig = this.$getConfig();\n\n var reorderColumns = _ganttConfig.reorder_grid_columns || false;\n\n if (this.$config.reorder_grid_columns !== undefined) {\n reorderColumns = this.$config.reorder_grid_columns;\n }\n\n container.innerHTML = \"<div class='gantt_grid' style='height:inherit;width:inherit;' \" + gridAriaAttr + \"></div>\";\n this.$grid = container.childNodes[0];\n this.$grid.innerHTML = \"<div class='gantt_grid_scale' \" + gantt._waiAria.gridScaleRowAttrString() + \"></div><div class='gantt_grid_data' \" + gridDataAriaAttr + \"></div>\";\n this.$grid_scale = this.$grid.childNodes[0];\n this.$grid_data = this.$grid.childNodes[1];\n var attr = _ganttConfig[this.$config.bind + \"_attribute\"];\n\n if (!attr && this.$config.bind) {\n attr = \"data-\" + this.$config.bind + \"-id\";\n }\n\n this.$config.item_attribute = attr || null;\n\n if (!this.$config.layers) {\n var layers = this._createLayerConfig();\n\n this.$config.layers = layers;\n }\n\n var resizer = gridResize(gantt, this);\n resizer.init();\n this._renderHeaderResizers = resizer.doOnRender;\n this._mouseDelegates = require(\"../mouse_event_container\")(gantt);\n var resizerrow = rowResize(gantt, this);\n resizerrow.init();\n\n this._addLayers(this.$gantt);\n\n this._initEvents();\n\n if (reorderColumns) {\n this._columnDND = new ColumnDnd(gantt, this);\n\n this._columnDND.init();\n }\n\n this.callEvent(\"onReady\", []); //this.refresh();\n },\n _validateColumnWidth: function _validateColumnWidth(column, property) {\n // user can set {name:\"text\", width:\"200\",...} for some reason,\n // check and convert it to number when possible\n var value = column[property];\n\n if (value && value != \"*\") {\n var gantt = this.$gantt;\n var numericWidth = value * 1;\n\n if (isNaN(numericWidth)) {\n gantt.assert(false, \"Wrong \" + property + \" value of column \" + column.name);\n } else {\n column[property] = numericWidth;\n }\n }\n },\n setSize: function setSize(width, height) {\n this.$config.width = this.$state.width = width;\n this.$config.height = this.$state.height = height; // TODO: maybe inherit and override in a subclass instead of extending here\n\n var columns = this.getGridColumns(),\n innerWidth = 0;\n var config = this.$getConfig();\n var elasticColumns = config.grid_elastic_columns;\n\n for (var i = 0, l = columns.length; i < l; i++) {\n this._validateColumnWidth(columns[i], \"min_width\");\n\n this._validateColumnWidth(columns[i], \"max_width\");\n\n this._validateColumnWidth(columns[i], \"width\");\n\n innerWidth += columns[i].width * 1;\n }\n\n var outerWidth;\n\n if (isNaN(innerWidth) || !this.$config.scrollable) {\n outerWidth = this._setColumnsWidth(width + 1);\n innerWidth = outerWidth;\n }\n\n if (this.$config.scrollable && elasticColumns && !isNaN(innerWidth)) {\n // GS-1352: Allow resizing the grid columns, then the grid width is increased\n // or keep the grid width, but don't allow column resize to affect the grid width\n var columnProperty = \"width\";\n\n if (elasticColumns == \"min_width\") {\n columnProperty = \"min_width\";\n }\n\n var newColumnWidth = 0;\n columns.forEach(function (col) {\n newColumnWidth += col[columnProperty] || config.min_grid_column_width;\n }); //newColumnWidth--; // the total column width shouldn't match the outerWidth // GS-2190 reducing width seems to be not needed\n\n var columnsWidth = Math.max(newColumnWidth, width);\n innerWidth = this._setColumnsWidth(columnsWidth);\n outerWidth = width;\n }\n\n if (this.$config.scrollable) {\n this.$grid_scale.style.width = innerWidth + \"px\";\n this.$grid_data.style.width = innerWidth + \"px\";\n } else {\n this.$grid_scale.style.width = \"inherit\";\n this.$grid_data.style.width = \"inherit\";\n }\n\n this.$config.width -= 1;\n var config = this.$getConfig();\n\n if (outerWidth !== width) {\n if (outerWidth !== undefined) {\n config.grid_width = outerWidth;\n this.$config.width = outerWidth - 1;\n } else {\n if (!isNaN(innerWidth)) {\n this._setColumnsWidth(innerWidth);\n\n config.grid_width = innerWidth;\n this.$config.width = innerWidth - 1;\n }\n }\n }\n\n var dataHeight = Math.max(this.$state.height - config.scale_height, 0);\n this.$grid_data.style.height = dataHeight + \"px\";\n this.refresh();\n },\n getSize: function getSize() {\n var config = this.$getConfig();\n var store = this.$config.rowStore;\n\n var contentHeight = store ? this.getTotalHeight() : 0,\n contentWidth = this._getGridWidth();\n\n var size = {\n x: this.$state.width,\n y: this.$state.height,\n contentX: this.isVisible() ? contentWidth : 0,\n contentY: this.isVisible() ? config.scale_height + contentHeight : 0,\n scrollHeight: this.isVisible() ? contentHeight : 0,\n scrollWidth: this.isVisible() ? contentWidth : 0\n };\n return size;\n },\n _bindStore: function _bindStore() {\n if (this.$config.bind) {\n var rowStore = this.$gantt.getDatastore(this.$config.bind);\n this.$config.rowStore = rowStore;\n\n if (rowStore && !rowStore._gridCacheAttached) {\n var self = this;\n rowStore._gridCacheAttached = rowStore.attachEvent(\"onBeforeFilter\", function () {\n self._resetTopPositionHeight();\n });\n }\n }\n },\n _unbindStore: function _unbindStore() {\n if (this.$config.bind) {\n var rowStore = this.$gantt.getDatastore(this.$config.bind);\n\n if (rowStore && rowStore._gridCacheAttached) {\n rowStore.detachEvent(rowStore._gridCacheAttached);\n rowStore._gridCacheAttached = false;\n }\n }\n },\n refresh: function refresh() {\n this._bindStore();\n\n this._resetTopPositionHeight();\n\n this._resetHeight();\n\n this._initSmartRenderingPlaceholder();\n\n this._calculateGridWidth();\n\n this._renderGridHeader();\n },\n getViewPort: function getViewPort() {\n var scrollLeft = this.$config.scrollLeft || 0;\n var scrollTop = this.$config.scrollTop || 0;\n var height = this.$config.height || 0;\n var width = this.$config.width || 0;\n return {\n y: scrollTop,\n y_end: scrollTop + height,\n x: scrollLeft,\n x_end: scrollLeft + width,\n height: height,\n width: width\n };\n },\n scrollTo: function scrollTo(left, top) {\n if (!this.isVisible()) return;\n var scrolled = false;\n this.$config.scrollTop = this.$config.scrollTop || 0;\n this.$config.scrollLeft = this.$config.scrollLeft || 0;\n\n if (left * 1 == left) {\n this.$config.scrollLeft = this.$state.scrollLeft = this.$grid.scrollLeft = left;\n scrolled = true;\n } // var config = this.$getConfig();\n\n\n if (top * 1 == top) {\n this.$config.scrollTop = this.$state.scrollTop = this.$grid_data.scrollTop = top;\n scrolled = true;\n }\n\n if (scrolled) {\n this.callEvent(\"onScroll\", [this.$config.scrollLeft, this.$config.scrollTop]);\n }\n },\n getColumnIndex: function getColumnIndex(name, excludeHidden) {\n var columns = this.$getConfig().columns;\n var hiddenIndexShift = 0;\n\n for (var i = 0; i < columns.length; i++) {\n // GS-1257. If the cell is hidden, the target column index should be correct\n if (excludeHidden && columns[i].hide) {\n hiddenIndexShift++;\n }\n\n if (columns[i].name == name) {\n return i - hiddenIndexShift;\n }\n }\n\n return null;\n },\n getColumn: function getColumn(name) {\n var index = this.getColumnIndex(name);\n\n if (index === null) {\n return null;\n }\n\n return this.$getConfig().columns[index];\n },\n getGridColumns: function getGridColumns() {\n var config = this.$getConfig();\n return config.columns.slice();\n },\n isVisible: function isVisible() {\n if (this.$parent && this.$parent.$config) {\n return !this.$parent.$config.hidden;\n } else {\n return this.$grid.offsetWidth;\n }\n },\n // getItemHeight: function () {\n // \tvar config = this.$getConfig();\n // \treturn config.row_height;\n // },\n _createLayerConfig: function _createLayerConfig() {\n var gantt = this.$gantt;\n var self = this;\n var layers = [{\n renderer: gantt.$ui.layers.gridLine(),\n container: this.$grid_data,\n filter: [function () {\n return self.isVisible();\n }]\n }, {\n renderer: gantt.$ui.layers.gridTaskRowResizer(),\n container: this.$grid_data,\n append: true,\n filter: [function () {\n return gantt.config.resize_rows;\n }]\n }];\n return layers;\n },\n _addLayers: function _addLayers(gantt) {\n if (!this.$config.bind) return;\n this._taskLayers = [];\n var self = this;\n var layers = this.$gantt.$services.getService(\"layers\");\n var taskRenderer = layers.getDataRender(this.$config.bind);\n\n if (!taskRenderer) {\n taskRenderer = layers.createDataRender({\n name: this.$config.bind,\n defaultContainer: function defaultContainer() {\n return self.$grid_data;\n }\n });\n }\n\n var taskLayers = this.$config.layers;\n\n for (var i = 0; taskLayers && i < taskLayers.length; i++) {\n var layer = taskLayers[i];\n layer.view = this;\n var bar_layer = taskRenderer.addLayer(layer);\n\n this._taskLayers.push(bar_layer);\n }\n\n this._bindStore();\n\n this._initSmartRenderingPlaceholder();\n },\n _refreshPlaceholderOnStoreUpdate: function _refreshPlaceholderOnStoreUpdate(id) {\n var config = this.$getConfig(),\n store = this.$config.rowStore;\n\n if (!store || id !== null || !this.isVisible() || !config.smart_rendering) {\n return;\n }\n\n var contentHeight;\n\n if (this.$config.scrollY) {\n var scroll = this.$gantt.$ui.getView(this.$config.scrollY);\n if (scroll) contentHeight = scroll.getScrollState().scrollSize;\n }\n\n if (!contentHeight) {\n contentHeight = store ? this.getTotalHeight() : 0;\n }\n\n if (contentHeight) {\n if (this.$rowsPlaceholder && this.$rowsPlaceholder.parentNode) {\n this.$rowsPlaceholder.parentNode.removeChild(this.$rowsPlaceholder);\n }\n\n var placeholder = this.$rowsPlaceholder = document.createElement(\"div\");\n placeholder.style.visibility = \"hidden\";\n placeholder.style.height = contentHeight + \"px\";\n placeholder.style.width = \"1px\";\n this.$grid_data.appendChild(placeholder);\n }\n },\n _initSmartRenderingPlaceholder: function _initSmartRenderingPlaceholder() {\n var store = this.$config.rowStore;\n\n if (!store) {\n return;\n } else {\n this._initSmartRenderingPlaceholder = function () {};\n }\n\n this._staticBgHandler = store.attachEvent(\"onStoreUpdated\", utils.bind(this._refreshPlaceholderOnStoreUpdate, this));\n },\n _initEvents: function _initEvents() {\n var gantt = this.$gantt;\n\n this._mouseDelegates.delegate(\"click\", \"gantt_close\", gantt.bind(function (e, id, trg) {\n var store = this.$config.rowStore;\n if (!store) return true;\n var target = domHelpers.locateAttribute(e, this.$config.item_attribute);\n\n if (target) {\n store.close(target.getAttribute(this.$config.item_attribute));\n }\n\n return false;\n }, this), this.$grid);\n\n this._mouseDelegates.delegate(\"click\", \"gantt_open\", gantt.bind(function (e, id, trg) {\n var store = this.$config.rowStore;\n if (!store) return true;\n var target = domHelpers.locateAttribute(e, this.$config.item_attribute);\n\n if (target) {\n store.open(target.getAttribute(this.$config.item_attribute));\n }\n\n return false;\n }, this), this.$grid);\n },\n _clearLayers: function _clearLayers(gantt) {\n var layers = this.$gantt.$services.getService(\"layers\");\n var taskRenderer = layers.getDataRender(this.$config.bind);\n\n if (this._taskLayers) {\n for (var i = 0; i < this._taskLayers.length; i++) {\n taskRenderer.removeLayer(this._taskLayers[i]);\n }\n }\n\n this._taskLayers = [];\n },\n _getColumnWidth: function _getColumnWidth(column, config, width) {\n var min_width = column.min_width || config.min_grid_column_width;\n var new_width = Math.max(width, min_width || 10);\n if (column.max_width) new_width = Math.min(new_width, column.max_width);\n return new_width;\n },\n // set min width only if width < than config.min_grid_column_width\n _checkGridColumnMinWidthLimits: function _checkGridColumnMinWidthLimits(columns, config) {\n for (var i = 0, l = columns.length; i < l; i++) {\n var width = columns[i].width * 1;\n\n if (!columns[i].min_width && width < config.min_grid_column_width) {\n columns[i].min_width = width;\n }\n }\n },\n // return min and max possible grid width according to restricts\n _getGridWidthLimits: function _getGridWidthLimits() {\n var config = this.$getConfig(),\n columns = this.getGridColumns(),\n min_limit = 0,\n max_limit = 0;\n\n for (var i = 0; i < columns.length; i++) {\n min_limit += columns[i].min_width ? columns[i].min_width : config.min_grid_column_width;\n\n if (max_limit !== undefined) {\n max_limit = columns[i].max_width ? max_limit + columns[i].max_width : undefined;\n }\n }\n\n this._checkGridColumnMinWidthLimits(columns, config); // FIX ME: should it be before calculating limits?\n\n\n return [min_limit, max_limit];\n },\n // resize columns to get total newWidth, starting from columns[start_index]\n _setColumnsWidth: function _setColumnsWidth(newWidth, start_index) {\n var config = this.$getConfig();\n var columns = this.getGridColumns(),\n columns_width = 0,\n final_width = newWidth;\n start_index = !window.isNaN(start_index) ? start_index : -1;\n\n for (var i = 0, l = columns.length; i < l; i++) {\n columns_width += columns[i].width * 1;\n }\n\n if (window.isNaN(columns_width)) {\n this._calculateGridWidth();\n\n columns_width = 0;\n\n for (var i = 0, l = columns.length; i < l; i++) {\n columns_width += columns[i].width * 1;\n }\n }\n\n var extra_width = final_width - columns_width;\n var start_width = 0;\n\n for (var i = 0; i < start_index + 1; i++) {\n start_width += columns[i].width;\n }\n\n columns_width -= start_width;\n\n for (var i = start_index + 1; i < columns.length; i++) {\n var col = columns[i];\n var share = Math.round(extra_width * (col.width / columns_width)); // columns have 2 additional restrict fields - min_width & max_width that are set by user\n\n if (extra_width < 0) {\n if (col.min_width && col.width + share < col.min_width) share = col.min_width - col.width;else if (!col.min_width && config.min_grid_column_width && col.width + share < config.min_grid_column_width) share = config.min_grid_column_width - col.width;\n } else if (col.max_width && col.width + share > col.max_width) share = col.max_width - col.width;\n\n columns_width -= col.width;\n col.width += share;\n extra_width -= share;\n }\n\n var iterator = extra_width > 0 ? 1 : -1;\n\n while (extra_width > 0 && iterator === 1 || extra_width < 0 && iterator === -1) {\n var curExtra = extra_width;\n\n for (i = start_index + 1; i < columns.length; i++) {\n var new_width = columns[i].width + iterator;\n\n if (new_width == this._getColumnWidth(columns[i], config, new_width)) {\n extra_width -= iterator;\n columns[i].width = new_width;\n }\n\n if (!extra_width) break;\n }\n\n if (curExtra == extra_width) break;\n } // if impossible to resize the right-side columns, resize the start column\n\n\n if (extra_width && start_index > -1) {\n var new_width = columns[start_index].width + extra_width;\n if (new_width == this._getColumnWidth(columns[start_index], config, new_width)) columns[start_index].width = new_width;\n } //if (this.callEvent(\"onGridResizeEnd\", [config.grid_width, final_width]) === false)\n //\treturn;\n\n\n return this._getColsTotalWidth();\n },\n _getColsTotalWidth: function _getColsTotalWidth() {\n var columns = this.getGridColumns();\n var cols_width = 0;\n\n for (var i = 0; i < columns.length; i++) {\n var v = parseFloat(columns[i].width);\n\n if (window.isNaN(v)) {\n return false;\n }\n\n cols_width += v;\n }\n\n return cols_width;\n },\n _calculateGridWidth: function _calculateGridWidth() {\n var config = this.$getConfig();\n var columns = this.getGridColumns();\n var cols_width = 0;\n var unknown = [];\n var width = [];\n\n for (var i = 0; i < columns.length; i++) {\n var v = parseFloat(columns[i].width);\n\n if (window.isNaN(v)) {\n v = config.min_grid_column_width || 10;\n unknown.push(i);\n }\n\n width[i] = v;\n cols_width += v;\n }\n\n var gridWidth = this._getGridWidth() + 1;\n\n if (config.autofit || unknown.length) {\n var diff = gridWidth - cols_width; // TODO: logic may be improved for proportional changing of width\n // autofit adjusts columns widths to the outer grid width\n // it doesn't makes sense if grid has inner scroll with elastic columns\n\n if (config.autofit && !config.grid_elastic_columns) {\n // delta must be added for all columns\n for (var i = 0; i < width.length; i++) {\n var delta = Math.round(diff / (width.length - i));\n width[i] += delta;\n\n var new_width = this._getColumnWidth(columns[i], config, width[i]);\n\n if (new_width != width[i]) {\n delta = new_width - width[i];\n width[i] = new_width;\n }\n\n diff -= delta;\n }\n } else if (unknown.length) {\n // there are several columns with undefined width\n for (var i = 0; i < unknown.length; i++) {\n var delta = Math.round(diff / (unknown.length - i)); // no float values, just integer\n\n var index = unknown[i];\n width[index] += delta;\n\n var new_width = this._getColumnWidth(columns[index], config, width[index]);\n\n if (new_width != width[index]) {\n delta = new_width - width[index];\n width[index] = new_width;\n }\n\n diff -= delta;\n }\n }\n\n for (var i = 0; i < width.length; i++) {\n columns[i].width = width[i];\n }\n } else {\n var changed = gridWidth != cols_width;\n this.$config.width = cols_width - 1;\n config.grid_width = cols_width;\n\n if (changed) {\n this.$parent._setContentSize(this.$config.width, null);\n }\n }\n },\n _renderGridHeader: function _renderGridHeader() {\n var gantt = this.$gantt;\n var config = this.$getConfig();\n var locale = this.$gantt.locale;\n var templates = this.$gantt.templates;\n var columns = this.getGridColumns();\n\n if (config.rtl) {\n columns = columns.reverse();\n }\n\n var cells = [];\n var width = 0,\n labels = locale.labels;\n var lineHeigth = config.scale_height - 1;\n\n for (var i = 0; i < columns.length; i++) {\n var last = i == columns.length - 1;\n var col = columns[i]; // ensure columns have non-empty names\n\n if (!col.name) {\n col.name = gantt.uid() + \"\";\n }\n\n var colWidth = col.width * 1;\n\n var gridWidth = this._getGridWidth();\n\n if (last && gridWidth > width + colWidth) col.width = colWidth = gridWidth - width;\n width += colWidth;\n var sort = gantt._sort && col.name == gantt._sort.name ? \"<div class='gantt_sort gantt_\" + gantt._sort.direction + \"'></div>\" : \"\";\n var cssClass = [\"gantt_grid_head_cell\", \"gantt_grid_head_\" + col.name, last ? \"gantt_last_cell\" : \"\", templates.grid_header_class(col.name, col)].join(\" \");\n var style = \"width:\" + (colWidth - (last ? 1 : 0)) + \"px;\";\n var label = col.label || labels[\"column_\" + col.name] || labels[col.name];\n label = label || \"\";\n\n var ariaAttrs = gantt._waiAria.gridScaleCellAttrString(col, label);\n\n var cell = \"<div class='\" + cssClass + \"' style='\" + style + \"' \" + ariaAttrs + \" data-column-id='\" + col.name + \"' column_id='\" + col.name + \"'\" + \" data-column-name='\" + col.name + \"' data-column-index='\" + i + \"'\" + \">\" + label + sort + \"</div>\";\n cells.push(cell);\n }\n\n this.$grid_scale.style.height = config.scale_height + \"px\";\n this.$grid_scale.style.lineHeight = lineHeigth + \"px\"; //this.$grid_scale.style.width = \"inherit\";\n\n this.$grid_scale.innerHTML = cells.join(\"\");\n\n if (this._renderHeaderResizers) {\n this._renderHeaderResizers();\n }\n },\n _getGridWidth: function _getGridWidth() {\n // TODO: refactor/remove/comment some of _getGridWidth/this.$config.width/this.$state.width, it's not clear what they do\n return this.$config.width;\n },\n destructor: function destructor() {\n this._clearLayers(this.$gantt);\n\n if (this._mouseDelegates) {\n this._mouseDelegates.destructor();\n\n this._mouseDelegates = null;\n }\n\n this._unbindStore();\n\n this.$grid = null;\n this.$grid_scale = null;\n this.$grid_data = null;\n this.$gantt = null;\n\n if (this.$config.rowStore) {\n this.$config.rowStore.detachEvent(this._staticBgHandler);\n this.$config.rowStore = null;\n }\n\n this.callEvent(\"onDestroy\", []);\n this.detachAllEvents();\n }\n};\nmodule.exports = Grid;","var utils = require(\"../../../utils/utils\");\n\nfunction ScaleHelper(gantt) {\n var dateHelper = gantt.date;\n var services = gantt.$services;\n return {\n getSum: function getSum(sizes, from, to) {\n if (to === undefined) to = sizes.length - 1;\n if (from === undefined) from = 0;\n var summ = 0;\n\n for (var i = from; i <= to; i++) {\n summ += sizes[i];\n }\n\n return summ;\n },\n setSumWidth: function setSumWidth(sum_width, scale, from, to) {\n var parts = scale.width;\n if (to === undefined) to = parts.length - 1;\n if (from === undefined) from = 0;\n var length = to - from + 1;\n if (from > parts.length - 1 || length <= 0 || to > parts.length - 1) return;\n var oldWidth = this.getSum(parts, from, to);\n var diff = sum_width - oldWidth;\n this.adjustSize(diff, parts, from, to);\n this.adjustSize(-diff, parts, to + 1);\n scale.full_width = this.getSum(parts);\n },\n splitSize: function splitSize(width, count) {\n var arr = [];\n\n for (var i = 0; i < count; i++) {\n arr[i] = 0;\n }\n\n this.adjustSize(width, arr);\n return arr;\n },\n adjustSize: function adjustSize(width, parts, from, to) {\n if (!from) from = 0;\n if (to === undefined) to = parts.length - 1;\n var length = to - from + 1;\n var full = this.getSum(parts, from, to);\n\n for (var i = from; i <= to; i++) {\n var share = Math.floor(width * (full ? parts[i] / full : 1 / length));\n full -= parts[i];\n width -= share;\n length--;\n parts[i] += share;\n }\n\n parts[parts.length - 1] += width;\n },\n sortScales: function sortScales(scales) {\n function cellSize(unit, step) {\n var d = new Date(1970, 0, 1);\n return dateHelper.add(d, step, unit) - d;\n }\n\n scales.sort(function (a, b) {\n if (cellSize(a.unit, a.step) < cellSize(b.unit, b.step)) {\n return 1;\n } else if (cellSize(a.unit, a.step) > cellSize(b.unit, b.step)) {\n return -1;\n } else {\n return 0;\n }\n });\n\n for (var i = 0; i < scales.length; i++) {\n scales[i].index = i;\n }\n },\n _isLegacyMode: function _isLegacyMode(config) {\n var scaleConfig = config || gantt.config;\n return scaleConfig.scale_unit || scaleConfig.date_scale || scaleConfig.subscales;\n },\n _prepareScaleObject: function _prepareScaleObject(scale) {\n var format = scale.format;\n\n if (!format) {\n format = scale.template || scale.date || \"%d %M\";\n }\n\n if (typeof format === \"string\") {\n format = gantt.date.date_to_str(format);\n }\n\n return {\n unit: scale.unit || \"day\",\n step: scale.step || 1,\n format: format,\n css: scale.css\n };\n },\n primaryScale: function primaryScale(config) {\n var templates = services.getService(\"templateLoader\");\n\n var legacyMode = this._isLegacyMode(config);\n\n var scaleConfig = config || gantt.config;\n var result;\n\n if (legacyMode) {\n templates.initTemplate(\"date_scale\", undefined, undefined, scaleConfig, gantt.config.templates);\n result = {\n unit: gantt.config.scale_unit,\n step: gantt.config.step,\n template: gantt.templates.date_scale,\n date: gantt.config.date_scale,\n css: gantt.templates.scale_cell_class\n };\n } else {\n var primaryScale = scaleConfig.scales[0];\n result = {\n unit: primaryScale.unit,\n step: primaryScale.step,\n template: primaryScale.template,\n format: primaryScale.format,\n date: primaryScale.date,\n css: primaryScale.css || gantt.templates.scale_cell_class\n };\n }\n\n return this._prepareScaleObject(result);\n },\n getSubScales: function getSubScales(config) {\n var legacyMode = this._isLegacyMode(config);\n\n var scaleConfig = config || gantt.config;\n var scales;\n\n if (legacyMode) {\n scales = scaleConfig.subscales || [];\n } else {\n scales = scaleConfig.scales.slice(1);\n }\n\n return scales.map(function (scale) {\n return this._prepareScaleObject(scale);\n }.bind(this));\n },\n prepareConfigs: function prepareConfigs(scales, min_coll_width, container_width, scale_height, minDate, maxDate, rtl) {\n var heights = this.splitSize(scale_height, scales.length);\n var full_width = container_width;\n var configs = [];\n\n for (var i = scales.length - 1; i >= 0; i--) {\n var main_scale = i == scales.length - 1;\n var cfg = this.initScaleConfig(scales[i], minDate, maxDate);\n\n if (main_scale) {\n this.processIgnores(cfg);\n }\n\n this.initColSizes(cfg, min_coll_width, full_width, heights[i]);\n this.limitVisibleRange(cfg);\n\n if (main_scale) {\n full_width = cfg.full_width;\n }\n\n configs.unshift(cfg);\n }\n\n for (var i = 0; i < configs.length - 1; i++) {\n this.alineScaleColumns(configs[configs.length - 1], configs[i]);\n }\n\n for (var i = 0; i < configs.length; i++) {\n if (rtl) {\n this.reverseScale(configs[i]);\n }\n\n this.setPosSettings(configs[i]);\n }\n\n return configs;\n },\n reverseScale: function reverseScale(scale) {\n scale.width = scale.width.reverse();\n scale.trace_x = scale.trace_x.reverse();\n var indexes = scale.trace_indexes;\n scale.trace_indexes = {};\n scale.trace_index_transition = {};\n scale.rtl = true;\n\n for (var i = 0; i < scale.trace_x.length; i++) {\n scale.trace_indexes[scale.trace_x[i].valueOf()] = i;\n scale.trace_index_transition[indexes[scale.trace_x[i].valueOf()]] = i;\n }\n\n return scale;\n },\n setPosSettings: function setPosSettings(config) {\n for (var i = 0, len = config.trace_x.length; i < len; i++) {\n config.left.push((config.width[i - 1] || 0) + (config.left[i - 1] || 0));\n }\n },\n _ignore_time_config: function _ignore_time_config(date, scale) {\n if (gantt.config.skip_off_time) {\n var skip = true;\n var probe = date; // check dates in case custom scale unit, e.g. {unit: \"month\", step: 3}\n\n for (var i = 0; i < scale.step; i++) {\n if (i) {\n probe = dateHelper.add(date, i, scale.unit);\n }\n\n skip = skip && !this.isWorkTime(probe, scale.unit);\n }\n\n return skip;\n }\n\n return false;\n },\n //defined in an extension\n processIgnores: function processIgnores(config) {\n config.ignore_x = {};\n config.display_count = config.count;\n },\n initColSizes: function initColSizes(config, min_col_width, full_width, line_height) {\n var cont_width = full_width;\n config.height = line_height;\n var column_count = config.display_count === undefined ? config.count : config.display_count;\n if (!column_count) column_count = 1;\n config.col_width = Math.floor(cont_width / column_count);\n\n if (min_col_width) {\n if (config.col_width < min_col_width) {\n config.col_width = min_col_width;\n cont_width = config.col_width * column_count;\n }\n }\n\n config.width = [];\n var ignores = config.ignore_x || {};\n\n for (var i = 0; i < config.trace_x.length; i++) {\n if (ignores[config.trace_x[i].valueOf()] || config.display_count == config.count) {\n config.width[i] = 0;\n } else {\n // width of month columns should be proportional month duration\n var width = 1;\n\n if (config.unit == \"month\") {\n var days = Math.round((dateHelper.add(config.trace_x[i], config.step, config.unit) - config.trace_x[i]) / (1000 * 60 * 60 * 24));\n width = days;\n }\n\n config.width[i] = width;\n }\n }\n\n this.adjustSize(cont_width - this.getSum(config.width)\n /* 1 width per column from the code above */\n , config.width);\n config.full_width = this.getSum(config.width);\n },\n initScaleConfig: function initScaleConfig(config, min_date, max_date) {\n var cfg = utils.mixin({\n count: 0,\n col_width: 0,\n full_width: 0,\n height: 0,\n width: [],\n left: [],\n trace_x: [],\n trace_indexes: {},\n min_date: new Date(min_date),\n max_date: new Date(max_date)\n }, config);\n this.eachColumn(config.unit, config.step, min_date, max_date, function (date) {\n cfg.count++;\n cfg.trace_x.push(new Date(date));\n cfg.trace_indexes[date.valueOf()] = cfg.trace_x.length - 1;\n });\n cfg.trace_x_ascending = cfg.trace_x.slice();\n return cfg;\n },\n iterateScales: function iterateScales(lower_scale, upper_scale, from, to, callback) {\n var upper_dates = upper_scale.trace_x;\n var lower_dates = lower_scale.trace_x;\n var prev = from || 0;\n var end = to || lower_dates.length - 1;\n var prevUpper = 0;\n\n for (var up = 1; up < upper_dates.length; up++) {\n var target_index = lower_scale.trace_indexes[+upper_dates[up]];\n\n if (target_index !== undefined && target_index <= end) {\n if (callback) {\n callback.apply(this, [prevUpper, up, prev, target_index]);\n }\n\n prev = target_index;\n prevUpper = up;\n continue;\n }\n }\n },\n alineScaleColumns: function alineScaleColumns(lower_scale, upper_scale, from, to) {\n this.iterateScales(lower_scale, upper_scale, from, to, function (upper_start, upper_end, lower_start, lower_end) {\n var targetWidth = this.getSum(lower_scale.width, lower_start, lower_end - 1);\n var actualWidth = this.getSum(upper_scale.width, upper_start, upper_end - 1);\n\n if (actualWidth != targetWidth) {\n this.setSumWidth(targetWidth, upper_scale, upper_start, upper_end - 1);\n }\n });\n },\n eachColumn: function eachColumn(unit, step, min_date, max_date, callback) {\n var start = new Date(min_date),\n end = new Date(max_date);\n\n if (dateHelper[unit + \"_start\"]) {\n start = dateHelper[unit + \"_start\"](start);\n }\n\n var curr = new Date(start);\n\n if (+curr >= +end) {\n end = dateHelper.add(curr, step, unit);\n }\n\n while (+curr < +end) {\n callback.call(this, new Date(curr));\n var tzOffset = curr.getTimezoneOffset();\n curr = dateHelper.add(curr, step, unit);\n curr = gantt._correct_dst_change(curr, tzOffset, step, unit);\n if (dateHelper[unit + '_start']) curr = dateHelper[unit + \"_start\"](curr);\n }\n },\n limitVisibleRange: function limitVisibleRange(cfg) {\n var dates = cfg.trace_x;\n var left = 0,\n right = cfg.width.length - 1;\n var diff = 0;\n\n if (+dates[0] < +cfg.min_date && left != right) {\n var width = Math.floor(cfg.width[0] * ((dates[1] - cfg.min_date) / (dates[1] - dates[0])));\n diff += cfg.width[0] - width;\n cfg.width[0] = width;\n dates[0] = new Date(cfg.min_date);\n }\n\n var last = dates.length - 1;\n var lastDate = dates[last];\n var outDate = dateHelper.add(lastDate, cfg.step, cfg.unit);\n\n if (+outDate > +cfg.max_date && last > 0) {\n var width = cfg.width[last] - Math.floor(cfg.width[last] * ((outDate - cfg.max_date) / (outDate - lastDate)));\n diff += cfg.width[last] - width;\n cfg.width[last] = width;\n }\n\n if (diff) {\n var full = this.getSum(cfg.width);\n var shared = 0;\n\n for (var i = 0; i < cfg.width.length; i++) {\n var share = Math.floor(diff * (cfg.width[i] / full));\n cfg.width[i] += share;\n shared += share;\n }\n\n this.adjustSize(diff - shared, cfg.width);\n }\n }\n };\n}\n\nmodule.exports = ScaleHelper;","var helpers = require(\"../../../utils/helpers\");\n\nvar htmlHelpers = {\n getHtmlSelect: function getHtmlSelect(options, attributes, value) {\n var innerHTML = \"\";\n\n var _this = this;\n\n options = options || [];\n helpers.forEach(options, function (entry) {\n var _attributes = [{\n key: \"value\",\n value: entry.key\n }];\n\n if (value == entry.key) {\n _attributes[_attributes.length] = {\n key: \"selected\",\n value: \"selected\"\n };\n }\n\n if (entry.attributes) {\n _attributes = _attributes.concat(entry.attributes);\n }\n\n innerHTML += _this.getHtmlOption({\n innerHTML: entry.label\n }, _attributes);\n });\n return _getHtmlContainer(\"select\", {\n innerHTML: innerHTML\n }, attributes);\n },\n getHtmlOption: function getHtmlOption(options, attributes) {\n return _getHtmlContainer(\"option\", options, attributes);\n },\n getHtmlButton: function getHtmlButton(options, attributes) {\n return _getHtmlContainer(\"button\", options, attributes);\n },\n getHtmlDiv: function getHtmlDiv(options, attributes) {\n return _getHtmlContainer(\"div\", options, attributes);\n },\n getHtmlLabel: function getHtmlLabel(options, attributes) {\n return _getHtmlContainer(\"label\", options, attributes);\n },\n getHtmlInput: function getHtmlInput(attributes) {\n return \"<input\" + _getHtmlAttributes(attributes || []) + \">\";\n }\n};\n\nfunction _getHtmlContainer(tag, options, attributes) {\n var html;\n options = options || [];\n html = \"<\" + tag + _getHtmlAttributes(attributes || []) + \">\" + (options.innerHTML || \"\") + \"</\" + tag + \">\";\n return html;\n}\n\nfunction _getHtmlAttributes(attributes) {\n var html = \"\";\n helpers.forEach(attributes, function (entry) {\n html += \" \" + entry.key + \"='\" + entry.value + \"'\";\n });\n return html;\n}\n\nmodule.exports = htmlHelpers;","var helpers = require(\"../utils/helpers\");\n\nmodule.exports = function createResourceTimelineBuilder(gantt) {\n var resourceTaskCache = {};\n gantt.$data.tasksStore.attachEvent(\"onStoreUpdated\", function () {\n resourceTaskCache = {};\n });\n\n function getResourceLoad(resource, resourceProperty, scale, timeline) {\n var cacheKey = resource.id + \"_\" + resourceProperty + \"_\" + scale.unit + \"_\" + scale.step;\n var res;\n\n if (!resourceTaskCache[cacheKey]) {\n res = resourceTaskCache[cacheKey] = calculateResourceLoad(resource, resourceProperty, scale, timeline);\n } else {\n res = resourceTaskCache[cacheKey];\n }\n\n return res;\n }\n\n function calculateResourceLoadFromAssignments(items, scale, assignmentsPassed) {\n var scaleUnit = scale.unit;\n var scaleStep = scale.step;\n var timegrid = {};\n var precalculatedTimes = {};\n\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n var task = item;\n\n if (assignmentsPassed) {\n task = gantt.getTask(item.task_id);\n }\n\n var minDate = item.start_date || task.start_date;\n var maxDate = item.end_date || task.end_date;\n\n if (assignmentsPassed) {\n if (item.start_date) {\n minDate = new Date(Math.max(item.start_date.valueOf(), task.start_date.valueOf()));\n }\n\n if (item.end_date) {\n maxDate = new Date(Math.min(item.end_date.valueOf(), task.end_date.valueOf()));\n }\n }\n\n var firstColumn = helpers.findBinary(scale.trace_x, minDate.valueOf());\n var currDate = new Date(scale.trace_x[firstColumn] || gantt.date[scaleUnit + \"_start\"](new Date(minDate)));\n var calendar = gantt.config.work_time ? gantt.getTaskCalendar(task) : gantt;\n precalculatedTimes[calendar.id] = {};\n\n while (currDate < maxDate) {\n var cachedTimes = precalculatedTimes[calendar.id];\n var date = currDate;\n var timestamp = date.valueOf();\n currDate = gantt.date.add(currDate, scaleStep, scaleUnit);\n\n if (cachedTimes[timestamp] === false) {\n continue;\n }\n\n var isWorkTime = calendar.isWorkTime({\n date: date,\n task: task,\n unit: scaleUnit\n });\n\n if (!isWorkTime) {\n cachedTimes[timestamp] = false;\n continue;\n }\n\n if (!timegrid[timestamp]) {\n timegrid[timestamp] = {\n tasks: [],\n assignments: []\n };\n }\n\n timegrid[timestamp].tasks.push(task);\n\n if (assignmentsPassed) {\n timegrid[timestamp].assignments.push(item);\n }\n }\n }\n\n return timegrid;\n }\n\n function calculateResourceLoad(resource, resourceProperty, scale, timeline) {\n var items;\n var assignmentsPassed = false;\n var timegrid = {};\n\n if (gantt.config.process_resource_assignments && resourceProperty === gantt.config.resource_property) {\n if (resource.$role == \"task\") {\n items = gantt.getResourceAssignments(resource.$resource_id, resource.$task_id);\n } else {\n items = gantt.getResourceAssignments(resource.id);\n }\n\n assignmentsPassed = true;\n } else if (resource.$role == \"task\") {\n items = [];\n } else {\n items = gantt.getTaskBy(resourceProperty, resource.id);\n }\n\n var timegrid = calculateResourceLoadFromAssignments(items, scale, assignmentsPassed);\n var scaleUnit = scale.unit;\n var scaleStep = scale.step;\n var timetable = [];\n var start, end, tasks, assignments, cell;\n var config = timeline.$getConfig();\n\n for (var i = 0; i < scale.trace_x.length; i++) {\n start = new Date(scale.trace_x[i]);\n end = gantt.date.add(start, scaleStep, scaleUnit);\n cell = timegrid[start.valueOf()] || {};\n tasks = cell.tasks || [];\n assignments = cell.assignments || [];\n\n if (tasks.length || config.resource_render_empty_cells) {\n timetable.push({\n start_date: start,\n end_date: end,\n tasks: tasks,\n assignments: assignments\n });\n } else {\n timetable.push(null);\n }\n }\n\n return timetable;\n }\n\n return getResourceLoad;\n};","var __extends = require(\"../../../utils/extends\"),\n domHelpers = require(\"../utils/dom_helpers\"),\n Cell = require(\"./cell\");\n\nvar Layout = function (_super) {\n \"use strict\";\n\n __extends(Layout, _super);\n\n function Layout(parent, config, factory) {\n var _this = _super.apply(this, arguments) || this;\n\n if (parent) _this.$root = true;\n\n _this._parseConfig(config);\n\n _this.$name = \"layout\";\n return _this;\n }\n\n Layout.prototype.destructor = function () {\n if (this.$container && this.$view) {\n domHelpers.removeNode(this.$view);\n }\n\n for (var i = 0; i < this.$cells.length; i++) {\n var child = this.$cells[i];\n child.destructor();\n }\n\n this.$cells = [];\n\n _super.prototype.destructor.call(this);\n };\n\n Layout.prototype._resizeScrollbars = function (autosize, scrollbars) {\n var scrollChanged = false;\n var visibleScrollbars = [],\n hiddenScrollbars = [];\n var scrollbarsToHide = [];\n\n function showScrollbar(scrollbar) {\n scrollbar.$parent.show();\n scrollChanged = true;\n visibleScrollbars.push(scrollbar);\n }\n\n function hideScrollbar(scrollbar) {\n scrollbar.$parent.hide();\n scrollChanged = true;\n hiddenScrollbars.push(scrollbar);\n }\n\n var scrollbar;\n\n for (var i = 0; i < scrollbars.length; i++) {\n scrollbar = scrollbars[i];\n\n if (autosize[scrollbar.$config.scroll]) {\n hideScrollbar(scrollbar);\n } else if (scrollbar.shouldHide()) {\n //hideScrollbar(scrollbar);\n scrollbarsToHide.push(scrollbar);\n } else if (scrollbar.shouldShow()) {\n showScrollbar(scrollbar);\n } else {\n if (scrollbar.isVisible()) {\n visibleScrollbars.push(scrollbar);\n } else {\n hiddenScrollbars.push(scrollbar);\n }\n }\n }\n\n var visibleGroups = {};\n\n for (var i = 0; i < visibleScrollbars.length; i++) {\n if (visibleScrollbars[i].$config.group) {\n visibleGroups[visibleScrollbars[i].$config.group] = true;\n }\n } // GS-2220\n\n\n scrollbarsToHide.forEach(function (scrollbar) {\n if (!(scrollbar.$config.group && visibleGroups[scrollbar.$config.group])) {\n hideScrollbar(scrollbar);\n }\n });\n\n for (var i = 0; i < hiddenScrollbars.length; i++) {\n scrollbar = hiddenScrollbars[i];\n\n if (scrollbar.$config.group && visibleGroups[scrollbar.$config.group]) {\n showScrollbar(scrollbar); // GS-707 If the scrollbar was hidden then showed, the container resize shouldn't happen because of that\n\n for (var j = 0; j < visibleScrollbars.length; j++) {\n if (visibleScrollbars[j] == scrollbar) {\n this.$gantt.$scrollbarRepaint = true;\n break;\n }\n }\n }\n }\n\n return scrollChanged;\n };\n\n Layout.prototype._syncCellSizes = function (groupName, newSize) {\n if (!groupName) return;\n var groups = {};\n\n this._eachChild(function (cell) {\n if (cell.$config.group && cell.$name != \"scrollbar\" && cell.$name != \"resizer\") {\n if (!groups[cell.$config.group]) {\n groups[cell.$config.group] = [];\n }\n\n groups[cell.$config.group].push(cell);\n }\n });\n\n if (groups[groupName]) {\n this._syncGroupSize(groups[groupName], newSize);\n }\n\n return groups[groupName];\n };\n\n Layout.prototype._syncGroupSize = function (cells, newSize) {\n if (!cells.length) return;\n var property = cells[0].$parent._xLayout ? \"width\" : \"height\";\n var direction = cells[0].$parent.getNextSibling(cells[0].$id) ? 1 : -1;\n var newSizeValue = newSize.value;\n var isGravity = newSize.isGravity;\n\n for (var i = 0; i < cells.length; i++) {\n var ownSize = cells[i].getSize();\n var resizeSibling = direction > 0 ? cells[i].$parent.getNextSibling(cells[i].$id) : cells[i].$parent.getPrevSibling(cells[i].$id);\n\n if (resizeSibling.$name == \"resizer\") {\n resizeSibling = direction > 0 ? resizeSibling.$parent.getNextSibling(resizeSibling.$id) : resizeSibling.$parent.getPrevSibling(resizeSibling.$id);\n }\n\n var siblingSize = resizeSibling.getSize();\n\n if (!isGravity) {\n if (resizeSibling[property]) {\n var totalGravity = ownSize.gravity + siblingSize.gravity;\n var totalSize = ownSize[property] + siblingSize[property];\n var k = totalGravity / totalSize;\n cells[i].$config.gravity = k * newSizeValue;\n resizeSibling.$config[property] = totalSize - newSizeValue;\n resizeSibling.$config.gravity = totalGravity - k * newSizeValue;\n } else {\n cells[i].$config[property] = newSizeValue;\n }\n } else {\n cells[i].$config.gravity = newSizeValue;\n }\n\n var mainGrid = this.$gantt.$ui.getView(\"grid\");\n\n if (mainGrid && cells[i].$content === mainGrid && !mainGrid.$config.scrollable && !isGravity) {\n this.$gantt.config.grid_width = newSizeValue;\n }\n }\n };\n\n Layout.prototype.resize = function (startStage) {\n var mainCall = false;\n\n if (this.$root && !this._resizeInProgress) {\n this.callEvent(\"onBeforeResize\", []);\n mainCall = true;\n this._resizeInProgress = true;\n }\n\n _super.prototype.resize.call(this, true);\n\n _super.prototype.resize.call(this, false);\n\n if (mainCall) {\n var contentViews = [];\n contentViews = contentViews.concat(this.getCellsByType(\"viewCell\"));\n contentViews = contentViews.concat(this.getCellsByType(\"viewLayout\"));\n contentViews = contentViews.concat(this.getCellsByType(\"hostCell\"));\n var scrollbars = this.getCellsByType(\"scroller\");\n\n for (var i = 0; i < contentViews.length; i++) {\n if (!contentViews[i].$config.hidden) contentViews[i].setContentSize();\n }\n\n var autosize = this._getAutosizeMode(this.$config.autosize);\n /* // possible to rollback set content size when autisize is disabled, not sure if need to\r\n \t\tcontentViews.forEach(function(view){\r\n \t\t\tconst parent = view.$parent;\r\n \t\t\tif(!autosize.x){\r\n \t\t\t\tif(parent.$config.$originalWidthStored){\r\n \t\t\t\t\tparent.$config.$originalWidthStored = false;\r\n \t\t\t\t\tparent.$config.width = parent.$config.$originalWidth;\r\n \t\t\t\t\tparent.$config.$originalWidth = undefined;\r\n \t\t\t\t}\r\n \t\t\t}\r\n \n \t\t\tif(!autosize.y){\r\n \t\t\t\tif(parent.$config.$originalHeightStored){\r\n \t\t\t\t\tparent.$config.$originalHeightStored = false;\r\n \t\t\t\t\tparent.$config.height = parent.$config.$originalHeight;\r\n \t\t\t\t\tparent.$config.$originalHeight = undefined;\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t});*/\n\n\n var scrollChanged = this._resizeScrollbars(autosize, scrollbars);\n\n if (this.$config.autosize) {\n this.autosize(this.$config.autosize);\n contentViews.forEach(function (view) {\n var parent = view.$parent;\n var sizes = parent.getContentSize(autosize);\n\n if (autosize.x) {\n if (!parent.$config.$originalWidthStored) {\n parent.$config.$originalWidthStored = true;\n parent.$config.$originalWidth = parent.$config.width;\n }\n\n parent.$config.width = sizes.width;\n }\n\n if (autosize.y) {\n if (!parent.$config.$originalHeightStored) {\n parent.$config.$originalHeightStored = true;\n parent.$config.$originalHeight = parent.$config.height;\n }\n\n parent.$config.height = sizes.height;\n }\n });\n scrollChanged = true;\n }\n\n if (scrollChanged) {\n this.resize();\n\n for (var i = 0; i < contentViews.length; i++) {\n if (!contentViews[i].$config.hidden) contentViews[i].setContentSize();\n }\n }\n\n this.callEvent(\"onResize\", []);\n }\n\n if (mainCall) {\n this._resizeInProgress = false;\n }\n };\n\n Layout.prototype._eachChild = function (code, cell) {\n cell = cell || this;\n code(cell);\n\n if (cell.$cells) {\n for (var i = 0; i < cell.$cells.length; i++) {\n this._eachChild(code, cell.$cells[i]);\n }\n }\n };\n\n Layout.prototype.isChild = function (view) {\n var res = false;\n\n this._eachChild(function (child) {\n if (child === view || child.$content === view) {\n res = true;\n }\n });\n\n return res;\n };\n\n Layout.prototype.getCellsByType = function (type) {\n var res = [];\n\n if (type === this.$name) {\n res.push(this);\n }\n\n if (this.$content && this.$content.$name == type) {\n res.push(this.$content);\n }\n\n if (this.$cells) {\n for (var i = 0; i < this.$cells.length; i++) {\n var children = Layout.prototype.getCellsByType.call(this.$cells[i], type);\n\n if (children.length) {\n res.push.apply(res, children);\n }\n }\n }\n\n return res;\n };\n\n Layout.prototype.getNextSibling = function (cellId) {\n var index = this.cellIndex(cellId);\n\n if (index >= 0 && this.$cells[index + 1]) {\n return this.$cells[index + 1];\n } else {\n return null;\n }\n };\n\n Layout.prototype.getPrevSibling = function (cellId) {\n var index = this.cellIndex(cellId);\n\n if (index >= 0 && this.$cells[index - 1]) {\n return this.$cells[index - 1];\n } else {\n return null;\n }\n };\n\n Layout.prototype.cell = function (id) {\n for (var i = 0; i < this.$cells.length; i++) {\n var child = this.$cells[i];\n\n if (child.$id === id) {\n return child;\n }\n\n var sub = child.cell(id);\n\n if (sub) {\n return sub;\n }\n }\n };\n\n Layout.prototype.cellIndex = function (id) {\n for (var i = 0; i < this.$cells.length; i++) {\n if (this.$cells[i].$id === id) {\n return i;\n }\n }\n\n return -1;\n };\n\n Layout.prototype.moveView = function (view, ind) {\n if (this.$cells[ind] !== view) {\n return window.alert(\"Not implemented\");\n } else {\n ind += this.$config.header ? 1 : 0;\n var node = this.$view;\n\n if (ind >= node.childNodes.length) {\n node.appendChild(view.$view);\n } else {\n node.insertBefore(view.$view, node.childNodes[ind]);\n }\n }\n };\n\n Layout.prototype._parseConfig = function (config) {\n this.$cells = [];\n this._xLayout = !config.rows;\n var cells = config.rows || config.cols || config.views;\n\n for (var i = 0; i < cells.length; i++) {\n var cell = cells[i];\n cell.mode = this._xLayout ? \"x\" : \"y\";\n var $content = this.$factory.initUI(cell, this);\n\n if (!$content) {\n cells.splice(i, 1);\n i--;\n } else {\n $content.$parent = this;\n this.$cells.push($content);\n }\n }\n };\n\n Layout.prototype.getCells = function () {\n return this.$cells;\n };\n\n Layout.prototype.render = function () {\n var view = domHelpers.insertNode(this.$container, this.$toHTML());\n this.$fill(view, null);\n this.callEvent(\"onReady\", []);\n this.resize(); // do simple repaint after the first call\n\n this.render = this.resize;\n };\n\n Layout.prototype.$fill = function (node, parent) {\n this.$view = node;\n this.$parent = parent;\n var cells = domHelpers.getChildNodes(node, \"gantt_layout_cell\");\n\n for (var i = cells.length - 1; i >= 0; i--) {\n var sub = this.$cells[i];\n sub.$fill(cells[i], this); // initially hidden cell\n\n if (sub.$config.hidden) {\n sub.$view.parentNode.removeChild(sub.$view);\n }\n }\n };\n\n Layout.prototype.$toHTML = function () {\n var mode = this._xLayout ? \"x\" : \"y\";\n var html = [];\n\n for (var i = 0; i < this.$cells.length; i++) {\n html.push(this.$cells[i].$toHTML());\n }\n\n return _super.prototype.$toHTML.call(this, html.join(\"\"), (this.$root ? \"gantt_layout_root \" : \"\") + \"gantt_layout gantt_layout_\" + mode);\n };\n\n Layout.prototype.getContentSize = function (mode) {\n var contentWidth = 0,\n contentHeight = 0;\n var cellSize, cell, borders;\n\n for (var i = 0; i < this.$cells.length; i++) {\n cell = this.$cells[i];\n if (cell.$config.hidden) continue;\n cellSize = cell.getContentSize(mode);\n\n if (cell.$config.view === \"scrollbar\" && mode[cell.$config.scroll]) {\n cellSize.height = 0;\n cellSize.width = 0;\n }\n\n if (cell.$config.resizer) {\n if (this._xLayout) {\n cellSize.height = 0;\n } else {\n cellSize.width = 0;\n }\n }\n\n borders = cell._getBorderSizes();\n\n if (this._xLayout) {\n contentWidth += cellSize.width + borders.horizontal;\n contentHeight = Math.max(contentHeight, cellSize.height + borders.vertical);\n } else {\n contentWidth = Math.max(contentWidth, cellSize.width + borders.horizontal);\n contentHeight += cellSize.height + borders.vertical;\n }\n }\n\n borders = this._getBorderSizes();\n contentWidth += borders.horizontal;\n contentHeight += borders.vertical; // GS-149 & GS-150: By default this code only increases the container sizes, because of that, the cell sizes\n // are also increased. Keep this code here in the case if something goes wrong\n\n /*\r\n if(this.$root){\r\n \tcontentWidth += 1;\r\n \tcontentHeight += 1;\r\n }\r\n */\n\n return {\n width: contentWidth,\n height: contentHeight\n };\n };\n\n Layout.prototype._cleanElSize = function (value) {\n return (value || \"\").toString().replace(\"px\", \"\") * 1 || 0;\n };\n\n Layout.prototype._getBoxStyles = function (div) {\n var computed = null;\n\n if (window.getComputedStyle) {\n computed = window.getComputedStyle(div, null);\n } else {\n //IE with elem.currentStyle does not calculate sizes from %, so will use the default approach\n computed = {\n \"width\": div.clientWidth,\n \"height\": div.clientHeight\n };\n }\n\n var properties = [\"width\", \"height\", \"paddingTop\", \"paddingBottom\", \"paddingLeft\", \"paddingRight\", \"borderLeftWidth\", \"borderRightWidth\", \"borderTopWidth\", \"borderBottomWidth\"];\n var styles = {\n boxSizing: computed.boxSizing == \"border-box\"\n };\n\n if (computed.MozBoxSizing) {\n styles.boxSizing = computed.MozBoxSizing == \"border-box\";\n }\n\n for (var i = 0; i < properties.length; i++) {\n styles[properties[i]] = computed[properties[i]] ? this._cleanElSize(computed[properties[i]]) : 0;\n }\n\n var box = {\n horPaddings: styles.paddingLeft + styles.paddingRight + styles.borderLeftWidth + styles.borderRightWidth,\n vertPaddings: styles.paddingTop + styles.paddingBottom + styles.borderTopWidth + styles.borderBottomWidth,\n borderBox: styles.boxSizing,\n innerWidth: styles.width,\n innerHeight: styles.height,\n outerWidth: styles.width,\n outerHeight: styles.height\n };\n\n if (box.borderBox) {\n box.innerWidth -= box.horPaddings;\n box.innerHeight -= box.vertPaddings;\n } else {\n box.outerWidth += box.horPaddings;\n box.outerHeight += box.vertPaddings;\n }\n\n return box;\n };\n\n Layout.prototype._getAutosizeMode = function (config) {\n var res = {\n x: false,\n y: false\n };\n\n if (config === \"xy\") {\n res.x = res.y = true;\n } else if (config === \"y\" || config === true) {\n res.y = true;\n } else if (config === \"x\") {\n res.x = true;\n }\n\n return res;\n };\n\n Layout.prototype.autosize = function (mode) {\n var res = this._getAutosizeMode(mode);\n\n var boxSizes = this._getBoxStyles(this.$container);\n\n var contentSizes = this.getContentSize(mode);\n var node = this.$container;\n\n if (res.x) {\n if (boxSizes.borderBox) {\n contentSizes.width += boxSizes.horPaddings;\n }\n\n node.style.width = contentSizes.width + \"px\";\n }\n\n if (res.y) {\n if (boxSizes.borderBox) {\n contentSizes.height += boxSizes.vertPaddings;\n }\n\n node.style.height = contentSizes.height + \"px\";\n }\n };\n\n Layout.prototype.getSize = function () {\n this._sizes = [];\n var width = 0;\n var minWidth = 0;\n var maxWidth = 100000000000;\n var height = 0;\n var maxHeight = 100000000000;\n var minHeight = 0;\n\n for (var i = 0; i < this.$cells.length; i++) {\n var size = this._sizes[i] = this.$cells[i].getSize();\n\n if (this.$cells[i].$config.hidden) {\n continue;\n }\n\n if (this._xLayout) {\n if (!size.width && size.minWidth) {\n width += size.minWidth;\n } else {\n width += size.width;\n }\n\n maxWidth += size.maxWidth;\n minWidth += size.minWidth;\n height = Math.max(height, size.height);\n maxHeight = Math.min(maxHeight, size.maxHeight); // min of maxHeight\n\n minHeight = Math.max(minHeight, size.minHeight); // max of minHeight\n } else {\n if (!size.height && size.minHeight) {\n height += size.minHeight;\n } else {\n height += size.height;\n }\n\n maxHeight += size.maxHeight;\n minHeight += size.minHeight;\n width = Math.max(width, size.width);\n maxWidth = Math.min(maxWidth, size.maxWidth); // min of maxWidth\n\n minWidth = Math.max(minWidth, size.minWidth); // max of minWidth\n }\n }\n\n var self = _super.prototype.getSize.call(this); // maxWidth\n\n\n if (self.maxWidth >= 100000) {\n self.maxWidth = maxWidth;\n } // maxHeight\n\n\n if (self.maxHeight >= 100000) {\n self.maxHeight = maxHeight;\n } // minWidth\n\n\n self.minWidth = self.minWidth !== self.minWidth ? 0 : self.minWidth; // || self.width || Math.max(minWidth, width);\n // minHeight\n\n self.minHeight = self.minHeight !== self.minHeight ? 0 : self.minHeight; //self.minHeight || self.height || Math.max(minHeight, height);\n // sizes with paddings and margins\n\n if (this._xLayout) {\n self.minWidth += this.$config.margin * this.$cells.length || 0;\n self.minWidth += this.$config.padding * 2 || 0;\n self.minHeight += this.$config.padding * 2 || 0;\n } else {\n self.minHeight += this.$config.margin * this.$cells.length || 0;\n self.minHeight += this.$config.padding * 2 || 0;\n }\n\n return self;\n }; // calc total gravity and free space\n\n\n Layout.prototype._calcFreeSpace = function (s, cell, xLayout) {\n var min = xLayout ? cell.minWidth : cell.minHeight;\n var max = xLayout ? cell.maxWidth : cell.maxWidth;\n var side = s;\n\n if (!side) {\n side = Math.floor(this._free / this._gravity * cell.gravity);\n\n if (side > max) {\n side = max;\n this._free -= side;\n this._gravity -= cell.gravity;\n }\n\n if (side < min) {\n side = min;\n this._free -= side;\n this._gravity -= cell.gravity;\n }\n } else {\n if (side > max) {\n side = max;\n }\n\n if (side < min) {\n side = min;\n }\n\n this._free -= side;\n }\n\n return side;\n };\n\n Layout.prototype._calcSize = function (s, size, xLayout) {\n var side = s;\n var min = xLayout ? size.minWidth : size.minHeight;\n var max = xLayout ? size.maxWidth : size.maxHeight;\n\n if (!side) {\n side = Math.floor(this._free / this._gravity * size.gravity);\n }\n\n if (side > max) {\n side = max;\n }\n\n if (side < min) {\n side = min;\n }\n\n return side;\n };\n\n Layout.prototype._configureBorders = function () {\n if (this.$root) {\n this._setBorders([this._borders.left, this._borders.top, this._borders.right, this._borders.bottom], this);\n }\n\n var borderClass = this._xLayout ? this._borders.right : this._borders.bottom;\n var cells = this.$cells;\n var lastVisibleIndex = cells.length - 1;\n\n for (var i = lastVisibleIndex; i >= 0; i--) {\n if (!cells[i].$config.hidden) {\n lastVisibleIndex = i;\n break;\n }\n }\n\n for (var i = 0; i < cells.length; i++) {\n if (cells[i].$config.hidden) {\n continue;\n }\n\n var lastCell = i >= lastVisibleIndex;\n var borderColorClass = \"\";\n\n if (!lastCell && cells[i + 1]) {\n if (cells[i + 1].$config.view == \"scrollbar\") {\n if (this._xLayout) {\n lastCell = true;\n } else {\n borderColorClass = \"gantt_layout_cell_border_transparent\";\n }\n }\n }\n\n this._setBorders(lastCell ? [] : [borderClass, borderColorClass], cells[i]);\n }\n };\n\n Layout.prototype._updateCellVisibility = function () {\n var oldVisibleCells = this._visibleCells || {};\n var firstCall = !this._visibleCells;\n var visibleCells = {};\n var cell = null;\n var parentVisibility = [];\n\n for (var i = 0; i < this._sizes.length; i++) {\n cell = this.$cells[i];\n\n if (cell.$config.hide_empty) {\n parentVisibility.push(cell);\n }\n\n if (!firstCall && cell.$config.hidden && oldVisibleCells[cell.$id]) {\n cell._hide(true);\n } else if (!cell.$config.hidden && !oldVisibleCells[cell.$id]) {\n cell._hide(false);\n }\n\n if (!cell.$config.hidden) {\n visibleCells[cell.$id] = true;\n }\n }\n\n this._visibleCells = visibleCells; // GS-27. A way to hide the whole cell if all its children are hidden\n\n for (var i = 0; i < parentVisibility.length; i++) {\n var cell = parentVisibility[i];\n var children = cell.$cells;\n var hideCell = true;\n children.forEach(function (child) {\n if (!child.$config.hidden && !child.$config.resizer) {\n hideCell = false;\n }\n });\n cell.$config.hidden = hideCell;\n }\n };\n\n Layout.prototype.setSize = function (x, y) {\n this._configureBorders();\n\n _super.prototype.setSize.call(this, x, y);\n\n y = this.$lastSize.contentY;\n x = this.$lastSize.contentX;\n var padding = this.$config.padding || 0;\n this.$view.style.padding = padding + \"px\";\n this._gravity = 0;\n this._free = this._xLayout ? x : y;\n this._free -= padding * 2; // calc all gravity\n\n var cell, size;\n\n this._updateCellVisibility();\n\n for (var i = 0; i < this._sizes.length; i++) {\n cell = this.$cells[i];\n\n if (cell.$config.hidden) {\n continue;\n }\n\n var margin = this.$config.margin || 0;\n\n if (cell.$name == \"resizer\" && !margin) {\n margin = -1;\n } // set margins to child cell\n\n\n var cellView = cell.$view;\n var marginSide = this._xLayout ? \"marginRight\" : \"marginBottom\";\n\n if (i !== this.$cells.length - 1) {\n cellView.style[marginSide] = margin + \"px\";\n this._free -= margin; // calc free space without margin\n }\n\n size = this._sizes[i];\n\n if (this._xLayout) {\n if (!size.width) {\n this._gravity += size.gravity;\n }\n } else {\n if (!size.height) {\n this._gravity += size.gravity;\n }\n }\n }\n\n for (var i = 0; i < this._sizes.length; i++) {\n cell = this.$cells[i];\n\n if (cell.$config.hidden) {\n continue;\n }\n\n size = this._sizes[i];\n var width = size.width;\n var height = size.height;\n\n if (this._xLayout) {\n this._calcFreeSpace(width, size, true);\n } else {\n this._calcFreeSpace(height, size, false);\n }\n }\n\n for (var i = 0; i < this.$cells.length; i++) {\n cell = this.$cells[i];\n\n if (cell.$config.hidden) {\n continue;\n }\n\n size = this._sizes[i];\n var dx = void 0;\n var dy = void 0;\n\n if (this._xLayout) {\n dx = this._calcSize(size.width, size, true);\n dy = y - padding * 2; // layout height without paddings\n } else {\n dx = x - padding * 2; // layout width without paddings\n\n dy = this._calcSize(size.height, size, false);\n }\n\n cell.setSize(dx, dy);\n }\n };\n\n return Layout;\n}(Cell);\n\nmodule.exports = Layout;","// optimized checker for links smart rendering\n// first check the vertical position since it's easier to calculate\nmodule.exports = function isLinkInViewPort(item, viewport, view, config, gantt) {\n var source = view.$gantt.getTask(item.source);\n var target = view.$gantt.getTask(item.target); // check vertical visibility first since it's a lighter check\n\n var sourceTop = view.getItemTop(source.id);\n var sourceHeight = view.getItemHeight(source.id);\n var targetTop = view.getItemTop(target.id);\n var targetHeight = view.getItemHeight(target.id);\n\n if (viewport.y > sourceTop + sourceHeight && viewport.y > targetTop + targetHeight) {\n return false;\n }\n\n if (viewport.y_end < targetTop && viewport.y_end < sourceTop) {\n return false;\n }\n\n var padding = 100;\n var sourceLeft = view.posFromDate(source.start_date);\n var sourceRight = view.posFromDate(source.end_date);\n var targetLeft = view.posFromDate(target.start_date);\n var targetRight = view.posFromDate(target.end_date);\n\n if (sourceLeft > sourceRight) {\n // rtl\n var tmp = sourceRight;\n sourceRight = sourceLeft;\n sourceLeft = tmp;\n }\n\n if (targetLeft > targetRight) {\n // rtl\n var tmp = targetRight;\n targetRight = targetLeft;\n targetLeft = tmp;\n }\n\n sourceLeft += -padding; // add buffer for custom elements\n\n sourceRight += padding;\n targetLeft += -padding; // add buffer for custom elements\n\n targetRight += padding;\n\n if (viewport.x > sourceRight && viewport.x > targetRight) {\n return false;\n }\n\n if (viewport.x_end < sourceLeft && viewport.x_end < targetLeft) {\n return false;\n }\n\n return true;\n};","var getLinkRectangle = require(\"../get_link_rectangle\");\n\nmodule.exports = function () {\n var coordinates = [];\n var calculated = false;\n\n function clearCache() {\n coordinates = [];\n calculated = false;\n }\n\n function buildCache(datastore, view, gantt) {\n var config = view.$getConfig();\n var visibleItems = datastore.getVisibleItems(); //datastore.eachItem(function(link){\n\n visibleItems.forEach(function (link) {\n var rec = getLinkRectangle(link, view, config, gantt);\n\n if (!rec) {\n return;\n }\n\n coordinates.push({\n id: link.id,\n rec: rec\n });\n });\n coordinates.sort(function (a, b) {\n if (a.rec.right < b.rec.right) {\n return -1;\n } else {\n return 1;\n }\n });\n calculated = true;\n }\n\n var initialized = false;\n\n function init(datastore) {\n if (initialized) {\n return;\n }\n\n initialized = true;\n datastore.attachEvent(\"onPreFilter\", clearCache);\n datastore.attachEvent(\"onStoreUpdated\", clearCache);\n datastore.attachEvent(\"onClearAll\", clearCache);\n datastore.attachEvent(\"onBeforeStoreUpdate\", clearCache);\n }\n\n return function getVisibleLinksRange(gantt, view, config, datastore, viewport) {\n init(datastore);\n\n if (!calculated) {\n buildCache(datastore, view, gantt);\n }\n\n var visibleBoxes = [];\n\n for (var i = 0; i < coordinates.length; i++) {\n var item = coordinates[i];\n var box = item.rec;\n\n if (box.right < viewport.x) {\n continue;\n }\n\n if (box.left < viewport.x_end && box.right > viewport.x && box.top < viewport.y_end && box.bottom > viewport.y) {\n visibleBoxes.push(item.id);\n }\n }\n\n return {\n ids: visibleBoxes\n };\n };\n};","import { IWorkUnitCache } from \"./workunit_cache_interface\";\r\nimport { WorkUnitsMapCache } from \"./workunit_map_cache\";\r\nimport { WorkUnitsObjectCache } from \"./workunit_object_cache\";\r\nexport { LargerUnitsCache } from \"./larger_units_helper\";\r\n\r\nexport function createCacheObject(): IWorkUnitCache {\r\n\r\n\t// worktime hash is on the hot path,\r\n\t// Map seems to work faster than plain array, use it whenever possible\r\n\tif (typeof Map !== \"undefined\") {\r\n\t\treturn new WorkUnitsMapCache();\r\n\t} else {\r\n\t\treturn new WorkUnitsObjectCache();\r\n\t}\r\n}\r\n","var utils = require(\"../../utils/utils\");\n\nvar helpers = require(\"../../utils/helpers\");\n\nfunction IsWorkTimeArgument(date, unit, task, id, calendar) {\n this.date = date;\n this.unit = unit;\n this.task = task;\n this.id = id;\n this.calendar = calendar;\n return this;\n}\n\nfunction ClosestWorkTimeArgument(date, dir, unit, task, id, calendar) {\n this.date = date;\n this.dir = dir;\n this.unit = unit;\n this.task = task;\n this.id = id;\n this.calendar = calendar;\n return this;\n}\n\nfunction CalculateEndDateArgument(start_date, duration, unit, step, task, id, calendar) {\n this.start_date = start_date;\n this.duration = duration;\n this.unit = unit;\n this.step = step;\n this.task = task;\n this.id = id;\n this.calendar = calendar;\n return this;\n}\n\nfunction GetDurationArgument(start, end, task, calendar) {\n this.start_date = start;\n this.end_date = end;\n this.task = task;\n this.calendar = calendar;\n this.unit = null;\n this.step = null;\n return this;\n}\n\nvar calendarArgumentsHelper = function calendarArgumentsHelper(gantt) {\n return {\n getWorkHoursArguments: function getWorkHoursArguments() {\n var config = arguments[0];\n\n if (helpers.isDate(config)) {\n config = {\n date: config\n };\n } else {\n config = utils.mixin({}, config);\n }\n\n if (!helpers.isValidDate(config.date)) {\n gantt.assert(false, \"Invalid date argument for getWorkHours method\");\n throw new Error(\"Invalid date argument for getWorkHours method\");\n }\n\n return config;\n },\n setWorkTimeArguments: function setWorkTimeArguments() {\n return arguments[0];\n },\n unsetWorkTimeArguments: function unsetWorkTimeArguments() {\n return arguments[0];\n },\n isWorkTimeArguments: function isWorkTimeArguments() {\n var config = arguments[0];\n\n if (config instanceof IsWorkTimeArgument) {\n return config;\n }\n\n var processedConfig;\n\n if (!config.date) {\n //IsWorkTimeArgument(date, unit, task, id, calendar)\n processedConfig = new IsWorkTimeArgument(arguments[0], arguments[1], arguments[2], null, arguments[3]);\n } else {\n processedConfig = new IsWorkTimeArgument(config.date, config.unit, config.task, null, config.calendar);\n }\n\n processedConfig.unit = processedConfig.unit || gantt.config.duration_unit;\n\n if (!helpers.isValidDate(processedConfig.date)) {\n gantt.assert(false, \"Invalid date argument for isWorkTime method\");\n throw new Error(\"Invalid date argument for isWorkTime method\");\n }\n\n return processedConfig;\n },\n getClosestWorkTimeArguments: function getClosestWorkTimeArguments(arg) {\n var config = arguments[0];\n if (config instanceof ClosestWorkTimeArgument) return config;\n var processedConfig;\n\n if (helpers.isDate(config)) {\n processedConfig = new ClosestWorkTimeArgument(config);\n } else {\n processedConfig = new ClosestWorkTimeArgument(config.date, config.dir, config.unit, config.task, null, //config.id,\n config.calendar);\n }\n\n if (config.id) {\n processedConfig.task = config;\n }\n\n processedConfig.dir = config.dir || 'any';\n processedConfig.unit = config.unit || gantt.config.duration_unit;\n\n if (!helpers.isValidDate(processedConfig.date)) {\n gantt.assert(false, \"Invalid date argument for getClosestWorkTime method\");\n throw new Error(\"Invalid date argument for getClosestWorkTime method\");\n }\n\n return processedConfig;\n },\n _getStartEndConfig: function _getStartEndConfig(param) {\n var argumentType = GetDurationArgument;\n var config;\n if (param instanceof argumentType) return param;\n\n if (helpers.isDate(param)) {\n config = new argumentType(arguments[0], arguments[1], arguments[2], arguments[3]);\n } else {\n config = new argumentType(param.start_date, param.end_date, param.task);\n\n if (param.id !== null && param.id !== undefined) {\n config.task = param;\n }\n }\n\n config.unit = config.unit || gantt.config.duration_unit;\n config.step = config.step || gantt.config.duration_step;\n config.start_date = config.start_date || config.start || config.date;\n\n if (!helpers.isValidDate(config.start_date)) {\n gantt.assert(false, \"Invalid start_date argument for getDuration method\");\n throw new Error(\"Invalid start_date argument for getDuration method\");\n }\n\n if (!helpers.isValidDate(config.end_date)) {\n gantt.assert(false, \"Invalid end_date argument for getDuration method\");\n throw new Error(\"Invalid end_date argument for getDuration method\");\n }\n\n return config;\n },\n getDurationArguments: function getDurationArguments(start, end, unit, step) {\n return this._getStartEndConfig.apply(this, arguments);\n },\n hasDurationArguments: function hasDurationArguments(start, end, unit, step) {\n return this._getStartEndConfig.apply(this, arguments);\n },\n calculateEndDateArguments: function calculateEndDateArguments(start, duration, unit, step) {\n var config = arguments[0];\n if (config instanceof CalculateEndDateArgument) return config;\n var processedConfig; //CalculateEndDateArgument(start_date, duration, unit, step, task, id, calendar)\n\n if (helpers.isDate(config)) {\n processedConfig = new CalculateEndDateArgument(arguments[0], arguments[1], arguments[2], undefined, arguments[3], undefined, arguments[4]);\n } else {\n processedConfig = new CalculateEndDateArgument(config.start_date, config.duration, config.unit, config.step, config.task, null, //config.id,\n config.calendar);\n }\n\n if (config.id !== null && config.id !== undefined) {\n processedConfig.task = config; // received a task object as an argument\n // ignore 'unit' and 'step' properties in this case, since it's likely a part of data model of a task\n\n processedConfig.unit = null;\n processedConfig.step = null;\n }\n\n processedConfig.unit = processedConfig.unit || gantt.config.duration_unit;\n processedConfig.step = processedConfig.step || gantt.config.duration_step;\n\n if (!helpers.isValidDate(processedConfig.start_date)) {\n gantt.assert(false, \"Invalid start_date argument for calculateEndDate method\");\n throw new Error(\"Invalid start_date argument for calculateEndDate method\");\n }\n\n return processedConfig;\n }\n };\n};\n\nmodule.exports = calendarArgumentsHelper;","var quickPositionHelperFactory = require(\"./row_position_fixed_height\");\n\nfunction createMixin(view) {\n var getItemTopCache = {};\n var getRowTopCache = {};\n var getItemHeightCache = null;\n var totalHeightCache = -1;\n var getItemHeightCacheState = null;\n var quickPosition = quickPositionHelperFactory(view);\n return {\n _resetTopPositionHeight: function _resetTopPositionHeight() {\n getItemTopCache = {};\n getRowTopCache = {};\n quickPosition.resetCache();\n },\n _resetHeight: function _resetHeight() {\n var store = this.$config.rowStore;\n var newState = this.getCacheStateTotalHeight(store);\n\n if (!getItemHeightCacheState) {\n getItemHeightCacheState = newState;\n } else if (this.shouldClearHeightCache(getItemHeightCacheState, newState)) {\n getItemHeightCacheState = newState;\n getItemHeightCache = null;\n }\n\n totalHeightCache = -1;\n quickPosition.resetCache();\n },\n\n /**\r\n * Get top coordinate by row index (order)\r\n * @param {number} index\r\n */\n getRowTop: function getRowTop(index) {\n if (quickPosition.canUseSimpleCalculation()) {\n return quickPosition.getRowTop(index);\n }\n\n var store = this.$config.rowStore;\n\n if (!store) {\n return 0;\n }\n\n if (getRowTopCache[index] !== undefined) {\n return getRowTopCache[index];\n } else {\n var all = store.getIndexRange();\n var top = 0;\n var result = 0;\n\n for (var i = 0; i < all.length; i++) {\n getRowTopCache[i] = top;\n top += this.getItemHeight(all[i].id);\n\n if (i < index) {\n result = top;\n }\n }\n\n return result;\n }\n },\n\n /**\r\n * Get top coordinate by item id\r\n * @param {*} task_id\r\n */\n getItemTop: function getItemTop(taskId) {\n if (this.$config.rowStore) {\n if (getItemTopCache[taskId] !== undefined) {\n return getItemTopCache[taskId];\n }\n\n var store = this.$config.rowStore;\n if (!store) return 0;\n var itemIndex = store.getIndexById(taskId);\n\n if (itemIndex === -1 && store.getParent && store.exists(taskId)) {\n var parentId = store.getParent(taskId);\n\n if (store.exists(parentId)) {\n // if task is not found in list - maybe it's parent is a split task and we should use parents index instead\n var parent = store.getItem(parentId);\n\n if (this.$gantt.isSplitTask(parent)) {\n return this.getItemTop(parentId);\n }\n }\n }\n\n getItemTopCache[taskId] = this.getRowTop(itemIndex);\n return getItemTopCache[taskId];\n } else {\n return 0;\n }\n },\n\n /**\r\n * Get height of the item by item id\r\n * @param {*} itemId\r\n */\n getItemHeight: function getItemHeight(itemId) {\n if (quickPosition.canUseSimpleCalculation()) {\n return quickPosition.getItemHeight(itemId);\n }\n\n if (!getItemHeightCache && this.$config.rowStore) {\n this._fillHeightCache(this.$config.rowStore);\n }\n\n if (getItemHeightCache[itemId] !== undefined) {\n return getItemHeightCache[itemId];\n }\n\n var defaultHeight = this.$getConfig().row_height;\n\n if (this.$config.rowStore) {\n var store = this.$config.rowStore;\n if (!store) return defaultHeight;\n var item = store.getItem(itemId);\n return getItemHeightCache[itemId] = item && item.row_height || defaultHeight;\n } else {\n return defaultHeight;\n }\n },\n _fillHeightCache: function _fillHeightCache(store) {\n if (!store) {\n return;\n }\n\n getItemHeightCache = {};\n var defaultHeight = this.$getConfig().row_height;\n store.eachItem(function (item) {\n return getItemHeightCache[item.id] = item && item.row_height || defaultHeight;\n });\n },\n getCacheStateTotalHeight: function getCacheStateTotalHeight(store) {\n var globalHeight = this.$getConfig().row_height;\n var itemHeightCache = {};\n var items = [];\n var sumHeight = 0;\n\n if (store) {\n store.eachItem(function (item) {\n items.push(item);\n itemHeightCache[item.id] = item.row_height;\n sumHeight += item.row_height || globalHeight;\n });\n }\n\n return {\n globalHeight: globalHeight,\n items: items,\n count: items.length,\n sumHeight: sumHeight\n };\n },\n shouldClearHeightCache: function shouldClearHeightCache(oldState, newState) {\n if (oldState.count != newState.count) {\n return true;\n }\n\n if (oldState.globalHeight != newState.globalHeight) {\n return true;\n }\n\n if (oldState.sumHeight != newState.sumHeight) {\n return true;\n }\n\n for (var i in oldState.items) {\n var newValue = newState.items[i];\n\n if (newValue !== undefined && newValue != oldState.items[i]) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\r\n * Get total height of items\r\n */\n getTotalHeight: function getTotalHeight() {\n if (quickPosition.canUseSimpleCalculation()) {\n return quickPosition.getTotalHeight();\n }\n\n if (totalHeightCache != -1) {\n return totalHeightCache;\n }\n\n if (this.$config.rowStore) {\n var store = this.$config.rowStore;\n\n this._fillHeightCache(store);\n\n var getHeight = this.getItemHeight.bind(this);\n var visibleItems = store.getVisibleItems();\n var totalHeight = 0;\n visibleItems.forEach(function (item) {\n totalHeight += getHeight(item.id);\n });\n totalHeightCache = totalHeight;\n return totalHeight;\n } else {\n return 0;\n }\n },\n\n /**\r\n * Get item by top position\r\n * @param {*} top\r\n */\n getItemIndexByTopPosition: function getItemIndexByTopPosition(top) {\n if (this.$config.rowStore) {\n if (quickPosition.canUseSimpleCalculation()) {\n return quickPosition.getItemIndexByTopPosition(top);\n }\n\n var store = this.$config.rowStore;\n\n for (var i = 0; i < store.countVisible(); i++) {\n var current = this.getRowTop(i);\n var next = this.getRowTop(i + 1);\n\n if (!next) {\n var taskId = store.getIdByIndex(i);\n next = current + this.getItemHeight(taskId);\n }\n\n if (top >= current && top < next) {\n return i;\n }\n } // GS-1723: If we iterated all tasks and didn't find the position, the target is below all other tasks\n\n\n return store.countVisible() + 2;\n } else {\n return 0;\n }\n }\n };\n}\n\nmodule.exports = createMixin;","export default class DurationFormatterNumeric implements IDurationFormatter {\r\n\tstatic create = (settings: IDurationFormatterConfig = null): IDurationFormatter => {\r\n\t\treturn new DurationFormatterNumeric();\r\n\t}\r\n\tcanParse = (value: string) : boolean => {\r\n\t\treturn !isNaN(this.parse(value));\r\n\t}\r\n\tformat = (value: number) : string => {\r\n\t\treturn String(value);\r\n\t}\r\n\tparse = (value: string) : number => {\r\n\t\treturn parseInt(value, 10);\r\n\t}\r\n}","function copyLinkIdsArray(gantt, linkIds, targetHash) {\n for (var i = 0; i < linkIds.length; i++) {\n if (gantt.isLinkExists(linkIds[i])) {\n targetHash[linkIds[i]] = gantt.getLink(linkIds[i]);\n }\n }\n}\n\nfunction copyLinkIds(gantt, task, targetHash) {\n copyLinkIdsArray(gantt, task.$source, targetHash);\n copyLinkIdsArray(gantt, task.$target, targetHash);\n}\n\nfunction getSubtreeLinks(gantt, rootId) {\n var res = {};\n\n if (gantt.isTaskExists(rootId)) {\n copyLinkIds(gantt, gantt.getTask(rootId), res);\n }\n\n gantt.eachTask(function (child) {\n copyLinkIds(gantt, child, res);\n }, rootId);\n return res;\n}\n\nfunction getSubtreeTasks(gantt, rootId) {\n var res = {};\n gantt.eachTask(function (child) {\n res[child.id] = child;\n }, rootId);\n return res;\n}\n\nmodule.exports = {\n getSubtreeLinks: getSubtreeLinks,\n getSubtreeTasks: getSubtreeTasks\n};","var ScaleHelper = require(\"./ui/timeline/scales_ignore\");\n\nvar PrimaryScaleHelper = require(\"./ui/timeline/scales\");\n\nfunction resolveConfigRange(unit, gantt) {\n var range = {\n start_date: null,\n end_date: null\n };\n\n if (gantt.config.start_date && gantt.config.end_date) {\n range.start_date = gantt.date[unit + \"_start\"](new Date(gantt.config.start_date));\n var end = new Date(gantt.config.end_date);\n var start_interval = gantt.date[unit + \"_start\"](new Date(end));\n\n if (+end != +start_interval) {\n end = gantt.date.add(start_interval, 1, unit);\n } else {\n end = start_interval;\n }\n\n range.end_date = end;\n }\n\n return range;\n}\n\nfunction _scale_range_unit(gantt) {\n var primaryScale = new PrimaryScaleHelper(gantt).primaryScale();\n var unit = primaryScale.unit;\n var step = primaryScale.step;\n\n if (gantt.config.scale_offset_minimal) {\n var helper = new ScaleHelper(gantt);\n var scales = [helper.primaryScale()].concat(helper.getSubScales());\n helper.sortScales(scales);\n unit = scales[scales.length - 1].unit;\n step = scales[scales.length - 1].step || 1;\n }\n\n return {\n unit: unit,\n step: step\n };\n}\n\nfunction _init_tasks_range(gantt) {\n var cfg = _scale_range_unit(gantt);\n\n var unit = cfg.unit,\n step = cfg.step;\n var range = resolveConfigRange(unit, gantt); // GS-1544: Show correct date range if we have tasks or only projects\n\n if (!(range.start_date && range.end_date)) {\n var onlyProjectTasks = true;\n var tasks = gantt.getTaskByTime();\n\n for (var i = 0; i < tasks.length; i++) {\n var task = tasks[i];\n\n if (task.type !== gantt.config.types.project) {\n onlyProjectTasks = false;\n break;\n }\n }\n\n if (tasks.length && onlyProjectTasks) {\n var start_date = tasks[0].start_date;\n var end_date = gantt.date.add(start_date, 1, gantt.config.duration_unit);\n range = {\n start_date: new Date(start_date),\n end_date: new Date(end_date)\n };\n } else {\n range = gantt.getSubtaskDates();\n }\n\n if (!range.start_date || !range.end_date) {\n range = {\n start_date: new Date(),\n end_date: new Date()\n };\n }\n\n range.start_date = gantt.date[unit + \"_start\"](range.start_date);\n range.start_date = gantt.calculateEndDate({\n start_date: gantt.date[unit + \"_start\"](range.start_date),\n duration: -1,\n unit: unit,\n step: step\n }); //one free column before first task\n\n range.end_date = gantt.date[unit + \"_start\"](range.end_date);\n range.end_date = gantt.calculateEndDate({\n start_date: range.end_date,\n duration: 2,\n unit: unit,\n step: step\n }); //one free column after last task\n }\n\n gantt._min_date = range.start_date;\n gantt._max_date = range.end_date;\n}\n\nfunction _adjust_scales(gantt) {\n if (gantt.config.fit_tasks) {\n var old_min = +gantt._min_date,\n old_max = +gantt._max_date; //this._init_tasks_range();\n\n if (+gantt._min_date != old_min || +gantt._max_date != old_max) {\n gantt.render();\n gantt.callEvent(\"onScaleAdjusted\", []);\n return true;\n }\n }\n\n return false;\n}\n\nmodule.exports = function updateTasksRange(gantt) {\n _init_tasks_range(gantt);\n\n _adjust_scales(gantt);\n};","var powerArray = require(\"./power_array\");\n\nvar utils = require(\"../../utils/utils\");\n\nvar helpers = require(\"../../utils/helpers\");\n\nvar DataStore = require(\"./datastore\");\n\nvar isPlaceholderTask = require(\"../../utils/placeholder_task\");\n\nvar _require = require(\"../../utils/helpers\"),\n replaceValidZeroId = _require.replaceValidZeroId; // TODO: remove workaround for mixup with es5 and ts imports\n\n\nif (DataStore[\"default\"]) {\n DataStore = DataStore[\"default\"];\n}\n\nvar TreeDataStore = function TreeDataStore(config) {\n DataStore.apply(this, [config]);\n this._branches = {};\n this.pull = {}; //GS-761 Update existing item instead of adding it to the new position\n\n this.$initItem = function (item) {\n var loadedItem = item;\n\n if (config.initItem) {\n loadedItem = config.initItem(loadedItem);\n }\n\n var existingItem = this.getItem(item.id);\n\n if (existingItem && existingItem.parent != loadedItem.parent) {\n this.move(loadedItem.id, loadedItem.$index || -1, loadedItem.parent || this._ganttConfig.root_id);\n }\n\n return loadedItem;\n };\n\n this.$parentProperty = config.parentProperty || \"parent\";\n\n if (typeof config.rootId !== \"function\") {\n this.$getRootId = function (val) {\n return function () {\n return val;\n };\n }(config.rootId || 0);\n } else {\n this.$getRootId = config.rootId;\n } // TODO: replace with live reference to gantt config\n\n\n this.$openInitially = config.openInitially;\n this.visibleOrder = powerArray.$create();\n this.fullOrder = powerArray.$create();\n this._searchVisibleOrder = {};\n this._indexRangeCache = {};\n this._eachItemMainRangeCache = null;\n this._getItemsCache = null;\n this._skip_refresh = false;\n this._ganttConfig = null;\n\n if (config.getConfig) {\n this._ganttConfig = config.getConfig();\n }\n\n var splitParents = {};\n var splitItems = {};\n var taskOpenState = {};\n var taskVisibility = {};\n var haveSplitItems = false;\n\n this._attachDataChange(function () {\n this._indexRangeCache = {};\n this._eachItemMainRangeCache = null;\n this._getItemsCache = null;\n return true;\n });\n\n this.attachEvent(\"onPreFilter\", function () {\n this._indexRangeCache = {};\n this._eachItemMainRangeCache = null;\n splitParents = {};\n splitItems = {};\n taskOpenState = {};\n taskVisibility = {};\n haveSplitItems = false;\n this.eachItem(function (item) {\n var parent = this.getParent(item.id);\n\n if (item.$open && taskOpenState[parent] !== false) {\n taskOpenState[item.id] = true;\n } else {\n taskOpenState[item.id] = false;\n }\n\n if (this._isSplitItem(item)) {\n haveSplitItems = true;\n splitParents[item.id] = true;\n splitItems[item.id] = true;\n }\n\n if (haveSplitItems && splitItems[parent]) {\n splitItems[item.id] = true;\n }\n\n if (taskOpenState[parent] || taskOpenState[parent] === undefined) {\n taskVisibility[item.id] = true;\n } else {\n taskVisibility[item.id] = false;\n }\n });\n });\n this.attachEvent(\"onFilterItem\", function (id, item) {\n var canOpenSplitTasks = false;\n\n if (this._ganttConfig) {\n var canOpenSplitTasks = this._ganttConfig.open_split_tasks;\n }\n\n var open = taskVisibility[item.id];\n\n if (haveSplitItems) {\n if (open && splitItems[item.id] && !splitParents[item.id]) {\n open = !!canOpenSplitTasks;\n }\n\n if (splitItems[item.id] && !splitParents[item.id]) {\n item.$split_subtask = true;\n }\n }\n\n item.$expanded_branch = !!taskVisibility[item.id];\n return !!open;\n });\n this.attachEvent(\"onFilter\", function () {\n splitParents = {};\n splitItems = {};\n taskOpenState = {};\n taskVisibility = {};\n });\n return this;\n};\n\nTreeDataStore.prototype = utils.mixin({\n _buildTree: function _buildTree(data) {\n var item = null;\n var rootId = this.$getRootId();\n\n for (var i = 0, len = data.length; i < len; i++) {\n item = data[i];\n this.setParent(item, replaceValidZeroId(this.getParent(item), rootId) || rootId);\n } // calculating $level for each item\n\n\n for (var i = 0, len = data.length; i < len; i++) {\n item = data[i];\n\n this._add_branch(item);\n\n item.$level = this.calculateItemLevel(item);\n item.$local_index = this.getBranchIndex(item.id);\n\n if (!utils.defined(item.$open)) {\n item.$open = utils.defined(item.open) ? item.open : this.$openInitially();\n }\n }\n\n this._updateOrder();\n },\n _isSplitItem: function _isSplitItem(item) {\n return item.render == \"split\" && this.hasChild(item.id);\n },\n parse: function parse(data) {\n if (!this._skip_refresh) {\n this.callEvent(\"onBeforeParse\", [data]);\n }\n\n var loaded = this._parseInner(data);\n\n this._buildTree(loaded);\n\n this.filter();\n\n if (!this._skip_refresh) {\n this.callEvent(\"onParse\", [loaded]);\n }\n },\n _addItemInner: function _addItemInner(item, index) {\n var parent = this.getParent(item);\n\n if (!utils.defined(parent)) {\n parent = this.$getRootId();\n this.setParent(item, parent);\n }\n\n var parentIndex = this.getIndexById(parent);\n var targetIndex = parentIndex + Math.min(Math.max(index, 0), this.visibleOrder.length);\n\n if (targetIndex * 1 !== targetIndex) {\n targetIndex = undefined;\n }\n\n DataStore.prototype._addItemInner.call(this, item, targetIndex);\n\n this.setParent(item, parent);\n\n if (item.hasOwnProperty(\"$rendered_parent\")) {\n this._move_branch(item, item.$rendered_parent);\n }\n\n this._add_branch(item, index);\n },\n _changeIdInner: function _changeIdInner(oldId, newId) {\n var children = this.getChildren(oldId);\n var visibleOrder = this._searchVisibleOrder[oldId];\n\n DataStore.prototype._changeIdInner.call(this, oldId, newId);\n\n var parent = this.getParent(newId);\n\n this._replace_branch_child(parent, oldId, newId);\n\n if (this._branches[oldId]) {\n this._branches[newId] = this._branches[oldId];\n }\n\n for (var i = 0; i < children.length; i++) {\n var child = this.getItem(children[i]);\n child[this.$parentProperty] = newId;\n child.$rendered_parent = newId;\n }\n\n this._searchVisibleOrder[newId] = visibleOrder;\n delete this._branches[oldId];\n },\n _traverseBranches: function _traverseBranches(code, parent) {\n if (!utils.defined(parent)) {\n parent = this.$getRootId();\n }\n\n var branch = this._branches[parent];\n\n if (branch) {\n for (var i = 0; i < branch.length; i++) {\n var itemId = branch[i];\n code.call(this, itemId);\n if (this._branches[itemId]) this._traverseBranches(code, itemId);\n }\n }\n },\n _updateOrder: function _updateOrder(code) {\n this.fullOrder = powerArray.$create();\n\n this._traverseBranches(function (taskId) {\n this.fullOrder.push(taskId);\n });\n\n if (code) DataStore.prototype._updateOrder.call(this, code);\n },\n _removeItemInner: function _removeItemInner(id) {\n var items = [];\n this.eachItem(function (child) {\n items.push(child);\n }, id);\n items.push(this.getItem(id));\n\n for (var i = 0; i < items.length; i++) {\n this._move_branch(items[i], this.getParent(items[i]), null);\n\n DataStore.prototype._removeItemInner.call(this, items[i].id);\n\n this._move_branch(items[i], this.getParent(items[i]), null);\n }\n },\n move: function move(sid, tindex, parent) {\n //target id as 4th parameter\n var id = arguments[3];\n var config = this._ganttConfig || {};\n var root_id = config.root_id || 0;\n id = replaceValidZeroId(id, root_id);\n\n if (id) {\n if (id === sid) return;\n parent = this.getParent(id);\n tindex = this.getBranchIndex(id);\n }\n\n if (sid == parent) {\n return;\n }\n\n if (!utils.defined(parent)) {\n parent = this.$getRootId();\n }\n\n var source = this.getItem(sid);\n var source_pid = this.getParent(source.id);\n var tbranch = this.getChildren(parent);\n if (tindex == -1) tindex = tbranch.length + 1;\n\n if (source_pid == parent) {\n var sindex = this.getBranchIndex(sid);\n if (sindex == tindex) return;\n }\n\n if (this.callEvent(\"onBeforeItemMove\", [sid, parent, tindex]) === false) return false;\n var placeholderIds = [];\n\n for (var i = 0; i < tbranch.length; i++) {\n if (isPlaceholderTask(tbranch[i], null, this, this._ganttConfig)) {\n placeholderIds.push(tbranch[i]);\n tbranch.splice(i, 1);\n i--;\n }\n }\n\n this._replace_branch_child(source_pid, sid);\n\n tbranch = this.getChildren(parent);\n var tid = tbranch[tindex];\n tid = replaceValidZeroId(tid, root_id);\n if (!tid) //adding as last element\n tbranch.push(sid);else tbranch = tbranch.slice(0, tindex).concat([sid]).concat(tbranch.slice(tindex));\n\n if (placeholderIds.length) {\n tbranch = tbranch.concat(placeholderIds);\n }\n\n this.setParent(source, parent);\n this._branches[parent] = tbranch;\n var diff = this.calculateItemLevel(source) - source.$level;\n source.$level += diff;\n this.eachItem(function (item) {\n item.$level += diff;\n }, source.id, this);\n\n this._moveInner(this.getIndexById(sid), this.getIndexById(parent) + tindex);\n\n this.callEvent(\"onAfterItemMove\", [sid, parent, tindex]);\n this.refresh();\n },\n getBranchIndex: function getBranchIndex(id) {\n var branch = this.getChildren(this.getParent(id));\n var index = branch.indexOf(id + \"\");\n\n if (index == -1) {\n index = branch.indexOf(+id);\n }\n\n return index;\n },\n hasChild: function hasChild(id) {\n var branch = this._branches[id];\n return branch && branch.length;\n },\n getChildren: function getChildren(id) {\n var branch = this._branches[id];\n return branch ? branch : powerArray.$create();\n },\n isChildOf: function isChildOf(childId, parentId) {\n if (!this.exists(childId)) return false;\n if (parentId === this.$getRootId()) return true;\n if (!this.hasChild(parentId)) return false;\n var item = this.getItem(childId);\n var pid = this.getParent(childId);\n var parent = this.getItem(parentId);\n\n if (parent.$level >= item.$level) {\n return false;\n }\n\n while (item && this.exists(pid)) {\n item = this.getItem(pid);\n if (item && item.id == parentId) return true;\n pid = this.getParent(item);\n }\n\n return false;\n },\n getSiblings: function getSiblings(id) {\n if (!this.exists(id)) {\n return powerArray.$create();\n }\n\n var parent = this.getParent(id);\n return this.getChildren(parent);\n },\n getNextSibling: function getNextSibling(id) {\n var siblings = this.getSiblings(id);\n\n for (var i = 0, len = siblings.length; i < len; i++) {\n if (siblings[i] == id) {\n var nextSibling = siblings[i + 1];\n\n if (nextSibling === 0 && i > 0) {\n nextSibling = \"0\";\n }\n\n return nextSibling || null;\n }\n }\n\n return null;\n },\n getPrevSibling: function getPrevSibling(id) {\n var siblings = this.getSiblings(id);\n\n for (var i = 0, len = siblings.length; i < len; i++) {\n if (siblings[i] == id) {\n var previousSibling = siblings[i - 1];\n\n if (previousSibling === 0 && i > 0) {\n previousSibling = \"0\";\n }\n\n return previousSibling || null;\n }\n }\n\n return null;\n },\n getParent: function getParent(id) {\n var item = null;\n\n if (id.id !== undefined) {\n item = id;\n } else {\n item = this.getItem(id);\n }\n\n var parent;\n\n if (item) {\n parent = item[this.$parentProperty];\n } else {\n parent = this.$getRootId();\n }\n\n return parent;\n },\n clearAll: function clearAll() {\n this._branches = {};\n DataStore.prototype.clearAll.call(this);\n },\n calculateItemLevel: function calculateItemLevel(item) {\n var level = 0;\n this.eachParent(function () {\n level++;\n }, item);\n return level;\n },\n _setParentInner: function _setParentInner(item, new_pid, silent) {\n if (!silent) {\n if (item.hasOwnProperty(\"$rendered_parent\")) {\n this._move_branch(item, item.$rendered_parent, new_pid);\n } else {\n this._move_branch(item, item[this.$parentProperty], new_pid);\n }\n }\n },\n setParent: function setParent(item, new_pid, silent) {\n this._setParentInner(item, new_pid, silent);\n\n item[this.$parentProperty] = new_pid;\n },\n _eachItemCached: function _eachItemCached(code, cache) {\n for (var i = 0, len = cache.length; i < len; i++) {\n code.call(this, cache[i]);\n }\n },\n _eachItemIterate: function _eachItemIterate(code, startId, cache) {\n var itemsStack = this.getChildren(startId);\n\n if (itemsStack.length) {\n itemsStack = itemsStack.slice().reverse();\n }\n\n while (itemsStack.length) {\n var itemId = itemsStack.pop();\n var item = this.getItem(itemId);\n code.call(this, item);\n\n if (cache) {\n cache.push(item);\n }\n\n if (this.hasChild(item.id)) {\n var children = this.getChildren(item.id);\n var len = children.length;\n\n for (var i = len - 1; i >= 0; i--) {\n itemsStack.push(children[i]);\n }\n }\n }\n },\n eachItem: function eachItem(code, parent) {\n var rootId = this.$getRootId();\n\n if (!utils.defined(parent)) {\n parent = rootId;\n }\n\n var startId = replaceValidZeroId(parent, rootId) || rootId;\n var useCache = false;\n var buildCache = false;\n var cache = null;\n\n if (startId === rootId) {\n if (this._eachItemMainRangeCache) {\n useCache = true;\n cache = this._eachItemMainRangeCache;\n } else {\n buildCache = true;\n cache = this._eachItemMainRangeCache = [];\n }\n }\n\n if (useCache) {\n this._eachItemCached(code, cache);\n } else {\n this._eachItemIterate(code, startId, buildCache ? cache : null);\n }\n },\n eachParent: function eachParent(code, startItem) {\n var parentsHash = {};\n var item = startItem;\n var parent = this.getParent(item);\n\n while (this.exists(parent)) {\n if (parentsHash[parent]) {\n throw new Error(\"Invalid tasks tree. Cyclic reference has been detected on task \" + parent);\n }\n\n parentsHash[parent] = true;\n item = this.getItem(parent);\n code.call(this, item);\n parent = this.getParent(item);\n }\n },\n _add_branch: function _add_branch(item, index, parent) {\n var pid = parent === undefined ? this.getParent(item) : parent;\n if (!this.hasChild(pid)) this._branches[pid] = powerArray.$create();\n var branch = this.getChildren(pid);\n var added_already = branch.indexOf(item.id + \"\") > -1 || branch.indexOf(+item.id) > -1;\n\n if (!added_already) {\n if (index * 1 == index) {\n branch.splice(index, 0, item.id);\n } else {\n branch.push(item.id);\n }\n\n item.$rendered_parent = pid;\n }\n },\n _move_branch: function _move_branch(item, old_parent, new_parent) {\n this._eachItemMainRangeCache = null; //this.setParent(item, new_parent);\n //this._sync_parent(task);\n\n this._replace_branch_child(old_parent, item.id);\n\n if (this.exists(new_parent) || new_parent == this.$getRootId()) {\n this._add_branch(item, undefined, new_parent);\n } else {\n delete this._branches[item.id];\n }\n\n item.$level = this.calculateItemLevel(item);\n this.eachItem(function (child) {\n child.$level = this.calculateItemLevel(child);\n }, item.id);\n },\n _replace_branch_child: function _replace_branch_child(node, old_id, new_id) {\n var branch = this.getChildren(node);\n\n if (branch && node !== undefined) {\n var newbranch = powerArray.$create();\n var index = branch.indexOf(old_id + \"\");\n\n if (index == -1 && !isNaN(+old_id)) {\n index = branch.indexOf(+old_id);\n }\n\n if (index > -1) {\n if (new_id) {\n branch.splice(index, 1, new_id);\n } else {\n branch.splice(index, 1);\n }\n }\n\n newbranch = branch;\n this._branches[node] = newbranch;\n }\n },\n sort: function sort(field, desc, parent) {\n if (!this.exists(parent)) {\n parent = this.$getRootId();\n }\n\n if (!field) field = \"order\";\n var criteria = typeof field == \"string\" ? function (a, b) {\n if (a[field] == b[field] || helpers.isDate(a[field]) && helpers.isDate(b[field]) && a[field].valueOf() == b[field].valueOf()) {\n return 0;\n }\n\n var result = a[field] > b[field];\n return result ? 1 : -1;\n } : field;\n\n if (desc) {\n var original_criteria = criteria;\n\n criteria = function criteria(a, b) {\n return original_criteria(b, a);\n };\n }\n\n var els = this.getChildren(parent);\n\n if (els) {\n var temp = [];\n\n for (var i = els.length - 1; i >= 0; i--) {\n temp[i] = this.getItem(els[i]);\n }\n\n temp.sort(criteria);\n\n for (var i = 0; i < temp.length; i++) {\n els[i] = temp[i].id;\n this.sort(field, desc, els[i]);\n }\n }\n },\n filter: function filter(rule) {\n for (var i in this.pull) {\n var renderedParent = this.pull[i].$rendered_parent;\n var actualParent = this.getParent(this.pull[i]);\n\n if (renderedParent !== actualParent) {\n this._move_branch(this.pull[i], renderedParent, actualParent);\n }\n }\n\n return DataStore.prototype.filter.apply(this, arguments);\n },\n open: function open(id) {\n if (this.exists(id)) {\n this.getItem(id).$open = true; // GS-2170. Do not recalculate the indexes and dates as they will be recalculated later\n\n this._skipTaskRecalculation = true;\n this.callEvent(\"onItemOpen\", [id]);\n }\n },\n close: function close(id) {\n if (this.exists(id)) {\n this.getItem(id).$open = false; // GS-2170. Do not recalculate the indexes and dates as they will be recalculated later\n\n this._skipTaskRecalculation = true;\n this.callEvent(\"onItemClose\", [id]);\n }\n },\n destructor: function destructor() {\n DataStore.prototype.destructor.call(this);\n this._branches = null;\n this._indexRangeCache = {};\n this._eachItemMainRangeCache = null;\n }\n}, DataStore.prototype);\nmodule.exports = TreeDataStore;","var utils = require(\"../../utils/utils\");\n\nvar $powerArray = {\n $create: function $create(array) {\n return utils.mixin(array || [], this);\n },\n //remove element at specified position\n $removeAt: function $removeAt(pos, len) {\n if (pos >= 0) this.splice(pos, len || 1);\n },\n //find element in collection and remove it\n $remove: function $remove(value) {\n this.$removeAt(this.$find(value));\n },\n //add element to collection at specific position\n $insertAt: function $insertAt(data, pos) {\n if (!pos && pos !== 0) //add to the end by default\n this.push(data);else {\n var b = this.splice(pos, this.length - pos);\n this[pos] = data;\n this.push.apply(this, b); //reconstruct array without loosing this pointer\n }\n },\n //return index of element, -1 if it doesn't exists\n $find: function $find(data) {\n for (var i = 0; i < this.length; i++) {\n if (data == this[i]) return i;\n }\n\n return -1;\n },\n //execute some method for each element of array\n $each: function $each(functor, master) {\n for (var i = 0; i < this.length; i++) {\n functor.call(master || this, this[i]);\n }\n },\n //create new array from source, by using results of functor\n $map: function $map(functor, master) {\n for (var i = 0; i < this.length; i++) {\n this[i] = functor.call(master || this, this[i]);\n }\n\n return this;\n },\n $filter: function $filter(functor, master) {\n for (var i = 0; i < this.length; i++) {\n if (!functor.call(master || this, this[i])) {\n this.splice(i, 1);\n i--;\n }\n }\n\n return this;\n }\n};\nmodule.exports = $powerArray;","var powerArray = require(\"./power_array\");\n\nvar utils = require(\"../../utils/utils\");\n\nvar eventable = require(\"../../utils/eventable\");\n\nvar isPlaceholderTask = require(\"../../utils/placeholder_task\");\n\nvar DataStore = function DataStore(config) {\n this.pull = {};\n this.$initItem = config.initItem;\n this.visibleOrder = powerArray.$create();\n this.fullOrder = powerArray.$create();\n this._skip_refresh = false;\n this._filterRule = null;\n this._searchVisibleOrder = {};\n this._indexRangeCache = {};\n this._getItemsCache = null;\n this.$config = config;\n eventable(this);\n\n this._attachDataChange(function () {\n this._indexRangeCache = {};\n this._getItemsCache = null;\n return true;\n });\n\n return this;\n};\n\nDataStore.prototype = {\n _attachDataChange: function _attachDataChange(callback) {\n this.attachEvent(\"onClearAll\", callback);\n this.attachEvent(\"onBeforeParse\", callback);\n this.attachEvent(\"onBeforeUpdate\", callback);\n this.attachEvent(\"onBeforeDelete\", callback);\n this.attachEvent(\"onBeforeAdd\", callback);\n this.attachEvent(\"onParse\", callback);\n this.attachEvent(\"onBeforeFilter\", callback);\n },\n _parseInner: function _parseInner(data) {\n var item = null,\n loaded = [];\n\n for (var i = 0, len = data.length; i < len; i++) {\n item = data[i];\n\n if (this.$initItem) {\n if (this.$config.copyOnParse()) {\n item = utils.copy(item);\n }\n\n item = this.$initItem(item);\n }\n\n if (this.callEvent(\"onItemLoading\", [item])) {\n if (!this.pull.hasOwnProperty(item.id)) {\n this.fullOrder.push(item.id);\n }\n\n loaded.push(item);\n this.pull[item.id] = item;\n }\n }\n\n return loaded;\n },\n parse: function parse(data) {\n if (!this.isSilent()) {\n this.callEvent(\"onBeforeParse\", [data]);\n }\n\n var loaded = this._parseInner(data);\n\n if (!this.isSilent()) {\n this.refresh();\n this.callEvent(\"onParse\", [loaded]);\n }\n },\n getItem: function getItem(id) {\n return this.pull[id];\n },\n _updateOrder: function _updateOrder(code) {\n code.call(this.visibleOrder);\n code.call(this.fullOrder);\n },\n updateItem: function updateItem(id, item) {\n if (!utils.defined(item)) item = this.getItem(id);\n\n if (!this.isSilent()) {\n if (this.callEvent(\"onBeforeUpdate\", [item.id, item]) === false) return false;\n } // This is how it worked before updating the properties:\n // this.pull[id]=item;\n\n\n utils.mixin(this.pull[id], item, true);\n\n if (!this.isSilent()) {\n this.callEvent(\"onAfterUpdate\", [item.id, item]);\n this.callEvent(\"onStoreUpdated\", [item.id, item, \"update\"]);\n }\n },\n _removeItemInner: function _removeItemInner(id) {\n //clear from collections\n //this.visibleOrder.$remove(id);\n this._updateOrder(function () {\n this.$remove(id);\n });\n\n delete this.pull[id];\n },\n removeItem: function removeItem(id) {\n //utils.assert(this.exists(id), \"Not existing ID in remove command\"+id);\n var obj = this.getItem(id); //save for later event\n\n if (!this.isSilent()) {\n if (this.callEvent(\"onBeforeDelete\", [obj.id, obj]) === false) return false;\n }\n\n this.callEvent(\"onAfterDeleteConfirmed\", [obj.id, obj]);\n\n this._removeItemInner(id);\n\n if (!this.isSilent()) {\n this.filter();\n this.callEvent(\"onAfterDelete\", [obj.id, obj]); //repaint signal\n\n this.callEvent(\"onStoreUpdated\", [obj.id, obj, \"delete\"]);\n }\n },\n _addItemInner: function _addItemInner(item, index) {\n //in case of treetable order is sent as 3rd parameter\n //var order = index;\n if (this.exists(item.id)) {\n this.silent(function () {\n this.updateItem(item.id, item);\n });\n } else {\n var order = this.visibleOrder; //by default item is added to the end of the list\n\n var data_size = order.length;\n if (!utils.defined(index) || index < 0) index = data_size; //check to prevent too big indexes\n\n if (index > data_size) {\n //dhx.log(\"Warning\",\"DataStore:add\",\"Index of out of bounds\");\n index = Math.min(order.length, index);\n }\n } //gantt.assert(!this.exists(id), \"Not unique ID\");\n\n\n this.pull[item.id] = item;\n\n if (!this.isSilent()) {\n this._updateOrder(function () {\n if (this.$find(item.id) === -1) this.$insertAt(item.id, index);\n });\n }\n\n this.filter(); //order.$insertAt(item.id,index);\n },\n isVisible: function isVisible(id) {\n return this.visibleOrder.$find(id) > -1;\n },\n getVisibleItems: function getVisibleItems() {\n return this.getIndexRange();\n },\n addItem: function addItem(item, index) {\n if (!utils.defined(item.id)) item.id = utils.uid();\n\n if (this.$initItem) {\n item = this.$initItem(item);\n }\n\n if (!this.isSilent()) {\n if (this.callEvent(\"onBeforeAdd\", [item.id, item]) === false) return false;\n }\n\n this._addItemInner(item, index);\n\n if (!this.isSilent()) {\n this.callEvent(\"onAfterAdd\", [item.id, item]); //repaint signal\n\n this.callEvent(\"onStoreUpdated\", [item.id, item, \"add\"]);\n }\n\n return item.id;\n },\n _changeIdInner: function _changeIdInner(oldId, newId) {\n if (this.pull[oldId]) this.pull[newId] = this.pull[oldId];\n var visibleOrder = this._searchVisibleOrder[oldId];\n this.pull[newId].id = newId;\n\n this._updateOrder(function () {\n this[this.$find(oldId)] = newId;\n });\n\n this._searchVisibleOrder[newId] = visibleOrder;\n delete this._searchVisibleOrder[oldId]; //this.visibleOrder[this.visibleOrder.$find(oldId)]=newId;\n\n delete this.pull[oldId];\n },\n changeId: function changeId(oldId, newId) {\n this._changeIdInner(oldId, newId);\n\n this.callEvent(\"onIdChange\", [oldId, newId]);\n },\n exists: function exists(id) {\n return !!this.pull[id];\n },\n _moveInner: function _moveInner(sindex, tindex) {\n var id = this.getIdByIndex(sindex);\n\n this._updateOrder(function () {\n this.$removeAt(sindex);\n this.$insertAt(id, Math.min(this.length, tindex));\n }); //this.visibleOrder.$removeAt(sindex);\t//remove at old position\n //if (sindex<tindex) tindex--;\t//correct shift, caused by element removing\n //this.visibleOrder.$insertAt(id,Math.min(this.visibleOrder.length, tindex));\t//insert at new position\n\n },\n move: function move(sindex, tindex) {\n //gantt.assert(sindex>=0 && tindex>=0, \"DataStore::move\",\"Incorrect indexes\");\n var id = this.getIdByIndex(sindex);\n var obj = this.getItem(id);\n\n this._moveInner(sindex, tindex);\n\n if (!this.isSilent()) {\n //repaint signal\n this.callEvent(\"onStoreUpdated\", [obj.id, obj, \"move\"]);\n }\n },\n clearAll: function clearAll() {\n if (this.$destroyed) {\n return;\n } // GS-956 We need to unselect the resource as its ID is cached\n\n\n this.silent(function () {\n this.unselect();\n });\n this.pull = {};\n this.visibleOrder = powerArray.$create();\n this.fullOrder = powerArray.$create();\n if (this.isSilent()) return;\n this.callEvent(\"onClearAll\", []);\n this.refresh();\n },\n silent: function silent(code, master) {\n var alreadySilent = false;\n\n if (this.isSilent()) {\n alreadySilent = true;\n }\n\n this._skip_refresh = true;\n code.call(master || this);\n\n if (!alreadySilent) {\n this._skip_refresh = false;\n }\n },\n isSilent: function isSilent() {\n return !!this._skip_refresh;\n },\n arraysEqual: function arraysEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) return false;\n\n for (var i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n\n return true;\n },\n refresh: function refresh(id, quick) {\n if (this.isSilent()) return;\n var item;\n\n if (id) {\n item = this.getItem(id);\n }\n\n var args;\n\n if (id) {\n args = [id, item, \"paint\"];\n } else {\n args = [null, null, null];\n }\n\n if (this.callEvent(\"onBeforeStoreUpdate\", args) === false) {\n return;\n }\n\n var skipFilter = this._quick_refresh && !this._mark_recompute;\n this._mark_recompute = false;\n\n if (id) {\n // if item changes visible order (e.g. expand-collapse branch) - do a complete repaint\n if (!quick && !skipFilter) {\n var oldOrder = this.visibleOrder;\n this.filter();\n\n if (!this.arraysEqual(oldOrder, this.visibleOrder)) {\n id = undefined;\n }\n }\n } else if (!skipFilter) {\n this.filter();\n }\n\n if (id) {\n args = [id, item, \"paint\"];\n } else {\n args = [null, null, null];\n }\n\n this.callEvent(\"onStoreUpdated\", args);\n },\n count: function count() {\n return this.fullOrder.length;\n },\n countVisible: function countVisible() {\n return this.visibleOrder.length;\n },\n sort: function sort(_sort) {},\n serialize: function serialize() {},\n eachItem: function eachItem(code) {\n for (var i = 0; i < this.fullOrder.length; i++) {\n var item = this.getItem(this.fullOrder[i]);\n code.call(this, item);\n }\n },\n find: function find(filter) {\n var result = [];\n this.eachItem(function (item) {\n if (filter(item)) {\n result.push(item);\n }\n });\n return result;\n },\n filter: function filter(rule) {\n if (!this.isSilent()) {\n this.callEvent(\"onBeforeFilter\", []);\n }\n\n this.callEvent(\"onPreFilter\", []);\n var filteredOrder = powerArray.$create();\n var placeholderIds = [];\n this.eachItem(function (item) {\n if (this.callEvent(\"onFilterItem\", [item.id, item])) {\n if (isPlaceholderTask(item.id, null, this, this._ganttConfig)) {\n placeholderIds.push(item.id);\n } else {\n filteredOrder.push(item.id);\n }\n }\n });\n\n for (var i = 0; i < placeholderIds.length; i++) {\n filteredOrder.push(placeholderIds[i]);\n }\n\n this.visibleOrder = filteredOrder;\n this._searchVisibleOrder = {};\n\n for (var i = 0; i < this.visibleOrder.length; i++) {\n this._searchVisibleOrder[this.visibleOrder[i]] = i;\n }\n\n if (!this.isSilent()) {\n this.callEvent(\"onFilter\", []);\n }\n },\n getIndexRange: function getIndexRange(from, to) {\n var max = Math.min(to || Infinity, this.countVisible() - 1);\n var min = from || 0;\n var cacheKey = min + '-' + max;\n\n if (this._indexRangeCache[cacheKey]) {\n return this._indexRangeCache[cacheKey].slice();\n }\n\n var ret = [];\n\n for (var i = min; i <= max; i++) {\n ret.push(this.getItem(this.visibleOrder[i]));\n }\n\n this._indexRangeCache[cacheKey] = ret.slice();\n return ret;\n },\n getItems: function getItems() {\n if (this._getItemsCache) {\n return this._getItemsCache.slice();\n }\n\n var res = [];\n\n for (var i in this.pull) {\n res.push(this.pull[i]);\n }\n\n this._getItemsCache = res.slice();\n return res;\n },\n getIdByIndex: function getIdByIndex(index) {\n return this.visibleOrder[index];\n },\n getIndexById: function getIndexById(id) {\n var res = this._searchVisibleOrder[id];\n\n if (res === undefined) {\n res = -1;\n }\n\n return res;\n },\n _getNullIfUndefined: function _getNullIfUndefined(value) {\n if (value === undefined) {\n return null;\n } else {\n return value;\n }\n },\n getFirst: function getFirst() {\n return this._getNullIfUndefined(this.visibleOrder[0]);\n },\n getLast: function getLast() {\n return this._getNullIfUndefined(this.visibleOrder[this.visibleOrder.length - 1]);\n },\n getNext: function getNext(id) {\n return this._getNullIfUndefined(this.visibleOrder[this.getIndexById(id) + 1]);\n },\n getPrev: function getPrev(id) {\n return this._getNullIfUndefined(this.visibleOrder[this.getIndexById(id) - 1]);\n },\n destructor: function destructor() {\n this.callEvent(\"onDestroy\", []);\n this.detachAllEvents();\n this.$destroyed = true;\n this.pull = null;\n this.$initItem = null;\n this.visibleOrder = null;\n this.fullOrder = null;\n this._skip_refresh = null;\n this._filterRule = null;\n this._searchVisibleOrder = null;\n this._indexRangeCache = {};\n }\n};\nmodule.exports = DataStore;","function checkTimeout(host, updPerSecond) {\n if (!updPerSecond) return true;\n if (host._on_timeout) return false;\n var timeout = Math.ceil(1000 / updPerSecond);\n if (timeout < 2) return true;\n setTimeout(function () {\n delete host._on_timeout;\n }, timeout);\n host._on_timeout = true;\n return true;\n}\n\nmodule.exports = checkTimeout;","var utils = require(\"../../../utils/utils\");\n\nfunction createScope(addEvent, removeEvent) {\n addEvent = addEvent || utils.event;\n removeEvent = removeEvent || utils.eventRemove;\n var handlers = [];\n var eventScope = {\n attach: function attach(el, event, callback, capture) {\n handlers.push({\n element: el,\n event: event,\n callback: callback,\n capture: capture\n });\n addEvent(el, event, callback, capture);\n },\n detach: function detach(el, event, callback, capture) {\n removeEvent(el, event, callback, capture);\n\n for (var i = 0; i < handlers.length; i++) {\n var handler = handlers[i];\n\n if (handler.element === el && handler.event === event && handler.callback === callback && handler.capture === capture) {\n handlers.splice(i, 1);\n i--;\n }\n }\n },\n detachAll: function detachAll() {\n var staticArray = handlers.slice(); // original handlers array can be spliced on every iteration\n\n for (var i = 0; i < staticArray.length; i++) {\n var handler = staticArray[i];\n eventScope.detach(handler.element, handler.event, handler.callback, handler.capture);\n eventScope.detach(handler.element, handler.event, handler.callback, undefined);\n eventScope.detach(handler.element, handler.event, handler.callback, false);\n eventScope.detach(handler.element, handler.event, handler.callback, true);\n }\n\n handlers.splice(0, handlers.length);\n },\n extend: function extend() {\n return createScope(this.event, this.eventRemove);\n }\n };\n return eventScope;\n}\n\nmodule.exports = createScope;","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/* eslint-env browser */\nmodule.exports = (typeof self === \"undefined\" ? \"undefined\" : _typeof(self)) == 'object' ? self.FormData : window.FormData;","/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict';\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar punycode = require('punycode');\n\nvar util = require('./util');\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\nexports.Url = Url;\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n} // Reference: RFC 3986, RFC 1808, RFC 2396\n// define these here so at least they only have to be\n// compiled once on the first module load.\n\n\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n // Special case for a simple path URL\nsimplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n // RFC 2396: characters reserved for delimiting URLs.\n// We actually just auto-escape these.\ndelims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n // RFC 2396: characters not allowed for various reasons.\nunwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\nautoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n// Note that any invalid chars are also handled, but these\n// are the ones that are *expected* to be seen, so we fast-path\n// them.\nnonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\nunsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n},\n // protocols that never have a hostname.\nhostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n},\n // protocols that always contain a // bit.\nslashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n},\n querystring = require('querystring');\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n var u = new Url();\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + _typeof(url));\n } // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n\n\n var queryIndex = url.indexOf('?'),\n splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n var rest = url; // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n\n if (simplePath[2]) {\n this.search = simplePath[2];\n\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n } // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n\n\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n } // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n\n\n var auth, atSign;\n\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n } // Now we have a portion which is definitely the auth.\n // Pull that off.\n\n\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n } // the host is the remaining to the left of the first non-host char\n\n\n hostEnd = -1;\n\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n } // if we still have not hit it, then the entire thing is a host.\n\n\n if (hostEnd === -1) hostEnd = rest.length;\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd); // pull out port.\n\n this.parseHost(); // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n\n this.hostname = this.hostname || ''; // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n\n var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; // validate a little.\n\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n } // we test again with ASCII char only\n\n\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host; // strip [ and ] from the hostname\n // the host field still retains them, though\n\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n } // now rest is set to the post-host stuff.\n // chop off any delim chars.\n\n\n if (!unsafeProtocol[lowerProto]) {\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1) continue;\n var esc = encodeURIComponent(ae);\n\n if (esc === ae) {\n esc = escape(ae);\n }\n\n rest = rest.split(ae).join(esc);\n }\n } // chop off from the tail first.\n\n\n var hash = rest.indexOf('#');\n\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n\n var qm = rest.indexOf('?');\n\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n\n if (rest) this.pathname = rest;\n\n if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {\n this.pathname = '/';\n } //to support http.request\n\n\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n } // finally, reconstruct the href based on what has been validated.\n\n\n this.href = this.format();\n return this;\n}; // format a parsed object into a url string\n\n\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\n\nUrl.prototype.format = function () {\n var auth = this.auth || '';\n\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');\n\n if (this.port) {\n host += ':' + this.port;\n }\n }\n\n if (this.query && util.isObject(this.query) && Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n\n var search = this.search || query && '?' + query || '';\n if (protocol && protocol.substr(-1) !== ':') protocol += ':'; // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n\n if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n pathname = pathname.replace(/[?#]/g, function (match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function (relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function (relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n\n var result = new Url();\n var tkeys = Object.keys(this);\n\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n } // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n\n\n result.hash = relative.hash; // if the relative url is empty, then there's nothing left to do here.\n\n if (relative.href === '') {\n result.href = result.format();\n return result;\n } // hrefs like //foo/bar always cut to the protocol.\n\n\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol') result[rkey] = relative[rkey];\n } //urlParse appends trailing / to urls like http://www.example.com\n\n\n if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n\n result.href = result.format();\n return result;\n }\n\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n\n result.href = result.format();\n return result;\n }\n\n result.protocol = relative.protocol;\n\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n\n while (relPath.length && !(relative.host = relPath.shift())) {\n ;\n }\n\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port; // to support http.request\n\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n\n var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/',\n isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/',\n mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname,\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol]; // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;else srcPath.unshift(result.host);\n }\n\n result.host = '';\n\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;else relPath.unshift(relative.host);\n }\n\n relative.host = null;\n }\n\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n\n if (isRelAbs) {\n // it's absolute.\n result.host = relative.host || relative.host === '' ? relative.host : result.host;\n result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath; // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift(); //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n result.search = relative.search;\n result.query = relative.query; //to support http.request\n\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n\n result.href = result.format();\n return result;\n }\n\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null; //to support http.request\n\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n\n result.href = result.format();\n return result;\n } // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n\n\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === ''; // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n\n var up = 0;\n\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n } // if the path is allowed to go above the root, restore leading ..s\n\n\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n\n if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n\n if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {\n srcPath.push('');\n }\n\n var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/'; // put the host back\n\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : ''; //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n mustEndAbs = mustEndAbs || result.host && srcPath.length;\n\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n } //to support request.http\n\n\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\n\nUrl.prototype.parseHost = function () {\n var host = this.host;\n var port = portPattern.exec(host);\n\n if (port) {\n port = port[0];\n\n if (port !== ':') {\n this.port = port.substr(1);\n }\n\n host = host.substr(0, host.length - port.length);\n }\n\n if (host) this.hostname = host;\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n/*<replacement>*/\n\n\nvar util = require('core-util-is');\n\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n var cb = ts.writecb;\n\n if (!cb) {\n return this.emit('error', new Error('write callback called multiple times'));\n }\n\n ts.writechunk = null;\n ts.writecb = null;\n if (data != null) // single equals check for both `null` and `undefined`\n this.push(data);\n cb(er);\n var rs = this._readableState;\n rs.reading = false;\n\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\n\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n Duplex.call(this, options);\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n }; // start out asking for a readable event once data is transformed.\n\n this._readableState.needReadable = true; // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n if (typeof options.flush === 'function') this._flush = options.flush;\n } // When the writable side finishes, then flush out anything remaining.\n\n\n this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n var _this = this;\n\n if (typeof this._flush === 'function') {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n}; // This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\n\n\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n}; // Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\n\n\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n var _this2 = this;\n\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n\n _this2.emit('close');\n });\n};\n\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n if (data != null) // single equals check for both `null` and `undefined`\n stream.push(data); // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n\n if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n return stream.push(null);\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict';\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\n/*</replacement>*/\n\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n encoding = '' + encoding;\n\n switch (encoding && encoding.toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n case 'raw':\n return true;\n\n default:\n return false;\n }\n};\n\nfunction _normalizeEncoding(enc) {\n if (!enc) return 'utf8';\n var retried;\n\n while (true) {\n switch (enc) {\n case 'utf8':\n case 'utf-8':\n return 'utf8';\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return 'utf16le';\n\n case 'latin1':\n case 'binary':\n return 'latin1';\n\n case 'base64':\n case 'ascii':\n case 'hex':\n return enc;\n\n default:\n if (retried) return; // undefined\n\n enc = ('' + enc).toLowerCase();\n retried = true;\n }\n }\n}\n\n; // Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\n\nfunction normalizeEncoding(enc) {\n var nenc = _normalizeEncoding(enc);\n\n if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n return nenc || enc;\n} // StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\n\n\nexports.StringDecoder = StringDecoder;\n\nfunction StringDecoder(encoding) {\n this.encoding = normalizeEncoding(encoding);\n var nb;\n\n switch (this.encoding) {\n case 'utf16le':\n this.text = utf16Text;\n this.end = utf16End;\n nb = 4;\n break;\n\n case 'utf8':\n this.fillLast = utf8FillLast;\n nb = 4;\n break;\n\n case 'base64':\n this.text = base64Text;\n this.end = base64End;\n nb = 3;\n break;\n\n default:\n this.write = simpleWrite;\n this.end = simpleEnd;\n return;\n }\n\n this.lastNeed = 0;\n this.lastTotal = 0;\n this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n if (buf.length === 0) return '';\n var r;\n var i;\n\n if (this.lastNeed) {\n r = this.fillLast(buf);\n if (r === undefined) return '';\n i = this.lastNeed;\n this.lastNeed = 0;\n } else {\n i = 0;\n }\n\n if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n return r || '';\n};\n\nStringDecoder.prototype.end = utf8End; // Returns only complete characters in a Buffer\n\nStringDecoder.prototype.text = utf8Text; // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\n\nStringDecoder.prototype.fillLast = function (buf) {\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n this.lastNeed -= buf.length;\n}; // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\n\n\nfunction utf8CheckByte(_byte) {\n if (_byte <= 0x7F) return 0;else if (_byte >> 5 === 0x06) return 2;else if (_byte >> 4 === 0x0E) return 3;else if (_byte >> 3 === 0x1E) return 4;\n return _byte >> 6 === 0x02 ? -1 : -2;\n} // Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\n\n\nfunction utf8CheckIncomplete(self, buf, i) {\n var j = buf.length - 1;\n if (j < i) return 0;\n var nb = utf8CheckByte(buf[j]);\n\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 1;\n return nb;\n }\n\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 2;\n return nb;\n }\n\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n\n if (nb >= 0) {\n if (nb > 0) {\n if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n }\n\n return nb;\n }\n\n return 0;\n} // Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\n\n\nfunction utf8CheckExtraBytes(self, buf, p) {\n if ((buf[0] & 0xC0) !== 0x80) {\n self.lastNeed = 0;\n return \"\\uFFFD\";\n }\n\n if (self.lastNeed > 1 && buf.length > 1) {\n if ((buf[1] & 0xC0) !== 0x80) {\n self.lastNeed = 1;\n return \"\\uFFFD\";\n }\n\n if (self.lastNeed > 2 && buf.length > 2) {\n if ((buf[2] & 0xC0) !== 0x80) {\n self.lastNeed = 2;\n return \"\\uFFFD\";\n }\n }\n }\n} // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\n\n\nfunction utf8FillLast(buf) {\n var p = this.lastTotal - this.lastNeed;\n var r = utf8CheckExtraBytes(this, buf, p);\n if (r !== undefined) return r;\n\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, p, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n\n buf.copy(this.lastChar, p, 0, buf.length);\n this.lastNeed -= buf.length;\n} // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\n\n\nfunction utf8Text(buf, i) {\n var total = utf8CheckIncomplete(this, buf, i);\n if (!this.lastNeed) return buf.toString('utf8', i);\n this.lastTotal = total;\n var end = buf.length - (total - this.lastNeed);\n buf.copy(this.lastChar, 0, end);\n return buf.toString('utf8', i, end);\n} // For UTF-8, a replacement character is added when ending on a partial\n// character.\n\n\nfunction utf8End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + \"\\uFFFD\";\n return r;\n} // UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\n\n\nfunction utf16Text(buf, i) {\n if ((buf.length - i) % 2 === 0) {\n var r = buf.toString('utf16le', i);\n\n if (r) {\n var c = r.charCodeAt(r.length - 1);\n\n if (c >= 0xD800 && c <= 0xDBFF) {\n this.lastNeed = 2;\n this.lastTotal = 4;\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n return r.slice(0, -1);\n }\n }\n\n return r;\n }\n\n this.lastNeed = 1;\n this.lastTotal = 2;\n this.lastChar[0] = buf[buf.length - 1];\n return buf.toString('utf16le', i, buf.length - 1);\n} // For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\n\n\nfunction utf16End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n\n if (this.lastNeed) {\n var end = this.lastTotal - this.lastNeed;\n return r + this.lastChar.toString('utf16le', 0, end);\n }\n\n return r;\n}\n\nfunction base64Text(buf, i) {\n var n = (buf.length - i) % 3;\n if (n === 0) return buf.toString('base64', i);\n this.lastNeed = 3 - n;\n this.lastTotal = 3;\n\n if (n === 1) {\n this.lastChar[0] = buf[buf.length - 1];\n } else {\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n }\n\n return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n return r;\n} // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\n\n\nfunction simpleWrite(buf) {\n return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n return buf && buf.length ? this.write(buf) : '';\n}","var scope = typeof global !== \"undefined\" && global || typeof self !== \"undefined\" && self || window;\nvar apply = Function.prototype.apply; // DOM APIs, for completeness\n\nexports.setTimeout = function () {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\n\nexports.setInterval = function () {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\n\nexports.clearTimeout = exports.clearInterval = function (timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\n\nTimeout.prototype.unref = Timeout.prototype.ref = function () {};\n\nTimeout.prototype.close = function () {\n this._clearFn.call(scope, this._id);\n}; // Does not start the time, just sets up the members needed.\n\n\nexports.enroll = function (item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function (item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function (item) {\n clearTimeout(item._idleTimeoutId);\n var msecs = item._idleTimeout;\n\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout) item._onTimeout();\n }, msecs);\n }\n}; // setimmediate attaches itself to the global object\n\n\nrequire(\"setimmediate\"); // On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\n\n\nexports.setImmediate = typeof self !== \"undefined\" && self.setImmediate || typeof global !== \"undefined\" && global.setImmediate || this && this.setImmediate;\nexports.clearImmediate = typeof self !== \"undefined\" && self.clearImmediate || typeof global !== \"undefined\" && global.clearImmediate || this && this.clearImmediate;","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n'use strict';\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\n\nmodule.exports = Writable;\n/* <replacement> */\n\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n} // It seems a linked list but it is not\n// there will be only 2 of these for each stream\n\n\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* </replacement> */\n\n/*<replacement>*/\n\n\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n/*<replacement>*/\n\nvar util = require('core-util-is');\n\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar internalUtil = {\n deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar Buffer = require('safe-buffer').Buffer;\n\nvar OurUint8Array = global.Uint8Array || function () {};\n\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\n\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n/*</replacement>*/\n\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n Duplex = Duplex || require('./_stream_duplex');\n options = options || {}; // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n\n var isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n\n var hwm = options.highWaterMark;\n var writableHwm = options.writableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; // cast to ints.\n\n this.highWaterMark = Math.floor(this.highWaterMark); // if _final has been called\n\n this.finalCalled = false; // drain event flag.\n\n this.needDrain = false; // at the start of calling end()\n\n this.ending = false; // when end() has been called, and returned\n\n this.ended = false; // when 'finish' is emitted\n\n this.finished = false; // has it been destroyed\n\n this.destroyed = false; // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n\n this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n\n this.length = 0; // a flag to see when we're in the middle of a write.\n\n this.writing = false; // when true all writes will be buffered until .uncork() call\n\n this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n\n this.sync = true; // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n\n this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)\n\n this.onwrite = function (er) {\n onwrite(stream, er);\n }; // the callback that the user supplies to write(chunk,encoding,cb)\n\n\n this.writecb = null; // the amount that is being written when _write is called.\n\n this.writelen = 0;\n this.bufferedRequest = null;\n this.lastBufferedRequest = null; // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n\n this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n\n this.prefinished = false; // True if the error was already emitted and should not be thrown again\n\n this.errorEmitted = false; // count buffered requests\n\n this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n\n while (current) {\n out.push(current);\n current = current.next;\n }\n\n return out;\n};\n\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})(); // Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\n\n\nvar realHasInstance;\n\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function value(object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function realHasInstance(object) {\n return object instanceof this;\n };\n}\n\nfunction Writable(options) {\n Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n\n if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n return new Writable(options);\n }\n\n this._writableState = new WritableState(options, this); // legacy.\n\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n if (typeof options.writev === 'function') this._writev = options.writev;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n if (typeof options[\"final\"] === 'function') this._final = options[\"final\"];\n }\n\n Stream.call(this);\n} // Otherwise people can pipe Writable streams, which is just wrong.\n\n\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb\n\n stream.emit('error', er);\n pna.nextTick(cb, er);\n} // Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\n\n\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n\n if (er) {\n stream.emit('error', er);\n pna.nextTick(cb, er);\n valid = false;\n }\n\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n if (typeof cb !== 'function') cb = nop;\n if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n}); // if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\n\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n\n var len = state.objectMode ? 1 : chunk.length;\n state.length += len;\n var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.\n\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n pna.nextTick(cb, er); // this can emit finish, and it will always happen\n // after error\n\n pna.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er); // this can emit finish, but finish must\n // always follow error\n\n finishMaybe(stream, state);\n }\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n onwriteStateUpdate(state);\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /*<replacement>*/\n asyncWrite(afterWrite, stream, state, finished, cb);\n /*</replacement>*/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n} // Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\n\n\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n} // if there's something in the buffer waiting, then process it\n\n\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n var count = 0;\n var allBuffers = true;\n\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n\n buffer.allBuffers = allBuffers;\n doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n\n state.pendingcb++;\n state.lastBufferedRequest = null;\n\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks\n\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n } // ignore unnecessary end() calls.\n\n\n if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n\n if (err) {\n stream.emit('error', err);\n }\n\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\n\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function') {\n state.pendingcb++;\n state.finalCalled = true;\n pna.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n\n if (need) {\n prefinish(stream, state);\n\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n }\n }\n\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n\n if (cb) {\n if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n }\n\n state.ended = true;\n stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n\n if (state.corkedRequestsFree) {\n state.corkedRequestsFree.next = corkReq;\n } else {\n state.corkedRequestsFree = corkReq;\n }\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n get: function get() {\n if (this._writableState === undefined) {\n return false;\n }\n\n return this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n } // backward compatibility, the user is explicitly\n // managing destroyed\n\n\n this._writableState.destroyed = value;\n }\n});\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\n\nWritable.prototype._destroy = function (err, cb) {\n this.end();\n cb(err);\n};","'use strict';\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n// undocumented cb() API, needed for core, not for public API\n\n\nfunction destroy(err, cb) {\n var _this = this;\n\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {\n pna.nextTick(emitErrorNT, this, err);\n }\n\n return this;\n } // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n } // if this is a duplex stream mark the writable part as destroyed as well\n\n\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n pna.nextTick(emitErrorNT, _this, err);\n\n if (_this._writableState) {\n _this._writableState.errorEmitted = true;\n }\n } else if (cb) {\n cb(err);\n }\n });\n\n return this;\n}\n\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\n\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\n\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy\n};","module.exports = require('events').EventEmitter;","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\n\nmodule.exports = EventEmitter; // Backwards-compat with node 0.10.x\n\nEventEmitter.EventEmitter = EventEmitter;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\n\nEventEmitter.defaultMaxListeners = 10; // Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\n\nEventEmitter.prototype.setMaxListeners = function (n) {\n if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function (type) {\n var er, handler, len, args, i, listeners;\n if (!this._events) this._events = {}; // If there is no 'error' event listener then throw.\n\n if (type === 'error') {\n if (!this._events.error || isObject(this._events.error) && !this._events.error.length) {\n er = arguments[1];\n\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n if (isUndefined(handler)) return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n\n case 2:\n handler.call(this, arguments[1]);\n break;\n\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n\n for (i = 0; i < len; i++) {\n listeners[i].apply(this, args);\n }\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function (type, listener) {\n var m;\n if (!isFunction(listener)) throw TypeError('listener must be a function');\n if (!this._events) this._events = {}; // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n\n if (this._events.newListener) this.emit('newListener', type, isFunction(listener.listener) ? listener.listener : listener);\n if (!this._events[type]) // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;else if (isObject(this._events[type])) // If we've already got an array, just append.\n this._events[type].push(listener);else // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener]; // Check for listener leak\n\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length);\n\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function (type, listener) {\n if (!isFunction(listener)) throw TypeError('listener must be a function');\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n return this;\n}; // emits a 'removeListener' event iff the listener was removed\n\n\nEventEmitter.prototype.removeListener = function (type, listener) {\n var list, position, length, i;\n if (!isFunction(listener)) throw TypeError('listener must be a function');\n if (!this._events || !this._events[type]) return this;\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener || isFunction(list.listener) && list.listener === listener) {\n delete this._events[type];\n if (this._events.removeListener) this.emit('removeListener', type, listener);\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener || list[i].listener && list[i].listener === listener) {\n position = i;\n break;\n }\n }\n\n if (position < 0) return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener) this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function (type) {\n var key, listeners;\n if (!this._events) return this; // not listening for removeListener, no need to emit\n\n if (!this._events.removeListener) {\n if (arguments.length === 0) this._events = {};else if (this._events[type]) delete this._events[type];\n return this;\n } // emit removeListener for all listeners on all events\n\n\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length) {\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n }\n\n delete this._events[type];\n return this;\n};\n\nEventEmitter.prototype.listeners = function (type) {\n var ret;\n if (!this._events || !this._events[type]) ret = [];else if (isFunction(this._events[type])) ret = [this._events[type]];else ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function (type) {\n if (this._events) {\n var evlistener = this._events[type];\n if (isFunction(evlistener)) return 1;else if (evlistener) return evlistener.length;\n }\n\n return 0;\n};\n\nEventEmitter.listenerCount = function (emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return _typeof(arg) === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict';\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\n\nmodule.exports = Readable;\n/*<replacement>*/\n\nvar isArray = require('isarray');\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n/*<replacement>*/\n\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function EElistenerCount(emitter, type) {\n return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar Buffer = require('safe-buffer').Buffer;\n\nvar OurUint8Array = global.Uint8Array || function () {};\n\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\n\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar util = require('core-util-is');\n\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar debugUtil = require('util');\n\nvar debug = void 0;\n\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function debug() {};\n}\n/*</replacement>*/\n\n\nvar BufferList = require('./internal/streams/BufferList');\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nvar StringDecoder;\nutil.inherits(Readable, Stream);\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n Duplex = Duplex || require('./_stream_duplex');\n options = options || {}; // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n\n var isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n\n var hwm = options.highWaterMark;\n var readableHwm = options.readableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; // cast to ints.\n\n this.highWaterMark = Math.floor(this.highWaterMark); // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n\n this.sync = true; // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false; // has it been destroyed\n\n this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n\n this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s\n\n this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled\n\n this.readingMore = false;\n this.decoder = null;\n this.encoding = null;\n\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\n\nfunction Readable(options) {\n Duplex = Duplex || require('./_stream_duplex');\n if (!(this instanceof Readable)) return new Readable(options);\n this._readableState = new ReadableState(options, this); // legacy\n\n this.readable = true;\n\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n\n Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n get: function get() {\n if (this._readableState === undefined) {\n return false;\n }\n\n return this._readableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n } // backward compatibility, the user is explicitly\n // managing destroyed\n\n\n this._readableState.destroyed = value;\n }\n});\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\n\nReadable.prototype._destroy = function (err, cb) {\n this.push(null);\n cb(err);\n}; // Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\n\n\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n}; // Unshift should *always* be something directly out of read()\n\n\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n var state = stream._readableState;\n\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n\n if (er) {\n stream.emit('error', er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (addToFront) {\n if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n stream.emit('error', new Error('stream.push() after EOF'));\n } else {\n state.reading = false;\n\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n }\n\n return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n if (state.needReadable) emitReadable(stream);\n }\n\n maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n var er;\n\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n\n return er;\n} // if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\n\n\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n}; // backwards compatibility.\n\n\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n}; // Don't raise the hwm > 8MB\n\n\nvar MAX_HWM = 0x800000;\n\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n\n return n;\n} // This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\n\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n } // If we're asking for more than the current hwm, then raise the hwm.\n\n\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n; // Don't have enough\n\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n\n return state.length;\n} // you can override either this method, or the async _read(n) below.\n\n\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.\n\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n } // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n // if we need a readable event, then we need to do some reading.\n\n\n var doRead = state.needReadable;\n debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some\n\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n } // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n\n\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true; // if the length is currently zero, then we *need* a readable event.\n\n if (state.length === 0) state.needReadable = true; // call internal read method\n\n this._read(state.highWaterMark);\n\n state.sync = false; // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.\n\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n return ret;\n};\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n\n if (state.decoder) {\n var chunk = state.decoder.end();\n\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n\n state.ended = true; // emit 'readable' now to make sure it gets picked up.\n\n emitReadable(stream);\n} // Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\n\n\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n} // at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\n\n\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n pna.nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length) // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n\n state.readingMore = false;\n} // abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\n\n\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n\n default:\n state.pipes.push(dest);\n break;\n }\n\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n dest.on('unpipe', onunpipe);\n\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n } // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n\n\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n var cleanedUp = false;\n\n function cleanup() {\n debug('cleanup'); // cleanup event handlers once the pipe is broken\n\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n cleanedUp = true; // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n } // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n\n\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', src._readableState.awaitDrain);\n src._readableState.awaitDrain++;\n increasedAwaitDrain = true;\n }\n\n src.pause();\n }\n } // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n\n\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n } // Make sure our error handler is attached before userland ones.\n\n\n prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.\n\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n\n dest.once('close', onclose);\n\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n } // tell the dest that it's being piped to\n\n\n dest.emit('pipe', src); // start the flow if it hasn't been started already.\n\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = {\n hasUnpiped: false\n }; // if we're not piping anywhere, then do nothing.\n\n if (state.pipesCount === 0) return this; // just one destination. most common case.\n\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n if (!dest) dest = state.pipes; // got a match.\n\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n } // slow case. multiple pipe destinations.\n\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var i = 0; i < len; i++) {\n dests[i].emit('unpipe', this, unpipeInfo);\n }\n\n return this;\n } // try to find the right one.\n\n\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n dest.emit('unpipe', this, unpipeInfo);\n return this;\n}; // set up data events if they are asked for\n// Ensure readable listeners eventually get something\n\n\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n\n if (!state.reading) {\n pna.nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this);\n }\n }\n }\n\n return res;\n};\n\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n} // pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\n\n\nReadable.prototype.resume = function () {\n var state = this._readableState;\n\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n pna.nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n\n while (state.flowing && stream.read() !== null) {}\n} // wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\n\n\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n\n var state = this._readableState;\n var paused = false;\n stream.on('end', function () {\n debug('wrapped end');\n\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n\n _this.push(null);\n });\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode\n\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = _this.push(chunk);\n\n if (!ret) {\n paused = true;\n stream.pause();\n }\n }); // proxy all the other methods.\n // important when wrapping filters and duplexes.\n\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n } // proxy certain important events.\n\n\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n } // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n\n\n this._read = function (n) {\n debug('wrapped _read', n);\n\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.highWaterMark;\n }\n}); // exposed for testing purposes only.\n\nReadable._fromList = fromList; // Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n return ret;\n} // Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\n\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n\n return ret;\n} // Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\n\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n\n break;\n }\n\n ++c;\n }\n\n list.length -= c;\n return ret;\n} // Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\n\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n\n break;\n }\n\n ++c;\n }\n\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState; // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n pna.nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n\n return -1;\n}","exports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = exports;\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');","var capability = require('./capability');\n\nvar inherits = require('inherits');\n\nvar stream = require('readable-stream');\n\nvar rStates = exports.readyStates = {\n UNSENT: 0,\n OPENED: 1,\n HEADERS_RECEIVED: 2,\n LOADING: 3,\n DONE: 4\n};\n\nvar IncomingMessage = exports.IncomingMessage = function (xhr, response, mode, fetchTimer) {\n var self = this;\n stream.Readable.call(self);\n self._mode = mode;\n self.headers = {};\n self.rawHeaders = [];\n self.trailers = {};\n self.rawTrailers = []; // Fake the 'close' event, but only once 'end' fires\n\n self.on('end', function () {\n // The nextTick is necessary to prevent the 'request' module from causing an infinite loop\n process.nextTick(function () {\n self.emit('close');\n });\n });\n\n if (mode === 'fetch') {\n var read = function read() {\n reader.read().then(function (result) {\n if (self._destroyed) return;\n\n if (result.done) {\n global.clearTimeout(fetchTimer);\n self.push(null);\n return;\n }\n\n self.push(new Buffer(result.value));\n read();\n })[\"catch\"](function (err) {\n global.clearTimeout(fetchTimer);\n if (!self._destroyed) self.emit('error', err);\n });\n };\n\n self._fetchResponse = response;\n self.url = response.url;\n self.statusCode = response.status;\n self.statusMessage = response.statusText;\n response.headers.forEach(function (header, key) {\n self.headers[key.toLowerCase()] = header;\n self.rawHeaders.push(key, header);\n });\n\n if (capability.writableStream) {\n var writable = new WritableStream({\n write: function write(chunk) {\n return new Promise(function (resolve, reject) {\n if (self._destroyed) {\n reject();\n } else if (self.push(new Buffer(chunk))) {\n resolve();\n } else {\n self._resumeFetch = resolve;\n }\n });\n },\n close: function close() {\n global.clearTimeout(fetchTimer);\n if (!self._destroyed) self.push(null);\n },\n abort: function abort(err) {\n if (!self._destroyed) self.emit('error', err);\n }\n });\n\n try {\n response.body.pipeTo(writable)[\"catch\"](function (err) {\n global.clearTimeout(fetchTimer);\n if (!self._destroyed) self.emit('error', err);\n });\n return;\n } catch (e) {} // pipeTo method isn't defined. Can't find a better way to feature test this\n\n } // fallback for when writableStream or pipeTo aren't available\n\n\n var reader = response.body.getReader();\n read();\n } else {\n self._xhr = xhr;\n self._pos = 0;\n self.url = xhr.responseURL;\n self.statusCode = xhr.status;\n self.statusMessage = xhr.statusText;\n var headers = xhr.getAllResponseHeaders().split(/\\r?\\n/);\n headers.forEach(function (header) {\n var matches = header.match(/^([^:]+):\\s*(.*)/);\n\n if (matches) {\n var key = matches[1].toLowerCase();\n\n if (key === 'set-cookie') {\n if (self.headers[key] === undefined) {\n self.headers[key] = [];\n }\n\n self.headers[key].push(matches[2]);\n } else if (self.headers[key] !== undefined) {\n self.headers[key] += ', ' + matches[2];\n } else {\n self.headers[key] = matches[2];\n }\n\n self.rawHeaders.push(matches[1], matches[2]);\n }\n });\n self._charset = 'x-user-defined';\n\n if (!capability.overrideMimeType) {\n var mimeType = self.rawHeaders['mime-type'];\n\n if (mimeType) {\n var charsetMatch = mimeType.match(/;\\s*charset=([^;])(;|$)/);\n\n if (charsetMatch) {\n self._charset = charsetMatch[1].toLowerCase();\n }\n }\n\n if (!self._charset) self._charset = 'utf-8'; // best guess\n }\n }\n};\n\ninherits(IncomingMessage, stream.Readable);\n\nIncomingMessage.prototype._read = function () {\n var self = this;\n var resolve = self._resumeFetch;\n\n if (resolve) {\n self._resumeFetch = null;\n resolve();\n }\n};\n\nIncomingMessage.prototype._onXHRProgress = function () {\n var self = this;\n var xhr = self._xhr;\n var response = null;\n\n switch (self._mode) {\n case 'text:vbarray':\n // For IE9\n if (xhr.readyState !== rStates.DONE) break;\n\n try {\n // This fails in IE8\n response = new global.VBArray(xhr.responseBody).toArray();\n } catch (e) {}\n\n if (response !== null) {\n self.push(new Buffer(response));\n break;\n }\n\n // Falls through in IE8\t\n\n case 'text':\n try {\n // This will fail when readyState = 3 in IE9. Switch mode and wait for readyState = 4\n response = xhr.responseText;\n } catch (e) {\n self._mode = 'text:vbarray';\n break;\n }\n\n if (response.length > self._pos) {\n var newData = response.substr(self._pos);\n\n if (self._charset === 'x-user-defined') {\n var buffer = new Buffer(newData.length);\n\n for (var i = 0; i < newData.length; i++) {\n buffer[i] = newData.charCodeAt(i) & 0xff;\n }\n\n self.push(buffer);\n } else {\n self.push(newData, self._charset);\n }\n\n self._pos = response.length;\n }\n\n break;\n\n case 'arraybuffer':\n if (xhr.readyState !== rStates.DONE || !xhr.response) break;\n response = xhr.response;\n self.push(new Buffer(new Uint8Array(response)));\n break;\n\n case 'moz-chunked-arraybuffer':\n // take whole\n response = xhr.response;\n if (xhr.readyState !== rStates.LOADING || !response) break;\n self.push(new Buffer(new Uint8Array(response)));\n break;\n\n case 'ms-stream':\n response = xhr.response;\n if (xhr.readyState !== rStates.LOADING) break;\n var reader = new global.MSStreamReader();\n\n reader.onprogress = function () {\n if (reader.result.byteLength > self._pos) {\n self.push(new Buffer(new Uint8Array(reader.result.slice(self._pos))));\n self._pos = reader.result.byteLength;\n }\n };\n\n reader.onload = function () {\n self.push(null);\n }; // reader.onerror = ??? // TODO: this\n\n\n reader.readAsArrayBuffer(response);\n break;\n } // The ms-stream case handles end separately in reader.onload()\n\n\n if (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') {\n self.push(null);\n }\n};","exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream);\nexports.writableStream = isFunction(global.WritableStream);\nexports.abortController = isFunction(global.AbortController);\nexports.blobConstructor = false;\n\ntry {\n new Blob([new ArrayBuffer(1)]);\n exports.blobConstructor = true;\n} catch (e) {} // The xhr request to example.com may violate some restrictive CSP configurations,\n// so if we're running in a browser that supports `fetch`, avoid calling getXHR()\n// and assume support for certain features below.\n\n\nvar xhr;\n\nfunction getXHR() {\n // Cache the xhr value\n if (xhr !== undefined) return xhr;\n\n if (global.XMLHttpRequest) {\n xhr = new global.XMLHttpRequest(); // If XDomainRequest is available (ie only, where xhr might not work\n // cross domain), use the page location. Otherwise use example.com\n // Note: this doesn't actually make an http request.\n\n try {\n xhr.open('GET', global.XDomainRequest ? '/' : 'https://example.com');\n } catch (e) {\n xhr = null;\n }\n } else {\n // Service workers don't have XHR\n xhr = null;\n }\n\n return xhr;\n}\n\nfunction checkTypeSupport(type) {\n var xhr = getXHR();\n if (!xhr) return false;\n\n try {\n xhr.responseType = type;\n return xhr.responseType === type;\n } catch (e) {}\n\n return false;\n} // For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'.\n// Safari 7.1 appears to have fixed this bug.\n\n\nvar haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined';\nvar haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice); // If fetch is supported, then arraybuffer will be supported too. Skip calling\n// checkTypeSupport(), since that calls getXHR().\n\nexports.arraybuffer = exports.fetch || haveArrayBuffer && checkTypeSupport('arraybuffer'); // These next two tests unavoidably show warnings in Chrome. Since fetch will always\n// be used if it's available, just return false for these to avoid the warnings.\n\nexports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream');\nexports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer && checkTypeSupport('moz-chunked-arraybuffer'); // If fetch is supported, then overrideMimeType will be supported too. Skip calling\n// getXHR().\n\nexports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false);\nexports.vbArray = isFunction(global.VBArray);\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n\nxhr = null; // Help gc","var ClientRequest = require('./lib/request');\n\nvar response = require('./lib/response');\n\nvar extend = require('xtend');\n\nvar statusCodes = require('builtin-status-codes');\n\nvar url = require('url');\n\nvar http = exports;\n\nhttp.request = function (opts, cb) {\n if (typeof opts === 'string') opts = url.parse(opts);else opts = extend(opts); // Normally, the page is loaded from http or https, so not specifying a protocol\n // will result in a (valid) protocol-relative url. However, this won't work if\n // the protocol is something else, like 'file:'\n\n var defaultProtocol = global.location.protocol.search(/^https?:$/) === -1 ? 'http:' : '';\n var protocol = opts.protocol || defaultProtocol;\n var host = opts.hostname || opts.host;\n var port = opts.port;\n var path = opts.path || '/'; // Necessary for IPv6 addresses\n\n if (host && host.indexOf(':') !== -1) host = '[' + host + ']'; // This may be a relative url. The browser should always be able to interpret it correctly.\n\n opts.url = (host ? protocol + '//' + host : '') + (port ? ':' + port : '') + path;\n opts.method = (opts.method || 'GET').toUpperCase();\n opts.headers = opts.headers || {}; // Also valid opts.auth, opts.mode\n\n var req = new ClientRequest(opts);\n if (cb) req.on('response', cb);\n return req;\n};\n\nhttp.get = function get(opts, cb) {\n var req = http.request(opts, cb);\n req.end();\n return req;\n};\n\nhttp.ClientRequest = ClientRequest;\nhttp.IncomingMessage = response.IncomingMessage;\n\nhttp.Agent = function () {};\n\nhttp.Agent.defaultMaxSockets = 4;\nhttp.globalAgent = new http.Agent();\nhttp.STATUS_CODES = statusCodes;\nhttp.METHODS = ['CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD', 'LOCK', 'M-SEARCH', 'MERGE', 'MKACTIVITY', 'MKCOL', 'MOVE', 'NOTIFY', 'OPTIONS', 'PATCH', 'POST', 'PROPFIND', 'PROPPATCH', 'PURGE', 'PUT', 'REPORT', 'SEARCH', 'SUBSCRIBE', 'TRACE', 'UNLOCK', 'UNSUBSCRIBE'];","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};","module.exports = function (gantt) {\n // TODO: why eslint fails on regexp?\n // eslint-disable-next-line no-control-regex\n var htmlTags = new RegExp(\"<(?:.|\\n)*?>\", \"gm\");\n var extraSpaces = new RegExp(\" +\", \"gm\");\n\n function stripHTMLLite(htmlText) {\n return (htmlText + \"\").replace(htmlTags, \" \").replace(extraSpaces, \" \");\n }\n\n var singleQuotes = new RegExp(\"'\", \"gm\");\n\n function escapeQuotes(text) {\n return (text + \"\").replace(singleQuotes, \"'\");\n }\n\n gantt._waiAria = {\n getAttributeString: function getAttributeString(attr) {\n var attributes = [\" \"];\n\n for (var i in attr) {\n var text = escapeQuotes(stripHTMLLite(attr[i]));\n attributes.push(i + \"='\" + text + \"'\");\n }\n\n attributes.push(\" \");\n return attributes.join(\" \");\n },\n getTimelineCellAttr: function getTimelineCellAttr(dateString) {\n return gantt._waiAria.getAttributeString({\n \"aria-label\": dateString\n });\n },\n _taskCommonAttr: function _taskCommonAttr(task, div) {\n if (!(task.start_date && task.end_date)) return;\n div.setAttribute(\"aria-label\", stripHTMLLite(gantt.templates.tooltip_text(task.start_date, task.end_date, task)));\n\n if (task.$dataprocessor_class) {\n div.setAttribute(\"aria-busy\", true);\n }\n },\n setTaskBarAttr: function setTaskBarAttr(task, div) {\n this._taskCommonAttr(task, div); // task bars are complex elements that should be treated as a single element\n\n\n div.setAttribute(\"role\", \"img\");\n\n if (!gantt.isReadonly(task) && gantt.config.drag_move) {\n if (task.id != gantt.getState(\"tasksDnd\").drag_id) {\n div.setAttribute(\"aria-grabbed\", false);\n } else {\n div.setAttribute(\"aria-grabbed\", true);\n }\n }\n },\n taskRowAttr: function taskRowAttr(task, div) {\n this._taskCommonAttr(task, div);\n\n if (!gantt.isReadonly(task) && gantt.config.order_branch) {\n div.setAttribute(\"aria-grabbed\", false);\n }\n\n div.setAttribute(\"role\", \"row\"); // selected attribute should be added only to the grid because\n // other parts don't have the keyboard navigation\n\n div.setAttribute(\"aria-selected\", gantt.isSelectedTask(task.id) ? \"true\" : \"false\"); // allowed values start from 1, set 1 for non-tree datastores\n\n div.setAttribute(\"aria-level\", task.$level + 1 || 1);\n\n if (gantt.hasChild(task.id)) {\n div.setAttribute(\"aria-expanded\", task.$open ? \"true\" : \"false\");\n }\n },\n linkAttr: function linkAttr(link, div) {\n var linkTypes = gantt.config.links;\n var toStart = link.type == linkTypes.finish_to_start || link.type == linkTypes.start_to_start;\n var fromStart = link.type == linkTypes.start_to_start || link.type == linkTypes.start_to_finish;\n var content = gantt.locale.labels.link + \" \" + gantt.templates.drag_link(link.source, fromStart, link.target, toStart); // links are complex elements that should be treated as a single element\n\n div.setAttribute(\"role\", \"img\");\n div.setAttribute(\"aria-label\", stripHTMLLite(content));\n\n if (gantt.isReadonly(link)) {\n div.setAttribute(\"aria-readonly\", true);\n }\n },\n gridSeparatorAttr: function gridSeparatorAttr(div) {\n // the only valid role for the grid header\n div.setAttribute(\"role\", \"columnheader\");\n },\n rowResizerAttr: function rowResizerAttr(div) {\n // the only valid role for the grid header\n div.setAttribute(\"role\", \"row\");\n },\n lightboxHiddenAttr: function lightboxHiddenAttr(div) {\n div.setAttribute(\"aria-hidden\", \"true\");\n },\n lightboxVisibleAttr: function lightboxVisibleAttr(div) {\n div.setAttribute(\"aria-hidden\", \"false\");\n },\n lightboxAttr: function lightboxAttr(div) {\n div.setAttribute(\"role\", \"dialog\");\n div.setAttribute(\"aria-hidden\", \"true\");\n div.firstChild.setAttribute(\"role\", \"heading\");\n div.firstChild.setAttribute(\"aria-level\", \"1\");\n },\n lightboxButtonAttrString: function lightboxButtonAttrString(buttonName) {\n return this.getAttributeString({\n \"role\": \"button\",\n \"aria-label\": gantt.locale.labels[buttonName],\n \"tabindex\": \"0\"\n });\n },\n lightboxHeader: function lightboxHeader(div, headerText) {\n div.setAttribute(\"aria-label\", headerText);\n },\n lightboxSelectAttrString: function lightboxSelectAttrString(time_option) {\n var label = \"\";\n\n switch (time_option) {\n case \"%Y\":\n label = gantt.locale.labels.years;\n break;\n\n case \"%m\":\n label = gantt.locale.labels.months;\n break;\n\n case \"%d\":\n label = gantt.locale.labels.days;\n break;\n\n case \"%H:%i\":\n label = gantt.locale.labels.hours + gantt.locale.labels.minutes;\n break;\n\n default:\n break;\n }\n\n return gantt._waiAria.getAttributeString({\n \"aria-label\": label\n });\n },\n lightboxDurationInputAttrString: function lightboxDurationInputAttrString(section) {\n return this.getAttributeString({\n \"aria-label\": gantt.locale.labels.column_duration,\n \"aria-valuemin\": \"0\",\n \"role\": \"spinbutton\"\n });\n },\n inlineEditorAttr: function inlineEditorAttr(div) {\n div.setAttribute(\"role\", \"row\");\n },\n gridAttrString: function gridAttrString() {\n return [\" role='treegrid'\", gantt.config.multiselect ? \"aria-multiselectable='true'\" : \"aria-multiselectable='false'\", \" \"].join(\" \");\n },\n gridScaleRowAttrString: function gridScaleRowAttrString() {\n return \"role='row'\";\n },\n gridScaleCellAttrString: function gridScaleCellAttrString(column, label) {\n var attrs = \"\";\n\n if (column.name == \"add\") {\n // a more precise role is button, but it is not valid for the grid header\n attrs = this.getAttributeString({\n \"role\": \"columnheader\",\n \"aria-label\": gantt.locale.labels.new_task\n });\n } else {\n var attributes = {\n \"role\": \"columnheader\",\n \"aria-label\": label\n };\n\n if (gantt._sort && gantt._sort.name == column.name) {\n if (gantt._sort.direction == \"asc\") {\n attributes[\"aria-sort\"] = \"ascending\";\n } else {\n attributes[\"aria-sort\"] = \"descending\";\n }\n }\n\n attrs = this.getAttributeString(attributes);\n }\n\n return attrs;\n },\n gridDataAttrString: function gridDataAttrString() {\n return \"role='rowgroup'\";\n },\n reorderMarkerAttr: function reorderMarkerAttr(div) {\n div.setAttribute(\"role\", \"grid\");\n div.firstChild.removeAttribute(\"aria-level\");\n div.firstChild.setAttribute(\"aria-grabbed\", \"true\");\n },\n gridCellAttrString: function gridCellAttrString(column, textValue, task) {\n var attributes = {\n \"role\": \"gridcell\",\n \"aria-label\": textValue\n };\n\n if (!column.editor || gantt.isReadonly(task)) {\n attributes[\"aria-readonly\"] = true;\n }\n\n return this.getAttributeString(attributes);\n },\n gridAddButtonAttrString: function gridAddButtonAttrString(column) {\n return this.getAttributeString({\n \"role\": \"button\",\n \"aria-label\": gantt.locale.labels.new_task\n });\n },\n messageButtonAttrString: function messageButtonAttrString(buttonLabel) {\n return \"tabindex='0' role='button' aria-label='\" + buttonLabel + \"'\";\n },\n messageInfoAttr: function messageInfoAttr(div) {\n div.setAttribute(\"role\", \"alert\"); //div.setAttribute(\"tabindex\", \"-1\");\n },\n messageModalAttr: function messageModalAttr(div, uid) {\n div.setAttribute(\"role\", \"dialog\");\n\n if (uid) {\n div.setAttribute(\"aria-labelledby\", uid);\n } //\tdiv.setAttribute(\"tabindex\", \"-1\");\n\n },\n quickInfoAttr: function quickInfoAttr(div) {\n div.setAttribute(\"role\", \"dialog\");\n },\n quickInfoHeaderAttrString: function quickInfoHeaderAttrString() {\n return \" role='heading' aria-level='1' \";\n },\n quickInfoHeader: function quickInfoHeader(div, header) {\n div.setAttribute(\"aria-label\", header);\n },\n quickInfoButtonAttrString: function quickInfoButtonAttrString(label) {\n return gantt._waiAria.getAttributeString({\n \"role\": \"button\",\n \"aria-label\": label,\n \"tabindex\": \"0\"\n });\n },\n tooltipAttr: function tooltipAttr(div) {\n div.setAttribute(\"role\", \"tooltip\");\n },\n tooltipVisibleAttr: function tooltipVisibleAttr(div) {\n div.setAttribute(\"aria-hidden\", \"false\");\n },\n tooltipHiddenAttr: function tooltipHiddenAttr(div) {\n div.setAttribute(\"aria-hidden\", \"true\");\n }\n };\n\n function isDisabled() {\n return !gantt.config.wai_aria_attributes;\n }\n\n for (var i in gantt._waiAria) {\n gantt._waiAria[i] = function (payload) {\n return function () {\n if (isDisabled()) {\n return \"\";\n }\n\n return payload.apply(this, arguments);\n };\n }(gantt._waiAria[i]);\n }\n};","module.exports = function (gantt) {\n gantt._extend_to_optional = function (lightbox_block) {\n var duration = lightbox_block;\n var optional_time = {\n render: duration.render,\n focus: duration.focus,\n set_value: function set_value(node, value, task, section) {\n var mapping = gantt._resolve_default_mapping(section);\n\n if (!task[mapping.start_date] || mapping.start_date == \"start_date\" && this._isAllowedUnscheduledTask(task)) {\n optional_time.disable(node, section);\n var val = {};\n\n for (var i in mapping) {\n //take default values from the time control from task start/end dates\n val[mapping[i]] = task[i];\n }\n\n return duration.set_value.call(gantt, node, value, val, section); //set default value\n } else {\n optional_time.enable(node, section);\n return duration.set_value.call(gantt, node, value, task, section);\n }\n },\n get_value: function get_value(node, task, section) {\n if (section.disabled) {\n return {\n start_date: null\n };\n } else {\n return duration.get_value.call(gantt, node, task, section);\n }\n },\n update_block: function update_block(node, section) {\n gantt.callEvent(\"onSectionToggle\", [gantt._lightbox_id, section]);\n node.style.display = section.disabled ? \"none\" : \"block\";\n\n if (section.button) {\n var button = node.previousSibling.querySelector(\".gantt_custom_button_label\"),\n labels = gantt.locale.labels;\n var button_text = section.disabled ? labels[section.name + \"_enable_button\"] : labels[section.name + \"_disable_button\"];\n button.innerHTML = button_text;\n }\n\n gantt.resizeLightbox();\n },\n disable: function disable(node, section) {\n section.disabled = true;\n optional_time.update_block(node, section);\n },\n enable: function enable(node, section) {\n section.disabled = false;\n optional_time.update_block(node, section);\n },\n button_click: function button_click(index, el, section, container) {\n if (gantt.callEvent(\"onSectionButton\", [gantt._lightbox_id, section]) === false) {\n return;\n }\n\n var config = gantt._get_typed_lightbox_config()[index];\n\n if (config.disabled) {\n optional_time.enable(container, config);\n } else {\n optional_time.disable(container, config);\n }\n }\n };\n return optional_time;\n };\n\n gantt.form_blocks.duration_optional = gantt._extend_to_optional(gantt.form_blocks.duration);\n gantt.form_blocks.time_optional = gantt._extend_to_optional(gantt.form_blocks.time);\n};","var __extends = require(\"../../../../utils/extends\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./select_control\")(gantt);\n\n function TypeselectControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(TypeselectControl, _super);\n\n TypeselectControl.prototype.render = function (sns) {\n var types = gantt.config.types,\n locale = gantt.locale.labels,\n options = [];\n\n var filter = sns.filter || function (typeKey, typeValue) {\n if (!types.placeholder || typeValue !== types.placeholder) {\n return true;\n }\n\n return false;\n };\n\n for (var i in types) {\n if (!filter(i, types[i]) === false) {\n options.push({\n key: types[i],\n label: locale[\"type_\" + i]\n });\n }\n }\n\n sns.options = options;\n var oldOnChange = sns.onchange;\n\n sns.onchange = function () {\n gantt.changeLightboxType(this.value);\n\n if (this.value === gantt.config.types.task) {\n gantt._lightbox_new_type = \"task\";\n }\n\n if (typeof oldOnChange == 'function') {\n oldOnChange.apply(this, arguments);\n }\n };\n\n return _super.prototype.render.apply(this, arguments);\n };\n\n return TypeselectControl;\n};","var __extends = require(\"../../../../utils/extends\");\n\nvar htmlHelpers = require(\"../../utils/html_helpers\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function ConstraintControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(ConstraintControl, _super);\n\n function isNonTimedConstraint(value) {\n if (!value || value === gantt.config.constraint_types.ASAP || value === gantt.config.constraint_types.ALAP) {\n return true;\n } else {\n return false;\n }\n }\n\n function toggleTimeSelect(timeSelects, typeValue) {\n var isNonTimed = isNonTimedConstraint(typeValue);\n\n for (var i = 0; i < timeSelects.length; i++) {\n timeSelects[i].disabled = isNonTimed;\n }\n }\n\n ConstraintControl.prototype.render = function (sns) {\n var height = (sns.height || 30) + \"px\";\n var html = \"<div class='gantt_cal_ltext gantt_section_\" + sns.name + \"' style='height:\" + height + \";'>\";\n var options = [];\n\n for (var i in gantt.config.constraint_types) {\n options.push({\n key: gantt.config.constraint_types[i],\n label: gantt.locale.labels[gantt.config.constraint_types[i]]\n });\n }\n\n sns.options = sns.options || options;\n html += \"<span data-constraint-type-select>\" + htmlHelpers.getHtmlSelect(sns.options, [{\n key: \"data-type\",\n value: \"constraint-type\"\n }]) + \"</span>\";\n var timeLabel = gantt.locale.labels[\"constraint_date\"] || \"Constraint date\";\n html += \"<label data-constraint-time-select>\" + timeLabel + \": \" + gantt.form_blocks.getTimePicker.call(this, sns) + \"</label>\";\n html += \"</div>\";\n return html;\n };\n\n ConstraintControl.prototype.set_value = function (node, value, task, config) {\n var typeSelect = node.querySelector(\"[data-constraint-type-select] select\");\n var timeSelects = node.querySelectorAll(\"[data-constraint-time-select] select\");\n var map = config._time_format_order;\n\n var mapping = gantt._resolve_default_mapping(config);\n\n if (!typeSelect._eventsInitialized) {\n typeSelect.addEventListener(\"change\", function (e) {\n toggleTimeSelect(timeSelects, e.target.value);\n });\n typeSelect._eventsInitialized = true;\n }\n\n var constraintDate = task[mapping.constraint_date] || new Date();\n\n gantt.form_blocks._fill_lightbox_select(timeSelects, 0, constraintDate, map, config);\n\n var constraintType = task[mapping.constraint_type] || gantt.getConstraintType(task);\n typeSelect.value = constraintType;\n toggleTimeSelect(timeSelects, constraintType);\n };\n\n ConstraintControl.prototype.get_value = function (node, task, config) {\n var typeSelect = node.querySelector(\"[data-constraint-type-select] select\");\n var timeSelects = node.querySelectorAll(\"[data-constraint-time-select] select\");\n var constraintType = typeSelect.value;\n var constraintDate = null;\n\n if (!isNonTimedConstraint(constraintType)) {\n constraintDate = gantt.form_blocks.getTimePickerValue(timeSelects, config);\n }\n\n return {\n constraint_type: constraintType,\n constraint_date: constraintDate\n };\n };\n\n ConstraintControl.prototype.focus = function (node) {\n gantt._focus(node.querySelector(\"select\"));\n };\n\n return ConstraintControl;\n};","var __extends = require(\"../../../../utils/extends\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./select_control\")(gantt);\n\n function ParentControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(ParentControl, _super);\n\n ParentControl.prototype.render = function (sns) {\n return _display(sns, false);\n };\n\n ParentControl.prototype.set_value = function (node, value, ev, config) {\n // GS-1051. If the value is `0`, the set_value function in the select control won't select \n // the first child because (0 || '') = '';\n if (value === 0) value = \"0\";\n var tmpDom = document.createElement(\"div\");\n tmpDom.innerHTML = _display(config, ev.id);\n var newOptions = tmpDom.removeChild(tmpDom.firstChild);\n node.onselect = null;\n node.parentNode.replaceChild(newOptions, node);\n return gantt.form_blocks.select.set_value.apply(gantt, [newOptions, value, ev, config]);\n };\n\n function _display(config, item_id) {\n var tasks = [],\n options = [];\n\n if (item_id) {\n tasks = gantt.getTaskByTime();\n\n if (config.allow_root) {\n tasks.unshift({\n id: gantt.config.root_id,\n text: config.root_label || \"\"\n });\n }\n\n tasks = _filter(tasks, config, item_id);\n\n if (config.sort) {\n tasks.sort(config.sort);\n }\n }\n\n var text = config.template || gantt.templates.task_text;\n\n for (var i = 0; i < tasks.length; i++) {\n var label = text.apply(gantt, [tasks[i].start_date, tasks[i].end_date, tasks[i]]);\n\n if (label === undefined) {\n label = \"\";\n }\n\n options.push({\n key: tasks[i].id,\n label: label\n });\n }\n\n config.options = options;\n config.map_to = config.map_to || \"parent\";\n return gantt.form_blocks.select.render.apply(this, arguments);\n }\n\n function _filter(options, config, item_id) {\n var filter = config.filter || function () {\n return true;\n };\n\n options = options.slice(0);\n\n for (var i = 0; i < options.length; i++) {\n var task = options[i];\n\n if (task.id == item_id || gantt.isChildOf(task.id, item_id) || filter(task.id, task) === false) {\n options.splice(i, 1);\n i--;\n }\n }\n\n return options;\n }\n\n return ParentControl;\n};","var __extends = require(\"../../../../utils/extends\");\n\nvar DurationFormatterNumeric = require(\"../../../common/duration_formatter_numeric\")[\"default\"];\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function DurationControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n function getFormatter(config) {\n return config.formatter || new DurationFormatterNumeric();\n }\n\n __extends(DurationControl, _super);\n\n DurationControl.prototype.render = function (sns) {\n var time = \"<div class='gantt_time_selects'>\" + gantt.form_blocks.getTimePicker.call(this, sns) + \"</div>\";\n var label = \" \" + gantt.locale.labels[gantt.config.duration_unit + \"s\"] + \" \";\n var singleDate = sns.single_date ? \" style='display:none'\" : \"\";\n var readonly = sns.readonly ? \" disabled='disabled'\" : \"\";\n\n var ariaAttr = gantt._waiAria.lightboxDurationInputAttrString(sns);\n\n var durationInputClass = \"gantt_duration_value\";\n\n if (sns.formatter) {\n label = \"\";\n durationInputClass += \" gantt_duration_value_formatted\";\n }\n\n var duration = \"<div class='gantt_duration' \" + singleDate + \">\" + \"<input type='button' class='gantt_duration_dec' value='鈭�'\" + readonly + \">\" + \"<input type='text' value='5days' class='\" + durationInputClass + \"'\" + readonly + \" \" + ariaAttr + \">\" + \"<input type='button' class='gantt_duration_inc' value='+'\" + readonly + \">\" + label + \"<span></span>\" + \"</div>\";\n var html = \"<div style='height:\" + (sns.height || 30) + \"px;padding-top:0px;font-size:inherit;' class='gantt_section_time'>\" + time + \" \" + duration + \"</div>\";\n return html;\n };\n\n DurationControl.prototype.set_value = function (node, value, ev, config) {\n var s = node.getElementsByTagName(\"select\");\n var inps = node.getElementsByTagName(\"input\");\n var duration = inps[1];\n var btns = [inps[0], inps[2]];\n var endspan = node.getElementsByTagName(\"span\")[0];\n var map = config._time_format_order;\n var mapping;\n var start_date;\n var end_date;\n var duration_val;\n\n function _calc_date() {\n var start_date = _getStartDate.call(gantt, node, config);\n\n var duration = _getDuration.call(gantt, node, config);\n\n var end_date = gantt.calculateEndDate({\n start_date: start_date,\n duration: duration,\n task: ev\n });\n var template = gantt.templates.task_end_date || gantt.templates.task_date;\n endspan.innerHTML = template(end_date);\n }\n\n function _change_duration(step) {\n var value = duration.value;\n value = getFormatter(config).parse(value);\n if (window.isNaN(value)) value = 0;\n value += step;\n if (value < 1) value = 1;\n duration.value = getFormatter(config).format(value);\n\n _calc_date();\n }\n\n btns[0].onclick = gantt.bind(function () {\n _change_duration(-1 * gantt.config.duration_step);\n }, this);\n btns[1].onclick = gantt.bind(function () {\n _change_duration(1 * gantt.config.duration_step);\n }, this);\n s[0].onchange = _calc_date;\n s[1].onchange = _calc_date;\n s[2].onchange = _calc_date;\n if (s[3]) s[3].onchange = _calc_date;\n duration.onkeydown = gantt.bind(function (e) {\n var code;\n e = e || window.event;\n code = e.charCode || e.keyCode || e.which;\n\n if (code == gantt.constants.KEY_CODES.DOWN) {\n _change_duration(-1 * gantt.config.duration_step);\n\n return false;\n }\n\n if (code == gantt.constants.KEY_CODES.UP) {\n _change_duration(1 * gantt.config.duration_step);\n\n return false;\n }\n\n window.setTimeout(_calc_date, 1);\n }, this);\n duration.onchange = gantt.bind(_calc_date, this);\n mapping = gantt._resolve_default_mapping(config);\n if (typeof mapping === \"string\") mapping = {\n start_date: mapping\n };\n start_date = ev[mapping.start_date] || new Date();\n end_date = ev[mapping.end_date] || gantt.calculateEndDate({\n start_date: start_date,\n duration: 1,\n task: ev\n });\n duration_val = Math.round(ev[mapping.duration]) || gantt.calculateDuration({\n start_date: start_date,\n end_date: end_date,\n task: ev\n });\n duration_val = getFormatter(config).format(duration_val);\n\n gantt.form_blocks._fill_lightbox_select(s, 0, start_date, map, config);\n\n duration.value = duration_val;\n\n _calc_date();\n };\n\n DurationControl.prototype.get_value = function (node, ev, config) {\n var startDate = _getStartDate(node, config);\n\n var duration = _getDuration(node, config);\n\n var endDate = gantt.calculateEndDate({\n start_date: startDate,\n duration: duration,\n task: ev\n });\n\n if (typeof gantt._resolve_default_mapping(config) == \"string\") {\n return startDate;\n }\n\n return {\n start_date: startDate,\n end_date: endDate,\n duration: duration\n };\n };\n\n DurationControl.prototype.focus = function (node) {\n gantt._focus(node.getElementsByTagName(\"select\")[0]);\n };\n\n function _getStartDate(node, config) {\n var s = node.getElementsByTagName(\"select\");\n var map = config._time_format_order;\n var hours = 0;\n var minutes = 0;\n\n if (gantt.defined(map[3])) {\n var input = s[map[3]];\n var time = parseInt(input.value, 10);\n\n if (isNaN(time) && input.hasAttribute(\"data-value\")) {\n time = parseInt(input.getAttribute(\"data-value\"), 10);\n }\n\n hours = Math.floor(time / 60);\n minutes = time % 60;\n }\n\n return new Date(s[map[2]].value, s[map[1]].value, s[map[0]].value, hours, minutes);\n }\n\n function _getDuration(node, config) {\n var duration = node.getElementsByTagName(\"input\")[1];\n duration = getFormatter(config).parse(duration.value);\n if (!duration || window.isNaN(duration)) duration = 1;\n if (duration < 0) duration *= -1;\n return duration;\n }\n\n return DurationControl;\n};","var __extends = require(\"../../../../utils/extends\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function RadioControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(RadioControl, _super);\n\n RadioControl.prototype.render = function (sns) {\n var height = (sns.height || \"23\") + \"px\";\n var html = \"<div class='gantt_cal_ltext' style='height:\" + height + \";'>\";\n\n if (sns.options && sns.options.length) {\n for (var i = 0; i < sns.options.length; i++) {\n html += \"<label><input type='radio' value='\" + sns.options[i].key + \"' name='\" + sns.name + \"'>\" + sns.options[i].label + \"</label>\";\n }\n }\n\n html += \"</div>\";\n return html;\n };\n\n RadioControl.prototype.set_value = function (node, value, ev, sns) {\n var radio;\n if (!sns.options || !sns.options.length) return;\n radio = node.querySelector(\"input[type=radio][value='\" + value + \"']\") || node.querySelector(\"input[type=radio][value='\" + sns.default_value + \"']\");\n if (!radio) return;\n\n if (!node._dhx_onchange && sns.onchange) {\n node.onchange = sns.onchange;\n node._dhx_onchange = true;\n }\n\n radio.checked = true;\n };\n\n RadioControl.prototype.get_value = function (node, ev) {\n var result = node.querySelector(\"input[type=radio]:checked\");\n return result ? result.value : \"\";\n };\n\n RadioControl.prototype.focus = function (node) {\n gantt._focus(node.querySelector(\"input[type=radio]\"));\n };\n\n return RadioControl;\n};","var helpers = require(\"../../../../utils/helpers\");\n\nvar __extends = require(\"../../../../utils/extends\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function CheckboxControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(CheckboxControl, _super);\n\n CheckboxControl.prototype.render = function (sns) {\n var height = (sns.height || \"23\") + \"px\";\n var html = \"<div class='gantt_cal_ltext' style='height:\" + height + \";'>\";\n\n if (sns.options && sns.options.length) {\n for (var i = 0; i < sns.options.length; i++) {\n html += \"<label><input type='checkbox' value='\" + sns.options[i].key + \"' name='\" + sns.name + \"'>\" + sns.options[i].label + \"</label>\";\n }\n } else {\n sns.single_value = true;\n html += \"<label><input type='checkbox' name='\" + sns.name + \"'></label>\";\n }\n\n html += \"</div>\";\n return html;\n };\n\n CheckboxControl.prototype.set_value = function (node, value, ev, sns) {\n var checkboxes = Array.prototype.slice.call(node.querySelectorAll(\"input[type=checkbox]\"));\n\n if (!node._dhx_onchange && sns.onchange) {\n node.onchange = sns.onchange;\n node._dhx_onchange = true;\n }\n\n if (sns.single_value) {\n var box = checkboxes[0];\n box.checked = !!value;\n } else {\n helpers.forEach(checkboxes, function (entry) {\n entry.checked = value ? value.indexOf(entry.value) >= 0 : false;\n });\n }\n };\n\n CheckboxControl.prototype.get_value = function (node, task, sns) {\n if (sns.single_value) {\n var box = node.querySelector(\"input[type=checkbox]\");\n return box.checked;\n } else {\n return helpers.arrayMap(Array.prototype.slice.call(node.querySelectorAll(\"input[type=checkbox]:checked\")), function (entry) {\n return entry.value;\n });\n }\n };\n\n CheckboxControl.prototype.focus = function (node) {\n gantt._focus(node.querySelector(\"input[type=checkbox]\"));\n };\n\n return CheckboxControl;\n};","var __extends = require(\"../../../../utils/extends\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function TimeControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(TimeControl, _super);\n\n TimeControl.prototype.render = function (sns) {\n var time = gantt.form_blocks.getTimePicker.call(this, sns);\n var html = \"<div style='height:\" + (sns.height || 30) + \"px;padding-top:0px;font-size:inherit;text-align:center;' class='gantt_section_time'>\";\n html += time;\n\n if (sns.single_date) {\n time = gantt.form_blocks.getTimePicker.call(this, sns, true);\n html += \"<span></span>\";\n } else {\n html += \"<span style='font-weight:normal; font-size:10pt;'> – </span>\";\n }\n\n html += time;\n html += \"</div>\";\n return html;\n };\n\n TimeControl.prototype.set_value = function (node, value, ev, config) {\n var cfg = config;\n var s = node.getElementsByTagName(\"select\");\n var map = config._time_format_order;\n\n if (cfg.auto_end_date) {\n var _update_lightbox_select = function _update_lightbox_select() {\n start_date = new Date(s[map[2]].value, s[map[1]].value, s[map[0]].value, 0, 0);\n end_date = gantt.calculateEndDate({\n start_date: start_date,\n duration: 1,\n task: ev\n });\n\n gantt.form_blocks._fill_lightbox_select(s, map.size, end_date, map, cfg);\n };\n\n for (var i = 0; i < 4; i++) {\n s[i].onchange = _update_lightbox_select;\n }\n }\n\n var mapping = gantt._resolve_default_mapping(config);\n\n if (typeof mapping === \"string\") mapping = {\n start_date: mapping\n };\n var start_date = ev[mapping.start_date] || new Date();\n var end_date = ev[mapping.end_date] || gantt.calculateEndDate({\n start_date: start_date,\n duration: 1,\n task: ev\n });\n\n gantt.form_blocks._fill_lightbox_select(s, 0, start_date, map, cfg);\n\n gantt.form_blocks._fill_lightbox_select(s, map.size, end_date, map, cfg);\n };\n\n TimeControl.prototype.get_value = function (node, ev, config) {\n var selects = node.getElementsByTagName(\"select\");\n var startDate;\n var map = config._time_format_order;\n\n function _getEndDate(selects, map, startDate) {\n var endDate = gantt.form_blocks.getTimePickerValue(selects, config, map.size); // GS-1010: We need to add a way to obtain exact end_date for validation\n\n if (endDate <= startDate) {\n // when end date seems wrong\n if (config.autofix_end !== false || config.single_date) {\n // auto correct it in two cases - when the auto correction is not disabled, or when we have 'single date' control and the user don't have the UI to specify the end date\n return gantt.date.add(startDate, gantt._get_timepicker_step(), \"minute\");\n }\n }\n\n return endDate;\n }\n\n startDate = gantt.form_blocks.getTimePickerValue(selects, config);\n\n if (typeof gantt._resolve_default_mapping(config) === \"string\") {\n return startDate;\n }\n\n return {\n start_date: startDate,\n end_date: _getEndDate(selects, map, startDate)\n };\n };\n\n TimeControl.prototype.focus = function (node) {\n gantt._focus(node.getElementsByTagName(\"select\")[0]);\n };\n\n return TimeControl;\n};","var __extends = require(\"../../../../utils/extends\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function TextareaControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(TextareaControl, _super);\n\n TextareaControl.prototype.render = function (sns) {\n var height = (sns.height || \"130\") + \"px\";\n return \"<div class='gantt_cal_ltext' style='height:\" + height + \";'><textarea></textarea></div>\";\n };\n\n TextareaControl.prototype.set_value = function (node, value) {\n gantt.form_blocks.textarea._get_input(node).value = value || \"\";\n };\n\n TextareaControl.prototype.get_value = function (node) {\n return gantt.form_blocks.textarea._get_input(node).value;\n };\n\n TextareaControl.prototype.focus = function (node) {\n var a = gantt.form_blocks.textarea._get_input(node);\n\n gantt._focus(a, true);\n };\n\n TextareaControl.prototype._get_input = function (node) {\n return node.querySelector(\"textarea\");\n };\n\n return TextareaControl;\n};","var __extends = require(\"../../../../utils/extends\");\n\nmodule.exports = function (gantt) {\n var _super = require(\"./base_control\")(gantt);\n\n function TemplateControl() {\n var self = _super.apply(this, arguments) || this;\n return self;\n }\n\n __extends(TemplateControl, _super);\n\n TemplateControl.prototype.render = function (sns) {\n var height = (sns.height || \"30\") + \"px\";\n return \"<div class='gantt_cal_ltext gantt_cal_template' style='height:\" + height + \";'></div>\";\n };\n\n TemplateControl.prototype.set_value = function (node, value) {\n node.innerHTML = value || \"\";\n };\n\n TemplateControl.prototype.get_value = function (node) {\n return node.innerHTML || \"\";\n };\n\n TemplateControl.prototype.focus = function () {};\n\n return TemplateControl;\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nmodule.exports = function (gantt) {\n var domHelpers = require(\"../utils/dom_helpers\");\n\n var helpers = require(\"../../../utils/helpers\");\n\n var TemplateControl = require(\"./controls/template_control\")(gantt);\n\n var TextareaControl = require(\"./controls/textarea_control\")(gantt);\n\n var TimeControl = require(\"./controls/time_control\")(gantt);\n\n var SelectControl = require(\"./controls/select_control\")(gantt);\n\n var CheckboxControl = require(\"./controls/checkbox_control\")(gantt);\n\n var RadioControl = require(\"./controls/radio_control\")(gantt);\n\n var DurationControl = require(\"./controls/duration_control\")(gantt);\n\n var ParentControl = require(\"./controls/parent_control\")(gantt);\n\n var ResourcesControl = require(\"./controls/resources_control\")(gantt);\n\n var ConstraintControl = require(\"./controls/constraint_control\")(gantt);\n\n var TypeselectControl = require(\"./controls/typeselect_control\")(gantt);\n\n gantt._lightbox_methods = {};\n gantt._lightbox_template = \"<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span></div><div class='gantt_cal_larea'></div>\"; // GS-1952. Attaching the lightbox to the BODY element is not considered secure.\n // Attach it to Gantt container for Salesforce and other secure environments\n\n gantt._lightbox_root = gantt.$root;\n\n function setParentNode() {\n var cspEnvironment = gantt.config.csp === true;\n var salesforceEnvironment = !!window[\"Sfdc\"] || !!window[\"$A\"] || window[\"Aura\"] || '$shadowResolver$' in document.body;\n\n if (cspEnvironment || salesforceEnvironment) {\n gantt._lightbox_root = gantt.$root;\n } else {\n gantt._lightbox_root = document.body;\n }\n } //TODO: gantt._lightbox_id is changed from data.js and accessed from autoscheduling, check if it can be removed from gantt object\n\n\n var state = gantt.$services.getService(\"state\");\n state.registerProvider(\"lightbox\", function () {\n return {\n lightbox: gantt._lightbox_id\n };\n });\n\n gantt.showLightbox = function (id) {\n if (!this.callEvent(\"onBeforeLightbox\", [id])) return;\n var task = this.getTask(id);\n var box = this.getLightbox(this.getTaskType(task.type));\n\n this._center_lightbox(box);\n\n this.showCover();\n\n this._fill_lightbox(id, box);\n\n this._waiAria.lightboxVisibleAttr(box);\n\n this.callEvent(\"onLightbox\", [id]);\n };\n\n function _is_chart_visible(gantt) {\n var timeline = gantt.$ui.getView(\"timeline\");\n\n if (timeline && timeline.isVisible()) {\n return true;\n } else {\n return false;\n }\n }\n\n gantt._get_timepicker_step = function () {\n if (this.config.round_dnd_dates) {\n var step;\n\n if (_is_chart_visible(this)) {\n var scale = gantt.getScale();\n step = helpers.getSecondsInUnit(scale.unit) * scale.step / 60; //timepicker step is measured in minutes\n }\n\n if (!step || step >= 60 * 24) {\n step = this.config.time_step;\n }\n\n return step;\n }\n\n return this.config.time_step;\n };\n\n gantt.getLabel = function (property, key) {\n var sections = this._get_typed_lightbox_config();\n\n for (var i = 0; i < sections.length; i++) {\n if (sections[i].map_to == property) {\n var options = sections[i].options;\n\n for (var j = 0; j < options.length; j++) {\n if (options[j].key == key) {\n return options[j].label;\n }\n }\n }\n }\n\n return \"\";\n };\n\n gantt.updateCollection = function (list_name, collection) {\n collection = collection.slice(0);\n var list = gantt.serverList(list_name);\n if (!list) return false;\n list.splice(0, list.length);\n list.push.apply(list, collection || []);\n gantt.resetLightbox();\n };\n\n gantt.getLightboxType = function () {\n return this.getTaskType(this._lightbox_type);\n };\n\n gantt.getLightbox = function (type) {\n var lightboxDiv;\n var fullWidth;\n var html;\n var sns;\n var ds;\n var classNames = \"\";\n setParentNode();\n if (type === undefined) type = this.getLightboxType();\n\n if (!this._lightbox || this.getLightboxType() != this.getTaskType(type)) {\n this._lightbox_type = this.getTaskType(type);\n lightboxDiv = document.createElement(\"div\");\n classNames = \"gantt_cal_light\";\n fullWidth = this._is_lightbox_timepicker();\n if (gantt.config.wide_form || fullWidth) classNames += \" gantt_cal_light_wide\";\n\n if (fullWidth) {\n gantt.config.wide_form = true;\n classNames += \" gantt_cal_light_full\";\n }\n\n lightboxDiv.className = classNames;\n lightboxDiv.style.visibility = \"hidden\";\n html = this._lightbox_template;\n html += getHtmlButtons(this.config.buttons_left);\n html += getHtmlButtons(this.config.buttons_right, true);\n lightboxDiv.innerHTML = html;\n\n gantt._waiAria.lightboxAttr(lightboxDiv);\n\n if (gantt.config.drag_lightbox) {\n lightboxDiv.firstChild.onmousedown = gantt._ready_to_dnd;\n\n lightboxDiv.firstChild.onselectstart = function () {\n return false;\n };\n\n lightboxDiv.firstChild.style.cursor = \"pointer\";\n\n gantt._init_dnd_events();\n } // GS-1428: If there is lightbox node, we need to remove it from the DOM\n\n\n if (this._lightbox) {\n this.resetLightbox();\n }\n\n gantt._lightbox_root.insertBefore(lightboxDiv, gantt._lightbox_root.firstChild);\n\n this._lightbox = lightboxDiv;\n sns = this._get_typed_lightbox_config(type);\n html = this._render_sections(sns);\n ds = lightboxDiv.querySelector(\"div.gantt_cal_larea\"); //GS-1131. If gantt_cal_larea is displayed, Firefox renders buttons incorrectly;\n\n var backup_overflow = ds.style.overflow;\n ds.style.overflow = 'hidden';\n ds.innerHTML = html;\n bindLabelsToInputs(sns); //sizes\n\n this.resizeLightbox();\n ds.style.overflow = backup_overflow;\n\n this._init_lightbox_events(this);\n\n lightboxDiv.style.display = \"none\";\n lightboxDiv.style.visibility = \"visible\";\n }\n\n return this._lightbox;\n };\n\n gantt._render_sections = function (sns) {\n var html = \"\";\n\n for (var i = 0; i < sns.length; i++) {\n var block = this.form_blocks[sns[i].type];\n if (!block) continue; //ignore incorrect blocks\n\n sns[i].id = \"area_\" + this.uid();\n var display = sns[i].hidden ? \" style='display:none'\" : \"\";\n var button = \"\";\n\n if (sns[i].button) {\n button = \"<div class='gantt_custom_button' data-index='\" + i + \"'><div class='gantt_custom_button_\" + sns[i].button + \"'></div><div class='gantt_custom_button_label'>\" + this.locale.labels[\"button_\" + sns[i].button] + \"</div></div>\";\n }\n\n if (this.config.wide_form) {\n html += \"<div class='gantt_wrap_section' \" + display + \">\";\n }\n\n html += \"<div id='\" + sns[i].id + \"' class='gantt_cal_lsection'><label>\" + button + this.locale.labels[\"section_\" + sns[i].name] + \"</label></div>\" + block.render.call(this, sns[i]);\n html += \"</div>\";\n }\n\n return html;\n };\n\n gantt.resizeLightbox = function () {\n if (!this._lightbox) return;\n\n var con = this._lightbox.querySelector(\".gantt_cal_larea\");\n\n con.style.height = \"0px\";\n con.style.height = con.scrollHeight + \"px\";\n this._lightbox.style.height = con.scrollHeight + this.config.lightbox_additional_height + \"px\";\n con.style.height = con.scrollHeight + \"px\"; //it is incredible , how ugly IE can be\n };\n\n gantt._center_lightbox = function (box) {\n if (box) {\n box.style.display = \"block\";\n var scroll_top = window.pageYOffset || gantt._lightbox_root.scrollTop || document.documentElement.scrollTop;\n var scroll_left = window.pageXOffset || gantt._lightbox_root.scrollLeft || document.documentElement.scrollLeft;\n var view_height = window.innerHeight || document.documentElement.clientHeight;\n if (scroll_top) // if vertical scroll on window\n box.style.top = Math.round(scroll_top + Math.max((view_height - box.offsetHeight) / 2, 0)) + \"px\";else // vertical scroll on body\n box.style.top = Math.round(Math.max((view_height - box.offsetHeight) / 2, 0) + 9) + \"px\"; // +9 for compatibility with auto tests\n // not quite accurate but used for compatibility reasons\n\n if (document.documentElement.scrollWidth > gantt._lightbox_root.offsetWidth) // if horizontal scroll on the window\n box.style.left = Math.round(scroll_left + (gantt._lightbox_root.offsetWidth - box.offsetWidth) / 2) + \"px\";else // horizontal scroll on the body\n box.style.left = Math.round((gantt._lightbox_root.offsetWidth - box.offsetWidth) / 2) + \"px\";\n }\n };\n\n gantt.showCover = function () {\n if (this._cover) return;\n this._cover = document.createElement(\"DIV\");\n this._cover.className = \"gantt_cal_cover\";\n var rootElement = gantt._lightbox_root || gantt.$root;\n rootElement.appendChild(this._cover);\n };\n\n gantt.event(window, \"deviceorientation\", function () {\n if (gantt.getState().lightbox) {\n gantt._center_lightbox(gantt.getLightbox());\n }\n });\n\n gantt._init_lightbox_events = function () {\n gantt.lightbox_events = {};\n\n gantt.lightbox_events.gantt_save_btn = function () {\n gantt._save_lightbox();\n };\n\n gantt.lightbox_events.gantt_delete_btn = function () {\n gantt._lightbox_new_type = null;\n if (!gantt.callEvent(\"onLightboxDelete\", [gantt._lightbox_id])) return;\n\n if (gantt.isTaskExists(gantt._lightbox_id)) {\n gantt.$click.buttons[\"delete\"](gantt._lightbox_id);\n } else {\n gantt.hideLightbox();\n }\n };\n\n gantt.lightbox_events.gantt_cancel_btn = function () {\n gantt._cancel_lightbox();\n };\n\n gantt.lightbox_events[\"default\"] = function (e, src) {\n if (src.getAttribute(\"data-dhx-button\")) {\n gantt.callEvent(\"onLightboxButton\", [src.className, src, e]);\n } else {\n var index, block, sec;\n var className = domHelpers.getClassName(src);\n\n if (className.indexOf(\"gantt_custom_button\") != -1) {\n if (className.indexOf(\"gantt_custom_button_\") != -1) {\n index = src.parentNode.getAttribute(\"data-index\");\n sec = src;\n\n while (sec && domHelpers.getClassName(sec).indexOf(\"gantt_cal_lsection\") == -1) {\n sec = sec.parentNode;\n }\n } else {\n index = src.getAttribute(\"data-index\");\n sec = src.parentNode;\n src = src.firstChild;\n }\n }\n\n var sections = gantt._get_typed_lightbox_config();\n\n if (index) {\n index = index * 1;\n block = gantt.form_blocks[sections[index * 1].type];\n block.button_click(index, src, sec, sec.nextSibling);\n }\n }\n };\n\n this.event(gantt.getLightbox(), \"click\", function (e) {\n e = e || window.event;\n var src = domHelpers.getTargetNode(e);\n var className = domHelpers.getClassName(src);\n\n if (!className) {\n src = src.previousSibling;\n className = domHelpers.getClassName(src);\n }\n\n if (src && className && className.indexOf(\"gantt_btn_set\") === 0) {\n src = src.firstChild;\n className = domHelpers.getClassName(src);\n }\n\n if (src && className) {\n var func = gantt.defined(gantt.lightbox_events[src.className]) ? gantt.lightbox_events[src.className] : gantt.lightbox_events[\"default\"];\n return func(e, src);\n }\n\n return false;\n });\n\n gantt.getLightbox().onkeydown = function (e) {\n var event = e || window.event;\n var target = e.target || e.srcElement;\n var buttonTarget = domHelpers.getClassName(target).indexOf(\"gantt_btn_set\") > -1;\n\n switch ((e || event).keyCode) {\n case gantt.constants.KEY_CODES.SPACE:\n {\n if ((e || event).shiftKey) return;\n\n if (buttonTarget && target.click) {\n target.click();\n }\n\n break;\n }\n\n case gantt.keys.edit_save:\n if ((e || event).shiftKey) return;\n\n if (buttonTarget && target.click) {\n target.click();\n } else {\n gantt._save_lightbox();\n }\n\n break;\n\n case gantt.keys.edit_cancel:\n gantt._cancel_lightbox();\n\n break;\n\n default:\n break;\n }\n };\n };\n\n gantt._cancel_lightbox = function () {\n var task = this.getLightboxValues();\n this.callEvent(\"onLightboxCancel\", [this._lightbox_id, task.$new]);\n\n if (gantt.isTaskExists(task.id) && task.$new) {\n this.silent(function () {\n gantt.$data.tasksStore.removeItem(task.id);\n\n gantt._update_flags(task.id, null);\n });\n this.refreshData();\n }\n\n this.hideLightbox();\n };\n\n gantt._save_lightbox = function () {\n var task = this.getLightboxValues();\n if (!this.callEvent(\"onLightboxSave\", [this._lightbox_id, task, !!task.$new])) return; // GS-2170. Do not recalculate the indexes and dates of other tasks\n // as they will be recalculated in the `refreshData`\n\n gantt.$data.tasksStore._skipTaskRecalculation = \"lightbox\";\n\n if (task.$new) {\n delete task.$new;\n this.addTask(task, task.parent, this.getTaskIndex(task.id));\n } else if (this.isTaskExists(task.id)) {\n this.mixin(this.getTask(task.id), task, true);\n this.refreshTask(task.id);\n this.updateTask(task.id);\n }\n\n gantt.$data.tasksStore._skipTaskRecalculation = false;\n this.refreshData(); // TODO: do we need any blockable events here to prevent closing lightbox?\n\n this.hideLightbox();\n };\n\n gantt._resolve_default_mapping = function (section) {\n var mapping = section.map_to;\n var time_controls = {\n \"time\": true,\n \"time_optional\": true,\n \"duration\": true,\n \"duration_optional\": true\n };\n\n if (time_controls[section.type]) {\n if (section.map_to == \"auto\") {\n mapping = {\n start_date: \"start_date\",\n end_date: \"end_date\",\n duration: \"duration\"\n };\n } else if (typeof section.map_to === \"string\") {\n mapping = {\n start_date: section.map_to\n };\n }\n } else if (section.type === \"constraint\") {\n if (!section.map_to || typeof section.map_to === \"string\") {\n mapping = {\n constraint_type: \"constraint_type\",\n constraint_date: \"constraint_date\"\n };\n }\n }\n\n return mapping;\n };\n\n gantt.getLightboxValues = function () {\n var task = {};\n\n if (gantt.isTaskExists(this._lightbox_id)) {\n task = this.mixin({}, this.getTask(this._lightbox_id));\n }\n\n var sns = this._get_typed_lightbox_config();\n\n for (var i = 0; i < sns.length; i++) {\n var node = gantt._lightbox_root.querySelector(\"#\" + sns[i].id);\n\n node = node ? node.nextSibling : node;\n var block = this.form_blocks[sns[i].type];\n if (!block) continue;\n var res = block.get_value.call(this, node, task, sns[i]);\n\n var map_to = gantt._resolve_default_mapping(sns[i]);\n\n if (typeof map_to == \"string\" && map_to != \"auto\") {\n task[map_to] = res;\n } else if (_typeof(map_to) == \"object\") {\n for (var property in map_to) {\n if (map_to[property]) task[map_to[property]] = res[property];\n }\n }\n } // GS-1282 We need to preserve the task type even if the lightbox doesn't have the typeselect section\n\n\n if (gantt._lightbox_new_type == \"task\") {\n task.type = gantt.config.types.task;\n gantt._lightbox_new_type = null;\n }\n\n return task;\n };\n\n gantt.hideLightbox = function () {\n var box = this.getLightbox();\n if (box) box.style.display = \"none\";\n\n this._waiAria.lightboxHiddenAttr(box);\n\n this._lightbox_id = null;\n this.hideCover();\n this.callEvent(\"onAfterLightbox\", []);\n };\n\n gantt.hideCover = function () {\n if (this._cover) this._cover.parentNode.removeChild(this._cover);\n this._cover = null;\n };\n\n gantt.resetLightbox = function () {\n if (gantt._lightbox && !gantt._custom_lightbox) gantt._lightbox.parentNode.removeChild(gantt._lightbox);\n gantt._lightbox = null;\n gantt.hideCover();\n };\n\n gantt._set_lightbox_values = function (data, box) {\n var task = data;\n var s = box.getElementsByTagName(\"span\");\n var lightboxHeader = [];\n\n if (gantt.templates.lightbox_header) {\n lightboxHeader.push(\"\");\n lightboxHeader.push(gantt.templates.lightbox_header(task.start_date, task.end_date, task));\n s[1].innerHTML = \"\";\n s[2].innerHTML = gantt.templates.lightbox_header(task.start_date, task.end_date, task);\n } else {\n lightboxHeader.push(this.templates.task_time(task.start_date, task.end_date, task));\n lightboxHeader.push(String(this.templates.task_text(task.start_date, task.end_date, task) || \"\").substr(0, 70)); //IE6 fix\n\n s[1].innerHTML = this.templates.task_time(task.start_date, task.end_date, task);\n s[2].innerHTML = String(this.templates.task_text(task.start_date, task.end_date, task) || \"\").substr(0, 70); //IE6 fix\n }\n\n s[1].innerHTML = lightboxHeader[0];\n s[2].innerHTML = lightboxHeader[1];\n\n gantt._waiAria.lightboxHeader(box, lightboxHeader.join(\" \"));\n\n var sns = this._get_typed_lightbox_config(this.getLightboxType());\n\n for (var i = 0; i < sns.length; i++) {\n var section = sns[i];\n\n if (!this.form_blocks[section.type]) {\n continue; //skip incorrect sections, same check is done during rendering\n }\n\n var node = gantt._lightbox_root.querySelector(\"#\" + section.id).nextSibling;\n\n var block = this.form_blocks[section.type];\n\n var map_to = gantt._resolve_default_mapping(sns[i]);\n\n var value = this.defined(task[map_to]) ? task[map_to] : section.default_value;\n block.set_value.call(gantt, node, value, task, section);\n if (section.focus) block.focus.call(gantt, node);\n }\n\n if (gantt.isTaskExists(data.id)) {\n gantt._lightbox_id = data.id;\n }\n };\n\n gantt._fill_lightbox = function (id, box) {\n var task = this.getTask(id);\n\n this._set_lightbox_values(task, box);\n };\n\n gantt.getLightboxSection = function (name) {\n var config = this._get_typed_lightbox_config();\n\n var i = 0;\n\n for (i; i < config.length; i++) {\n if (config[i].name == name) break;\n }\n\n var section = config[i];\n if (!section) return null;\n if (!this._lightbox) this.getLightbox();\n\n var header = gantt._lightbox_root.querySelector(\"#\" + section.id);\n\n var node = header.nextSibling;\n var result = {\n section: section,\n header: header,\n node: node,\n getValue: function getValue(ev) {\n return gantt.form_blocks[section.type].get_value.call(gantt, node, ev || {}, section);\n },\n setValue: function setValue(value, ev) {\n return gantt.form_blocks[section.type].set_value.call(gantt, node, value, ev || {}, section);\n }\n };\n var handler = this._lightbox_methods[\"get_\" + section.type + \"_control\"];\n return handler ? handler(result) : result;\n };\n\n gantt._lightbox_methods.get_template_control = function (result) {\n result.control = result.node;\n return result;\n };\n\n gantt._lightbox_methods.get_select_control = function (result) {\n result.control = result.node.getElementsByTagName(\"select\")[0];\n return result;\n };\n\n gantt._lightbox_methods.get_textarea_control = function (result) {\n result.control = result.node.getElementsByTagName(\"textarea\")[0];\n return result;\n };\n\n gantt._lightbox_methods.get_time_control = function (result) {\n result.control = result.node.getElementsByTagName(\"select\"); // array\n\n return result;\n };\n\n gantt._init_dnd_events = function () {\n var eventElement = gantt._lightbox_root;\n this.event(eventElement, \"mousemove\", gantt._move_while_dnd);\n this.event(eventElement, \"mouseup\", gantt._finish_dnd); // GS-1952: In Salesforce environment, the lightbox is attached to the Gantt container. \n // So when Gantt is reinitialized, the events are no longer attached to the Gantt container.\n // gantt._init_dnd_events = function () {\n // };\n };\n\n gantt._move_while_dnd = function (event) {\n if (gantt._dnd_start_lb) {\n if (!document.gantt_unselectable) {\n gantt._lightbox_root.className += \" gantt_unselectable\";\n document.gantt_unselectable = true;\n }\n\n var lb = gantt.getLightbox();\n var now = [event.pageX, event.pageY];\n lb.style.top = gantt._lb_start[1] + now[1] - gantt._dnd_start_lb[1] + \"px\";\n lb.style.left = gantt._lb_start[0] + now[0] - gantt._dnd_start_lb[0] + \"px\";\n }\n };\n\n gantt._ready_to_dnd = function (event) {\n var lb = gantt.getLightbox();\n gantt._lb_start = [parseInt(lb.style.left, 10), parseInt(lb.style.top, 10)];\n gantt._dnd_start_lb = [event.pageX, event.pageY];\n };\n\n gantt._finish_dnd = function () {\n if (gantt._lb_start) {\n gantt._lb_start = gantt._dnd_start_lb = false;\n gantt._lightbox_root.className = gantt._lightbox_root.className.replace(\" gantt_unselectable\", \"\");\n document.gantt_unselectable = false;\n }\n };\n\n gantt._focus = function (node, select) {\n if (node && node.focus) {\n if (gantt.config.touch) {//do not focus editor, to prevent auto-zoom\n } else {\n try {\n if (select && node.select) node.select();\n node.focus();\n } catch (e) {// silent errors\n }\n }\n }\n };\n\n gantt.form_blocks = {\n getTimePicker: function getTimePicker(sns, hidden) {\n var html = \"\";\n var cfg = this.config;\n var i;\n var options;\n var ariaAttrs;\n var readonly;\n var display;\n var settings = {\n first: 0,\n last: 24 * 60,\n date: this.date.date_part(new Date(gantt._min_date.valueOf())),\n timeFormat: getTimeFormat(sns)\n }; // map: default order => real one\n\n sns._time_format_order = {\n size: 0\n };\n\n if (gantt.config.limit_time_select) {\n settings.first = 60 * cfg.first_hour;\n settings.last = 60 * cfg.last_hour + 1;\n settings.date.setHours(cfg.first_hour);\n }\n\n for (i = 0; i < settings.timeFormat.length; i++) {\n // adding spaces between selects\n if (i > 0) {\n html += \" \";\n }\n\n options = getHtmlTimePickerOptions(sns, i, settings);\n\n if (options) {\n ariaAttrs = gantt._waiAria.lightboxSelectAttrString(settings.timeFormat[i]);\n readonly = sns.readonly ? \"disabled='disabled'\" : \"\";\n display = hidden ? \" style='display:none' \" : \"\";\n html += \"<select \" + readonly + display + ariaAttrs + \">\" + options + \"</select>\";\n }\n }\n\n return html;\n },\n getTimePickerValue: function getTimePickerValue(selects, config, offset) {\n var map = config._time_format_order;\n var needSetTime = gantt.defined(map[3]);\n var time;\n var hours = 0;\n var minutes = 0;\n var mapOffset = offset || 0;\n\n if (needSetTime) {\n time = parseInt(selects[map[3] + mapOffset].value, 10);\n hours = Math.floor(time / 60);\n minutes = time % 60;\n }\n\n return new Date(selects[map[2] + mapOffset].value, selects[map[1] + mapOffset].value, selects[map[0] + mapOffset].value, hours, minutes);\n },\n _fill_lightbox_select: function _fill_lightbox_select(s, i, d, map) {\n s[i + map[0]].value = d.getDate();\n s[i + map[1]].value = d.getMonth();\n s[i + map[2]].value = d.getFullYear();\n\n if (gantt.defined(map[3])) {\n var v = d.getHours() * 60 + d.getMinutes();\n v = Math.round(v / gantt._get_timepicker_step()) * gantt._get_timepicker_step();\n var input = s[i + map[3]];\n input.value = v; //in case option not shown\n\n input.setAttribute(\"data-value\", v);\n }\n },\n template: new TemplateControl(),\n textarea: new TextareaControl(),\n select: new SelectControl(),\n time: new TimeControl(),\n duration: new DurationControl(),\n parent: new ParentControl(),\n radio: new RadioControl(),\n checkbox: new CheckboxControl(),\n resources: new ResourcesControl(),\n constraint: new ConstraintControl(),\n typeselect: new TypeselectControl()\n };\n\n gantt._is_lightbox_timepicker = function () {\n var s = this._get_typed_lightbox_config();\n\n for (var i = 0; i < s.length; i++) {\n if (s[i].name == \"time\" && s[i].type == \"time\") return true;\n }\n\n return false;\n };\n\n gantt._simple_confirm = function (message, title, callback, ok) {\n if (!message) return callback();\n var opts = {\n text: message\n };\n if (title) opts.title = title;\n\n if (ok) {\n opts.ok = ok;\n }\n\n if (callback) {\n opts.callback = function (result) {\n if (result) callback();\n };\n }\n\n gantt.confirm(opts);\n };\n\n function _get_type_name(type_value) {\n for (var i in this.config.types) {\n if (this.config.types[i] == type_value) {\n return i;\n }\n }\n\n return \"task\";\n }\n\n gantt._get_typed_lightbox_config = function (type) {\n if (type === undefined) {\n type = this.getLightboxType();\n }\n\n var field = _get_type_name.call(this, type);\n\n if (gantt.config.lightbox[field + \"_sections\"]) {\n return gantt.config.lightbox[field + \"_sections\"];\n } else {\n return gantt.config.lightbox.sections;\n }\n };\n\n gantt._silent_redraw_lightbox = function (type) {\n var oldType = this.getLightboxType();\n\n if (this.getState().lightbox) {\n var taskId = this.getState().lightbox;\n var formData = this.getLightboxValues(),\n task = this.copy(this.getTask(taskId));\n this.resetLightbox();\n var updTask = this.mixin(task, formData, true);\n var box = this.getLightbox(type ? type : undefined);\n\n this._center_lightbox(this.getLightbox());\n\n this._set_lightbox_values(updTask, box);\n\n this.showCover();\n } else {\n this.resetLightbox();\n this.getLightbox(type ? type : undefined);\n }\n\n this.callEvent(\"onLightboxChange\", [oldType, this.getLightboxType()]);\n };\n\n function bindLabelsToInputs(sns) {\n var section;\n var label;\n var labelBlock;\n var inputBlock;\n var input;\n var i;\n\n for (i = 0; i < sns.length; i++) {\n section = sns[i];\n labelBlock = gantt._lightbox_root.querySelector(\"#\" + section.id);\n if (!section.id || !labelBlock) continue;\n label = labelBlock.querySelector(\"label\");\n inputBlock = labelBlock.nextSibling;\n if (!inputBlock) continue;\n input = inputBlock.querySelector(\"input, select, textarea\");\n\n if (input) {\n input.id = input.id || \"input_\" + gantt.uid();\n section.inputId = input.id;\n label.setAttribute(\"for\", section.inputId);\n }\n }\n }\n\n function getHtmlButtons(buttons, floatRight) {\n var button;\n var ariaAttr;\n var html = \"\";\n var i;\n\n for (i = 0; i < buttons.length; i++) {\n // needed to migrate from 'dhx_something' to 'gantt_something' naming in a lightbox\n button = gantt.config._migrate_buttons[buttons[i]] ? gantt.config._migrate_buttons[buttons[i]] : buttons[i];\n ariaAttr = gantt._waiAria.lightboxButtonAttrString(button);\n html += \"<div \" + ariaAttr + \" class='gantt_btn_set gantt_left_btn_set \" + button + \"_set'\" + (floatRight ? \" style='float:right;'\" : \"\") + \"><div dhx_button='1' data-dhx-button='1' class='\" + button + \"'></div><div>\" + gantt.locale.labels[button] + \"</div></div>\";\n }\n\n return html;\n }\n\n function getTimeFormat(sns) {\n var scale;\n var unit;\n var result;\n if (sns.time_format) return sns.time_format; // default order\n\n result = [\"%d\", \"%m\", \"%Y\"];\n scale = gantt.getScale();\n unit = scale ? scale.unit : gantt.config.duration_unit;\n\n if (helpers.getSecondsInUnit(unit) < helpers.getSecondsInUnit(\"day\")) {\n result.push(\"%H:%i\");\n }\n\n return result;\n }\n\n function getHtmlTimePickerOptions(sns, index, settings) {\n var range;\n var offset;\n var start_year;\n var end_year;\n var i;\n var time;\n var diff;\n var tdate;\n var html = \"\";\n\n switch (settings.timeFormat[index]) {\n case \"%Y\":\n sns._time_format_order[2] = index;\n sns._time_format_order.size++; //year\n\n if (sns.year_range) {\n if (!isNaN(sns.year_range)) {\n range = sns.year_range;\n } else if (sns.year_range.push) {\n // if\n start_year = sns.year_range[0];\n end_year = sns.year_range[1];\n }\n }\n\n range = range || 10;\n offset = offset || Math.floor(range / 2);\n start_year = start_year || settings.date.getFullYear() - offset;\n end_year = end_year || gantt.getState().max_date.getFullYear() + offset;\n\n for (i = start_year; i < end_year; i++) {\n html += \"<option value='\" + i + \"'>\" + i + \"</option>\";\n }\n\n break;\n\n case \"%m\":\n sns._time_format_order[1] = index;\n sns._time_format_order.size++; //month\n\n for (i = 0; i < 12; i++) {\n html += \"<option value='\" + i + \"'>\" + gantt.locale.date.month_full[i] + \"</option>\";\n }\n\n break;\n\n case \"%d\":\n sns._time_format_order[0] = index;\n sns._time_format_order.size++; //days\n\n for (i = 1; i < 32; i++) {\n html += \"<option value='\" + i + \"'>\" + i + \"</option>\";\n }\n\n break;\n\n case \"%H:%i\":\n // var last = 24*60, first = 0;\n sns._time_format_order[3] = index;\n sns._time_format_order.size++; //hours\n\n i = settings.first;\n tdate = settings.date.getDate();\n sns._time_values = [];\n\n while (i < settings.last) {\n time = gantt.templates.time_picker(settings.date);\n html += \"<option value='\" + i + \"'>\" + time + \"</option>\";\n\n sns._time_values.push(i);\n\n settings.date.setTime(settings.date.valueOf() + gantt._get_timepicker_step() * 60 * 1000);\n diff = settings.date.getDate() != tdate ? 1 : 0; // moved or not to the next day\n\n i = diff * 24 * 60 + settings.date.getHours() * 60 + settings.date.getMinutes();\n }\n\n break;\n\n default:\n break;\n }\n\n return html;\n }\n};","module.exports = function (gantt) {\n gantt.config.touch_drag = 500; //nearly immediate dnd\n\n gantt.config.touch = true;\n gantt.config.touch_feedback = true;\n gantt.config.touch_feedback_duration = 1;\n gantt._prevent_touch_scroll = false;\n\n gantt._touch_feedback = function () {\n if (gantt.config.touch_feedback) {\n if (navigator.vibrate) navigator.vibrate(gantt.config.touch_feedback_duration);\n }\n };\n\n gantt.attachEvent(\"onGanttReady\", gantt.bind(function () {\n if (this.config.touch != \"force\") this.config.touch = this.config.touch && (navigator.userAgent.indexOf(\"Mobile\") != -1 || navigator.userAgent.indexOf(\"iPad\") != -1 || navigator.userAgent.indexOf(\"Android\") != -1 || navigator.userAgent.indexOf(\"Touch\") != -1) || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n\n if (this.config.touch) {\n var touchEventsSupported = true;\n\n try {\n document.createEvent(\"TouchEvent\");\n } catch (e) {\n touchEventsSupported = false;\n }\n\n if (touchEventsSupported) {\n this._touch_events([\"touchmove\", \"touchstart\", \"touchend\"], function (ev) {\n if (ev.touches && ev.touches.length > 1) return null;\n if (ev.touches[0]) return {\n target: ev.target,\n pageX: ev.touches[0].pageX,\n pageY: ev.touches[0].pageY,\n clientX: ev.touches[0].clientX,\n clientY: ev.touches[0].clientY\n };else return ev;\n }, function () {\n return false;\n });\n } else if (window.navigator.pointerEnabled) {\n this._touch_events([\"pointermove\", \"pointerdown\", \"pointerup\"], function (ev) {\n if (ev.pointerType == \"mouse\") return null;\n return ev;\n }, function (ev) {\n return !ev || ev.pointerType == \"mouse\";\n });\n } else if (window.navigator.msPointerEnabled) {\n this._touch_events([\"MSPointerMove\", \"MSPointerDown\", \"MSPointerUp\"], function (ev) {\n if (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE) return null;\n return ev;\n }, function (ev) {\n return !ev || ev.pointerType == ev.MSPOINTER_TYPE_MOUSE;\n });\n }\n }\n }, gantt));\n\n function findTargetView(event) {\n var allViews = gantt.$layout.getCellsByType(\"viewCell\");\n\n for (var i = 0; i < allViews.length; i++) {\n var box = allViews[i].$view.getBoundingClientRect();\n\n if (event.clientX >= box.left && event.clientX <= box.right && event.clientY <= box.bottom && event.clientY >= box.top) {\n return allViews[i];\n }\n }\n }\n\n function getScrollState(view) {\n var scrollX = view.$config.scrollX ? gantt.$ui.getView(view.$config.scrollX) : null;\n var scrollY = view.$config.scrollY ? gantt.$ui.getView(view.$config.scrollY) : null;\n var scrollState = {\n x: null,\n y: null\n };\n\n if (scrollX) {\n var state = scrollX.getScrollState();\n\n if (state.visible) {\n scrollState.x = scrollX.$view.scrollLeft;\n }\n }\n\n if (scrollY) {\n var state = scrollY.getScrollState();\n\n if (state.visible) {\n scrollState.y = scrollY.$view.scrollTop;\n }\n }\n\n return scrollState;\n }\n\n function scrollView(view, left, top) {\n var scrollX = view.$config.scrollX ? gantt.$ui.getView(view.$config.scrollX) : null;\n var scrollY = view.$config.scrollY ? gantt.$ui.getView(view.$config.scrollY) : null;\n\n if (scrollX) {\n scrollX.scrollTo(left, null);\n }\n\n if (scrollY) {\n scrollY.scrollTo(null, top);\n }\n }\n\n function getTaskDND() {\n var tasksDnD;\n\n if (gantt.$ui.getView(\"timeline\")) {\n tasksDnD = gantt.$ui.getView(\"timeline\")._tasks_dnd;\n }\n\n return tasksDnD;\n }\n\n var touchHandlers = []; //we can't use native scrolling, as we need to sync momentum between different parts\n //so we will block native scroll and use the custom one\n //in future we can add custom momentum\n\n gantt._touch_events = function (names, accessor, ignore) {\n //webkit on android need to be handled separately\n var dblclicktime = 0;\n var actionMode = false;\n var scrollMode = false;\n var actionStart = null;\n var scrollState;\n var longTapTimer = null;\n var currentDndId = null;\n var dndNodes = [];\n var targetView = null;\n\n for (var i = 0; i < touchHandlers.length; i++) {\n gantt.eventRemove(touchHandlers[i][0], touchHandlers[i][1], touchHandlers[i][2]);\n }\n\n touchHandlers = []; //touch move\n\n touchHandlers.push([gantt.$container, names[0], function (e) {\n var tasksDnD = getTaskDND();\n if (ignore(e)) return; //ignore common and scrolling moves\n\n if (!actionMode) return;\n if (longTapTimer) clearTimeout(longTapTimer);\n var source = accessor(e);\n\n if (tasksDnD && (tasksDnD.drag.id || tasksDnD.drag.start_drag)) {\n tasksDnD.on_mouse_move(source);\n if (e.preventDefault) e.preventDefault();\n e.cancelBubble = true;\n return false;\n }\n\n if (!gantt._prevent_touch_scroll) {\n if (source && actionStart) {\n var dx = actionStart.pageX - source.pageX;\n var dy = actionStart.pageY - source.pageY;\n\n if (!scrollMode && (Math.abs(dx) > 5 || Math.abs(dy) > 5)) {\n scrollMode = true; //gantt._touch_scroll_active = scroll_mode = true;\n\n dblclicktime = 0;\n\n if (targetView) {\n scrollState = getScrollState(targetView);\n } else {\n scrollState = gantt.getScrollState();\n }\n }\n\n if (scrollMode) {\n var newScrollState;\n var scrollX = scrollState.x + dx;\n var scrollY = scrollState.y + dy;\n\n if (targetView) {\n scrollView(targetView, scrollX, scrollY);\n newScrollState = getScrollState(targetView);\n } else {\n gantt.scrollTo(scrollX, scrollY);\n newScrollState = gantt.getScrollState();\n }\n\n if (scrollState.x != newScrollState.x && dy > 2 * dx || scrollState.y != newScrollState.y && dx > 2 * dy) {\n return block_action(e);\n }\n }\n }\n\n return block_action(e);\n }\n\n return true;\n }]); //block touch context menu in IE10\n\n touchHandlers.push([this.$container, \"contextmenu\", function (e) {\n if (actionMode) return block_action(e);\n }]); //touch start\n\n touchHandlers.push([this.$container, names[1], function (e) {\n // block pull-to-refresh\n if (document && document.body) {\n document.body.classList.add(\"gantt_touch_active\");\n }\n\n if (ignore(e)) return;\n\n if (e.touches && e.touches.length > 1) {\n actionMode = false;\n return;\n }\n\n actionStart = accessor(e);\n targetView = findTargetView(actionStart);\n\n if (!gantt._locate_css(actionStart, \"gantt_hor_scroll\") && !gantt._locate_css(actionStart, \"gantt_ver_scroll\")) {\n actionMode = true;\n }\n\n var tasksDnD = getTaskDND(); //long tap\n\n longTapTimer = setTimeout(function () {\n var taskId = gantt.locate(actionStart);\n\n if (tasksDnD && taskId && !gantt._locate_css(actionStart, \"gantt_link_control\") && !gantt._locate_css(actionStart, \"gantt_grid_data\")) {\n tasksDnD.on_mouse_down(actionStart);\n\n if (tasksDnD.drag && tasksDnD.drag.start_drag) {\n cloneTaskRendered(taskId);\n\n tasksDnD._start_dnd(actionStart);\n\n gantt._touch_drag = true;\n gantt.refreshTask(taskId);\n\n gantt._touch_feedback();\n }\n }\n\n longTapTimer = null;\n }, gantt.config.touch_drag);\n }]); //touch end\n\n touchHandlers.push([this.$container, names[2], function (e) {\n if (document && document.body) {\n document.body.classList.remove(\"gantt_touch_active\");\n }\n\n if (ignore(e)) return;\n if (longTapTimer) clearTimeout(longTapTimer);\n gantt._touch_drag = false;\n actionMode = false;\n var source = accessor(e);\n var tasksDnD = getTaskDND();\n if (tasksDnD) tasksDnD.on_mouse_up(source);\n\n if (currentDndId && gantt.isTaskExists(currentDndId)) {\n gantt.refreshTask(currentDndId);\n\n if (dndNodes.length) {\n dndNodes.forEach(function (node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n });\n\n gantt._touch_feedback();\n }\n } //gantt._touch_scroll_active = action_mode = scroll_mode = false;\n\n\n actionMode = scrollMode = false;\n dndNodes = [];\n currentDndId = null; //dbl-tap handling\n\n if (actionStart && dblclicktime) {\n var now = new Date();\n\n if (now - dblclicktime < 500) {\n var mouseEvents = gantt.$services.getService(\"mouseEvents\");\n mouseEvents.onDoubleClick(actionStart);\n block_action(e);\n } else dblclicktime = now;\n } else {\n dblclicktime = new Date();\n }\n }]);\n\n for (var i = 0; i < touchHandlers.length; i++) {\n gantt.event(touchHandlers[i][0], touchHandlers[i][1], touchHandlers[i][2]);\n } //common helper, prevents event\n\n\n function block_action(e) {\n if (e && e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n return false;\n }\n\n function cloneTaskRendered(taskId) {\n var renders = gantt._getTaskLayers();\n\n var task = gantt.getTask(taskId);\n\n if (task && gantt.isTaskVisible(taskId)) {\n currentDndId = taskId;\n\n for (var i = 0; i < renders.length; i++) {\n task = renders[i].rendered[taskId];\n\n if (task && task.getAttribute(gantt.config.task_attribute) && task.getAttribute(gantt.config.task_attribute) == taskId) {\n var copy = task.cloneNode(true);\n dndNodes.push(task);\n renders[i].rendered[taskId] = copy;\n task.style.display = \"none\";\n copy.className += \" gantt_drag_move \";\n task.parentNode.appendChild(copy); //return copy;\n }\n }\n }\n }\n };\n};","import * as env from \"../../../utils/env\";\r\nimport * as eventable from \"../../../utils/eventable\";\r\nimport { IScale, TModifierKeys } from \"../../common/config\";\r\n\r\ninterface ITimelineZoomConfig {\r\n\thandler?: (e: Event) => {};\r\n\tstartDate?: Date;\r\n\tendDate?: Date;\r\n\tlevels: IZoomLevel[];\r\n\tactiveLevelIndex?: number;\r\n\twidthStep?: number;\r\n\tminColumnWidth?: number;\r\n\tmaxColumnWidth?: number;\r\n\tuseKey?: \"ctrlKey\" | \"altKey\" | \"shiftKey\";\r\n\ttrigger?: \"wheel\" | null | undefined;\r\n\telement?: Element | (() => Element);\r\n}\r\n\r\nconst USE_KEY = [\"ctrlKey\", \"altKey\", \"shiftKey\", \"metaKey\"];\r\n\r\ninterface IZoomLevel {\r\n\tname?: string;\r\n\tscale_height?: number;\r\n\tmin_column_width: number;\r\n\tscales: IScale[];\r\n}\r\n\r\nconst _defaultScales = [\r\n\t[\r\n\t\t{\r\n\t\t\tunit: \"month\",\r\n\t\t\tdate: \"%M\",\r\n\t\t\tstep: 1\r\n\t\t},\r\n\t\t{\r\n\t\t\tunit: \"day\",\r\n\t\t\tdate: \"%d\",\r\n\t\t\tstep: 1\r\n\t\t}\r\n\t],\r\n\t[\r\n\t\t{\r\n\t\t\tunit: \"day\",\r\n\t\t\tdate: \"%d %M\",\r\n\t\t\tstep: 1\r\n\t\t}\r\n\t],\r\n\t[\r\n\t\t{\r\n\t\t\tunit: \"day\",\r\n\t\t\tdate: \"%d %M\",\r\n\t\t\tstep: 1\r\n\t\t},\r\n\t\t{\r\n\t\t\tunit: \"hour\",\r\n\t\t\tdate: \"%H:00\",\r\n\t\t\tstep: 8\r\n\t\t},\r\n\t],\r\n\t[\r\n\t\t{\r\n\t\t\tunit: \"day\",\r\n\t\t\tdate: \"%d %M\",\r\n\t\t\tstep: 1\r\n\t\t},\r\n\t\t{\r\n\t\t\tunit: \"hour\",\r\n\t\t\tdate: \"%H:00\",\r\n\t\t\tstep: 1\r\n\t\t},\r\n\t],\r\n];\r\n\r\nexport default class TimelineZoom {\r\n\tpublic attachEvent: (eventName: string, handler: () => void) => string;\r\n\tpublic callEvent: (eventName: string, args: any[]) => any;\r\n\tpublic detachEvent: (eventName: string) => any;\r\n\tprotected _initialStartDate: Date;\r\n\tprotected _initialEndDate: Date;\r\n\tprotected _activeLevelIndex: number;\r\n\tprotected _levels: IZoomLevel[];\r\n\tprotected _handler: (e: any) => void;\r\n\tprotected $gantt;\r\n\tprotected _widthStep: number;\r\n\tprotected _minColumnWidth: number;\r\n\tprotected _maxColumnWidth: number;\r\n\tprotected _useKey: TModifierKeys;\r\n\tprotected _visibleDate: Date;\r\n\tprotected _initialized: boolean;\r\n\tprotected _domEvents: any;\r\n\r\n\tconstructor(gantt) {\r\n\t\tthis.$gantt = gantt;\r\n\t\tthis._domEvents = this.$gantt._createDomEventScope();\r\n\t}\r\n\r\n\tpublic init(config: ITimelineZoomConfig) {\r\n\t\t// GS-1354 and GS-1318. If we check the headless mode using the function,\r\n\t\t// it will return false when Gantt is not initialized, but we may want to do it later\r\n\t\tif(this.$gantt.env.isNode){\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._initialStartDate = config.startDate;\r\n\t\tthis._initialEndDate = config.endDate;\r\n\t\tthis._activeLevelIndex = config.activeLevelIndex ? config.activeLevelIndex : 0;\r\n\t\tthis._levels = this._mapScales(config.levels || _defaultScales);\r\n\t\tthis._handler = config.handler || this._defaultHandler;\r\n\t\tthis._minColumnWidth = config.minColumnWidth || 60;\r\n\t\tthis._maxColumnWidth = config.maxColumnWidth || 240;\r\n\t\tthis._widthStep = config.widthStep || 3/8 * config.minColumnWidth;\r\n\t\tthis._useKey = config.useKey;\r\n\r\n\t\tif(!this._initialized){\r\n\t\t\teventable(this);\r\n\t\t\tthis.$gantt.attachEvent(\"onGanttScroll\", () => {\r\n\t\t\t\tthis._getVisibleDate();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._domEvents.detachAll();\r\n\r\n\t\tif(config.trigger === \"wheel\"){\r\n\t\t\tif(this.$gantt.$root){\r\n\t\t\t\tthis._attachWheelEvent(config);\r\n\t\t\t}else{\r\n\t\t\t\tthis.$gantt.attachEvent(\"onGanttReady\", () => {\r\n\t\t\t\t\tthis._attachWheelEvent(config);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._initialized = true;\r\n\t\tthis.setLevel(this._activeLevelIndex);\r\n\t}\r\n\r\n\tpublic zoomIn = () => {\r\n\t\tconst index = this.getCurrentLevel() - 1;\r\n\t\tif(index < 0){\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.setLevel(index);\r\n\t}\r\n\r\n\tpublic zoomOut = () => {\r\n\t\tconst index = this.getCurrentLevel() + 1;\r\n\t\tif(index > this._levels.length - 1){\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.setLevel(index);\r\n\t}\r\n\r\n\tpublic getCurrentLevel = () => {\r\n\t\treturn this._activeLevelIndex;\r\n\t}\r\n\r\n\tpublic getLevels = () => {\r\n\t\treturn this._levels;\r\n\t}\r\n\r\n\tpublic setLevel = (level: number|string) => {\r\n\t\tconst zoomLevel = this._getZoomIndexByName(level);\r\n\r\n\t\tif(zoomLevel === -1){\r\n\t\t\tthis.$gantt.assert(zoomLevel !== -1, \"Invalid zoom level for gantt.ext.zoom.setLevel. \" + level + \" is not an expected value.\");\r\n\t\t}\r\n\t\tthis._setLevel(zoomLevel, 0);\r\n\t}\r\n\r\n\tprotected _getZoomIndexByName = (levelName: number|string) => {\r\n\t\tlet zoomLevel:number = -1;\r\n\t\tif(typeof levelName === \"string\"){\r\n\t\t\tif(!isNaN(Number(levelName)) && this._levels[Number(levelName)]){\r\n\t\t\t\tzoomLevel = Number(levelName);\r\n\t\t\t}else{\r\n\t\t\t\tfor(let i = 0; i < this._levels.length; i++){\r\n\t\t\t\t\tif(this._levels[i].name === levelName){\r\n\t\t\t\t\t\tzoomLevel = i;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\tzoomLevel = levelName;\r\n\t\t}\r\n\t\treturn zoomLevel;\r\n\t}\r\n\r\n\tprotected _mapScales(levels: IScale[][] | any): IZoomLevel[]{\r\n\t\treturn levels.map((l) => {\r\n\t\t\tif(Array.isArray(l)){\r\n\t\t\t\treturn {\r\n\t\t\t\t\tscales: l\r\n\t\t\t\t};\r\n\t\t\t}else{\r\n\t\t\t\treturn l;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprotected _getVisibleDate = () => {\r\n\t\t// GS-1450. Don't try to get the visible date if there is no timeline\r\n\t\tif (!this.$gantt.$task){\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst scrollPos = this.$gantt.getScrollState().x;\r\n\t\tconst viewPort = this.$gantt.$task.offsetWidth;\r\n\t\tthis._visibleDate = this.$gantt.dateFromPos(scrollPos + viewPort/2);\r\n\t}\r\n\r\n\tprotected _setLevel = (level: number, cursorOffset: number) => {\r\n\t\tthis._activeLevelIndex = level;\r\n\r\n\t\tconst gantt = this.$gantt;\r\n\t\tconst nextConfig = gantt.copy(this._levels[this._activeLevelIndex]);\r\n\t\tconst chartConfig = gantt.copy(nextConfig);\r\n\t\tdelete chartConfig.name;\r\n\r\n\t\tgantt.mixin(gantt.config, chartConfig, true);\r\n\r\n\t\tconst isRendered = !!gantt.$root && !!gantt.$task;\r\n\r\n\t\tif(isRendered){\r\n\t\t\tif(cursorOffset){\r\n\t\t\t\tconst cursorDate = this.$gantt.dateFromPos(cursorOffset + this.$gantt.getScrollState().x);\r\n\t\t\t\tthis.$gantt.render();\r\n\t\t\t\tconst newPosition = this.$gantt.posFromDate(cursorDate);\r\n\t\t\t\tthis.$gantt.scrollTo(newPosition - cursorOffset);\r\n\t\t\t}else{\r\n\t\t\t\tconst viewPort = this.$gantt.$task.offsetWidth;\r\n\t\t\t\tif(!this._visibleDate){\r\n\t\t\t\t\tthis._getVisibleDate();\r\n\t\t\t\t}\r\n\t\t\t\tconst middleDate = this._visibleDate;\r\n\t\t\t\tthis.$gantt.render();\r\n\t\t\t\tconst newPosition = this.$gantt.posFromDate(middleDate);\r\n\t\t\t\tthis.$gantt.scrollTo(newPosition - viewPort/2);\r\n\t\t\t}\r\n\r\n\t\t\tthis.callEvent(\"onAfterZoom\", [this._activeLevelIndex, nextConfig]);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _attachWheelEvent = (config) => {\r\n\t\tconst event = env.isFF ? \"wheel\" : \"mousewheel\";\r\n\t\tlet el: Element;\r\n\t\tif(typeof config.element === \"function\"){\r\n\t\t\tel = config.element();\r\n\t\t}else{\r\n\t\t\tel = config.element as Element;\r\n\t\t}\r\n\t\tif (!el){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._domEvents.attach(el, event, this.$gantt.bind(function(e) {\r\n\t\t\tif (this._useKey) {\r\n\t\t\t\tif (USE_KEY.indexOf(this._useKey) < 0) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (!e[this._useKey]) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (typeof this._handler === \"function\") {\r\n\t\t\t\tthis._handler.apply(this, [e]);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}, this), {passive: false});\r\n\t}\r\n\r\n\tprivate _defaultHandler = (e: any):void => {\r\n\t\tconst timelineOffset = this.$gantt.$task.getBoundingClientRect().x;\r\n\t\tconst cursorOffset = e.clientX - timelineOffset;\r\n\t\tconst wheelY = this.$gantt.env.isFF ? (e.deltaY*-40) : e.wheelDelta;\r\n\t\tlet wheelUp = false;\r\n\t\tif (wheelY > 0) {\r\n\t\t\twheelUp = true;\r\n\t\t}\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tthis._setScaleSettings(wheelUp, cursorOffset);\r\n\t}\r\n\r\n\tprivate _setScaleSettings(wheelUp: boolean, cursorOffset: number) {\r\n\t\tif (wheelUp) {\r\n\t\t\tthis._stepUp(cursorOffset);\r\n\t\t} else {\r\n\t\t\tthis._stepDown(cursorOffset);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _setScaleDates = () => {\r\n\t\tif(this._initialStartDate && this._initialEndDate){\r\n\t\t\tthis.$gantt.config.start_date = this._initialStartDate;\r\n\t\t\tthis.$gantt.config.end_date = this._initialEndDate;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _stepUp(cursorOffset) {\r\n\t\tif (this._activeLevelIndex >= this._levels.length - 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet nextLevel = this._activeLevelIndex;\r\n\t\tthis._setScaleDates();\r\n\r\n\t\tif(this._widthStep){\r\n\t\t\tlet newColumnWidth = this.$gantt.config.min_column_width + this._widthStep;\r\n\t\t\tif (newColumnWidth > this._maxColumnWidth) {\r\n\t\t\t\tnewColumnWidth = this._minColumnWidth;\r\n\t\t\t\tnextLevel++;\r\n\t\t\t}\r\n\r\n\t\t\tthis.$gantt.config.min_column_width = newColumnWidth;\r\n\t\t}else{\r\n\t\t\tnextLevel++;\r\n\t\t}\r\n\t\tthis._setLevel(nextLevel, cursorOffset);\r\n\t}\r\n\tprivate _stepDown(cursorOffset) {\r\n\t\tif (this._activeLevelIndex < 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet nextLevel = this._activeLevelIndex;\r\n\t\tthis._setScaleDates();\r\n\r\n\t\tif(this._widthStep){\r\n\t\t\tlet newColumnWidth = this.$gantt.config.min_column_width - this._widthStep;\r\n\t\t\tif (newColumnWidth < this._minColumnWidth) {\r\n\t\t\t\tnewColumnWidth = this._maxColumnWidth;\r\n\t\t\t\tnextLevel--;\r\n\t\t\t}\r\n\t\t\tthis.$gantt.config.min_column_width = newColumnWidth;\r\n\t\t}else{\r\n\t\t\tnextLevel--;\r\n\t\t}\r\n\t\tthis._setLevel(nextLevel, cursorOffset);\r\n\t}\r\n}","if (window.dhtmlx) {\n if (!window.dhtmlx.attaches) window.dhtmlx.attaches = {};\n\n window.dhtmlx.attaches.attachGantt = function (start, end, gantt) {\n var obj = document.createElement(\"DIV\");\n gantt = gantt || window.gantt;\n obj.id = \"gantt_\" + gantt.uid();\n obj.style.width = \"100%\";\n obj.style.height = \"100%\";\n obj.cmp = \"grid\";\n document.body.appendChild(obj);\n this.attachObject(obj.id);\n this.dataType = \"gantt\";\n this.dataObj = gantt;\n var that = this.vs[this.av];\n that.grid = gantt;\n gantt.init(obj.id, start, end);\n obj.firstChild.style.border = \"none\";\n that.gridId = obj.id;\n that.gridObj = obj;\n var method_name = \"_viewRestore\";\n return this.vs[this[method_name]()].grid;\n };\n}\n\nif (typeof window.dhtmlXCellObject != \"undefined\") {\n window.dhtmlXCellObject.prototype.attachGantt = function (start, end, gantt) {\n gantt = gantt || window.gantt;\n var obj = document.createElement(\"DIV\");\n obj.id = \"gantt_\" + gantt.uid();\n obj.style.width = \"100%\";\n obj.style.height = \"100%\";\n obj.cmp = \"grid\";\n document.body.appendChild(obj);\n this.attachObject(obj.id);\n this.dataType = \"gantt\";\n this.dataObj = gantt;\n gantt.init(obj.id, start, end);\n obj.firstChild.style.border = \"none\";\n obj = null;\n this.callEvent(\"_onContentAttach\", []);\n return this.dataObj;\n };\n}\n\nmodule.exports = null;","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nif (window.jQuery) {\n (function ($) {\n var methods = [];\n\n $.fn.dhx_gantt = function (config) {\n config = config || {};\n\n if (typeof config === 'string') {\n if (methods[config]) {\n return methods[config].apply(this, []);\n } else {\n $.error('Method ' + config + ' does not exist on jQuery.dhx_gantt');\n }\n } else {\n var views = [];\n this.each(function () {\n if (this && this.getAttribute) {\n if (!this.gantt && !(window.gantt.$root == this)) {\n var newgantt = window.gantt.$container && window.Gantt ? window.Gantt.getGanttInstance() : window.gantt;\n\n for (var key in config) {\n if (key != \"data\") newgantt.config[key] = config[key];\n }\n\n newgantt.init(this);\n if (config.data) newgantt.parse(config.data);\n views.push(newgantt);\n } else views.push(_typeof(this.gantt) == \"object\" ? this.gantt : window.gantt);\n }\n });\n if (views.length === 1) return views[0];\n return views;\n }\n };\n })(window.jQuery);\n}\n\nmodule.exports = null;","var domHelpers = require(\"../utils/dom_helpers\");\n\nvar isHeadless = require(\"../../../utils/is_headless\");\n\nmodule.exports = function (gantt) {\n var scrollRange = 50,\n scrollStep = 30,\n scrollDelay = 10,\n scrollSpeed = 50;\n var interval = null,\n isMove = false,\n delayTimeout = null,\n startPos = {\n started: false\n },\n eventPos = {};\n\n function isDisplayed(element) {\n return element && domHelpers.isChildOf(element, gantt.$root) && element.offsetHeight;\n }\n\n function getAutoscrollContainer() {\n var element;\n\n if (isDisplayed(gantt.$task)) {\n element = gantt.$task;\n } else if (isDisplayed(gantt.$grid)) {\n element = gantt.$grid;\n } else {\n element = gantt.$root;\n }\n\n return element;\n }\n\n function isScrollState() {\n var dragMarker = !!document.querySelector(\".gantt_drag_marker\");\n var isResize = !!document.querySelector(\".gantt_drag_marker.gantt_grid_resize_area\") || !!document.querySelector(\".gantt_drag_marker.gantt_row_grid_resize_area\");\n var isLink = !!document.querySelector(\".gantt_link_direction\");\n var state = gantt.getState();\n var isClickDrag = state.autoscroll;\n isMove = dragMarker && !isResize && !isLink;\n return !(!state.drag_mode && !dragMarker || isResize) || isClickDrag;\n }\n\n function defineDelayTimeout(state) {\n if (delayTimeout) {\n clearTimeout(delayTimeout);\n delayTimeout = null;\n }\n\n if (state) {\n var speed = gantt.config.autoscroll_speed;\n if (speed && speed < 10) // limit speed value to 10\n speed = 10;\n delayTimeout = setTimeout(function () {\n interval = setInterval(tick, speed || scrollSpeed);\n }, gantt.config.autoscroll_delay || scrollDelay);\n }\n }\n\n function defineScrollInterval(state) {\n if (state) {\n defineDelayTimeout(true);\n\n if (!startPos.started) {\n startPos.x = eventPos.x;\n startPos.y = eventPos.y;\n startPos.started = true;\n }\n } else {\n if (interval) {\n clearInterval(interval);\n interval = null;\n }\n\n defineDelayTimeout(false);\n startPos.started = false;\n }\n }\n\n function autoscrollInterval(event) {\n var isScroll = isScrollState();\n\n if ((interval || delayTimeout) && !isScroll) {\n defineScrollInterval(false);\n }\n\n if (!gantt.config.autoscroll || !isScroll) {\n return false;\n }\n\n eventPos = {\n x: event.clientX,\n y: event.clientY\n }; // if it is a mobile device, we need to detect the touch event coords\n\n if (event.type == \"touchmove\") {\n eventPos.x = event.targetTouches[0].clientX;\n eventPos.y = event.targetTouches[0].clientY;\n }\n\n if (!interval && isScroll) {\n defineScrollInterval(true);\n }\n }\n\n function tick() {\n if (!isScrollState()) {\n defineScrollInterval(false);\n return false;\n }\n\n var container = getAutoscrollContainer();\n\n if (!container) {\n return;\n } // GS-1150: if we reorder or resize something in the grid, we should obtain the grid container\n\n\n var gridDrag = false;\n var gridMarkers = [\".gantt_drag_marker.gantt_grid_resize_area\", \".gantt_drag_marker .gantt_row.gantt_row_task\", \".gantt_drag_marker.gantt_grid_dnd_marker\"];\n gridMarkers.forEach(function (selector) {\n gridDrag = gridDrag || !!document.querySelector(selector);\n });\n\n if (gridDrag) {\n container = gantt.$grid;\n }\n\n var box = domHelpers.getNodePosition(container);\n var posX = eventPos.x - box.x;\n var posY = eventPos.y - box.y + window.scrollY; // GS-1315: window.scrollY here and below for the elements above Gantt\n\n var scrollLeft = isMove ? 0 : need_scroll(posX, box.width, startPos.x - box.x);\n var scrollTop = need_scroll(posY, box.height, startPos.y - box.y + window.scrollY);\n var scrollState = gantt.getScrollState();\n var currentScrollTop = scrollState.y,\n scrollOuterHeight = scrollState.inner_height,\n scrollInnerHeight = scrollState.height,\n currentScrollLeft = scrollState.x,\n scrollOuterWidth = scrollState.inner_width,\n scrollInnerWidth = scrollState.width; // do scrolling only if we have scrollable area to do so\n\n if (scrollTop && !scrollOuterHeight) {\n scrollTop = 0;\n } else if (scrollTop < 0 && !currentScrollTop) {\n scrollTop = 0;\n } else if (scrollTop > 0 && currentScrollTop + scrollOuterHeight >= scrollInnerHeight + 2) {\n scrollTop = 0;\n }\n\n if (scrollLeft && !scrollOuterWidth) {\n scrollLeft = 0;\n } else if (scrollLeft < 0 && !currentScrollLeft) {\n scrollLeft = 0;\n } else if (scrollLeft > 0 && currentScrollLeft + scrollOuterWidth >= scrollInnerWidth) {\n scrollLeft = 0;\n }\n\n var step = gantt.config.autoscroll_step;\n if (step && step < 2) // limit step value to 2\n step = 2;\n scrollLeft = scrollLeft * (step || scrollStep);\n scrollTop = scrollTop * (step || scrollStep);\n\n if (scrollLeft || scrollTop) {\n scroll(scrollLeft, scrollTop);\n }\n }\n\n function need_scroll(pos, boxSize, startCoord) {\n if (pos - scrollRange < 0 && pos < startCoord) return -1;else if (pos > boxSize - scrollRange && pos > startCoord) return 1;\n return 0;\n }\n\n function scroll(left, top) {\n var scrollState = gantt.getScrollState();\n var scrollLeft = null,\n scrollTop = null;\n\n if (left) {\n scrollLeft = scrollState.x + left;\n scrollLeft = Math.min(scrollState.width, scrollLeft);\n scrollLeft = Math.max(0, scrollLeft);\n }\n\n if (top) {\n scrollTop = scrollState.y + top;\n scrollTop = Math.min(scrollState.height, scrollTop);\n scrollTop = Math.max(0, scrollTop);\n }\n\n gantt.scrollTo(scrollLeft, scrollTop);\n }\n\n gantt.attachEvent(\"onGanttReady\", function () {\n if (!isHeadless(gantt)) {\n var eventElement = domHelpers.getRootNode(gantt.$root) || document.body;\n gantt.eventRemove(eventElement, \"mousemove\", autoscrollInterval);\n gantt.event(eventElement, \"mousemove\", autoscrollInterval);\n gantt.eventRemove(eventElement, \"touchmove\", autoscrollInterval);\n gantt.event(eventElement, \"touchmove\", autoscrollInterval);\n gantt.eventRemove(eventElement, \"pointermove\", autoscrollInterval);\n gantt.event(eventElement, \"pointermove\", autoscrollInterval);\n }\n });\n gantt.attachEvent(\"onDestroy\", function () {\n defineScrollInterval(false);\n });\n};","module.exports = function (gantt) {\n if (!gantt.ext) {\n gantt.ext = {};\n }\n\n var modules = [require(\"./autoscroll\"), require(\"./jquery_hooks\"), require(\"./dhtmlx_hooks\")];\n\n for (var i = 0; i < modules.length; i++) {\n if (modules[i]) modules[i](gantt);\n }\n\n var TimelineZoom = require(\"./timeline_zoom\")[\"default\"];\n\n gantt.ext.zoom = new TimelineZoom(gantt);\n};","module.exports = function (gantt) {\n gantt.skins[\"contrast_white\"] = {\n config: {\n grid_width: 360,\n row_height: 35,\n scale_height: 35,\n link_line_width: 2,\n link_arrow_size: 6,\n lightbox_additional_height: 75\n },\n _second_column_width: 100,\n _third_column_width: 80\n };\n};","module.exports = function (gantt) {\n gantt.skins[\"contrast_black\"] = {\n config: {\n grid_width: 360,\n row_height: 35,\n scale_height: 35,\n link_line_width: 2,\n link_arrow_size: 6,\n lightbox_additional_height: 75\n },\n _second_column_width: 100,\n _third_column_width: 80\n };\n};","module.exports = function (gantt) {\n gantt.skins.material = {\n config: {\n grid_width: 411,\n row_height: 34,\n task_height_offset: 6,\n scale_height: 36,\n link_line_width: 2,\n link_arrow_size: 6,\n lightbox_additional_height: 80\n },\n _second_column_width: 110,\n _third_column_width: 75,\n _redefine_lightbox_buttons: {\n \"buttons_left\": [\"dhx_delete_btn\"],\n \"buttons_right\": [\"dhx_save_btn\", \"dhx_cancel_btn\"]\n }\n };\n gantt.attachEvent(\"onAfterTaskDrag\", function (id) {\n var t = gantt.getTaskNode(id);\n\n if (t) {\n t.className += \" gantt_drag_animation\";\n setTimeout(function () {\n var indx = t.className.indexOf(\" gantt_drag_animation\");\n\n if (indx > -1) {\n t.className = t.className.slice(0, indx);\n }\n }, 200);\n }\n });\n};","module.exports = function (gantt) {\n gantt.skins.broadway = {\n config: {\n grid_width: 360,\n row_height: 35,\n scale_height: 35,\n link_line_width: 1,\n link_arrow_size: 7,\n lightbox_additional_height: 86\n },\n _second_column_width: 90,\n _third_column_width: 80,\n _lightbox_template: \"<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span><div class='gantt_cancel_btn'></div></div><div class='gantt_cal_larea'></div>\",\n _config_buttons_left: {},\n _config_buttons_right: {\n \"gantt_delete_btn\": \"icon_delete\",\n \"gantt_save_btn\": \"icon_save\"\n }\n };\n};","module.exports = function (gantt) {\n gantt.skins.terrace = {\n config: {\n grid_width: 360,\n row_height: 35,\n scale_height: 35,\n link_line_width: 2,\n link_arrow_size: 6,\n lightbox_additional_height: 75\n },\n _second_column_width: 90,\n _third_column_width: 70\n };\n};","module.exports = function (gantt) {\n gantt.skins.meadow = {\n config: {\n grid_width: 350,\n row_height: 27,\n scale_height: 30,\n link_line_width: 2,\n link_arrow_size: 6,\n lightbox_additional_height: 72\n },\n _second_column_width: 95,\n _third_column_width: 80\n };\n};","module.exports = function (gantt) {\n gantt.skins.skyblue = {\n config: {\n grid_width: 350,\n row_height: 27,\n scale_height: 27,\n link_line_width: 1,\n link_arrow_size: 8,\n lightbox_additional_height: 75\n },\n _second_column_width: 95,\n _third_column_width: 80\n };\n};","function _configure(col, data, force) {\n for (var key in data) {\n if (typeof col[key] == \"undefined\" || force) col[key] = data[key];\n }\n}\n\nfunction _get_skin(force, gantt) {\n var skin = gantt.skin;\n\n if (!skin || force) {\n var links = document.getElementsByTagName(\"link\");\n\n for (var i = 0; i < links.length; i++) {\n var res = links[i].href.match(\"dhtmlxgantt_([a-z_]+).css\");\n\n if (res) {\n if (gantt.skins[res[1]] || !skin) {\n skin = res[1];\n break;\n }\n }\n }\n }\n\n gantt.skin = skin || \"terrace\";\n var skinset = gantt.skins[gantt.skin] || gantt.skins[\"terrace\"]; //apply skin related settings\n\n _configure(gantt.config, skinset.config, force);\n\n var config = gantt.getGridColumns();\n if (config[1] && !gantt.defined(config[1].width)) config[1].width = skinset._second_column_width;\n if (config[2] && !gantt.defined(config[2].width)) config[2].width = skinset._third_column_width;\n\n for (var i = 0; i < config.length; i++) {\n var column = config[i];\n\n if (column.name == \"add\") {\n if (!column.width) {\n column.width = 44;\n }\n\n if (!(gantt.defined(column.min_width) && gantt.defined(column.max_width))) {\n column.min_width = column.min_width || column.width;\n column.max_width = column.max_width || column.width;\n }\n\n if (column.min_width) column.min_width = +column.min_width;\n if (column.max_width) column.max_width = +column.max_width;\n\n if (column.width) {\n column.width = +column.width;\n column.width = column.min_width && column.min_width > column.width ? column.min_width : column.width;\n column.width = column.max_width && column.max_width < column.width ? column.max_width : column.width;\n }\n }\n }\n\n if (skinset.config.task_height) {\n gantt.config.task_height = skinset.config.task_height || \"full\";\n }\n\n if (skinset.config.bar_height) {\n gantt.config.bar_height = skinset.config.bar_height || \"full\";\n }\n\n if (skinset._lightbox_template) gantt._lightbox_template = skinset._lightbox_template;\n\n if (skinset._redefine_lightbox_buttons) {\n gantt.config.buttons_right = skinset._redefine_lightbox_buttons[\"buttons_right\"];\n gantt.config.buttons_left = skinset._redefine_lightbox_buttons[\"buttons_left\"];\n }\n\n gantt.resetLightbox();\n}\n\nmodule.exports = function (gantt) {\n if (!gantt.resetSkin) {\n gantt.resetSkin = function () {\n this.skin = \"\";\n\n _get_skin(true, this);\n };\n\n gantt.skins = {};\n gantt.attachEvent(\"onGanttLayoutReady\", function () {\n _get_skin(false, this);\n });\n }\n};","function createLayoutFacade() {\n function getTimeline(gantt) {\n return gantt.$ui.getView(\"timeline\");\n }\n\n function getGrid(gantt) {\n return gantt.$ui.getView(\"grid\");\n }\n\n function getBaseCell(gantt) {\n var timeline = getTimeline(gantt);\n\n if (timeline && !timeline.$config.hidden) {\n return timeline;\n } else {\n var grid = getGrid(gantt);\n\n if (grid && !grid.$config.hidden) {\n return grid;\n } else {\n return null;\n }\n }\n }\n\n function getVerticalScrollbar(gantt) {\n var baseCell = null; // GS-1150: if we reorder or resize something in the grid, we should obtain the grid container\n\n var gridDrag = false;\n var gridMarkers = [\".gantt_drag_marker.gantt_grid_resize_area\", \".gantt_drag_marker .gantt_row.gantt_row_task\", \".gantt_drag_marker.gantt_grid_dnd_marker\"];\n gridMarkers.forEach(function (selector) {\n gridDrag = gridDrag || !!document.querySelector(selector);\n });\n\n if (gridDrag) {\n baseCell = getGrid(gantt);\n } else {\n baseCell = getBaseCell(gantt);\n } // GS-1827. If there is no grid and timeline, there is no scrollbar for them\n\n\n if (!baseCell) {\n return null;\n }\n\n var verticalScrollbar = getAttachedScrollbar(gantt, baseCell, \"scrollY\");\n return verticalScrollbar;\n }\n\n function getHorizontalScrollbar(gantt) {\n var baseCell = getBaseCell(gantt);\n\n if (!baseCell || baseCell.id == \"grid\") {\n return null; // if the timeline is not displayed, do not return the scrollbar\n }\n\n var horizontalScrollbar = getAttachedScrollbar(gantt, baseCell, \"scrollX\");\n return horizontalScrollbar;\n }\n\n function getAttachedScrollbar(gantt, cell, type) {\n var attachedScrollbar = cell.$config[type];\n var scrollbarView = gantt.$ui.getView(attachedScrollbar);\n return scrollbarView;\n }\n\n var DEFAULT_VALUE = \"DEFAULT_VALUE\";\n\n function tryCall(getView, method, args, fallback) {\n var view = getView(this);\n\n if (!(view && view.isVisible())) {\n if (fallback) {\n return fallback();\n } else {\n return DEFAULT_VALUE;\n }\n } else {\n return view[method].apply(view, args);\n }\n }\n\n return {\n getColumnIndex: function getColumnIndex(name) {\n var res = tryCall.call(this, getGrid, \"getColumnIndex\", [name]);\n\n if (res === DEFAULT_VALUE) {\n return 0;\n } else {\n return res;\n }\n },\n dateFromPos: function dateFromPos(x) {\n var res = tryCall.call(this, getTimeline, \"dateFromPos\", Array.prototype.slice.call(arguments));\n\n if (res === DEFAULT_VALUE) {\n return this.getState().min_date;\n } else {\n return res;\n }\n },\n posFromDate: function posFromDate(date) {\n var res = tryCall.call(this, getTimeline, \"posFromDate\", [date]);\n\n if (res === DEFAULT_VALUE) {\n return 0;\n } else {\n return res;\n }\n },\n getRowTop: function getRowTop(index) {\n var self = this;\n var res = tryCall.call(self, getTimeline, \"getRowTop\", [index], function () {\n return tryCall.call(self, getGrid, \"getRowTop\", [index]);\n });\n\n if (res === DEFAULT_VALUE) {\n return 0;\n } else {\n return res;\n }\n },\n getTaskTop: function getTaskTop(id) {\n var self = this;\n var res = tryCall.call(self, getTimeline, \"getItemTop\", [id], function () {\n return tryCall.call(self, getGrid, \"getItemTop\", [id]);\n });\n\n if (res === DEFAULT_VALUE) {\n return 0;\n } else {\n return res;\n }\n },\n getTaskPosition: function getTaskPosition(task, start_date, end_date) {\n var res = tryCall.call(this, getTimeline, \"getItemPosition\", [task, start_date, end_date]);\n\n if (res === DEFAULT_VALUE) {\n var top = this.getTaskTop(task.id);\n var height = this.getTaskBarHeight(task.id);\n return {\n left: 0,\n top: top,\n height: height,\n width: 0\n };\n } else {\n return res;\n }\n },\n getTaskBarHeight: function getTaskBarHeight(taskId, isMilestoneRender) {\n var self = this;\n var res = tryCall.call(self, getTimeline, \"getBarHeight\", [taskId, isMilestoneRender], function () {\n return tryCall.call(self, getGrid, \"getItemHeight\", [taskId]);\n });\n\n if (res === DEFAULT_VALUE) {\n return 0;\n } else {\n return res;\n }\n },\n getTaskHeight: function getTaskHeight(taskId) {\n var self = this;\n var res = tryCall.call(self, getTimeline, \"getItemHeight\", [taskId], function () {\n return tryCall.call(self, getGrid, \"getItemHeight\", [taskId]);\n });\n\n if (res === DEFAULT_VALUE) {\n return 0;\n } else {\n return res;\n }\n },\n columnIndexByDate: function columnIndexByDate(date) {\n var res = tryCall.call(this, getTimeline, \"columnIndexByDate\", [date]);\n\n if (res === DEFAULT_VALUE) {\n return 0;\n } else {\n return res;\n }\n },\n roundTaskDates: function roundTaskDates() {\n tryCall.call(this, getTimeline, \"roundTaskDates\", []);\n },\n getScale: function getScale() {\n var res = tryCall.call(this, getTimeline, \"getScale\", []);\n\n if (res === DEFAULT_VALUE) {\n return null;\n } else {\n return res;\n }\n },\n getTaskNode: function getTaskNode(id) {\n var timeline = getTimeline(this);\n\n if (!timeline || !timeline.isVisible()) {\n return null;\n } else {\n var node = timeline._taskRenderer.rendered[id];\n\n if (!node) {\n var domAttr = timeline.$config.item_attribute;\n node = timeline.$task_bars.querySelector(\"[\" + domAttr + \"='\" + id + \"']\");\n }\n\n return node || null;\n }\n },\n getLinkNode: function getLinkNode(id) {\n var timeline = getTimeline(this);\n\n if (!timeline.isVisible()) {\n return null;\n } else {\n return timeline._linkRenderer.rendered[id];\n }\n },\n scrollTo: function scrollTo(left, top) {\n var vertical = getVerticalScrollbar(this);\n var horizontal = getHorizontalScrollbar(this);\n var oldH = {\n position: 0\n },\n oldV = {\n position: 0\n };\n\n if (vertical) {\n oldV = vertical.getScrollState();\n }\n\n if (horizontal) {\n oldH = horizontal.getScrollState();\n }\n\n var scrollHorizontal = horizontal && left * 1 == left;\n var scrollVertical = vertical && top * 1 == top;\n var scrollBoth = scrollHorizontal && scrollVertical;\n\n if (scrollBoth) {\n // some views will be scrolled both horizontally and vertically and smart rendering can be called twice\n // set flag in order not to invoke smart rendering at the horizontal scroll stage\n // so it will repaint only once when the scroll is completed\n var verticalViews = vertical._getLinkedViews();\n\n var horizontalViews = horizontal._getLinkedViews();\n\n var commonViews = [];\n\n for (var i = 0; i < verticalViews.length; i++) {\n for (var j = 0; j < horizontalViews.length; j++) {\n if (verticalViews[i].$config.id && horizontalViews[j].$config.id && verticalViews[i].$config.id === horizontalViews[j].$config.id) {\n commonViews.push(verticalViews[i].$config.id);\n }\n }\n }\n }\n\n if (scrollHorizontal) {\n if (commonViews) {\n commonViews.forEach(function (viewId) {\n this.$ui.getView(viewId).$config.$skipSmartRenderOnScroll = true;\n }.bind(this));\n }\n\n horizontal.scroll(left);\n\n if (commonViews) {\n commonViews.forEach(function (viewId) {\n this.$ui.getView(viewId).$config.$skipSmartRenderOnScroll = false;\n }.bind(this));\n }\n }\n\n if (scrollVertical) {\n vertical.scroll(top);\n }\n\n var newV = {\n position: 0\n },\n newH = {\n position: 0\n };\n\n if (vertical) {\n newV = vertical.getScrollState();\n }\n\n if (horizontal) {\n newH = horizontal.getScrollState();\n }\n\n this.callEvent(\"onGanttScroll\", [oldH.position, oldV.position, newH.position, newV.position]);\n },\n showDate: function showDate(date) {\n var date_x = this.posFromDate(date);\n var scroll_to = Math.max(date_x - this.config.task_scroll_offset, 0);\n this.scrollTo(scroll_to);\n },\n showTask: function showTask(id) {\n var pos = this.getTaskPosition(this.getTask(id)); // GS-1261: we need to show the start_date even in the RTL mode\n\n var leftPos = pos.left;\n if (this.config.rtl) leftPos = pos.left + pos.width;\n var left = Math.max(leftPos - this.config.task_scroll_offset, 0);\n\n var dataHeight = this._scroll_state().y;\n\n var top;\n\n if (!dataHeight) {\n top = pos.top;\n } else {\n top = pos.top - (dataHeight - this.getTaskBarHeight(id)) / 2;\n }\n\n this.scrollTo(left, top); // GS-1150: if the grid and timeline have different scrollbars, we need to scroll thegrid to show the task\n\n var gridCell = getGrid(this);\n var timelineCell = getTimeline(this);\n\n if (gridCell && timelineCell && gridCell.$config.scrollY != timelineCell.$config.scrollY) {\n var gridScrollbar = getAttachedScrollbar(this, gridCell, \"scrollY\");\n gridScrollbar.scrollTo(null, top);\n }\n },\n _scroll_state: function _scroll_state() {\n var result = {\n x: false,\n y: false,\n x_pos: 0,\n y_pos: 0,\n scroll_size: this.config.scroll_size + 1,\n //1px for inner content\n x_inner: 0,\n y_inner: 0\n };\n var scrollVer = getVerticalScrollbar(this),\n scrollHor = getHorizontalScrollbar(this);\n\n if (scrollHor) {\n var horState = scrollHor.getScrollState();\n\n if (horState.visible) {\n result.x = horState.size;\n result.x_inner = horState.scrollSize;\n }\n\n result.x_pos = horState.position || 0;\n }\n\n if (scrollVer) {\n var verState = scrollVer.getScrollState();\n\n if (verState.visible) {\n result.y = verState.size;\n result.y_inner = verState.scrollSize;\n }\n\n result.y_pos = verState.position || 0;\n }\n\n return result;\n },\n getScrollState: function getScrollState() {\n var state = this._scroll_state();\n\n return {\n x: state.x_pos,\n y: state.y_pos,\n inner_width: state.x,\n inner_height: state.y,\n width: state.x_inner,\n height: state.y_inner\n };\n },\n getLayoutView: function getLayoutView(cellName) {\n return this.$ui.getView(cellName);\n },\n scrollLayoutCell: function scrollLayoutCell(cellName, left, top) {\n var cell = this.$ui.getView(cellName);\n\n if (!cell) {\n return false;\n }\n\n if (left !== null) {\n var horizontalScroll = this.$ui.getView(cell.$config.scrollX);\n\n if (horizontalScroll) {\n horizontalScroll.scrollTo(left, null);\n }\n }\n\n if (top !== null) {\n var verticalScroll = this.$ui.getView(cell.$config.scrollY);\n\n if (verticalScroll) {\n verticalScroll.scrollTo(null, top);\n }\n }\n }\n };\n}\n\nmodule.exports = createLayoutFacade;","module.exports = function (gantt) {\n delete gantt.addTaskLayer;\n delete gantt.addLinkLayer;\n};","var domHelpers = require(\"./utils/dom_helpers\");\n\nvar initializer = function () {\n return function (gantt) {\n return {\n getVerticalScrollbar: function getVerticalScrollbar() {\n return gantt.$ui.getView(\"scrollVer\");\n },\n getHorizontalScrollbar: function getHorizontalScrollbar() {\n return gantt.$ui.getView(\"scrollHor\");\n },\n _legacyGridResizerClass: function _legacyGridResizerClass(layout) {\n var resizers = layout.getCellsByType(\"resizer\");\n\n for (var i = 0; i < resizers.length; i++) {\n var r = resizers[i];\n var gridResizer = false;\n var prev = r.$parent.getPrevSibling(r.$id);\n\n if (prev && prev.$config && prev.$config.id === \"grid\") {\n gridResizer = true;\n } else {\n var next = r.$parent.getNextSibling(r.$id);\n\n if (next && next.$config && next.$config.id === \"grid\") {\n gridResizer = true;\n }\n }\n\n if (gridResizer) {\n r.$config.css = (r.$config.css ? r.$config.css + \" \" : \"\") + \"gantt_grid_resize_wrap\";\n }\n }\n },\n onCreated: function onCreated(layout) {\n var first = true;\n\n this._legacyGridResizerClass(layout);\n\n layout.attachEvent(\"onBeforeResize\", function () {\n var mainTimeline = gantt.$ui.getView(\"timeline\");\n if (mainTimeline) mainTimeline.$config.hidden = mainTimeline.$parent.$config.hidden = !gantt.config.show_chart;\n var mainGrid = gantt.$ui.getView(\"grid\");\n if (!mainGrid) return;\n\n var colsWidth = mainGrid._getColsTotalWidth();\n\n var hideGrid = !gantt.config.show_grid || !gantt.config.grid_width || colsWidth === 0;\n\n if (first && !hideGrid && colsWidth !== false) {\n gantt.config.grid_width = colsWidth;\n }\n\n mainGrid.$config.hidden = mainGrid.$parent.$config.hidden = hideGrid;\n\n if (!mainGrid.$config.hidden) {\n /* restrict grid width due to min_width, max_width, min_grid_column_width */\n var grid_limits = mainGrid._getGridWidthLimits();\n\n if (grid_limits[0] && gantt.config.grid_width < grid_limits[0]) gantt.config.grid_width = grid_limits[0];\n if (grid_limits[1] && gantt.config.grid_width > grid_limits[1]) gantt.config.grid_width = grid_limits[1];\n\n if (mainTimeline && gantt.config.show_chart) {\n mainGrid.$config.width = gantt.config.grid_width - 1; // GS-1314: Don't let the non-scrollable grid to be larger than the container with the correct width\n\n if (!mainGrid.$config.scrollable && mainGrid.$config.scrollY && gantt.$root.offsetWidth) {\n var ganttContainerWidth = mainGrid.$gantt.$layout.$container.offsetWidth;\n var verticalScrollbar = gantt.$ui.getView(mainGrid.$config.scrollY);\n var verticalScrollbarWidth = verticalScrollbar.$config.width;\n var gridOverflow = ganttContainerWidth - (mainGrid.$config.width + verticalScrollbarWidth);\n\n if (gridOverflow < 0) {\n mainGrid.$config.width += gridOverflow;\n gantt.config.grid_width += gridOverflow;\n }\n }\n\n if (!first) {\n if (mainTimeline && !domHelpers.isChildOf(mainTimeline.$task, layout.$view)) {\n // timeline is being displayed after being not visible, reset grid with from full screen\n if (!mainGrid.$config.original_grid_width) {\n var skinSettings = gantt.skins[gantt.skin];\n\n if (skinSettings && skinSettings.config && skinSettings.config.grid_width) {\n mainGrid.$config.original_grid_width = skinSettings.config.grid_width;\n } else {\n mainGrid.$config.original_grid_width = 0;\n }\n }\n\n gantt.config.grid_width = mainGrid.$config.original_grid_width;\n mainGrid.$parent.$config.width = gantt.config.grid_width;\n } else {\n mainGrid.$parent._setContentSize(mainGrid.$config.width, null);\n\n gantt.$layout._syncCellSizes(mainGrid.$parent.$config.group, {\n value: gantt.config.grid_width,\n isGravity: false\n });\n }\n } else {\n mainGrid.$parent.$config.width = gantt.config.grid_width;\n\n if (mainGrid.$parent.$config.group) {\n gantt.$layout._syncCellSizes(mainGrid.$parent.$config.group, {\n value: mainGrid.$parent.$config.width,\n isGravity: false\n });\n }\n }\n } else {\n if (mainTimeline && domHelpers.isChildOf(mainTimeline.$task, layout.$view)) {\n // hiding timeline, remember grid with to restore it when timeline is displayed again\n mainGrid.$config.original_grid_width = gantt.config.grid_width;\n }\n\n if (!first) {\n mainGrid.$parent.$config.width = 0;\n }\n }\n }\n\n first = false;\n });\n\n this._initScrollStateEvents(layout);\n },\n _initScrollStateEvents: function _initScrollStateEvents(layout) {\n gantt._getVerticalScrollbar = this.getVerticalScrollbar;\n gantt._getHorizontalScrollbar = this.getHorizontalScrollbar;\n var vertical = this.getVerticalScrollbar();\n var horizontal = this.getHorizontalScrollbar();\n\n if (vertical) {\n vertical.attachEvent(\"onScroll\", function (oldPos, newPos, dir) {\n var scrollState = gantt.getScrollState();\n gantt.callEvent(\"onGanttScroll\", [scrollState.x, oldPos, scrollState.x, newPos]);\n });\n }\n\n if (horizontal) {\n horizontal.attachEvent(\"onScroll\", function (oldPos, newPos, dir) {\n var scrollState = gantt.getScrollState();\n gantt.callEvent(\"onGanttScroll\", [oldPos, scrollState.y, newPos, scrollState.y]); // if the grid doesn't fit the width, scroll the row container\n\n var grid = gantt.$ui.getView(\"grid\");\n\n if (grid && grid.$grid_data && !grid.$config.scrollable) {\n grid.$grid_data.style.left = grid.$grid.scrollLeft + \"px\";\n grid.$grid_data.scrollLeft = grid.$grid.scrollLeft;\n }\n });\n }\n\n layout.attachEvent(\"onResize\", function () {\n if (vertical && !gantt.$scroll_ver) {\n gantt.$scroll_ver = vertical.$scroll_ver;\n }\n\n if (horizontal && !gantt.$scroll_hor) {\n gantt.$scroll_hor = horizontal.$scroll_hor;\n }\n });\n },\n _findGridResizer: function _findGridResizer(layout, grid) {\n var resizers = layout.getCellsByType(\"resizer\");\n var gridFirst = true;\n var gridResizer;\n\n for (var i = 0; i < resizers.length; i++) {\n var res = resizers[i];\n\n res._getSiblings();\n\n var prev = res._behind;\n var next = res._front;\n\n if (prev && prev.$content === grid || prev.isChild && prev.isChild(grid)) {\n gridResizer = res;\n gridFirst = true;\n break;\n } else if (next && next.$content === grid || next.isChild && next.isChild(grid)) {\n gridResizer = res;\n gridFirst = false;\n break;\n }\n }\n\n return {\n resizer: gridResizer,\n gridFirst: gridFirst\n };\n },\n onInitialized: function onInitialized(layout) {\n var grid = gantt.$ui.getView(\"grid\");\n\n var resizeInfo = this._findGridResizer(layout, grid); // expose grid resize events\n\n\n if (resizeInfo.resizer) {\n var gridFirst = resizeInfo.gridFirst,\n next = resizeInfo.resizer;\n\n if (next.$config.mode !== \"x\") {\n return; // track only horizontal resize\n }\n\n var initialWidth;\n next.attachEvent(\"onResizeStart\", function (prevCellWidth, nextCellWidth) {\n var grid = gantt.$ui.getView(\"grid\");\n var viewCell = grid ? grid.$parent : null;\n\n if (viewCell) {\n var limits = grid._getGridWidthLimits(); // min grid width is defined by min widths of its columns, unless grid has horizontal scroll\n\n\n if (!grid.$config.scrollable) viewCell.$config.minWidth = limits[0];\n viewCell.$config.maxWidth = limits[1];\n }\n\n initialWidth = gridFirst ? prevCellWidth : nextCellWidth;\n return gantt.callEvent(\"onGridResizeStart\", [initialWidth]);\n });\n next.attachEvent(\"onResize\", function (newBehindSize, newFrontSize) {\n var newSize = gridFirst ? newBehindSize : newFrontSize;\n return gantt.callEvent(\"onGridResize\", [initialWidth, newSize]);\n });\n next.attachEvent(\"onResizeEnd\", function (oldBackSize, oldFrontSize, newBackSize, newFrontSize) {\n var oldSize = gridFirst ? oldBackSize : oldFrontSize;\n var newSize = gridFirst ? newBackSize : newFrontSize;\n var grid = gantt.$ui.getView(\"grid\");\n var viewCell = grid ? grid.$parent : null;\n\n if (viewCell) {\n viewCell.$config.minWidth = undefined;\n }\n\n var res = gantt.callEvent(\"onGridResizeEnd\", [oldSize, newSize]);\n\n if (res && newSize !== 0) {\n // new size may be numeric zero when cell size is defined by 'gravity', actual size will be calculated by layout later\n gantt.config.grid_width = newSize;\n }\n\n return res;\n });\n }\n },\n onDestroyed: function onDestroyed(timeline) {}\n };\n };\n}();\n\nmodule.exports = initializer;","var domHelpers = require(\"../utils/dom_helpers\");\n\nvar initLinksDND = function initLinksDND(timeline, gantt) {\n var _link_landing,\n _link_target_task,\n _link_target_task_start,\n _link_source_task,\n _link_source_task_start,\n markerDefaultOffset = 10,\n scrollDefaultSize = 18;\n\n function getVisibleMilestoneWidth(taskId) {\n var origWidth = timeline.getBarHeight(taskId, true); //m-s have square shape\n\n return Math.round(Math.sqrt(2 * origWidth * origWidth)) - 2;\n }\n\n function isMilestone(task) {\n return gantt.getTaskType(task.type) == gantt.config.types.milestone;\n }\n\n function getDndState() {\n return {\n link_source_id: _link_source_task,\n link_target_id: _link_target_task,\n link_from_start: _link_source_task_start,\n link_to_start: _link_target_task_start,\n link_landing_area: _link_landing\n };\n }\n\n var services = gantt.$services;\n var state = services.getService(\"state\");\n var DnD = services.getService(\"dnd\");\n state.registerProvider(\"linksDnD\", getDndState);\n var start_marker = \"task_start_date\",\n end_marker = \"task_end_date\",\n link_edge_marker = \"gantt_link_point\",\n link_landing_hover_area = \"gantt_link_control\";\n var dnd = new DnD(timeline.$task_bars, {\n sensitivity: 0,\n updates_per_second: 60,\n mousemoveContainer: gantt.$root,\n selector: \".\" + link_edge_marker,\n preventDefault: true\n });\n dnd.attachEvent(\"onBeforeDragStart\", gantt.bind(function (obj, e) {\n var target = e.target || e.srcElement;\n resetDndState();\n if (gantt.getState(\"tasksDnd\").drag_id) return false;\n\n if (domHelpers.locateClassName(target, link_edge_marker)) {\n if (domHelpers.locateClassName(target, start_marker)) _link_source_task_start = true;\n var sid = gantt.locate(e);\n _link_source_task = sid;\n var t = gantt.getTask(sid);\n\n if (gantt.isReadonly(t)) {\n resetDndState();\n return false;\n }\n\n var shift = 0;\n this._dir_start = getLinePos(t, !!_link_source_task_start, shift, timeline.$getConfig(), true);\n return true;\n } else {\n return false;\n }\n }, this));\n dnd.attachEvent(\"onAfterDragStart\", gantt.bind(function (obj, e) {\n if (gantt.config.touch) {\n gantt.refreshData();\n }\n\n updateMarkedHtml(dnd.config.marker);\n }, this));\n\n function getLinePos(task, to_start, shift, cfg, isStart) {\n var taskPos = getMilestonePosition(task, function (task) {\n return gantt.getTaskPosition(task);\n }, cfg);\n var pos = {\n x: taskPos.x,\n y: taskPos.y\n };\n\n if (!to_start) {\n pos.x = taskPos.xEnd;\n } //var pos = gantt._get_task_pos(task, !!to_start);\n\n\n pos.y += gantt.getTaskHeight(task.id) / 2;\n var offset = isMilestone(task) && isStart ? 2 : 0;\n shift = shift || 0;\n if (cfg.rtl) shift = shift * -1;\n pos.x += (to_start ? -1 : 1) * shift - offset;\n return pos;\n }\n\n function getMilestonePosition(task, getTaskPosition, cfg) {\n var pos = getTaskPosition(task);\n var res = {\n x: pos.left,\n y: pos.top,\n width: pos.width,\n height: pos.height\n };\n\n if (cfg.rtl) {\n res.xEnd = res.x;\n res.x = res.xEnd + res.width;\n } else {\n res.xEnd = res.x + res.width;\n }\n\n res.yEnd = res.y + res.height;\n\n if (gantt.getTaskType(task.type) == gantt.config.types.milestone) {\n var milestoneWidth = getVisibleMilestoneWidth(task.id);\n res.x += (!cfg.rtl ? -1 : 1) * (milestoneWidth / 2);\n res.xEnd += (!cfg.rtl ? 1 : -1) * (milestoneWidth / 2); //pos.x -= milestoneWidth / 2;\n //pos.xEnd += milestoneWidth / 2;\n\n res.width = pos.xEnd - pos.x;\n }\n\n return res;\n }\n\n function getVieportSize() {\n var root = gantt.$root;\n return {\n right: root.offsetWidth,\n bottom: root.offsetHeight\n };\n }\n\n function getMarkerSize(marker) {\n var width = 0,\n height = 0;\n\n if (marker) {\n width = marker.offsetWidth || 0;\n height = marker.offsetHeight || 0;\n }\n\n return {\n width: width,\n height: height\n };\n }\n\n function getPosition(e, marker) {\n var oldPos = dnd.getPosition(e);\n var markerSize = getMarkerSize(marker);\n var viewportSize = getVieportSize();\n var offsetX = gantt.config.tooltip_offset_x || markerDefaultOffset;\n var offsetY = gantt.config.tooltip_offset_y || markerDefaultOffset;\n var scrollSize = gantt.config.scroll_size || scrollDefaultSize; // GS-1315: Add offset if there are elements above Gantt\n\n var ganttOffsetY = gantt.$container.getBoundingClientRect().y + window.scrollY;\n var position = {\n y: oldPos.y + offsetY,\n x: oldPos.x + offsetX,\n bottom: oldPos.y + markerSize.height + offsetY + scrollSize,\n right: oldPos.x + markerSize.width + offsetX + scrollSize\n };\n\n if (position.bottom > viewportSize.bottom + ganttOffsetY) {\n position.y = viewportSize.bottom + ganttOffsetY - markerSize.height - offsetY;\n }\n\n if (position.right > viewportSize.right) {\n position.x = viewportSize.right - markerSize.width - offsetX;\n }\n\n return position;\n }\n\n dnd.attachEvent(\"onDragMove\", gantt.bind(function (obj, e) {\n var dd = dnd.config;\n var pos = getPosition(e, dd.marker);\n advanceMarker(dd.marker, pos);\n var landing = !!domHelpers.locateClassName(e, link_landing_hover_area);\n var prevTarget = _link_target_task;\n var prevLanding = _link_landing;\n var prevToStart = _link_target_task_start;\n var targ = gantt.locate(e),\n to_start = true; // can drag and drop link to another gantt on the page, such links are not supported\n\n var eventTarget = domHelpers.getTargetNode(e);\n var sameGantt = domHelpers.isChildOf(eventTarget, gantt.$root);\n\n if (!sameGantt) {\n landing = false;\n targ = null;\n }\n\n if (landing) {\n //refreshTask\n to_start = !domHelpers.locateClassName(e, end_marker);\n landing = !!targ;\n }\n\n _link_target_task = targ;\n _link_landing = landing;\n _link_target_task_start = to_start;\n\n if (landing) {\n var t = gantt.getTask(targ);\n var config = timeline.$getConfig();\n var node = domHelpers.locateClassName(e, link_landing_hover_area);\n var shift = 0;\n\n if (node) {\n shift = Math.floor(node.offsetWidth / 2);\n }\n\n this._dir_end = getLinePos(t, !!_link_target_task_start, shift, config);\n } else {\n this._dir_end = domHelpers.getRelativeEventPosition(e, timeline.$task_data);\n\n if (gantt.env.isEdge) {\n // to fix margin collapsing\n this._dir_end.y += window.scrollY;\n }\n }\n\n var targetChanged = !(prevLanding == landing && prevTarget == targ && prevToStart == to_start);\n\n if (targetChanged) {\n if (prevTarget) gantt.refreshTask(prevTarget, false);\n if (targ) gantt.refreshTask(targ, false);\n }\n\n if (targetChanged) {\n updateMarkedHtml(dd.marker);\n }\n\n showDirectingLine(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y);\n return true;\n }, this));\n dnd.attachEvent(\"onDragEnd\", gantt.bind(function () {\n var drag = getDndState();\n\n if (drag.link_source_id && drag.link_target_id && drag.link_source_id != drag.link_target_id) {\n var type = gantt._get_link_type(drag.link_from_start, drag.link_to_start);\n\n var link = {\n source: drag.link_source_id,\n target: drag.link_target_id,\n type: type\n };\n\n if (link.type && gantt.isLinkAllowed(link)) {\n if (gantt.callEvent(\"onLinkCreated\", [link])) {\n gantt.addLink(link);\n }\n }\n }\n\n resetDndState();\n\n if (gantt.config.touch) {\n gantt.refreshData();\n } else {\n if (drag.link_source_id) gantt.refreshTask(drag.link_source_id, false);\n if (drag.link_target_id) gantt.refreshTask(drag.link_target_id, false);\n }\n\n removeDirectionLine();\n }, this));\n\n function updateMarkedHtml(marker) {\n var link = getDndState();\n var css = [\"gantt_link_tooltip\"];\n\n if (link.link_source_id && link.link_target_id) {\n if (gantt.isLinkAllowed(link.link_source_id, link.link_target_id, link.link_from_start, link.link_to_start)) {\n css.push(\"gantt_allowed_link\");\n } else {\n css.push(\"gantt_invalid_link\");\n }\n }\n\n var className = gantt.templates.drag_link_class(link.link_source_id, link.link_from_start, link.link_target_id, link.link_to_start);\n if (className) css.push(className);\n var html = \"<div class='\" + className + \"'>\" + gantt.templates.drag_link(link.link_source_id, link.link_from_start, link.link_target_id, link.link_to_start) + \"</div>\";\n marker.innerHTML = html;\n }\n\n function advanceMarker(marker, pos) {\n marker.style.left = pos.x + \"px\";\n marker.style.top = pos.y + \"px\";\n }\n\n function resetDndState() {\n _link_source_task = _link_source_task_start = _link_target_task = null;\n _link_target_task_start = true;\n }\n\n function showDirectingLine(s_x, s_y, e_x, e_y) {\n var div = getDirectionLine();\n var link = getDndState();\n var css = [\"gantt_link_direction\"];\n\n if (gantt.templates.link_direction_class) {\n css.push(gantt.templates.link_direction_class(link.link_source_id, link.link_from_start, link.link_target_id, link.link_to_start));\n }\n\n var dist = Math.sqrt(Math.pow(e_x - s_x, 2) + Math.pow(e_y - s_y, 2));\n dist = Math.max(0, dist - 3);\n if (!dist) return;\n div.className = css.join(\" \");\n var tan = (e_y - s_y) / (e_x - s_x),\n angle = Math.atan(tan);\n\n if (coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 2) {\n angle += Math.PI;\n } else if (coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 3) {\n angle -= Math.PI;\n }\n\n var sin = Math.sin(angle),\n cos = Math.cos(angle),\n top = Math.round(s_y),\n left = Math.round(s_x);\n var style = [\"-webkit-transform: rotate(\" + angle + \"rad)\", \"-moz-transform: rotate(\" + angle + \"rad)\", \"-ms-transform: rotate(\" + angle + \"rad)\", \"-o-transform: rotate(\" + angle + \"rad)\", \"transform: rotate(\" + angle + \"rad)\", \"width:\" + Math.round(dist) + \"px\"];\n\n if (window.navigator.userAgent.indexOf(\"MSIE 8.0\") != -1) {\n //ms-filter breaks styles in ie9, so add it only for 8th\n style.push(\"-ms-filter: \\\"\" + ieTransform(sin, cos) + \"\\\"\");\n var shiftLeft = Math.abs(Math.round(s_x - e_x)),\n shiftTop = Math.abs(Math.round(e_y - s_y)); //fix rotation axis\n\n switch (coordinateCircleQuarter(s_x, e_x, s_y, e_y)) {\n case 1:\n top -= shiftTop;\n break;\n\n case 2:\n left -= shiftLeft;\n top -= shiftTop;\n break;\n\n case 3:\n left -= shiftLeft;\n break;\n\n default:\n break;\n }\n }\n\n style.push(\"top:\" + top + \"px\");\n style.push(\"left:\" + left + \"px\");\n div.style.cssText = style.join(\";\");\n }\n\n function ieTransform(sin, cos) {\n return \"progid:DXImageTransform.Microsoft.Matrix(\" + \"M11 = \" + cos + \",\" + \"M12 = -\" + sin + \",\" + \"M21 = \" + sin + \",\" + \"M22 = \" + cos + \",\" + \"SizingMethod = 'auto expand'\" + \")\";\n }\n\n function coordinateCircleQuarter(sX, eX, sY, eY) {\n if (eX >= sX) {\n if (eY <= sY) {\n return 1;\n } else {\n return 4;\n }\n } else {\n if (eY <= sY) {\n return 2;\n } else {\n return 3;\n }\n }\n }\n\n function getDirectionLine() {\n if (!dnd._direction || !dnd._direction.parentNode) {\n dnd._direction = document.createElement(\"div\");\n timeline.$task_links.appendChild(dnd._direction);\n }\n\n return dnd._direction;\n }\n\n function removeDirectionLine() {\n if (dnd._direction) {\n if (dnd._direction.parentNode) //the event line can be detached because of data refresh\n dnd._direction.parentNode.removeChild(dnd._direction);\n dnd._direction = null;\n }\n }\n\n gantt.attachEvent(\"onGanttRender\", gantt.bind(function () {\n if (dnd._direction) {\n showDirectingLine(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y);\n }\n }, this));\n};\n\nmodule.exports = {\n createLinkDND: function createLinkDND() {\n return {\n init: initLinksDND\n };\n }\n};","var domHelpers = require(\"../utils/dom_helpers\");\n\nvar utils = require(\"../../../utils/utils\");\n\nvar timeout = require(\"../../../utils/timeout\");\n\nvar helpers = require(\"../../../utils/helpers\");\n\nfunction createTaskDND(timeline, gantt) {\n var services = gantt.$services;\n return {\n drag: null,\n dragMultiple: {},\n _events: {\n before_start: {},\n before_finish: {},\n after_finish: {}\n },\n _handlers: {},\n init: function init() {\n this._domEvents = gantt._createDomEventScope();\n this.clear_drag_state();\n var drag = gantt.config.drag_mode;\n this.set_actions();\n var stateService = services.getService(\"state\");\n stateService.registerProvider(\"tasksDnd\", utils.bind(function () {\n return {\n drag_id: this.drag ? this.drag.id : undefined,\n drag_mode: this.drag ? this.drag.mode : undefined,\n drag_from_start: this.drag ? this.drag.left : undefined\n };\n }, this));\n var evs = {\n \"before_start\": \"onBeforeTaskDrag\",\n \"before_finish\": \"onBeforeTaskChanged\",\n \"after_finish\": \"onAfterTaskDrag\"\n }; //for now, all drag operations will trigger the same events\n\n for (var stage in this._events) {\n for (var mode in drag) {\n this._events[stage][mode] = evs[stage];\n }\n }\n\n this._handlers[drag.move] = this._move;\n this._handlers[drag.resize] = this._resize;\n this._handlers[drag.progress] = this._resize_progress;\n },\n set_actions: function set_actions() {\n var data = timeline.$task_data;\n\n this._domEvents.attach(data, \"mousemove\", gantt.bind(function (e) {\n this.on_mouse_move(e);\n }, this));\n\n this._domEvents.attach(data, \"mousedown\", gantt.bind(function (e) {\n this.on_mouse_down(e);\n }, this));\n\n this._domEvents.attach(document.body, \"mouseup\", gantt.bind(function (e) {\n this.on_mouse_up(e);\n }, this));\n },\n clear_drag_state: function clear_drag_state() {\n this.drag = {\n id: null,\n mode: null,\n pos: null,\n start_x: null,\n start_y: null,\n obj: null,\n left: null\n };\n this.dragMultiple = {};\n },\n _resize: function _resize(task, shift, drag) {\n var cfg = timeline.$getConfig();\n\n var coords_x = this._drag_task_coords(task, drag);\n\n if (drag.left) {\n task.start_date = gantt.dateFromPos(coords_x.start + shift);\n\n if (!task.start_date) {\n task.start_date = new Date(gantt.getState().min_date);\n }\n } else {\n task.end_date = gantt.dateFromPos(coords_x.end + shift);\n\n if (!task.end_date) {\n task.end_date = new Date(gantt.getState().max_date);\n }\n }\n\n var minDurationInUnits = this._calculateMinDuration(cfg.min_duration, cfg.duration_unit);\n\n if (task.end_date - task.start_date < cfg.min_duration) {\n if (drag.left) task.start_date = gantt.calculateEndDate(task.end_date, -minDurationInUnits, cfg.duration_unit, task);else task.end_date = gantt.calculateEndDate(task.start_date, minDurationInUnits, cfg.duration_unit, task);\n }\n\n gantt._init_task_timing(task);\n },\n _calculateMinDuration: function _calculateMinDuration(duration, unit) {\n var inMs = {\n \"minute\": 60000,\n \"hour\": 3600000,\n \"day\": 86400000,\n \"week\": 604800000,\n \"month\": 2419200000,\n \"year\": 31356000000\n };\n return Math.ceil(duration / inMs[unit]);\n },\n _resize_progress: function _resize_progress(task, shift, drag) {\n var coords_x = this._drag_task_coords(task, drag);\n\n var config = timeline.$getConfig();\n var diffValue = !config.rtl ? drag.pos.x - coords_x.start : coords_x.start - drag.pos.x;\n var diff = Math.max(0, diffValue);\n task.progress = Math.min(1, diff / Math.abs(coords_x.end - coords_x.start));\n },\n _find_max_shift: function _find_max_shift(dragItems, shift) {\n var correctShift;\n\n for (var i in dragItems) {\n var drag = dragItems[i];\n var task = gantt.getTask(drag.id);\n\n var coords_x = this._drag_task_coords(task, drag);\n\n var minX = gantt.posFromDate(new Date(gantt.getState().min_date));\n var maxX = gantt.posFromDate(new Date(gantt.getState().max_date));\n\n if (coords_x.end + shift > maxX) {\n var maxShift = maxX - coords_x.end;\n\n if (maxShift < correctShift || correctShift === undefined) {\n correctShift = maxShift;\n }\n } else if (coords_x.start + shift < minX) {\n var minShift = minX - coords_x.start;\n\n if (minShift > correctShift || correctShift === undefined) {\n correctShift = minShift;\n }\n }\n }\n\n return correctShift;\n },\n _move: function _move(task, shift, drag, multipleDragShift) {\n var coords_x = this._drag_task_coords(task, drag);\n\n var new_start = null,\n new_end = null; // GS-454: If we drag multiple tasks, rely on the dates instead of timeline coordinates\n\n if (multipleDragShift) {\n new_start = new Date(+drag.obj.start_date + multipleDragShift), new_end = new Date(+drag.obj.end_date + multipleDragShift);\n } else {\n new_start = gantt.dateFromPos(coords_x.start + shift), new_end = gantt.dateFromPos(coords_x.end + shift);\n }\n\n if (!new_start) {\n task.start_date = new Date(gantt.getState().min_date);\n task.end_date = gantt.dateFromPos(gantt.posFromDate(task.start_date) + (coords_x.end - coords_x.start));\n } else if (!new_end) {\n task.end_date = new Date(gantt.getState().max_date);\n task.start_date = gantt.dateFromPos(gantt.posFromDate(task.end_date) - (coords_x.end - coords_x.start));\n } else {\n task.start_date = new_start;\n task.end_date = new_end;\n }\n },\n _drag_task_coords: function _drag_task_coords(t, drag) {\n var start = drag.obj_s_x = drag.obj_s_x || gantt.posFromDate(t.start_date);\n var end = drag.obj_e_x = drag.obj_e_x || gantt.posFromDate(t.end_date);\n return {\n start: start,\n end: end\n };\n },\n _mouse_position_change: function _mouse_position_change(oldPos, newPos) {\n var dx = oldPos.x - newPos.x,\n dy = oldPos.y - newPos.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n _is_number: function _is_number(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n },\n on_mouse_move: function on_mouse_move(e) {\n if (this.drag.start_drag) {\n var pos = domHelpers.getRelativeEventPosition(e, gantt.$task_data);\n var sX = this.drag.start_drag.start_x,\n sY = this.drag.start_drag.start_y;\n\n if (Date.now() - this.drag.timestamp > 50 || this._is_number(sX) && this._is_number(sY) && this._mouse_position_change({\n x: sX,\n y: sY\n }, pos) > 20) {\n this._start_dnd(e);\n }\n }\n\n var drag = this.drag;\n\n if (drag.mode) {\n if (!timeout(this, 40)) //limit update frequency\n return;\n\n this._update_on_move(e);\n }\n },\n _update_item_on_move: function _update_item_on_move(shift, id, mode, drag, e, multipleDragShift) {\n var task = gantt.getTask(id);\n var original = gantt.mixin({}, task);\n var copy = gantt.mixin({}, task);\n\n this._handlers[mode].apply(this, [copy, shift, drag, multipleDragShift]);\n\n gantt.mixin(task, copy, true); //gantt._update_parents(drag.id, true);\n\n gantt.callEvent(\"onTaskDrag\", [task.id, mode, copy, original, e]);\n gantt.mixin(task, copy, true);\n gantt.refreshTask(id);\n },\n _update_on_move: function _update_on_move(e) {\n var drag = this.drag;\n var config = timeline.$getConfig();\n\n if (drag.mode) {\n var pos = domHelpers.getRelativeEventPosition(e, timeline.$task_data);\n if (drag.pos && drag.pos.x == pos.x) return;\n drag.pos = pos;\n var curr_date = gantt.dateFromPos(pos.x);\n if (!curr_date || isNaN(curr_date.getTime())) return;\n var shift = pos.x - drag.start_x;\n var task = gantt.getTask(drag.id);\n\n if (this._handlers[drag.mode]) {\n if (drag.mode === config.drag_mode.move) {\n var dragHash = {};\n\n if (this._isMultiselect()) {\n var selectedTasksIds = gantt.getSelectedTasks();\n\n if (selectedTasksIds.indexOf(drag.id) >= 0) {\n dragHash = this.dragMultiple;\n }\n }\n\n var dragProject = false;\n\n if (gantt.isSummaryTask(task) && gantt.config.drag_project) {\n var initialDrag = {};\n initialDrag[drag.id] = utils.copy(drag);\n dragProject = true;\n dragHash = utils.mixin(initialDrag, this.dragMultiple);\n }\n\n var maxShift = this._find_max_shift(dragHash, shift);\n\n if (maxShift !== undefined) {\n shift = maxShift;\n }\n\n this._update_item_on_move(shift, drag.id, drag.mode, drag, e);\n\n for (var i in dragHash) {\n var childDrag = dragHash[i];\n\n if (dragProject && childDrag.id != drag.id) {\n gantt._bulk_dnd = true;\n } // GS-454: Calculate the date shift in milliseconds instead of pixels\n\n\n if (maxShift === undefined && (dragProject || Object.keys(dragHash).length > 1)) {\n var shiftDate = gantt.dateFromPos(drag.start_x);\n var multipleDragShift = curr_date - shiftDate;\n }\n\n this._update_item_on_move(shift, childDrag.id, childDrag.mode, childDrag, e, multipleDragShift);\n }\n\n gantt._bulk_dnd = false;\n } else {\n // for resize and progress\n this._update_item_on_move(shift, drag.id, drag.mode, drag, e);\n }\n\n gantt._update_parents(drag.id);\n }\n }\n },\n on_mouse_down: function on_mouse_down(e, src) {\n // on Mac we do not get onmouseup event when clicking right mouse button leaving us in dnd state\n // let's ignore right mouse button then\n if (e.button == 2 && e.button !== undefined) return;\n var config = timeline.$getConfig();\n var id = gantt.locate(e);\n var task = null;\n\n if (gantt.isTaskExists(id)) {\n task = gantt.getTask(id);\n }\n\n if (gantt.isReadonly(task) || this.drag.mode) return;\n this.clear_drag_state();\n src = src || e.target || e.srcElement;\n var className = domHelpers.getClassName(src);\n\n var drag = this._get_drag_mode(className, src);\n\n if (!className || !drag) {\n if (src.parentNode) return this.on_mouse_down(e, src.parentNode);else return;\n }\n\n if (!drag) {\n if (gantt.checkEvent(\"onMouseDown\") && gantt.callEvent(\"onMouseDown\", [className.split(\" \")[0]])) {\n if (src.parentNode) return this.on_mouse_down(e, src.parentNode);\n }\n } else {\n if (drag.mode && drag.mode != config.drag_mode.ignore && config[\"drag_\" + drag.mode]) {\n id = gantt.locate(src);\n task = gantt.copy(gantt.getTask(id) || {});\n\n if (gantt.isReadonly(task)) {\n this.clear_drag_state();\n return false;\n }\n\n if (gantt.isSummaryTask(task) && !config.drag_project && drag.mode != config.drag_mode.progress) {\n //only progress drag is allowed for tasks with flexible duration\n this.clear_drag_state();\n return;\n }\n\n drag.id = id;\n var pos = domHelpers.getRelativeEventPosition(e, gantt.$task_data);\n drag.start_x = pos.x;\n drag.start_y = pos.y;\n drag.obj = task;\n this.drag.start_drag = drag;\n this.drag.timestamp = Date.now();\n } else this.clear_drag_state();\n }\n },\n _fix_dnd_scale_time: function _fix_dnd_scale_time(task, drag) {\n var config = timeline.$getConfig();\n var unit = gantt.getScale().unit,\n step = gantt.getScale().step;\n\n if (!config.round_dnd_dates) {\n unit = 'minute';\n step = config.time_step;\n }\n\n function fixStart(task) {\n if (!gantt.config.correct_work_time) return;\n var config = timeline.$getConfig();\n if (!gantt.isWorkTime(task.start_date, undefined, task)) task.start_date = gantt.calculateEndDate({\n start_date: task.start_date,\n duration: -1,\n unit: config.duration_unit,\n task: task\n });\n }\n\n function fixEnd(task) {\n if (!gantt.config.correct_work_time) return;\n var config = timeline.$getConfig();\n if (!gantt.isWorkTime(new Date(task.end_date - 1), undefined, task)) task.end_date = gantt.calculateEndDate({\n start_date: task.end_date,\n duration: 1,\n unit: config.duration_unit,\n task: task\n });\n }\n\n if (drag.mode == config.drag_mode.resize) {\n if (drag.left) {\n task.start_date = gantt.roundDate({\n date: task.start_date,\n unit: unit,\n step: step\n });\n fixStart(task);\n } else {\n task.end_date = gantt.roundDate({\n date: task.end_date,\n unit: unit,\n step: step\n });\n fixEnd(task);\n }\n } else if (drag.mode == config.drag_mode.move) {\n task.start_date = gantt.roundDate({\n date: task.start_date,\n unit: unit,\n step: step\n });\n fixStart(task);\n task.end_date = gantt.calculateEndDate(task);\n }\n },\n _fix_working_times: function _fix_working_times(task, drag) {\n var config = timeline.$getConfig();\n var drag = drag || {\n mode: config.drag_mode.move\n };\n\n if (drag.mode == config.drag_mode.resize) {\n if (drag.left) {\n task.start_date = gantt.getClosestWorkTime({\n date: task.start_date,\n dir: 'future',\n task: task\n });\n } else {\n task.end_date = gantt.getClosestWorkTime({\n date: task.end_date,\n dir: 'past',\n task: task\n });\n }\n } else if (drag.mode == config.drag_mode.move) {\n gantt.correctTaskWorkTime(task);\n }\n },\n _finalize_mouse_up: function _finalize_mouse_up(taskId, config, drag, e) {\n var task = gantt.getTask(taskId);\n\n if (config.work_time && config.correct_work_time) {\n this._fix_working_times(task, drag);\n }\n\n this._fix_dnd_scale_time(task, drag);\n\n if (!this._fireEvent(\"before_finish\", drag.mode, [taskId, drag.mode, gantt.copy(drag.obj), e])) {\n //drag.obj._dhx_changed = false;\n this.clear_drag_state();\n\n if (taskId == drag.id) {\n drag.obj._dhx_changed = false;\n gantt.mixin(task, drag.obj, true);\n }\n\n gantt.refreshTask(task.id);\n } else {\n var drag_id = taskId;\n\n gantt._init_task_timing(task);\n\n this.clear_drag_state();\n gantt.updateTask(task.id);\n\n this._fireEvent(\"after_finish\", drag.mode, [drag_id, drag.mode, e]);\n }\n },\n on_mouse_up: function on_mouse_up(e) {\n var drag = this.drag;\n\n if (drag.mode && drag.id) {\n var config = timeline.$getConfig(); //drop\n\n var task = gantt.getTask(drag.id);\n var dragMultiple = this.dragMultiple;\n var finalizingBulkMove = false;\n var moveCount = 0;\n\n if (drag.mode === config.drag_mode.move) {\n if (gantt.isSummaryTask(task) && config.drag_project || this._isMultiselect()) {\n finalizingBulkMove = true;\n moveCount = Object.keys(dragMultiple).length;\n }\n }\n\n var doFinalize = function doFinalize() {\n if (finalizingBulkMove) {\n for (var i in dragMultiple) {\n this._finalize_mouse_up(dragMultiple[i].id, config, dragMultiple[i], e);\n }\n }\n\n this._finalize_mouse_up(drag.id, config, drag, e);\n };\n\n if (finalizingBulkMove && moveCount > 10) {\n // 10 - arbitrary threshold for bulk dnd at which we start doing complete repaint to refresh\n gantt.batchUpdate(function () {\n doFinalize.call(this);\n }.bind(this));\n } else {\n doFinalize.call(this);\n }\n }\n\n this.clear_drag_state();\n },\n _get_drag_mode: function _get_drag_mode(className, el) {\n var config = timeline.$getConfig();\n var modes = config.drag_mode;\n var classes = (className || \"\").split(\" \");\n var classname = classes[0];\n var drag = {\n mode: null,\n left: null\n };\n\n switch (classname) {\n case \"gantt_task_line\":\n case \"gantt_task_content\":\n drag.mode = modes.move;\n break;\n\n case \"gantt_task_drag\":\n drag.mode = modes.resize;\n var dragProperty = el.getAttribute(\"data-bind-property\");\n\n if (dragProperty == \"start_date\") {\n drag.left = true;\n } else {\n drag.left = false;\n }\n\n break;\n\n case \"gantt_task_progress_drag\":\n drag.mode = modes.progress;\n break;\n\n case \"gantt_link_control\":\n case \"gantt_link_point\":\n drag.mode = modes.ignore;\n break;\n\n default:\n drag = null;\n break;\n }\n\n return drag;\n },\n _start_dnd: function _start_dnd(e) {\n var drag = this.drag = this.drag.start_drag;\n delete drag.start_drag;\n var cfg = timeline.$getConfig();\n var id = drag.id;\n\n if (!cfg[\"drag_\" + drag.mode] || !gantt.callEvent(\"onBeforeDrag\", [id, drag.mode, e]) || !this._fireEvent(\"before_start\", drag.mode, [id, drag.mode, e])) {\n this.clear_drag_state();\n } else {\n delete drag.start_drag;\n var task = gantt.getTask(id);\n\n if (gantt.isReadonly(task)) {\n this.clear_drag_state();\n return;\n }\n\n if (this._isMultiselect()) {\n // for don't move selected tasks when drag unselected task\n var selectedTasksIds = gantt.getSelectedTasks();\n\n if (selectedTasksIds.indexOf(drag.id) >= 0) {\n helpers.forEach(selectedTasksIds, gantt.bind(function (taskId) {\n var selectedTask = gantt.getTask(taskId);\n\n if (gantt.isSummaryTask(selectedTask) && gantt.config.drag_project && drag.mode == cfg.drag_mode.move) {\n this._addSubtasksToDragMultiple(selectedTask.id);\n }\n\n this.dragMultiple[taskId] = gantt.mixin({\n id: selectedTask.id,\n obj: gantt.copy(selectedTask)\n }, this.drag);\n }, this));\n }\n } // for move unselected summary\n\n\n if (gantt.isSummaryTask(task) && gantt.config.drag_project && drag.mode == cfg.drag_mode.move) {\n this._addSubtasksToDragMultiple(task.id);\n }\n\n gantt.callEvent(\"onTaskDragStart\", []);\n }\n },\n _fireEvent: function _fireEvent(stage, mode, params) {\n gantt.assert(this._events[stage], \"Invalid stage:{\" + stage + \"}\");\n var trigger = this._events[stage][mode];\n gantt.assert(trigger, \"Unknown after drop mode:{\" + mode + \"}\");\n gantt.assert(params, \"Invalid event arguments\");\n if (!gantt.checkEvent(trigger)) return true;\n return gantt.callEvent(trigger, params);\n },\n round_task_dates: function round_task_dates(task) {\n var drag_state = this.drag;\n var config = timeline.$getConfig();\n\n if (!drag_state) {\n drag_state = {\n mode: config.drag_mode.move\n };\n }\n\n this._fix_dnd_scale_time(task, drag_state);\n },\n destructor: function destructor() {\n this._domEvents.detachAll();\n },\n _isMultiselect: function _isMultiselect() {\n return gantt.config.drag_multiple && !!(gantt.getSelectedTasks && gantt.getSelectedTasks().length > 0);\n },\n _addSubtasksToDragMultiple: function _addSubtasksToDragMultiple(summaryId) {\n gantt.eachTask(function (child) {\n this.dragMultiple[child.id] = gantt.mixin({\n id: child.id,\n obj: gantt.copy(child)\n }, this.drag);\n }, summaryId, this);\n }\n };\n}\n\nfunction initTaskDND() {\n var _tasks_dnd;\n\n return {\n extend: function extend(timeline) {\n timeline.roundTaskDates = function (task) {\n _tasks_dnd.round_task_dates(task);\n };\n },\n init: function init(timeline, gantt) {\n _tasks_dnd = createTaskDND(timeline, gantt); // TODO: entry point for touch handlers, move touch to timeline\n\n timeline._tasks_dnd = _tasks_dnd;\n return _tasks_dnd.init(gantt);\n },\n destructor: function destructor() {\n if (_tasks_dnd) {\n _tasks_dnd.destructor();\n\n _tasks_dnd = null;\n }\n }\n };\n}\n\nmodule.exports = {\n createTaskDND: initTaskDND\n};","var utils = require(\"../../../utils/utils\"),\n taskDnD = require(\"./tasks_dnd\"),\n linkDnD = require(\"./links_dnd\"),\n domHelpers = require(\"../utils/dom_helpers\");\n\nvar initializer = function () {\n return function (gantt) {\n var services = gantt.$services;\n return {\n onCreated: function onCreated(timeline) {\n var config = timeline.$config;\n config.bind = utils.defined(config.bind) ? config.bind : \"task\";\n config.bindLinks = utils.defined(config.bindLinks) ? config.bindLinks : \"link\";\n timeline._linksDnD = linkDnD.createLinkDND();\n timeline._tasksDnD = taskDnD.createTaskDND();\n\n timeline._tasksDnD.extend(timeline);\n\n this._mouseDelegates = require(\"../mouse_event_container\")(gantt);\n },\n onInitialized: function onInitialized(timeline) {\n this._attachDomEvents(gantt);\n\n this._attachStateProvider(gantt, timeline);\n\n timeline._tasksDnD.init(timeline, gantt);\n\n timeline._linksDnD.init(timeline, gantt);\n\n if (timeline.$config.id == \"timeline\") {\n this.extendDom(timeline);\n }\n },\n onDestroyed: function onDestroyed(timeline) {\n this._clearDomEvents(gantt);\n\n this._clearStateProvider(gantt);\n\n if (timeline._tasksDnD) {\n timeline._tasksDnD.destructor();\n }\n },\n extendDom: function extendDom(timeline) {\n gantt.$task = timeline.$task;\n gantt.$task_scale = timeline.$task_scale;\n gantt.$task_data = timeline.$task_data;\n gantt.$task_bg = timeline.$task_bg;\n gantt.$task_links = timeline.$task_links;\n gantt.$task_bars = timeline.$task_bars;\n },\n _clearDomEvents: function _clearDomEvents() {\n this._mouseDelegates.destructor();\n\n this._mouseDelegates = null;\n },\n _attachDomEvents: function _attachDomEvents(gantt) {\n function _delete_link_handler(id, e) {\n if (id && this.callEvent(\"onLinkDblClick\", [id, e])) {\n var link = this.getLink(id);\n if (this.isReadonly(link)) return;\n var title = \"\";\n var question = this.locale.labels.link + \" \" + this.templates.link_description(this.getLink(id)) + \" \" + this.locale.labels.confirm_link_deleting;\n window.setTimeout(function () {\n gantt._simple_confirm(question, title, function () {\n gantt.deleteLink(id);\n });\n }, this.config.touch ? 300 : 1);\n }\n }\n\n this._mouseDelegates.delegate(\"click\", \"gantt_task_link\", gantt.bind(function (e, trg) {\n var id = this.locate(e, this.config.link_attribute);\n\n if (id) {\n this.callEvent(\"onLinkClick\", [id, e]);\n }\n }, gantt), this.$task);\n\n this._mouseDelegates.delegate(\"click\", \"gantt_scale_cell\", gantt.bind(function (e, trg) {\n var pos = domHelpers.getRelativeEventPosition(e, gantt.$task_data);\n var date = gantt.dateFromPos(pos.x);\n var coll = Math.floor(gantt.columnIndexByDate(date));\n var coll_date = gantt.getScale().trace_x[coll];\n gantt.callEvent(\"onScaleClick\", [e, coll_date]);\n }, gantt), this.$task);\n\n this._mouseDelegates.delegate(\"doubleclick\", \"gantt_task_link\", gantt.bind(function (e, id, trg) {\n var id = this.locate(e, gantt.config.link_attribute);\n\n _delete_link_handler.call(this, id, e);\n }, gantt), this.$task);\n\n this._mouseDelegates.delegate(\"doubleclick\", \"gantt_link_point\", gantt.bind(function (e, id, trg) {\n var id = this.locate(e),\n task = this.getTask(id);\n var link = null;\n\n if (trg.parentNode && domHelpers.getClassName(trg.parentNode)) {\n if (domHelpers.getClassName(trg.parentNode).indexOf(\"_left\") > -1) {\n link = task.$target[0];\n } else {\n link = task.$source[0];\n }\n }\n\n if (link) _delete_link_handler.call(this, link, e);\n return false;\n }, gantt), this.$task);\n },\n _attachStateProvider: function _attachStateProvider(gantt, timeline) {\n var self = timeline;\n var state = services.getService(\"state\");\n state.registerProvider(\"tasksTimeline\", function () {\n return {\n scale_unit: self._tasks ? self._tasks.unit : undefined,\n scale_step: self._tasks ? self._tasks.step : undefined\n };\n });\n },\n _clearStateProvider: function _clearStateProvider() {\n var state = services.getService(\"state\");\n state.unregisterProvider(\"tasksTimeline\");\n }\n };\n };\n}();\n\nmodule.exports = initializer;","var domHelpers = require(\"../../utils/dom_helpers\");\n/**\r\n * methods for highlighting current drag and drop position\r\n */\n\n\nfunction highlightPosition(target, root, grid) {\n var markerPos = getTaskMarkerPosition(target, grid); // setting position of row\n\n root.marker.style.left = markerPos.x + 9 + \"px\";\n root.marker.style.width = markerPos.width + \"px\";\n root.marker.style.overflow = \"hidden\";\n var markerLine = root.markerLine;\n\n if (!markerLine) {\n markerLine = document.createElement(\"div\");\n markerLine.className = \"gantt_drag_marker gantt_grid_dnd_marker\";\n markerLine.innerHTML = \"<div class='gantt_grid_dnd_marker_line'></div>\";\n markerLine.style.pointerEvents = \"none\";\n }\n\n if (target.child) {\n highlightFolder(target, markerLine, grid);\n } else {\n highlightRow(target, markerLine, grid);\n }\n\n if (!root.markerLine) {\n document.body.appendChild(markerLine);\n root.markerLine = markerLine;\n }\n}\n\nfunction removeLineHighlight(root) {\n if (root.markerLine && root.markerLine.parentNode) {\n root.markerLine.parentNode.removeChild(root.markerLine);\n }\n\n root.markerLine = null;\n}\n\nfunction highlightRow(target, markerLine, grid) {\n var linePos = getLineMarkerPosition(target, grid);\n var maxBottom = grid.$grid_data.getBoundingClientRect().bottom + window.scrollY;\n markerLine.innerHTML = \"<div class='gantt_grid_dnd_marker_line'></div>\";\n markerLine.style.left = linePos.x + \"px\";\n markerLine.style.height = \"4px\";\n var markerLineTop = linePos.y - 2;\n markerLine.style.top = markerLineTop + \"px\";\n markerLine.style.width = linePos.width + \"px\";\n\n if (markerLineTop > maxBottom) {\n markerLine.style.top = maxBottom + 'px';\n }\n\n return markerLine;\n}\n\nfunction highlightFolder(target, markerFolder, grid) {\n var id = target.targetParent;\n var pos = gridToPageCoordinates({\n x: 0,\n y: grid.getItemTop(id)\n }, grid);\n var maxBottom = grid.$grid_data.getBoundingClientRect().bottom + window.scrollY;\n var folderHighlightWidth = setWidthWithinContainer(grid.$gantt, grid.$grid_data.offsetWidth);\n markerFolder.innerHTML = \"<div class='gantt_grid_dnd_marker_folder'></div>\";\n markerFolder.style.width = folderHighlightWidth + \"px\";\n markerFolder.style.top = pos.y + \"px\";\n markerFolder.style.left = pos.x + \"px\";\n markerFolder.style.height = grid.getItemHeight(id) + \"px\";\n\n if (pos.y > maxBottom) {\n markerFolder.style.top = maxBottom + 'px';\n }\n\n return markerFolder;\n}\n\nfunction getLineMarkerPosition(target, grid) {\n var store = grid.$config.rowStore;\n var pos = {\n x: 0,\n y: 0\n };\n var indentNode = grid.$grid_data.querySelector(\".gantt_tree_indent\");\n var indent = 15;\n var level = 0;\n\n if (indentNode) {\n indent = indentNode.offsetWidth;\n }\n\n var iconWidth = 40;\n\n if (target.targetId !== store.$getRootId()) {\n var itemTop = grid.getItemTop(target.targetId);\n var itemHeight = grid.getItemHeight(target.targetId);\n level = store.exists(target.targetId) ? store.calculateItemLevel(store.getItem(target.targetId)) : 0;\n\n if (target.prevSibling) {\n pos.y = itemTop;\n } else if (target.nextSibling) {\n var childCount = 0;\n store.eachItem(function (child) {\n if (store.getIndexById(child.id) !== -1) childCount++;\n }, target.targetId);\n pos.y = itemTop + itemHeight + childCount * itemHeight;\n } else {\n pos.y = itemTop + itemHeight;\n level += 1;\n }\n }\n\n pos.x = iconWidth + level * indent;\n pos.width = setWidthWithinContainer(grid.$gantt, Math.max(grid.$grid_data.offsetWidth - pos.x, 0), pos.x);\n return gridToPageCoordinates(pos, grid);\n}\n\nfunction gridToPageCoordinates(pos, grid) {\n var gridPos = domHelpers.getNodePosition(grid.$grid_data);\n pos.x += gridPos.x + grid.$grid.scrollLeft;\n pos.y += gridPos.y - grid.$grid_data.scrollTop;\n return pos;\n}\n\nfunction getTaskMarkerPosition(e, grid) {\n var pos = domHelpers.getNodePosition(grid.$grid_data);\n var ePos = domHelpers.getRelativeEventPosition(e, grid.$grid_data); // row offset\n\n var x = pos.x + grid.$grid.scrollLeft;\n var y = ePos.y - 10;\n var rowHeight = grid.getItemHeight(e.targetId); // prevent moving row out of grid_data container\n\n if (y < pos.y) y = pos.y;\n var gridHeight = grid.getTotalHeight();\n if (y > pos.y + gridHeight - rowHeight) y = pos.y + gridHeight - rowHeight;\n pos.x = x;\n pos.y = y;\n pos.width = setWidthWithinContainer(grid.$gantt, pos.width, 9);\n return pos;\n}\n\nfunction setWidthWithinContainer(gantt, width) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var containerSize = domHelpers.getNodePosition(gantt.$root);\n\n if (width > containerSize.width) {\n width = containerSize.width - offset - 2;\n }\n\n return width;\n}\n\nmodule.exports = {\n removeLineHighlight: removeLineHighlight,\n highlightPosition: highlightPosition\n};","/**\r\n * resolve dnd position of the task when gantt.config.order_branch_free = true\r\n */\nvar dropTarget = require(\"./drop_target\");\n\nmodule.exports = function getMultiLevelDropPosition(dndTaskId, targetTaskId, relTargetPos, eventTop, store) {\n var result;\n\n if (targetTaskId !== store.$getRootId()) {\n if (relTargetPos < 0.25) {\n result = dropTarget.prevSiblingTarget(dndTaskId, targetTaskId, store);\n } else if (relTargetPos > 0.60 && !(store.hasChild(targetTaskId) && store.getItem(targetTaskId).$open)) {\n result = dropTarget.nextSiblingTarget(dndTaskId, targetTaskId, store);\n } else {\n result = dropTarget.firstChildTarget(dndTaskId, targetTaskId, store);\n }\n } else {\n var rootId = store.$getRootId();\n\n if (store.hasChild(rootId) && eventTop >= 0) {\n result = dropTarget.lastChildTarget(dndTaskId, rootId, store);\n } else {\n result = dropTarget.firstChildTarget(dndTaskId, rootId, store);\n }\n }\n\n return result;\n};","/**\r\n * resolve dnd position of the task when gantt.config.order_branch_free = false\r\n */\nvar dropTarget = require(\"./drop_target\");\n\nfunction getLast(store) {\n var current = store.getNext();\n\n while (store.exists(current)) {\n var next = store.getNext(current);\n\n if (!store.exists(next)) {\n return current;\n } else {\n current = next;\n }\n }\n\n return null;\n}\n\nfunction findClosesTarget(dndTaskId, taskId, allowedLevel, store, up) {\n var prev = taskId;\n\n while (store.exists(prev)) {\n var targetLevel = store.calculateItemLevel(store.getItem(prev));\n\n if ((targetLevel === allowedLevel || targetLevel === allowedLevel - 1) && store.getBranchIndex(prev) > -1) {\n break;\n } else {\n prev = up ? store.getPrev(prev) : store.getNext(prev);\n }\n }\n\n if (store.exists(prev)) {\n if (store.calculateItemLevel(store.getItem(prev)) === allowedLevel) {\n return up ? dropTarget.nextSiblingTarget(dndTaskId, prev, store) : dropTarget.prevSiblingTarget(dndTaskId, prev, store);\n } else {\n return dropTarget.firstChildTarget(dndTaskId, prev, store);\n }\n }\n\n return null;\n}\n\nfunction findTargetAbove(dndTaskId, taskId, allowedLevel, store) {\n return findClosesTarget(dndTaskId, taskId, allowedLevel, store, true);\n}\n\nfunction findTargetBelow(dndTaskId, taskId, allowedLevel, store) {\n return findClosesTarget(dndTaskId, taskId, allowedLevel, store, false);\n}\n\nmodule.exports = function getSameLevelDropPosition(dndTaskId, targetTaskId, relTargetPos, eventTop, store, level) {\n var result;\n\n if (targetTaskId !== store.$getRootId()) {\n var targetTask = store.getItem(targetTaskId);\n var targetLevel = store.calculateItemLevel(targetTask);\n\n if (targetLevel === level) {\n var prevSibling = store.getPrevSibling(targetTaskId);\n\n if (relTargetPos < 0.5 && !prevSibling) {\n result = dropTarget.prevSiblingTarget(dndTaskId, targetTaskId, store);\n } else {\n if (relTargetPos < 0.5) {\n targetTaskId = prevSibling;\n }\n\n result = dropTarget.nextSiblingTarget(dndTaskId, targetTaskId, store);\n }\n } else if (targetLevel > level) {\n store.eachParent(function (parent) {\n if (store.calculateItemLevel(parent) === level) {\n targetTaskId = parent.id;\n }\n }, targetTask);\n result = findTargetAbove(dndTaskId, targetTaskId, level, store);\n } else {\n var targetAbove = findTargetAbove(dndTaskId, targetTaskId, level, store);\n var targetBelow = findTargetBelow(dndTaskId, targetTaskId, level, store);\n result = relTargetPos < 0.5 ? targetAbove : targetBelow;\n }\n } else {\n var rootId = store.$getRootId();\n var rootLevel = store.getChildren(rootId);\n result = dropTarget.createDropTargetObject();\n\n if (rootLevel.length && eventTop >= 0) {\n result = findTargetAbove(dndTaskId, getLast(store), level, store);\n } else {\n result = findTargetBelow(dndTaskId, rootId, level, store);\n }\n }\n\n return result;\n};","var domHelpers = require(\"../utils/dom_helpers\");\n\nvar dropTarget = require(\"./tasks_grid_dnd_marker_helpers/drop_target\");\n\nvar getLockedLevelTarget = require(\"./tasks_grid_dnd_marker_helpers/locked_level\");\n\nvar getMultiLevelTarget = require(\"./tasks_grid_dnd_marker_helpers/multi_level\");\n\nvar higlighter = require(\"./tasks_grid_dnd_marker_helpers/highlight\");\n\nvar isPlaceholderTask = require(\"../../../utils/placeholder_task\");\n\nfunction _init_dnd(gantt, grid) {\n var DnD = gantt.$services.getService(\"dnd\");\n\n if (!grid.$config.bind || !gantt.getDatastore(grid.$config.bind)) {\n return;\n }\n\n function locate(e) {\n return domHelpers.locateAttribute(e, grid.$config.item_attribute);\n }\n\n function getStore() {\n return gantt.getDatastore(grid.$config.bind);\n }\n\n function checkPlaceholderTask(id) {\n return isPlaceholderTask(id, gantt, getStore());\n }\n\n var dnd = new DnD(grid.$grid_data, {\n updates_per_second: 60\n });\n if (gantt.defined(grid.$getConfig().dnd_sensitivity)) dnd.config.sensitivity = grid.$getConfig().dnd_sensitivity;\n dnd.attachEvent(\"onBeforeDragStart\", gantt.bind(function (obj, e) {\n var el = locate(e);\n if (!el) return false;\n if (gantt.hideQuickInfo) gantt._hideQuickInfo();\n\n if (domHelpers.closest(e.target, \".gantt_grid_editor_placeholder\")) {\n return false;\n }\n\n var id = el.getAttribute(grid.$config.item_attribute);\n var datastore = grid.$config.rowStore;\n var task = datastore.getItem(id);\n if (gantt.isReadonly(task) || checkPlaceholderTask(id)) return false;\n dnd.config.initial_open_state = task.$open;\n\n if (!gantt.callEvent(\"onRowDragStart\", [id, e.target || e.srcElement, e])) {\n return false;\n }\n }, gantt));\n dnd.attachEvent(\"onAfterDragStart\", gantt.bind(function (obj, e) {\n var el = locate(e);\n dnd.config.marker.innerHTML = el.outerHTML;\n var element = dnd.config.marker.firstChild;\n\n if (element) {\n dnd.config.marker.style.opacity = 0.4;\n element.style.position = \"static\";\n element.style.pointerEvents = \"none\";\n }\n\n dnd.config.id = el.getAttribute(grid.$config.item_attribute);\n var store = grid.$config.rowStore;\n var task = store.getItem(dnd.config.id);\n dnd.config.level = store.calculateItemLevel(task);\n dnd.config.drop_target = dropTarget.createDropTargetObject({\n targetParent: store.getParent(task.id),\n targetIndex: store.getBranchIndex(task.id),\n targetId: task.id,\n nextSibling: true\n });\n task.$open = false;\n task.$transparent = true;\n this.refreshData();\n }, gantt));\n\n function getTargetTaskId(e) {\n var y = domHelpers.getRelativeEventPosition(e, grid.$grid_data).y;\n var store = grid.$config.rowStore;\n\n if (!document.doctype) {\n y += window.scrollY;\n }\n\n y = y || 0; // limits for the marker according to the layout layer\n\n var scrollPos = grid.$state.scrollTop || 0;\n var maxBottom = gantt.$grid_data.getBoundingClientRect().height + scrollPos + window.scrollY;\n var minTop = scrollPos;\n var firstVisibleTaskIndex = grid.getItemIndexByTopPosition(grid.$state.scrollTop);\n\n if (!store.exists(firstVisibleTaskIndex)) {\n firstVisibleTaskIndex = store.countVisible() - 1;\n }\n\n if (firstVisibleTaskIndex < 0) {\n return store.$getRootId();\n }\n\n var firstVisibleTaskId = store.getIdByIndex(firstVisibleTaskIndex);\n var firstVisibleTaskPos = grid.$state.scrollTop / grid.getItemHeight(firstVisibleTaskId);\n var hiddenTaskPart = firstVisibleTaskPos - Math.floor(firstVisibleTaskPos);\n\n if (hiddenTaskPart > 0.1 && hiddenTaskPart < 0.9) {\n maxBottom = maxBottom - grid.getItemHeight(firstVisibleTaskId) * hiddenTaskPart;\n minTop = minTop + grid.getItemHeight(firstVisibleTaskId) * (1 - hiddenTaskPart);\n } // GS-715. The placeholder task row shouldn't be draggable below the Gantt container\n\n\n var gridPosition = domHelpers.getNodePosition(grid.$grid_data);\n var gridBottom = gridPosition.y + gridPosition.height;\n var placeholderRowHeight = dnd.config.marker.offsetHeight;\n\n if (y + placeholderRowHeight + window.scrollY >= maxBottom) {\n dnd.config.marker.style.top = gridBottom - placeholderRowHeight + \"px\";\n }\n\n if (y >= maxBottom) {\n y = maxBottom;\n } else if (y <= minTop) {\n y = minTop;\n dnd.config.marker.style.top = gridPosition.y + \"px\";\n }\n\n var index = grid.getItemIndexByTopPosition(y);\n\n if (index > store.countVisible() - 1 || index < 0) {\n return store.$getRootId();\n }\n\n var targetId = store.getIdByIndex(index);\n\n if (checkPlaceholderTask(targetId)) {\n return store.getPrevSibling(targetId);\n }\n\n return store.getIdByIndex(index);\n }\n\n function getDropPosition(e) {\n var targetTaskId = getTargetTaskId(e);\n var relTargetPos = null;\n var store = grid.$config.rowStore;\n var config = grid.$getConfig();\n var lockLevel = !config.order_branch_free;\n var eventTop = domHelpers.getRelativeEventPosition(e, grid.$grid_data).y;\n\n if (!document.doctype) {\n eventTop += window.scrollY;\n }\n\n if (targetTaskId !== store.$getRootId()) {\n var rowTop = grid.getItemTop(targetTaskId);\n var rowHeight = grid.getItemHeight(targetTaskId);\n relTargetPos = (eventTop - rowTop) / rowHeight;\n }\n\n var result;\n\n if (!lockLevel) {\n result = getMultiLevelTarget(dnd.config.id, targetTaskId, relTargetPos, eventTop, store);\n } else {\n result = getLockedLevelTarget(dnd.config.id, targetTaskId, relTargetPos, eventTop, store, dnd.config.level);\n\n if (result && result.targetParent && checkPlaceholderTask(result.targetParent)) {\n targetTaskId = store.getPrevSibling(result.targetParent);\n result = getLockedLevelTarget(dnd.config.id, targetTaskId, relTargetPos, eventTop, store, dnd.config.level);\n }\n }\n\n return result;\n }\n\n dnd.attachEvent(\"onDragMove\", gantt.bind(function (obj, e) {\n var target = getDropPosition(e);\n\n if (!target || gantt.callEvent(\"onBeforeRowDragMove\", [dnd.config.id, target.targetParent, target.targetIndex]) === false) {\n target = dropTarget.createDropTargetObject(dnd.config.drop_target);\n }\n\n higlighter.highlightPosition(target, dnd.config, grid);\n dnd.config.drop_target = target;\n\n gantt._waiAria.reorderMarkerAttr(dnd.config.marker);\n\n this.callEvent(\"onRowDragMove\", [dnd.config.id, target.targetParent, target.targetIndex]);\n return true;\n }, gantt));\n dnd.attachEvent(\"onDragEnd\", gantt.bind(function () {\n var store = grid.$config.rowStore;\n var task = store.getItem(dnd.config.id);\n higlighter.removeLineHighlight(dnd.config);\n task.$transparent = false;\n task.$open = dnd.config.initial_open_state;\n var target = dnd.config.drop_target;\n\n if (this.callEvent(\"onBeforeRowDragEnd\", [dnd.config.id, target.targetParent, target.targetIndex]) === false) {\n task.$drop_target = null;\n } else {\n store.move(dnd.config.id, target.targetIndex, target.targetParent);\n gantt.render();\n this.callEvent(\"onRowDragEnd\", [dnd.config.id, target.targetParent, target.targetIndex]);\n }\n\n store.refresh(task.id);\n }, gantt));\n}\n\nmodule.exports = {\n init: _init_dnd\n};","var domHelpers = require(\"../utils/dom_helpers\");\n\nvar isPlaceholderTask = require(\"../../../utils/placeholder_task\");\n\nfunction _init_dnd(gantt, grid) {\n var DnD = gantt.$services.getService(\"dnd\");\n\n if (!grid.$config.bind || !gantt.getDatastore(grid.$config.bind)) {\n return;\n }\n\n function locate(e) {\n return domHelpers.locateAttribute(e, grid.$config.item_attribute);\n }\n\n function getStore() {\n return gantt.getDatastore(grid.$config.bind);\n }\n\n function checkPlaceholderTask(id) {\n return isPlaceholderTask(id, gantt, getStore());\n }\n\n var dnd = new DnD(grid.$grid_data, {\n updates_per_second: 60\n });\n if (gantt.defined(grid.$getConfig().dnd_sensitivity)) dnd.config.sensitivity = grid.$getConfig().dnd_sensitivity;\n dnd.attachEvent(\"onBeforeDragStart\", gantt.bind(function (obj, e) {\n var el = locate(e);\n if (!el) return false;\n if (gantt.hideQuickInfo) gantt._hideQuickInfo();\n\n if (domHelpers.closest(e.target, \".gantt_grid_editor_placeholder\")) {\n return false;\n }\n\n var id = el.getAttribute(grid.$config.item_attribute);\n if (checkPlaceholderTask(id)) return false;\n var datastore = getStore();\n var task = datastore.getItem(id);\n if (gantt.isReadonly(task)) return false;\n dnd.config.initial_open_state = task.$open;\n\n if (!gantt.callEvent(\"onRowDragStart\", [id, e.target || e.srcElement, e])) {\n return false;\n }\n }, gantt));\n dnd.attachEvent(\"onAfterDragStart\", gantt.bind(function (obj, e) {\n var el = locate(e);\n dnd.config.marker.innerHTML = el.outerHTML;\n var element = dnd.config.marker.firstChild;\n\n if (element) {\n element.style.position = \"static\";\n }\n\n dnd.config.id = el.getAttribute(grid.$config.item_attribute);\n var store = getStore();\n var task = store.getItem(dnd.config.id);\n dnd.config.index = store.getBranchIndex(dnd.config.id);\n dnd.config.parent = task.parent;\n task.$open = false;\n task.$transparent = true;\n this.refreshData();\n }, gantt));\n\n dnd.lastTaskOfLevel = function (level) {\n var last_item = null;\n var store = getStore();\n var tasks = store.getItems();\n\n for (var i = 0, len = tasks.length; i < len; i++) {\n if (tasks[i].$level == level) {\n last_item = tasks[i];\n }\n }\n\n return last_item ? last_item.id : null;\n };\n\n dnd._getGridPos = gantt.bind(function (e) {\n var pos = domHelpers.getNodePosition(grid.$grid_data); // row offset\n\n var x = pos.x + grid.$grid.scrollLeft;\n var y = e.pos.y - 10;\n var rowHeight = grid.getItemHeight(dnd.config.id); // prevent moving row out of grid_data container\n\n if (y < pos.y) y = pos.y;\n var gridHeight = grid.getTotalHeight();\n if (y > pos.y + gridHeight - rowHeight) y = pos.y + gridHeight - rowHeight;\n var maxBottom = pos.y + pos.height;\n\n if (y > maxBottom - rowHeight) {\n y = maxBottom - rowHeight;\n }\n\n pos.x = x;\n pos.y = y;\n return pos;\n }, gantt);\n dnd._getTargetY = gantt.bind(function (e) {\n var pos = domHelpers.getNodePosition(grid.$grid_data);\n var scrollPos = grid.$state.scrollTop || 0;\n var maxBottom = gantt.$grid_data.getBoundingClientRect().height + scrollPos;\n var y = e.pageY - pos.y + scrollPos;\n\n if (y > maxBottom) {\n y = maxBottom;\n } else if (y < scrollPos) {\n y = scrollPos;\n }\n\n return y;\n }, gantt);\n dnd._getTaskByY = gantt.bind(function (y, dropIndex) {\n var store = getStore();\n y = y || 0;\n var index = grid.getItemIndexByTopPosition(y);\n index = dropIndex < index ? index - 1 : index;\n if (index > store.countVisible() - 1) return null;\n return store.getIdByIndex(index);\n }, gantt);\n dnd.attachEvent(\"onDragMove\", gantt.bind(function (obj, e) {\n var gridDataSizes = gantt.$grid_data.getBoundingClientRect();\n var maxBottom = gridDataSizes.height + gridDataSizes.y + (grid.$state.scrollTop || 0) + window.scrollY;\n var dd = dnd.config;\n\n var pos = dnd._getGridPos(e);\n\n gantt._waiAria.reorderMarkerAttr(dd.marker);\n\n var config = grid.$getConfig(),\n store = getStore(); // setting position of row\n\n if (pos.y < maxBottom) {\n dd.marker.style.top = pos.y + \"px\";\n } else {\n dd.marker.style.top = maxBottom + \"px\";\n }\n\n dd.marker.style.left = pos.x + 10 + \"px\";\n var containerSize = domHelpers.getNodePosition(gantt.$root);\n\n if (pos.width > containerSize.width) {\n dd.marker.style.width = containerSize.width - 10 - 2 + \"px\";\n dd.marker.style.overflow = \"hidden\";\n } // highlight row when mouseover\n\n\n var item = store.getItem(dnd.config.id);\n\n var targetY = dnd._getTargetY(e);\n\n var el = dnd._getTaskByY(targetY, store.getIndexById(item.id));\n\n if (!store.exists(el)) {\n el = dnd.lastTaskOfLevel(config.order_branch_free ? item.$level : 0);\n\n if (el == dnd.config.id) {\n el = null;\n }\n }\n\n function allowedLevel(next, item) {\n return !store.isChildOf(over.id, item.id) && (next.$level == item.$level || config.order_branch_free);\n }\n\n if (store.exists(el)) {\n var over = store.getItem(el);\n var itemTop = grid.getItemTop(over.id);\n var itemHeight = grid.getItemHeight(over.id);\n\n if (itemTop + itemHeight / 2 < targetY) {\n //hovering over bottom part of item, check can be drop to bottom\n var index = store.getIndexById(over.id);\n var nextId = store.getNext(over.id); //adds +1 when hovering over placeholder\n\n var next = store.getItem(nextId);\n\n if (checkPlaceholderTask(nextId)) {\n var prevId = store.getPrev(next.id);\n next = store.getItem(prevId);\n }\n\n if (next) {\n if (next.id != item.id) {\n over = next; //there is a valid target\n } else {\n if (config.order_branch_free) {\n if (!(store.isChildOf(item.id, over.id) && store.getChildren(over.id).length == 1)) return;else {\n store.move(item.id, store.getBranchIndex(over.id) + 1, store.getParent(over.id));\n return;\n }\n } else {\n return;\n }\n }\n } else {\n //we at end of the list, check and drop at the end of list\n nextId = store.getIdByIndex(index);\n next = store.getItem(nextId);\n\n if (checkPlaceholderTask(nextId)) {\n var prevId = store.getPrev(next.id);\n next = store.getItem(prevId);\n }\n\n if (allowedLevel(next, item) && next.id != item.id) {\n store.move(item.id, -1, store.getParent(next.id));\n return;\n }\n }\n } else if (config.order_branch_free) {\n if (over.id != item.id && allowedLevel(over, item) && !checkPlaceholderTask(over.id)) {\n if (!store.hasChild(over.id)) {\n over.$open = true;\n store.move(item.id, -1, over.id);\n return;\n }\n\n if (store.getIndexById(over.id) || itemHeight / 3 < targetY) return;\n }\n } //if item is on different level, check the one before it\n\n\n var index = store.getIndexById(over.id),\n prevId = store.getIdByIndex(index - 1);\n var prev = store.getItem(prevId);\n var shift = 1;\n\n while ((!prev || prev.id == over.id) && index - shift >= 0) {\n prevId = store.getIdByIndex(index - shift);\n prev = store.getItem(prevId);\n shift++;\n }\n\n if (item.id == over.id || checkPlaceholderTask(over.id)) return; //replacing item under cursor\n\n if (allowedLevel(over, item) && item.id != over.id) {\n store.move(item.id, 0, 0, over.id);\n } else if (over.$level == item.$level - 1 && !store.getChildren(over.id).length) {\n store.move(item.id, 0, over.id);\n } else if (prev && allowedLevel(prev, item) && item.id != prev.id) {\n store.move(item.id, -1, store.getParent(prev.id));\n }\n }\n\n return true;\n }, gantt));\n dnd.attachEvent(\"onDragEnd\", gantt.bind(function () {\n var store = getStore();\n var task = store.getItem(dnd.config.id);\n task.$transparent = false;\n task.$open = dnd.config.initial_open_state;\n\n if (this.callEvent(\"onBeforeRowDragEnd\", [dnd.config.id, dnd.config.parent, dnd.config.index]) === false) {\n store.move(dnd.config.id, dnd.config.index, dnd.config.parent);\n task.$drop_target = null;\n } else {\n this.callEvent(\"onRowDragEnd\", [dnd.config.id, task.$drop_target]);\n }\n\n gantt.render();\n this.refreshData();\n }, gantt));\n}\n\nmodule.exports = {\n init: _init_dnd\n};","var utils = require(\"../../../utils/utils\");\n\nvar rowDnd = require(\"./tasks_grid_dnd\");\n\nvar rowDndMarker = require(\"./tasks_grid_dnd_marker\");\n\nvar initializer = function () {\n return function (gantt) {\n return {\n onCreated: function onCreated(grid) {\n grid.$config = utils.mixin(grid.$config, {\n bind: \"task\"\n });\n\n if (grid.$config.id == \"grid\") {\n this.extendGantt(grid);\n gantt.ext.inlineEditors = gantt.ext._inlineEditors.createEditors(grid);\n gantt.ext.inlineEditors.init();\n }\n\n this._mouseDelegates = require(\"../mouse_event_container\")(gantt);\n },\n onInitialized: function onInitialized(grid) {\n var config = grid.$getConfig();\n\n if (config.order_branch) {\n if (config.order_branch == \"marker\") {\n rowDndMarker.init(grid.$gantt, grid);\n } else {\n rowDnd.init(grid.$gantt, grid);\n }\n }\n\n this.initEvents(grid, gantt);\n\n if (grid.$config.id == \"grid\") {\n this.extendDom(grid);\n }\n },\n onDestroyed: function onDestroyed(grid) {\n if (grid.$config.id == \"grid\") {\n gantt.ext.inlineEditors.destructor();\n }\n\n this.clearEvents(grid, gantt);\n },\n initEvents: function initEvents(grid, gantt) {\n this._mouseDelegates.delegate(\"click\", \"gantt_row\", gantt.bind(function (e, id, trg) {\n var config = grid.$getConfig();\n\n if (id !== null) {\n var task = this.getTask(id);\n if (config.scroll_on_click && !gantt._is_icon_open_click(e)) this.showDate(task.start_date);\n gantt.callEvent(\"onTaskRowClick\", [id, trg]);\n }\n }, gantt), grid.$grid);\n\n this._mouseDelegates.delegate(\"click\", \"gantt_grid_head_cell\", gantt.bind(function (e, id, trg) {\n var column = trg.getAttribute(\"data-column-id\");\n if (!gantt.callEvent(\"onGridHeaderClick\", [column, e])) return;\n var config = grid.$getConfig();\n\n if (column == \"add\") {\n var mouseEvents = gantt.$services.getService(\"mouseEvents\");\n mouseEvents.callHandler(\"click\", \"gantt_add\", grid.$grid, [e, config.root_id]);\n return;\n }\n\n if (config.sort && column) {\n // GS-929: if there is no column name, we cannot sort the column\n var sorting_method = column,\n conf;\n\n for (var i = 0; i < config.columns.length; i++) {\n if (config.columns[i].name == column) {\n conf = config.columns[i];\n break;\n }\n }\n\n if (conf && conf.sort !== undefined && conf.sort !== true) {\n sorting_method = conf.sort;\n\n if (!sorting_method) {\n // column sort property 'false', no sorting\n return;\n }\n }\n\n var sort = this._sort && this._sort.direction && this._sort.name == column ? this._sort.direction : \"desc\"; // invert sort direction\n\n sort = sort == \"desc\" ? \"asc\" : \"desc\";\n this._sort = {\n name: column,\n direction: sort\n };\n this.sort(sorting_method, sort == \"desc\");\n }\n }, gantt), grid.$grid);\n\n this._mouseDelegates.delegate(\"click\", \"gantt_add\", gantt.bind(function (e, id, trg) {\n var config = grid.$getConfig();\n if (config.readonly) return;\n var item = {};\n this.createTask(item, id ? id : gantt.config.root_id);\n return false;\n }, gantt), grid.$grid);\n },\n clearEvents: function clearEvents(grid, gantt) {\n this._mouseDelegates.destructor();\n\n this._mouseDelegates = null;\n },\n extendDom: function extendDom(grid) {\n gantt.$grid = grid.$grid;\n gantt.$grid_scale = grid.$grid_scale;\n gantt.$grid_data = grid.$grid_data;\n },\n extendGantt: function extendGantt(grid) {\n gantt.getGridColumns = gantt.bind(grid.getGridColumns, grid);\n grid.attachEvent(\"onColumnResizeStart\", function () {\n return gantt.callEvent(\"onColumnResizeStart\", arguments);\n });\n grid.attachEvent(\"onColumnResize\", function () {\n return gantt.callEvent(\"onColumnResize\", arguments);\n });\n grid.attachEvent(\"onColumnResizeEnd\", function () {\n return gantt.callEvent(\"onColumnResizeEnd\", arguments);\n });\n grid.attachEvent(\"onColumnResizeComplete\", function (columns, totalWidth) {\n gantt.config.grid_width = totalWidth;\n });\n grid.attachEvent(\"onBeforeRowResize\", function () {\n return gantt.callEvent(\"onBeforeRowResize\", arguments);\n });\n grid.attachEvent(\"onRowResize\", function () {\n return gantt.callEvent(\"onRowResize\", arguments);\n });\n grid.attachEvent(\"onBeforeRowResizeEnd\", function () {\n return gantt.callEvent(\"onBeforeRowResizeEnd\", arguments);\n });\n grid.attachEvent(\"onAfterRowResize\", function () {\n return gantt.callEvent(\"onAfterRowResize\", arguments);\n });\n }\n };\n };\n}();\n\nmodule.exports = initializer;","var getRowRectangle = require(\"./viewport/get_grid_row_rectangle\");\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nfunction createGridTaskRowResizerRender(gantt) {\n function _render_grid_item(item, view, viewport) {\n var config = view.$getConfig();\n var resize_el = document.createElement(\"div\");\n resize_el.className = \"gantt_task_grid_row_resize_wrap\";\n resize_el.style.top = view.getItemTop(item.id) + view.getItemHeight(item.id) + \"px\";\n resize_el.innerHTML = \"<div class='gantt_task_grid_row_resize' role='cell'></div>\";\n resize_el.setAttribute(config.task_grid_row_resizer_attribute, item.id);\n\n gantt._waiAria.rowResizerAttr(resize_el);\n\n return resize_el;\n }\n\n return {\n render: _render_grid_item,\n update: null,\n getRectangle: getRowRectangle,\n getVisibleRange: getVisibleRange\n };\n}\n\nmodule.exports = createGridTaskRowResizerRender;","var getRectangle = require(\"./viewport/get_bg_row_rectangle\");\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nvar getVisibleCellsRange = require(\"./viewport/get_visible_cells_range\");\n\nvar isColumnVisible = require(\"./viewport/is_column_visible\");\n\nvar resourceTimetable = require(\"../../resource_timetable_builder\");\n\nfunction renderBar(level, start, end, timeline) {\n var top = (1 - (level * 1 || 0)) * 100;\n var left = timeline.posFromDate(start);\n var right = timeline.posFromDate(end);\n var element = document.createElement(\"div\");\n element.className = \"gantt_histogram_hor_bar\";\n element.style.top = top + '%';\n element.style.left = left + \"px\";\n element.style.width = right - left + 1 + \"px\";\n return element;\n}\n\nfunction renderConnection(prevLevel, nextLevel, left) {\n if (prevLevel === nextLevel) {\n return null;\n }\n\n var top = 1 - Math.max(prevLevel, nextLevel);\n var height = Math.abs(prevLevel - nextLevel);\n var element = document.createElement(\"div\");\n element.className = \"gantt_histogram_vert_bar\";\n element.style.top = top * 100 + \"%\";\n element.style.height = height * 100 + \"%\";\n element.style.left = left + \"px\";\n return element;\n}\n\nfunction generateRenderResourceHistogram(gantt) {\n var getResourceLoad = resourceTimetable(gantt);\n var renderedHistogramCells = {};\n var renderedHistogramRows = {};\n var renderedHistogramCapacity = {};\n\n function detachRenderedHistogramCell(id, index) {\n var renderedRow = renderedHistogramCells[id];\n\n if (renderedRow && renderedRow[index] && renderedRow[index].parentNode) {\n renderedRow[index].parentNode.removeChild(renderedRow[index]);\n }\n }\n\n function renderHistogramLine(capacity, timeline, maxCapacity, viewport) {\n var scale = timeline.getScale();\n var el = document.createElement(\"div\");\n var range = getVisibleCellsRange(scale, viewport);\n\n for (var i = range.start; i <= range.end; i++) {\n var colStart = scale.trace_x[i];\n var colEnd = scale.trace_x[i + 1] || gantt.date.add(colStart, scale.step, scale.unit);\n var col = scale.trace_x[i].valueOf();\n var level = Math.min(capacity[col] / maxCapacity, 1) || 0; // do not render histogram for lines with below zero capacity, as it's reserved for folders\n\n if (level < 0) {\n return null;\n }\n\n var nextLevel = Math.min(capacity[colEnd.valueOf()] / maxCapacity, 1) || 0;\n var bar = renderBar(level, colStart, colEnd, timeline);\n\n if (bar) {\n el.appendChild(bar);\n }\n\n var connection = renderConnection(level, nextLevel, timeline.posFromDate(colEnd));\n\n if (connection) {\n el.appendChild(connection);\n }\n }\n\n return el;\n }\n\n function renderCapacityElement(resource, sizes, capacityMatrix, config, timeline, maxCapacity, viewport) {\n var renderedElement = renderedHistogramCapacity[resource.id];\n\n if (renderedElement && renderedElement.parentNode) {\n renderedElement.parentNode.removeChild(renderedElement);\n }\n\n var capacityElement = renderHistogramLine(capacityMatrix, timeline, maxCapacity, viewport);\n\n if (capacityElement && sizes) {\n capacityElement.setAttribute(\"data-resource-id\", resource.id);\n capacityElement.setAttribute(timeline.$config.item_attribute, resource.id);\n capacityElement.style.position = \"absolute\";\n capacityElement.style.top = sizes.top + 1 + \"px\";\n capacityElement.style.height = timeline.getItemHeight(resource.id) - 1 + \"px\";\n capacityElement.style.left = 0;\n }\n\n return capacityElement;\n }\n\n function renderHistogramCell(resource, sizes, maxCapacity, config, templates, day, timeline) {\n var css = templates.histogram_cell_class(day.start_date, day.end_date, resource, day.tasks, day.assignments);\n var content = templates.histogram_cell_label(day.start_date, day.end_date, resource, day.tasks, day.assignments);\n var fill = templates.histogram_cell_allocated(day.start_date, day.end_date, resource, day.tasks, day.assignments);\n var height = timeline.getItemHeight(resource.id) - 1;\n\n if (css || content) {\n var el = document.createElement('div');\n el.className = [\"gantt_histogram_cell\", css].join(\" \");\n el.setAttribute(timeline.$config.item_attribute, resource.id);\n el.style.cssText = ['left:' + sizes.left + 'px', 'width:' + sizes.width + 'px', 'height:' + height + 'px', 'line-height:' + height + 'px', 'top:' + (sizes.top + 1) + 'px'].join(\";\");\n\n if (content) {\n content = \"<div class='gantt_histogram_label'>\" + content + \"</div>\";\n }\n\n if (fill) {\n content = \"<div class='gantt_histogram_fill' style='height:\" + Math.min(fill / maxCapacity || 0, 1) * 100 + \"%;'></div>\" + content;\n }\n\n if (content) {\n el.innerHTML = content;\n }\n\n return el;\n }\n\n return null;\n }\n\n function renderResourceHistogram(resource, timeline, config, viewport) {\n var templates = timeline.$getTemplates();\n var scale = timeline.getScale();\n var timetable = getResourceLoad(resource, config.resource_property, scale, timeline);\n var cells = [];\n var capacityMatrix = {};\n var maxCapacity = resource.capacity || timeline.$config.capacity || 24;\n renderedHistogramCells[resource.id] = {};\n renderedHistogramRows[resource.id] = null;\n renderedHistogramCapacity[resource.id] = null;\n var smartRendering = !!viewport; //no viewport means smart rendering is disabled\n\n var range = getVisibleCellsRange(scale, viewport);\n\n for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {\n var day = timetable[columnIndex];\n\n if (!day) {\n continue;\n }\n\n if (smartRendering && !isColumnVisible(columnIndex, scale, viewport, gantt)) {\n continue;\n }\n\n var capacity = templates.histogram_cell_capacity(day.start_date, day.end_date, resource, day.tasks, day.assignments);\n capacityMatrix[day.start_date.valueOf()] = capacity || 0;\n var sizes = timeline.getItemPosition(resource, day.start_date, day.end_date);\n var el = renderHistogramCell(resource, sizes, maxCapacity, config, templates, day, timeline);\n\n if (el) {\n cells.push(el);\n renderedHistogramCells[resource.id][columnIndex] = el;\n }\n }\n\n var row = null;\n\n if (cells.length) {\n row = document.createElement(\"div\");\n\n for (var i = 0; i < cells.length; i++) {\n row.appendChild(cells[i]);\n }\n\n var capacityElement = renderCapacityElement(resource, sizes, capacityMatrix, config, timeline, maxCapacity, viewport);\n\n if (capacityElement) {\n row.appendChild(capacityElement);\n renderedHistogramCapacity[resource.id] = capacityElement;\n }\n\n renderedHistogramRows[resource.id] = row;\n }\n\n return row;\n }\n\n function updateResourceHistogram(resource, node, timeline, config, viewport) {\n var templates = timeline.$getTemplates();\n var scale = timeline.getScale();\n var timetable = getResourceLoad(resource, config.resource_property, scale, timeline);\n var maxCapacity = resource.capacity || timeline.$config.capacity || 24;\n var capacityMatrix = {};\n var smartRendering = !!viewport; //no viewport means smart rendering is disabled\n\n var range = getVisibleCellsRange(scale, viewport);\n var checkedColumns = {};\n\n if (renderedHistogramCells && renderedHistogramCells[resource.id]) {\n for (var i in renderedHistogramCells[resource.id]) {\n checkedColumns[i] = i;\n }\n }\n\n for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {\n var day = timetable[columnIndex];\n checkedColumns[columnIndex] = false;\n\n if (!day) {\n continue;\n }\n\n var capacity = templates.histogram_cell_capacity(day.start_date, day.end_date, resource, day.tasks, day.assignments);\n capacityMatrix[day.start_date.valueOf()] = capacity || 0;\n var sizes = timeline.getItemPosition(resource, day.start_date, day.end_date);\n\n if (smartRendering && !isColumnVisible(columnIndex, scale, viewport, gantt)) {\n detachRenderedHistogramCell(resource.id, columnIndex);\n continue;\n }\n\n var renderedCell = renderedHistogramCells[resource.id];\n\n if (!renderedCell || !renderedCell[columnIndex]) {\n var el = renderHistogramCell(resource, sizes, maxCapacity, config, templates, day, timeline);\n\n if (el) {\n node.appendChild(el);\n renderedHistogramCells[resource.id][columnIndex] = el;\n }\n } else if (renderedCell && renderedCell[columnIndex] && !renderedCell[columnIndex].parentNode) {\n node.appendChild(renderedCell[columnIndex]);\n }\n }\n\n for (var i in checkedColumns) {\n if (checkedColumns[i] !== false) {\n detachRenderedHistogramCell(resource.id, i);\n }\n }\n\n var capacityElement = renderCapacityElement(resource, sizes, capacityMatrix, config, timeline, maxCapacity, viewport);\n\n if (capacityElement) {\n node.appendChild(capacityElement);\n renderedHistogramCapacity[resource.id] = capacityElement;\n }\n }\n\n return {\n render: renderResourceHistogram,\n update: updateResourceHistogram,\n getRectangle: getRectangle,\n getVisibleRange: getVisibleRange\n };\n}\n\nmodule.exports = generateRenderResourceHistogram;","var getRectangle = require(\"./viewport/get_bg_row_rectangle\");\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nvar getVisibleCellsRange = require(\"./viewport/get_visible_cells_range\");\n\nvar isColumnVisible = require(\"./viewport/is_column_visible\");\n\nvar resourceTimetable = require(\"../../resource_timetable_builder\");\n\nfunction generateRenderResourceLine(gantt) {\n var getResourceLoad = resourceTimetable(gantt);\n var renderedResourceLines = {};\n\n function renderResourceLineCell(resource, day, templates, config, timeline) {\n var css = templates.resource_cell_class(day.start_date, day.end_date, resource, day.tasks, day.assignments);\n var content = templates.resource_cell_value(day.start_date, day.end_date, resource, day.tasks, day.assignments);\n var height = timeline.getItemHeight(resource.id) - 1;\n\n if (css || content) {\n var sizes = timeline.getItemPosition(resource, day.start_date, day.end_date);\n var el = document.createElement('div');\n el.setAttribute(timeline.$config.item_attribute, resource.id);\n el.className = [\"gantt_resource_marker\", css].join(\" \");\n el.style.cssText = ['left:' + sizes.left + 'px', 'width:' + sizes.width + 'px', 'height:' + height + 'px', 'line-height:' + height + 'px', 'top:' + sizes.top + 'px'].join(\";\");\n if (content) el.innerHTML = content;\n return el;\n }\n\n return null;\n }\n\n function detachRenderedResourceLine(id, index) {\n if (renderedResourceLines[id] && renderedResourceLines[id][index] && renderedResourceLines[id][index].parentNode) {\n renderedResourceLines[id][index].parentNode.removeChild(renderedResourceLines[id][index]);\n }\n }\n\n function renderResourceLine(resource, timeline, config, viewport) {\n var templates = timeline.$getTemplates();\n var scale = timeline.getScale();\n var timetable = getResourceLoad(resource, config.resource_property, timeline.getScale(), timeline);\n var smartRendering = !!viewport; //no viewport means smart rendering is disabled\n\n var cells = [];\n renderedResourceLines[resource.id] = {};\n var range = getVisibleCellsRange(scale, viewport);\n\n for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {\n var day = timetable[columnIndex];\n\n if (!day) {\n continue;\n }\n\n if (smartRendering && !isColumnVisible(columnIndex, scale, viewport, gantt)) {\n continue;\n }\n\n var cell = renderResourceLineCell(resource, day, templates, config, timeline);\n\n if (cell) {\n cells.push(cell);\n renderedResourceLines[resource.id][columnIndex] = cell;\n }\n }\n\n var row = null;\n\n if (cells.length) {\n row = document.createElement(\"div\");\n\n for (var i = 0; i < cells.length; i++) {\n row.appendChild(cells[i]);\n }\n }\n\n return row;\n }\n\n function updateResourceLine(resource, node, timeline, config, viewport) {\n var templates = timeline.$getTemplates();\n var scale = timeline.getScale();\n var timetable = getResourceLoad(resource, config.resource_property, timeline.getScale(), timeline);\n var range = getVisibleCellsRange(scale, viewport);\n var checkedColumns = {};\n\n if (renderedResourceLines && renderedResourceLines[resource.id]) {\n for (var i in renderedResourceLines[resource.id]) {\n checkedColumns[i] = i;\n }\n }\n\n for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {\n var day = timetable[columnIndex];\n checkedColumns[columnIndex] = false;\n\n if (!day) {\n continue;\n }\n\n if (!isColumnVisible(columnIndex, scale, viewport, gantt)) {\n detachRenderedResourceLine(resource.id, columnIndex);\n continue;\n }\n\n if (!renderedResourceLines[resource.id] || !renderedResourceLines[resource.id][columnIndex]) {\n var cell = renderResourceLineCell(resource, day, templates, config, timeline);\n\n if (cell) {\n node.appendChild(cell);\n renderedResourceLines[resource.id][columnIndex] = cell;\n }\n } else if (renderedResourceLines[resource.id] && renderedResourceLines[resource.id][columnIndex] && !renderedResourceLines[resource.id][columnIndex].parentNode) {\n node.appendChild(renderedResourceLines[resource.id][columnIndex]);\n }\n }\n\n for (var i in checkedColumns) {\n if (checkedColumns[i] !== false) {\n detachRenderedResourceLine(resource.id, i);\n }\n }\n }\n\n return {\n render: renderResourceLine,\n update: updateResourceLine,\n getRectangle: getRectangle,\n getVisibleRange: getVisibleRange\n };\n}\n\nmodule.exports = generateRenderResourceLine;","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar helpers = require(\"../../../utils/helpers\");\n\nvar getRowRectangle = require(\"./viewport/get_grid_row_rectangle\");\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nfunction createGridLineRender(gantt) {\n function _render_grid_item(item, view, config, viewport) {\n var columns = view.getGridColumns();\n var templates = view.$getTemplates();\n var store = view.$config.rowStore;\n var cells = [];\n var has_child;\n\n for (var i = 0; i < columns.length; i++) {\n var last = i == columns.length - 1;\n var col = columns[i];\n var cell;\n var value;\n var textValue;\n\n if (col.name == \"add\") {\n var aria = gantt._waiAria.gridAddButtonAttrString(col);\n\n value = \"<div \" + aria + \" class='gantt_add'></div>\";\n textValue = \"\";\n } else {\n if (col.template) value = col.template(item);else value = item[col.name];\n\n if (helpers.isDate(value)) {\n value = templates.date_grid(value, item, col.name);\n }\n\n if (value === null || value === undefined) {\n value = \"\";\n }\n\n textValue = value;\n value = \"<div class='gantt_tree_content'>\" + value + \"</div>\";\n }\n\n var css = \"gantt_cell\" + (last ? \" gantt_last_cell\" : \"\");\n var tree = [];\n\n if (col.tree) {\n css += \" gantt_cell_tree\";\n\n for (var j = 0; j < item.$level; j++) {\n tree.push(templates.grid_indent(item));\n }\n\n has_child = store.hasChild(item.id) && !(gantt.isSplitTask(item) && !gantt.config.open_split_tasks);\n\n if (has_child) {\n tree.push(templates.grid_open(item));\n tree.push(templates.grid_folder(item));\n } else {\n tree.push(templates.grid_blank(item));\n tree.push(templates.grid_file(item));\n }\n }\n\n var style = \"width:\" + (col.width - (last ? 1 : 0)) + \"px;\";\n\n if (this.defined(col.align)) {\n var flexAlign = {\n right: \"flex-end\",\n left: \"flex-start\",\n center: \"center\"\n };\n var justifyContent = flexAlign[col.align];\n style += \"text-align:\" + col.align + \";justify-content:\" + justifyContent + \";\";\n }\n\n var aria = gantt._waiAria.gridCellAttrString(col, textValue, item);\n\n tree.push(value);\n cell = \"<div class='\" + css + \"' data-column-index='\" + i + \"' data-column-name='\" + col.name + \"' style='\" + style + \"' \" + aria + \">\" + tree.join(\"\") + \"</div>\";\n cells.push(cell);\n } // GS-291. The odd class should be assigned correctly\n\n\n css = \"\";\n var storeName = store.$config.name;\n\n switch (storeName) {\n case \"task\":\n css = gantt.getGlobalTaskIndex(item.id) % 2 === 0 ? \"\" : \" odd\";\n break;\n\n case \"resource\":\n css = store.visibleOrder.indexOf(item.id) % 2 === 0 ? \"\" : \" odd\";\n break;\n }\n\n css += item.$transparent ? \" gantt_transparent\" : \"\";\n css += item.$dataprocessor_class ? \" \" + item.$dataprocessor_class : \"\";\n\n if (templates.grid_row_class) {\n var css_template = templates.grid_row_class.call(gantt, item.start_date, item.end_date, item);\n if (css_template) css += \" \" + css_template;\n }\n\n if (store.isSelected(item.id)) {\n css += \" gantt_selected\";\n }\n\n var el = document.createElement(\"div\");\n el.className = \"gantt_row\" + css + \" gantt_row_\" + gantt.getTaskType(item.type);\n var height = view.getItemHeight(item.id);\n el.style.height = height + \"px\";\n el.style.lineHeight = height + \"px\";\n\n if (config.smart_rendering) {\n el.style.position = \"absolute\";\n el.style.left = \"0px\";\n el.style.top = view.getItemTop(item.id) + \"px\";\n }\n\n if (view.$config.item_attribute) {\n el.setAttribute(view.$config.item_attribute, item.id);\n el.setAttribute(view.$config.bind + \"_id\", item.id); // 'task_id'/'resource_id' for backward compatibility\n }\n\n gantt._waiAria.taskRowAttr(item, el);\n\n el.innerHTML = cells.join(\"\");\n return el;\n }\n\n function onrender(item, rowNode, view) {\n var columns = view.getGridColumns();\n\n for (var i = 0; i < columns.length; i++) {\n var column = columns[i];\n\n if (column.onrender) {\n // find cell node for current column\n var cellNode = rowNode.querySelector(\"[data-column-name=\" + column.name + \"]\");\n\n if (cellNode) {\n var content = column.onrender(item, cellNode);\n\n if (content && typeof content === \"string\") {\n cellNode.innerHTML = content;\n } else if (content && _typeof(content) === \"object\") {\n // render object to node using additional functionality\n if (gantt.config.external_render) {\n var adapter = gantt.config.external_render;\n\n if (adapter.isElement(content)) {\n adapter.renderElement(content, cellNode);\n }\n }\n }\n }\n }\n }\n }\n\n return {\n render: _render_grid_item,\n update: null,\n getRectangle: getRowRectangle,\n getVisibleRange: getVisibleRange,\n onrender: onrender\n };\n}\n\nmodule.exports = createGridLineRender;","var isInViewPort = require(\"./viewport/is_link_in_viewport\");\n\nvar getVisibleRange = require(\"./viewport/factory/get_visible_link_range\");\n\nfunction createLinkRender(gantt) {\n function _render_link_element(link, view, config) {\n var source = gantt.getTask(link.source);\n\n if (source.hide_bar) {\n return;\n }\n\n var target = gantt.getTask(link.target);\n\n if (target.hide_bar) {\n return;\n }\n\n var pt = path_builder.get_endpoint(link, view, source, target);\n var dy = pt.e_y - pt.y;\n var dx = pt.e_x - pt.x;\n\n if (!dx && !dy) {\n return null;\n }\n\n var dots = path_builder.get_points(link, view, source, target);\n var lines = drawer.get_lines(dots, view);\n var div = document.createElement(\"div\");\n var css = \"gantt_task_link\";\n\n if (link.color) {\n css += \" gantt_link_inline_color\";\n }\n\n var cssTemplate = gantt.templates.link_class ? gantt.templates.link_class(link) : \"\";\n\n if (cssTemplate) {\n css += \" \" + cssTemplate;\n }\n\n if (config.highlight_critical_path && gantt.isCriticalLink) {\n if (gantt.isCriticalLink(link)) css += \" gantt_critical_link\";\n }\n\n div.className = css;\n\n if (view.$config.link_attribute) {\n div.setAttribute(view.$config.link_attribute, link.id);\n div.setAttribute(\"link_id\", link.id);\n }\n\n for (var i = 0; i < lines.length; i++) {\n if (i == lines.length - 1) {\n lines[i].size -= config.link_arrow_size;\n }\n\n var el = drawer.render_line(lines[i], lines[i + 1], view, link.source);\n\n if (link.color) {\n el.firstChild.style.backgroundColor = link.color;\n }\n\n div.appendChild(el);\n }\n\n var direction = lines[lines.length - 1].direction;\n\n var endpoint = _render_link_arrow(dots[dots.length - 1], direction, view, link.source);\n\n if (link.color) {\n endpoint.style.borderColor = link.color;\n }\n\n div.appendChild(endpoint);\n\n gantt._waiAria.linkAttr(link, div);\n\n return div;\n }\n\n function _render_link_arrow(point, direction, view, targetId) {\n var config = view.$getConfig();\n var div = document.createElement(\"div\");\n var top = point.y;\n var left = point.x;\n var size = config.link_arrow_size;\n var className = \"gantt_link_arrow gantt_link_arrow_\" + direction;\n\n switch (direction) {\n case drawer.dirs.right:\n top -= size / 2;\n left -= size;\n break;\n\n case drawer.dirs.left:\n top -= size / 2;\n break;\n\n case drawer.dirs.up:\n left -= size;\n break;\n\n case drawer.dirs.down:\n top += size * 2;\n left -= size;\n break;\n\n default:\n break;\n }\n\n div.style.cssText = [\"top:\" + top + \"px\", \"left:\" + left + 'px'].join(';');\n div.className = className;\n return div;\n }\n\n var drawer = {\n current_pos: null,\n dirs: {\n \"left\": 'left',\n \"right\": 'right',\n \"up\": 'up',\n \"down\": 'down'\n },\n path: [],\n clear: function clear() {\n this.current_pos = null;\n this.path = [];\n },\n point: function point(pos) {\n this.current_pos = gantt.copy(pos);\n },\n get_lines: function get_lines(dots) {\n this.clear();\n this.point(dots[0]);\n\n for (var i = 1; i < dots.length; i++) {\n this.line_to(dots[i]);\n }\n\n return this.get_path();\n },\n line_to: function line_to(pos) {\n var next = gantt.copy(pos);\n var prev = this.current_pos;\n\n var line = this._get_line(prev, next);\n\n this.path.push(line);\n this.current_pos = next;\n },\n get_path: function get_path() {\n return this.path;\n },\n get_wrapper_sizes: function get_wrapper_sizes(v, view, itemId) {\n var config = view.$getConfig();\n var res,\n wrapper_size = config.link_wrapper_width,\n y = v.y - wrapper_size / 2;\n\n switch (v.direction) {\n case this.dirs.left:\n res = {\n top: y,\n height: wrapper_size,\n lineHeight: wrapper_size,\n left: v.x - v.size - wrapper_size / 2,\n width: v.size + wrapper_size\n };\n break;\n\n case this.dirs.right:\n res = {\n top: y,\n lineHeight: wrapper_size,\n height: wrapper_size,\n left: v.x - wrapper_size / 2,\n width: v.size + wrapper_size\n };\n break;\n\n case this.dirs.up:\n res = {\n top: y - v.size,\n lineHeight: v.size + wrapper_size,\n height: v.size + wrapper_size,\n left: v.x - wrapper_size / 2,\n width: wrapper_size\n };\n break;\n\n case this.dirs.down:\n res = {\n top: y\n /*- wrapper_size/2*/\n ,\n lineHeight: v.size + wrapper_size,\n height: v.size + wrapper_size,\n left: v.x - wrapper_size / 2,\n width: wrapper_size\n };\n break;\n\n default:\n break;\n }\n\n return res;\n },\n get_line_sizes: function get_line_sizes(v, view) {\n var config = view.$getConfig();\n var res,\n line_size = config.link_line_width,\n wrapper_size = config.link_wrapper_width,\n size = v.size + line_size;\n\n switch (v.direction) {\n case this.dirs.left:\n case this.dirs.right:\n res = {\n height: line_size,\n width: size,\n marginTop: (wrapper_size - line_size) / 2,\n marginLeft: (wrapper_size - line_size) / 2\n };\n break;\n\n case this.dirs.up:\n case this.dirs.down:\n res = {\n height: size,\n width: line_size,\n marginTop: (wrapper_size - line_size) / 2,\n marginLeft: (wrapper_size - line_size) / 2\n };\n break;\n\n default:\n break;\n }\n\n return res;\n },\n render_line: function render_line(v, end, view, itemId) {\n var pos = this.get_wrapper_sizes(v, view, itemId);\n var wrapper = document.createElement(\"div\");\n wrapper.style.cssText = [\"top:\" + pos.top + \"px\", \"left:\" + pos.left + \"px\", \"height:\" + pos.height + \"px\", \"width:\" + pos.width + \"px\"].join(';');\n wrapper.className = \"gantt_line_wrapper\";\n var innerPos = this.get_line_sizes(v, view);\n var inner = document.createElement(\"div\");\n inner.style.cssText = [\"height:\" + innerPos.height + \"px\", \"width:\" + innerPos.width + \"px\", \"margin-top:\" + innerPos.marginTop + \"px\", \"margin-left:\" + innerPos.marginLeft + \"px\"].join(\";\");\n inner.className = \"gantt_link_line_\" + v.direction;\n wrapper.appendChild(inner);\n return wrapper;\n },\n _get_line: function _get_line(from, to) {\n var direction = this.get_direction(from, to);\n var vect = {\n x: from.x,\n y: from.y,\n direction: this.get_direction(from, to)\n };\n\n if (direction == this.dirs.left || direction == this.dirs.right) {\n vect.size = Math.abs(from.x - to.x);\n } else {\n vect.size = Math.abs(from.y - to.y);\n }\n\n return vect;\n },\n get_direction: function get_direction(from, to) {\n var direction = 0;\n\n if (to.x < from.x) {\n direction = this.dirs.left;\n } else if (to.x > from.x) {\n direction = this.dirs.right;\n } else if (to.y > from.y) {\n direction = this.dirs.down;\n } else {\n direction = this.dirs.up;\n }\n\n return direction;\n }\n };\n var path_builder = {\n path: [],\n clear: function clear() {\n this.path = [];\n },\n current: function current() {\n return this.path[this.path.length - 1];\n },\n point: function point(next) {\n if (!next) return this.current();\n this.path.push(gantt.copy(next));\n return next;\n },\n point_to: function point_to(direction, diff, point) {\n if (!point) point = gantt.copy(this.point());else point = {\n x: point.x,\n y: point.y\n };\n var dir = drawer.dirs;\n\n switch (direction) {\n case dir.left:\n point.x -= diff;\n break;\n\n case dir.right:\n point.x += diff;\n break;\n\n case dir.up:\n point.y -= diff;\n break;\n\n case dir.down:\n point.y += diff;\n break;\n\n default:\n break;\n }\n\n return this.point(point);\n },\n get_points: function get_points(link, view, source, target) {\n var pt = this.get_endpoint(link, view, source, target);\n var xy = gantt.config;\n var dy = pt.e_y - pt.y;\n var dx = pt.e_x - pt.x;\n var dir = drawer.dirs;\n var rowHeight = view.getItemHeight(link.source);\n this.clear();\n this.point({\n x: pt.x,\n y: pt.y\n });\n var shiftX = 2 * xy.link_arrow_size; //just random size for first line\n\n var lineType = this.get_line_type(link, view.$getConfig());\n var forward = pt.e_x > pt.x;\n\n if (lineType.from_start && lineType.to_start) {\n this.point_to(dir.left, shiftX);\n\n if (forward) {\n this.point_to(dir.down, dy);\n this.point_to(dir.right, dx);\n } else {\n this.point_to(dir.right, dx);\n this.point_to(dir.down, dy);\n }\n\n this.point_to(dir.right, shiftX);\n } else if (!lineType.from_start && lineType.to_start) {\n forward = pt.e_x > pt.x + 2 * shiftX;\n this.point_to(dir.right, shiftX);\n\n if (forward) {\n dx -= shiftX;\n this.point_to(dir.down, dy);\n this.point_to(dir.right, dx);\n } else {\n dx -= 2 * shiftX;\n var sign = dy > 0 ? 1 : -1;\n this.point_to(dir.down, sign * (rowHeight / 2));\n this.point_to(dir.right, dx);\n this.point_to(dir.down, sign * (Math.abs(dy) - rowHeight / 2));\n this.point_to(dir.right, shiftX);\n }\n } else if (!lineType.from_start && !lineType.to_start) {\n this.point_to(dir.right, shiftX);\n\n if (forward) {\n this.point_to(dir.right, dx);\n this.point_to(dir.down, dy);\n } else {\n this.point_to(dir.down, dy);\n this.point_to(dir.right, dx);\n }\n\n this.point_to(dir.left, shiftX);\n } else if (lineType.from_start && !lineType.to_start) {\n forward = pt.e_x > pt.x - 2 * shiftX;\n this.point_to(dir.left, shiftX);\n\n if (!forward) {\n dx += shiftX;\n this.point_to(dir.down, dy);\n this.point_to(dir.right, dx);\n } else {\n dx += 2 * shiftX;\n var sign = dy > 0 ? 1 : -1;\n this.point_to(dir.down, sign * (rowHeight / 2));\n this.point_to(dir.right, dx);\n this.point_to(dir.down, sign * (Math.abs(dy) - rowHeight / 2));\n this.point_to(dir.left, shiftX);\n }\n }\n\n return this.path;\n },\n get_line_type: function get_line_type(link, config) {\n var types = config.links;\n var from_start = false,\n to_start = false;\n\n if (link.type == types.start_to_start) {\n from_start = to_start = true;\n } else if (link.type == types.finish_to_finish) {\n from_start = to_start = false;\n } else if (link.type == types.finish_to_start) {\n from_start = false;\n to_start = true;\n } else if (link.type == types.start_to_finish) {\n from_start = true;\n to_start = false;\n } else {\n gantt.assert(false, \"Invalid link type\");\n }\n\n if (config.rtl) {\n from_start = !from_start;\n to_start = !to_start;\n }\n\n return {\n from_start: from_start,\n to_start: to_start\n };\n },\n get_endpoint: function get_endpoint(link, view, source, target) {\n var config = view.$getConfig();\n var lineType = this.get_line_type(link, config);\n var from_start = lineType.from_start,\n to_start = lineType.to_start;\n var from = getMilestonePosition(source, view, config),\n to = getMilestonePosition(target, view, config);\n return {\n x: from_start ? from.left : from.left + from.width,\n e_x: to_start ? to.left : to.left + to.width,\n y: from.top + from.rowHeight / 2 - 1,\n e_y: to.top + to.rowHeight / 2 - 1\n };\n }\n };\n\n function getMilestonePosition(task, view, config) {\n var pos = view.getItemPosition(task);\n\n if (gantt.getTaskType(task.type) == config.types.milestone) {\n var milestoneHeight = view.getBarHeight(task.id, true);\n var milestoneWidth = Math.sqrt(2 * milestoneHeight * milestoneHeight);\n pos.left -= milestoneWidth / 2;\n pos.width = milestoneWidth;\n }\n\n return pos;\n }\n\n return {\n render: _render_link_element,\n update: null,\n //getRectangle: getLinkRectangle\n isInViewPort: isInViewPort,\n getVisibleRange: getVisibleRange()\n };\n}\n\nmodule.exports = createLinkRender;","module.exports = function (items, gantt) {\n var placeholderConfig = gantt.config.timeline_placeholder;\n items = items || [];\n\n if (placeholderConfig && items.filter(function (e) {\n return e.id === 'timeline_placeholder_task';\n }).length === 0) {\n var state = gantt.getState();\n var lastTaskId = null;\n var start_date = state.min_date;\n var end_date = state.max_date;\n\n if (items.length) {\n lastTaskId = items[items.length - 1].id;\n }\n\n var placeholderTask = {\n start_date: start_date,\n end_date: end_date,\n row_height: placeholderConfig.height || 0,\n id: \"timeline_placeholder_task\",\n unscheduled: true,\n lastTaskId: lastTaskId,\n calendar_id: placeholderConfig.calendar || \"global\",\n $source: [],\n $target: []\n };\n items.push(placeholderTask);\n }\n};","var getRowRectangle = require(\"./viewport/get_bg_row_rectangle\");\n\nvar isLegacyRender = require(\"./is_legacy_smart_render\");\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nvar getVisibleCellsRange = require(\"./viewport/get_visible_cells_range\");\n\nvar isColumnVisible = require(\"./viewport/is_column_visible\");\n\nvar bgPlaceholder = require(\"./prerender/task_bg_placeholder\");\n\nfunction createTaskBgRender(gantt) {\n var renderedCells = {};\n var visibleCells = {};\n\n function isRendered(item, columnIndex) {\n if (renderedCells[item.id][columnIndex] && renderedCells[item.id][columnIndex].parentNode) {\n return true;\n } else {\n return false;\n }\n }\n\n function detachRenderedCell(itemId, columnIndex) {\n if (renderedCells[itemId] && renderedCells[itemId][columnIndex] && renderedCells[itemId][columnIndex].parentNode) {\n renderedCells[itemId][columnIndex].parentNode.removeChild(renderedCells[itemId][columnIndex]);\n }\n }\n\n function getCellClassTemplate(view) {\n var templates = view.$getTemplates();\n var cssTemplate;\n\n if (typeof templates.task_cell_class !== \"undefined\") {\n cssTemplate = templates.task_cell_class; // eslint-disable-next-line no-console\n\n var log = console.warn || console.log;\n log('gantt.templates.task_cell_class template is deprecated and will be removed soon. Please use gantt.templates.timeline_cell_class instead.');\n } else {\n cssTemplate = templates.timeline_cell_class;\n }\n\n return cssTemplate;\n }\n\n function getCellContentTemplate(view) {\n var templates = view.$getTemplates();\n var contentTemplate = templates.timeline_cell_content;\n return contentTemplate;\n }\n\n function renderCells(item, node, view, config, viewPort) {\n var cfg = view.getScale();\n var count = cfg.count;\n var cssTemplate = getCellClassTemplate(view);\n var contentTemplate = getCellContentTemplate(view);\n\n if (config.show_task_cells) {\n if (!renderedCells[item.id]) {\n renderedCells[item.id] = {};\n }\n\n if (!visibleCells[item.id]) {\n visibleCells[item.id] = {};\n }\n\n var range = getVisibleCellsRange(cfg, viewPort);\n\n for (var i in visibleCells[item.id]) {\n var index = visibleCells[item.id][i];\n\n if (Number(index) < range.start || Number(index) > range.end) {\n detachRenderedCell(item.id, index);\n }\n }\n\n visibleCells[item.id] = {}; // TODO: do not iterate all cell, only ones in the viewport and once that are already rendered\n\n for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {\n var cell = renderOneCell(cfg, columnIndex, item, viewPort, count, cssTemplate, contentTemplate, config);\n\n if (!cell && isRendered(item, columnIndex)) {\n detachRenderedCell(item.id, columnIndex);\n } else if (cell && !cell.parentNode) {\n node.appendChild(cell);\n }\n }\n }\n }\n\n function renderOneCell(scale, columnIndex, item, viewPort, count, cssTemplate, contentTemplate, config) {\n var width = scale.width[columnIndex],\n cssclass = \"\";\n\n if (isColumnVisible(columnIndex, scale, viewPort, gantt)) {\n //do not render skipped columns\n var cssTemplateContent = cssTemplate(item, scale.trace_x[columnIndex]);\n var htmlTemplateContent = \"\";\n\n if (contentTemplate) {\n // for backward compatibility, contentTemplate was added in 7.2.0+, will be undefined if someone used copy of old config/template object\n htmlTemplateContent = contentTemplate(item, scale.trace_x[columnIndex]);\n }\n\n if (config.static_background) {\n // if cell render in static background is not allowed, or if it's a blank cell\n var customCell = !!(cssTemplateContent || htmlTemplateContent);\n\n if (!(config.static_background_cells && customCell)) {\n return null;\n }\n }\n\n if (renderedCells[item.id][columnIndex]) {\n visibleCells[item.id][columnIndex] = columnIndex;\n return renderedCells[item.id][columnIndex];\n }\n\n var cell = document.createElement(\"div\");\n cell.style.width = width + \"px\";\n cssclass = \"gantt_task_cell\" + (columnIndex == count - 1 ? \" gantt_last_cell\" : \"\");\n\n if (cssTemplateContent) {\n cssclass += \" \" + cssTemplateContent;\n }\n\n cell.className = cssclass;\n\n if (htmlTemplateContent) {\n cell.innerHTML = htmlTemplateContent;\n }\n\n cell.style.position = \"absolute\";\n cell.style.left = scale.left[columnIndex] + \"px\";\n renderedCells[item.id][columnIndex] = cell;\n visibleCells[item.id][columnIndex] = columnIndex;\n return cell;\n }\n\n return null;\n }\n\n function _render_bg_line(item, view, config, viewPort) {\n var templates = view.$getTemplates();\n var cfg = view.getScale();\n var count = cfg.count;\n\n if (config.static_background && !config.static_background_cells) {\n return null;\n }\n\n var row = document.createElement(\"div\");\n var cellCssTemplate = getCellClassTemplate(view);\n var cellHtmlTemplate = getCellContentTemplate(view);\n var range;\n\n if (!viewPort || !config.smart_rendering || isLegacyRender(gantt)) {\n range = {\n start: 0,\n end: count - 1\n };\n } else {\n range = getVisibleCellsRange(cfg, viewPort.x);\n }\n\n if (config.show_task_cells) {\n renderedCells[item.id] = {};\n visibleCells[item.id] = {};\n\n for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {\n var cell = renderOneCell(cfg, columnIndex, item, viewPort, count, cellCssTemplate, cellHtmlTemplate, config);\n\n if (cell) {\n row.appendChild(cell);\n }\n }\n } // GS-291. The odd class should be assigned correctly\n\n\n var store = view.$config.rowStore;\n var odd = store.getIndexById(item.id) % 2 !== 0;\n var cssTemplate = templates.task_row_class(item.start_date, item.end_date, item);\n var css = \"gantt_task_row\" + (odd ? \" odd\" : \"\") + (cssTemplate ? ' ' + cssTemplate : '');\n\n if (store.isSelected(item.id)) {\n css += \" gantt_selected\";\n }\n\n row.className = css;\n\n if (config.smart_rendering) {\n row.style.position = \"absolute\";\n row.style.top = view.getItemTop(item.id) + \"px\";\n row.style.width = \"100%\";\n } else {\n row.style.position = \"relative\";\n }\n\n row.style.height = view.getItemHeight(item.id) + \"px\";\n\n if (item.id == \"timeline_placeholder_task\") {\n var placeholderTop = 0;\n\n if (item.lastTaskId) {\n var lastTaskTop = view.getItemTop(item.lastTaskId);\n var lastTaskHeight = view.getItemHeight(item.lastTaskId);\n placeholderTop = lastTaskTop + lastTaskHeight;\n }\n\n var maxHeight = item.row_height || view.$task_data.offsetHeight;\n var placeholderHeight = maxHeight - placeholderTop; // So that it won't exceed the placeholder timeline height\n\n if (placeholderHeight < 0) {\n placeholderHeight = 0;\n }\n\n if (config.smart_rendering) {\n row.style.top = placeholderTop + \"px\";\n }\n\n row.style.height = placeholderHeight + \"px\";\n }\n\n if (view.$config.item_attribute) {\n row.setAttribute(view.$config.item_attribute, item.id);\n row.setAttribute(view.$config.bind + \"_id\", item.id); // 'task_id'/'resource_id' for backward compatibility\n }\n\n return row;\n }\n\n return {\n render: _render_bg_line,\n update: renderCells,\n getRectangle: getRowRectangle,\n getVisibleRange: getVisibleRange,\n prepareData: bgPlaceholder\n };\n}\n\nmodule.exports = createTaskBgRender;","var createBaseBarRender = require(\"./task_bar_render\");\n\nvar isInViewPort = require(\"./viewport/is_bar_in_viewport\");\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nfunction createTaskRenderer(gantt) {\n var defaultRender = createBaseBarRender(gantt);\n var renderedNodes = {};\n\n function checkVisibility(child, viewPort, timeline, config, gantt) {\n var isVisible = true; // GS-2123. Don't render rollup tasks that are outside the viewport\n\n if (config.smart_rendering) {\n isVisible = isInViewPort(child, viewPort, timeline, config, gantt);\n }\n\n return isVisible;\n }\n\n function generateChildElement(task, child, timeline, sizes) {\n var childCopy = gantt.copy(gantt.getTask(child.id));\n childCopy.$rendered_at = task.id; // a way to filter rollup tasks:\n\n var displayRollup = gantt.callEvent(\"onBeforeRollupTaskDisplay\", [childCopy.id, childCopy, task.id]);\n\n if (displayRollup === false) {\n return;\n }\n\n var element = defaultRender(childCopy, timeline);\n\n if (!element) {\n return;\n }\n\n var height = timeline.getBarHeight(task.id, child.type == gantt.config.types.milestone);\n var padding = Math.floor((timeline.getItemHeight(task.id) - height) / 2);\n element.style.top = sizes.top + padding + \"px\";\n element.classList.add(\"gantt_rollup_child\");\n element.setAttribute(\"data-rollup-parent-id\", task.id);\n return element;\n }\n\n function getKey(childId, renderParentId) {\n return childId + \"_\" + renderParentId;\n }\n\n function renderRollupTask(task, timeline, config, viewPort) {\n if (task.rollup !== false && task.$rollup && task.$rollup.length) {\n var el = document.createElement('div'),\n sizes = gantt.getTaskPosition(task); // vertical position is not important for the rollup tasks as long as the parent is rendered\n\n viewPort.y = 0;\n viewPort.y_end = gantt.$task_bg.scrollHeight;\n task.$rollup.forEach(function (itemId) {\n if (!gantt.isTaskExists(itemId)) {\n return;\n }\n\n var child = gantt.getTask(itemId);\n var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);\n\n if (!isVisible) {\n return;\n }\n\n var element = generateChildElement(task, child, timeline, sizes);\n\n if (element) {\n renderedNodes[getKey(child.id, task.id)] = element;\n el.appendChild(element);\n } else {\n renderedNodes[getKey(child.id, task.id)] = false;\n }\n });\n return el;\n }\n\n return false;\n }\n\n function repaintRollupTask(task, itemNode, timeline, config, viewPort) {\n var el = document.createElement(\"div\"),\n sizes = gantt.getTaskPosition(task); // vertical position is not important for the rollup tasks as long as the parent is rendered\n\n viewPort.y = 0;\n viewPort.y_end = gantt.$task_bg.scrollHeight;\n task.$rollup.forEach(function (itemId) {\n var child = gantt.getTask(itemId);\n var rollupKey = getKey(child.id, task.id);\n var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);\n\n if (isVisible !== !!renderedNodes[rollupKey]) {\n if (isVisible) {\n var element = generateChildElement(task, child, timeline, sizes);\n renderedNodes[rollupKey] = element || false;\n } else {\n renderedNodes[rollupKey] = false;\n }\n }\n\n if (!!renderedNodes[rollupKey]) {\n el.appendChild(renderedNodes[rollupKey]);\n }\n\n itemNode.innerHTML = \"\";\n itemNode.appendChild(el);\n });\n }\n\n return {\n render: renderRollupTask,\n update: repaintRollupTask,\n //getRectangle: getBarRectangle\n isInViewPort: isInViewPort,\n getVisibleRange: getVisibleRange\n };\n}\n\nmodule.exports = createTaskRenderer;","var isBarInViewport = require(\"./is_bar_in_viewport\");\n\nmodule.exports = function isSplitTaskInViewport(item, viewport, view, config, gantt) {\n if (!gantt.isSplitTask(item)) {\n return false;\n }\n\n var range = gantt.getSubtaskDates(item.id);\n return isBarInViewport({\n id: item.id,\n start_date: range.start_date,\n end_date: range.end_date,\n parent: item.parent\n }, viewport, view, gantt);\n};","var createBaseBarRender = require(\"./task_bar_render\"); //const isInViewPort = require(\"./viewport/is_split_task_in_viewport\");\n\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nvar isInViewPortParent = require(\"./viewport/is_split_task_in_viewport\");\n\nvar isInViewPortChild = require(\"./viewport/is_bar_in_viewport\");\n\nfunction createTaskRenderer(gantt) {\n var defaultRender = createBaseBarRender(gantt);\n var renderedNodes = {};\n\n function checkVisibility(child, viewPort, timeline, config, gantt) {\n var isVisible = !child.hide_bar; // GS-1195. Don't render split tasks that are outside the viewport\n\n if (config.smart_rendering && isVisible) {\n isVisible = isInViewPortChild(child, viewPort, timeline, config, gantt);\n }\n\n return isVisible;\n }\n\n function generateChildElement(task, child, timeline, sizes) {\n if (child.hide_bar) {\n return;\n }\n\n var isProject = gantt.isSummaryTask(child);\n\n if (isProject) {\n gantt.resetProjectDates(child);\n }\n\n var childCopy = gantt.copy(gantt.getTask(child.id));\n childCopy.$rendered_at = task.id; // a way to filter split tasks:\n\n var showSplitTask = gantt.callEvent(\"onBeforeSplitTaskDisplay\", [childCopy.id, childCopy, task.id]);\n\n if (showSplitTask === false) {\n return;\n }\n\n var element = defaultRender(childCopy, timeline);\n if (!element) return;\n var height = timeline.getBarHeight(task.id, child.type == gantt.config.types.milestone);\n var padding = Math.floor((timeline.getItemHeight(task.id) - height) / 2);\n element.style.top = sizes.top + padding + \"px\";\n element.classList.add(\"gantt_split_child\");\n\n if (isProject) {\n element.classList.add(\"gantt_split_subproject\");\n }\n\n return element;\n }\n\n function getKey(childId, renderParentId) {\n return childId + \"_\" + renderParentId;\n }\n\n function shouldUseSplitRendering(task, config) {\n return gantt.isSplitTask(task) && (config.open_split_tasks && !task.$open || !config.open_split_tasks) && gantt.hasChild(task.id);\n }\n\n function renderSplitTask(task, timeline, config, viewPort) {\n if (shouldUseSplitRendering(task, config)) {\n var el = document.createElement('div'),\n sizes = gantt.getTaskPosition(task);\n\n if (gantt.hasChild(task.id)) {\n gantt.eachTask(function (child) {\n var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);\n\n if (!isVisible) {\n return;\n }\n\n var element = generateChildElement(task, child, timeline, sizes);\n\n if (element) {\n renderedNodes[getKey(child.id, task.id)] = element;\n el.appendChild(element);\n } else {\n renderedNodes[getKey(child.id, task.id)] = false;\n }\n }, task.id);\n }\n\n return el;\n }\n\n return false;\n }\n\n function repaintSplitTask(task, itemNode, timeline, config, viewPort) {\n if (shouldUseSplitRendering(task, config)) {\n var el = document.createElement(\"div\"),\n sizes = gantt.getTaskPosition(task);\n gantt.eachTask(function (child) {\n var splitKey = getKey(child.id, task.id);\n var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);\n\n if (isVisible !== !!renderedNodes[splitKey]) {\n if (isVisible) {\n var element = generateChildElement(task, child, timeline, sizes);\n renderedNodes[splitKey] = element || false;\n } else {\n renderedNodes[splitKey] = false;\n }\n }\n\n if (!!renderedNodes[splitKey]) {\n el.appendChild(renderedNodes[splitKey]);\n }\n\n itemNode.innerHTML = \"\";\n itemNode.appendChild(el);\n }, task.id);\n }\n }\n\n return {\n render: renderSplitTask,\n update: repaintSplitTask,\n isInViewPort: isInViewPortParent,\n getVisibleRange: getVisibleRange\n };\n}\n\nmodule.exports = createTaskRenderer;","var isInViewPort = require(\"./viewport/is_bar_in_viewport\");\n\nvar getVisibleRange = require(\"./viewport/get_visible_bars_range\");\n\nvar createBaseBarRender = require(\"./task_bar_render\");\n\nmodule.exports = function createTaskRenderer(gantt) {\n var defaultRender = createBaseBarRender(gantt);\n return {\n render: defaultRender,\n update: null,\n //getRectangle: getBarRectangle\n isInViewPort: isInViewPort,\n getVisibleRange: getVisibleRange\n };\n};","module.exports = function (gantt) {\n return function processTaskDateProperties(item, mapTo, mode) {\n if (mode == \"keepDates\") {\n keepDatesOnEdit(item, mapTo);\n } else if (mode == \"keepDuration\") {\n keepDurationOnEdit(item, mapTo);\n } else {\n defaultActionOnEdit(item, mapTo);\n }\n }; // resize task\n // resize task when start/end/duration changes\n\n function keepDatesOnEdit(item, mapTo) {\n if (mapTo == \"duration\") {\n item.end_date = gantt.calculateEndDate(item);\n } else if (mapTo == \"end_date\" || mapTo == \"start_date\") {\n item.duration = gantt.calculateDuration(item);\n }\n } // move task(before 6.2)\n // move task when start/end dates changes\n // resize task when duration changes\n\n\n function keepDurationOnEdit(item, mapTo) {\n if (mapTo == \"end_date\") {\n item.start_date = decreaseStartDate(item);\n } else if (mapTo == \"start_date\" || mapTo == \"duration\") {\n item.end_date = gantt.calculateEndDate(item);\n }\n } // default behavior\n // move task when start date changes\n // resize task when end date/duration changes\n\n\n function defaultActionOnEdit(item, mapTo) {\n if (gantt.config.schedule_from_end) {\n if (mapTo == \"end_date\" || mapTo == \"duration\") {\n item.start_date = decreaseStartDate(item);\n } else if (mapTo == \"start_date\") {\n item.duration = gantt.calculateDuration(item);\n }\n } else {\n if (mapTo == \"start_date\" || mapTo == \"duration\") {\n item.end_date = gantt.calculateEndDate(item);\n } else if (mapTo == \"end_date\") {\n item.duration = gantt.calculateDuration(item);\n }\n }\n }\n\n function decreaseStartDate(item) {\n return gantt.calculateEndDate({\n start_date: item.end_date,\n duration: -item.duration,\n task: item\n });\n }\n};","module.exports = function (gantt) {\n var BaseEditor = require(\"./base\")(gantt),\n utils = require(\"../../../../../utils/utils\");\n\n var __extends = require(\"../../../../../utils/extends\");\n\n function TextEditor() {\n var self = BaseEditor.apply(this, arguments) || this;\n return self;\n }\n\n __extends(TextEditor, BaseEditor);\n\n function getFormatter(config) {\n return config.formatter || gantt.ext.formatters.durationFormatter();\n }\n\n utils.mixin(TextEditor.prototype, {\n show: function show(id, column, config, placeholder) {\n var html = \"<div role='cell'><input type='text' name='\".concat(column.name, \"' title='\").concat(column.name, \"'></div>\");\n placeholder.innerHTML = html;\n },\n set_value: function set_value(value, id, column, node) {\n this.get_input(node).value = getFormatter(column.editor).format(value);\n },\n get_value: function get_value(id, column, node) {\n return getFormatter(column.editor).parse(this.get_input(node).value || \"\");\n }\n }, true);\n return TextEditor;\n};","module.exports = function (gantt) {\n var BaseEditor = require(\"./base\")(gantt),\n utils = require(\"../../../../../utils/utils\");\n\n var __extends = require(\"../../../../../utils/extends\");\n\n function PredecessorEditor() {\n var self = BaseEditor.apply(this, arguments) || this;\n return self;\n }\n\n __extends(PredecessorEditor, BaseEditor);\n\n function getFormatter(config) {\n return config.formatter || gantt.ext.formatters.linkFormatter();\n }\n\n function parseInputString(value, config) {\n var predecessors = (value || \"\").split(config.delimiter || \",\");\n\n for (var i = 0; i < predecessors.length; i++) {\n var val = predecessors[i].trim();\n\n if (val) {\n predecessors[i] = val;\n } else {\n predecessors.splice(i, 1);\n i--;\n }\n }\n\n predecessors.sort();\n return predecessors;\n }\n\n function formatPredecessors(task, config, gantt) {\n var links = task.$target;\n var labels = [];\n\n for (var i = 0; i < links.length; i++) {\n var link = gantt.getLink(links[i]);\n labels.push(getFormatter(config).format(link));\n }\n\n return labels.join((config.delimiter || \",\") + \" \");\n }\n\n function getSelectedLinks(taskId, predecessorCodes, config) {\n var links = [];\n predecessorCodes.forEach(function (code) {\n var link = getFormatter(config).parse(code);\n\n if (link) {\n link.target = taskId; // GS-1290 A way to preserve the link. Otherwise validation will return false\n // because the existing link ID is not passed there\n\n link.id = \"predecessor_generated\";\n\n if (gantt.isLinkAllowed(link)) {\n link.id = undefined;\n links.push(link);\n }\n }\n });\n return links;\n }\n\n function formatLinkKey(link) {\n return link.source + \"_\" + link.target + \"_\" + link.type + \"_\" + (link.lag || 0);\n }\n\n function getLinksDiff(task, predecessorCodes, config) {\n var selectedLinks = getSelectedLinks(task.id, predecessorCodes, config);\n var existingLinksSearch = {};\n task.$target.forEach(function (linkId) {\n var link = gantt.getLink(linkId);\n existingLinksSearch[formatLinkKey(link)] = link.id;\n });\n var linksToAdd = [];\n selectedLinks.forEach(function (link) {\n var linkKey = formatLinkKey(link);\n\n if (!existingLinksSearch[linkKey]) {\n linksToAdd.push(link);\n } else {\n delete existingLinksSearch[linkKey];\n }\n });\n var linksToDelete = [];\n\n for (var i in existingLinksSearch) {\n linksToDelete.push(existingLinksSearch[i]);\n }\n\n return {\n add: linksToAdd,\n remove: linksToDelete\n };\n }\n\n utils.mixin(PredecessorEditor.prototype, {\n show: function show(id, column, config, placeholder) {\n var html = \"<div role='cell'><input type='text' name='\".concat(column.name, \"' title='\").concat(column.name, \"'></div>\");\n placeholder.innerHTML = html;\n },\n hide: function hide() {},\n set_value: function set_value(value, id, column, node) {\n this.get_input(node).value = formatPredecessors(value, column.editor, gantt);\n },\n get_value: function get_value(id, column, node) {\n return parseInputString(this.get_input(node).value || \"\", column.editor);\n },\n save: function save(id, column, node) {\n var task = gantt.getTask(id);\n var linksDiff = getLinksDiff(task, this.get_value(id, column, node), column.editor);\n\n if (linksDiff.add.length || linksDiff.remove.length) {\n gantt.batchUpdate(function () {\n linksDiff.add.forEach(function (link) {\n gantt.addLink(link);\n });\n linksDiff.remove.forEach(function (linkId) {\n gantt.deleteLink(linkId);\n });\n if (gantt.autoSchedule) gantt.autoSchedule();\n });\n }\n },\n is_changed: function is_changed(value, id, column, node) {\n var inputPredecessors = this.get_value(id, column, node);\n var taskPredecessors = parseInputString(formatPredecessors(value, column.editor, gantt), column.editor);\n return inputPredecessors.join() !== taskPredecessors.join();\n }\n }, true);\n return PredecessorEditor;\n};","module.exports = function (gantt) {\n var BaseEditor = require(\"./base\")(gantt),\n utils = require(\"../../../../../utils/utils\");\n\n var __extends = require(\"../../../../../utils/extends\");\n\n var html5DateFormat = \"%Y-%m-%d\";\n var dateToStr = null;\n var strToDate = null;\n\n function init() {\n if (!dateToStr) {\n dateToStr = gantt.date.date_to_str(html5DateFormat);\n }\n\n if (!strToDate) {\n strToDate = gantt.date.str_to_date(html5DateFormat);\n }\n }\n\n function DateEditor() {\n var self = BaseEditor.apply(this, arguments) || this;\n return self;\n }\n\n __extends(DateEditor, BaseEditor);\n\n utils.mixin(DateEditor.prototype, {\n show: function show(id, column, config, placeholder) {\n init();\n var minValue = null;\n var maxValue = null;\n\n if (typeof config.min === \"function\") {\n minValue = config.min(id, column);\n } else {\n minValue = config.min;\n }\n\n if (typeof config.max === \"function\") {\n maxValue = config.max(id, column);\n } else {\n maxValue = config.max;\n }\n\n var minAttr = minValue ? \" min='\" + dateToStr(minValue) + \"' \" : \"\";\n var maxAttr = maxValue ? \" max='\" + dateToStr(maxValue) + \"' \" : \"\";\n var html = \"<div style='width:140px' role='cell'><input type='date' \".concat(minAttr, \" \").concat(maxAttr, \" name='\").concat(column.name, \"' title='\").concat(column.name, \"'></div>\");\n placeholder.innerHTML = html;\n },\n set_value: function set_value(value, id, column, node) {\n if (value && value.getFullYear) {\n this.get_input(node).value = dateToStr(value);\n } else {\n this.get_input(node).value = value;\n }\n },\n is_valid: function is_valid(value, id, column, node) {\n if (!value || isNaN(value.getTime())) return false;\n return true;\n },\n get_value: function get_value(id, column, node) {\n var parsed;\n\n try {\n parsed = strToDate(this.get_input(node).value || \"\");\n } catch (e) {\n parsed = null; // return null will cancel changes\n }\n\n return parsed;\n }\n }, true);\n return DateEditor;\n};","module.exports = function (gantt) {\n var BaseEditor = require(\"./base\")(gantt),\n utils = require(\"../../../../../utils/utils\");\n\n var __extends = require(\"../../../../../utils/extends\");\n\n function SelectEditor() {\n var self = BaseEditor.apply(this, arguments) || this;\n return self;\n }\n\n __extends(SelectEditor, BaseEditor);\n\n utils.mixin(SelectEditor.prototype, {\n show: function show(id, column, config, placeholder) {\n var html = \"<div role='cell'><select name='\".concat(column.name, \"' title='\").concat(column.name, \"'>\");\n var optionsHtml = [],\n options = config.options || [];\n\n for (var i = 0; i < options.length; i++) {\n optionsHtml.push(\"<option value='\" + config.options[i].key + \"'>\" + options[i].label + \"</option>\");\n }\n\n html += optionsHtml.join(\"\") + \"</select></div>\";\n placeholder.innerHTML = html;\n },\n get_input: function get_input(node) {\n return node.querySelector(\"select\");\n }\n }, true);\n return SelectEditor;\n};","module.exports = function (gantt) {\n var BaseEditor = require(\"./base\")(gantt),\n utils = require(\"../../../../../utils/utils\");\n\n var __extends = require(\"../../../../../utils/extends\");\n\n function NumberEditor() {\n var self = BaseEditor.apply(this, arguments) || this;\n return self;\n }\n\n __extends(NumberEditor, BaseEditor);\n\n utils.mixin(NumberEditor.prototype, {\n show: function show(id, column, config, placeholder) {\n var min = config.min || 0,\n max = config.max || 100;\n var html = \"<div role='cell'><input type='number' min='\".concat(min, \"' max='\").concat(max, \"' name='\").concat(column.name, \"' title='\").concat(column.name, \"'></div>\");\n placeholder.innerHTML = html;\n },\n get_value: function get_value(id, column, node) {\n return this.get_input(node).value || \"\";\n },\n is_valid: function is_valid(value, id, column, node) {\n return !isNaN(parseInt(value, 10));\n }\n }, true);\n return NumberEditor;\n};","module.exports = function (gantt) {\n var BaseEditor = require(\"./base\")(gantt),\n utils = require(\"../../../../../utils/utils\");\n\n var __extends = require(\"../../../../../utils/extends\");\n\n function TextEditor() {\n var self = BaseEditor.apply(this, arguments) || this;\n return self;\n }\n\n __extends(TextEditor, BaseEditor);\n\n utils.mixin(TextEditor.prototype, {\n show: function show(id, column, config, placeholder) {\n var html = \"<div role='cell'><input type='text' name='\".concat(column.name, \"' title='\").concat(column.name, \"'></div>\");\n placeholder.innerHTML = html;\n }\n }, true);\n return TextEditor;\n};","module.exports = {\n init: function init(controller, grid) {\n var self = controller;\n var gantt = grid.$gantt;\n var onBlurDelay = null;\n var keyNav = gantt.ext.keyboardNavigation;\n keyNav.attachEvent(\"onBeforeFocus\", function (node) {\n var activeCell = controller.locateCell(node);\n clearTimeout(onBlurDelay);\n\n if (activeCell) {\n var columnName = activeCell.columnName;\n var id = activeCell.id;\n var editorState = self.getState();\n\n if (self.isVisible()) {\n if (editorState.id == id && editorState.columnName === columnName) {\n return false;\n }\n }\n }\n\n return true;\n });\n keyNav.attachEvent(\"onFocus\", function (node) {\n var activeCell = controller.locateCell(node);\n var state = controller.getState();\n clearTimeout(onBlurDelay);\n\n if (activeCell && !(activeCell.id == state.id && activeCell.columnName == state.columnName)) {\n if (self.isVisible()) {\n self.save();\n }\n }\n\n return true;\n });\n controller.attachEvent(\"onHide\", function () {\n clearTimeout(onBlurDelay);\n });\n keyNav.attachEvent(\"onBlur\", function () {\n onBlurDelay = setTimeout(function () {\n self.save();\n });\n return true;\n });\n gantt.attachEvent(\"onTaskDblClick\", function (id, e) {\n // block lightbox on double click inside editor\n var state = controller.getState();\n var cell = controller.locateCell(e.target);\n\n if (cell && controller.isVisible() && cell.columnName == state.columnName) {\n return false;\n }\n\n return true;\n });\n gantt.attachEvent(\"onTaskClick\", function (id, e) {\n if (gantt._is_icon_open_click(e)) return true;\n var state = controller.getState();\n var cell = controller.locateCell(e.target);\n\n if (cell && controller.getEditorConfig(cell.columnName)) {\n if (controller.isVisible() && state.id == cell.id && state.columnName == cell.columnName) {// do nothing if editor is already active in this cell\n } else {\n controller.startEdit(cell.id, cell.columnName);\n }\n\n return false;\n }\n\n return true;\n });\n gantt.attachEvent(\"onEmptyClick\", function () {\n self.save();\n return true;\n });\n keyNav.attachEvent(\"onKeyDown\", function (command, e) {\n var activeCell = controller.locateCell(e.target);\n var hasEditor = activeCell ? controller.getEditorConfig(activeCell.columnName) : false;\n var state = controller.getState();\n var keyboard = gantt.constants.KEY_CODES;\n var keyCode = e.keyCode;\n var preventKeyNav = false;\n\n switch (keyCode) {\n case keyboard.ENTER:\n if (controller.isVisible()) {\n controller.save();\n e.preventDefault();\n preventKeyNav = true;\n } else if (hasEditor && !(e.ctrlKey || e.metaKey || e.shiftKey)) {\n self.startEdit(activeCell.id, activeCell.columnName);\n e.preventDefault();\n preventKeyNav = true;\n }\n\n break;\n\n case keyboard.ESC:\n if (controller.isVisible()) {\n controller.hide();\n e.preventDefault();\n preventKeyNav = true;\n }\n\n break;\n\n case keyboard.UP:\n case keyboard.DOWN:\n break;\n\n case keyboard.LEFT:\n case keyboard.RIGHT:\n if (hasEditor && controller.isVisible() || state.editorType === \"date\") {\n preventKeyNav = true;\n }\n\n break;\n\n case keyboard.SPACE:\n if (controller.isVisible()) {\n preventKeyNav = true;\n }\n\n if (hasEditor && !controller.isVisible()) {\n self.startEdit(activeCell.id, activeCell.columnName);\n e.preventDefault();\n preventKeyNav = true;\n }\n\n break;\n\n case keyboard.DELETE:\n if (hasEditor && !controller.isVisible()) {\n self.startEdit(activeCell.id, activeCell.columnName);\n preventKeyNav = true;\n } else if (hasEditor && controller.isVisible()) {\n preventKeyNav = true;\n }\n\n break;\n\n case keyboard.TAB:\n if (controller.isVisible()) {\n if (e.shiftKey) {\n controller.editPrevCell(true);\n } else {\n controller.editNextCell(true);\n }\n\n var newState = controller.getState();\n\n if (newState.id) {\n keyNav.focus({\n type: \"taskCell\",\n id: newState.id,\n column: newState.columnName\n });\n }\n\n e.preventDefault();\n preventKeyNav = true;\n }\n\n break;\n\n default:\n if (controller.isVisible()) preventKeyNav = true;else {\n // start editing on character key\n if (keyCode >= 48 && keyCode <= 57 || // [0-9]\n keyCode > 95 && keyCode < 112 || // numpad\n keyCode >= 64 && keyCode <= 91 || // [a-z]\n keyCode > 185 && keyCode < 193 || //;=-,etc\n keyCode > 218 && keyCode < 223) {\n var modifiers = command.modifiers;\n var anyModifier = modifiers.alt || modifiers.ctrl || modifiers.meta || modifiers.shift;\n\n if (modifiers.alt) {// don't start editing on alt+key\n } else if (anyModifier && keyNav.getCommandHandler(command, \"taskCell\")) {// don't start editing if command already have a keyboard shortcut\n } else if (hasEditor && !controller.isVisible()) {\n self.startEdit(activeCell.id, activeCell.columnName);\n preventKeyNav = true;\n }\n }\n }\n break;\n }\n\n if (preventKeyNav) {\n return false;\n } else {\n return true;\n }\n });\n },\n onShow: function onShow(controller, placeholder, grid) {},\n onHide: function onHide(controller, placeholder, grid) {\n var gantt = grid.$gantt;\n gantt.focus();\n },\n destroy: function destroy() {}\n};","module.exports = {\n init: function init(controller, grid) {\n var gantt = grid.$gantt;\n gantt.attachEvent(\"onTaskClick\", function (id, e) {\n if (gantt._is_icon_open_click(e)) return true;\n var state = controller.getState();\n var cell = controller.locateCell(e.target);\n\n if (cell && controller.getEditorConfig(cell.columnName)) {\n if (controller.isVisible() && state.id == cell.id && state.columnName == cell.columnName) {// do nothing if editor is already active in this cell\n } else {\n controller.startEdit(cell.id, cell.columnName);\n }\n\n return false;\n }\n\n return true;\n });\n gantt.attachEvent(\"onEmptyClick\", function () {\n if (controller.isVisible() && controller.isChanged()) {\n controller.save();\n } else {\n controller.hide();\n }\n\n return true;\n });\n gantt.attachEvent(\"onTaskDblClick\", function (id, e) {\n var state = controller.getState();\n var cell = controller.locateCell(e.target);\n\n if (cell && controller.isVisible() && cell.columnName == state.columnName) {\n //GS-933 probably, we don't need to hide the inline editor because the lightbox cannot be opened if you double-click on an inline editor\n //remove this code later if people don't complain\n //controller.hide();\n return false;\n }\n\n return true;\n });\n },\n onShow: function onShow(controller, placeholder, grid) {\n var gantt = grid.$gantt;\n\n if (gantt.ext && gantt.ext.keyboardNavigation) {\n var keyNav = gantt.ext.keyboardNavigation;\n keyNav.attachEvent(\"onKeyDown\", function (command, e) {\n var keyboard = gantt.constants.KEY_CODES;\n var keyCode = e.keyCode;\n var preventKeyNav = false;\n\n switch (keyCode) {\n case keyboard.SPACE:\n if (controller.isVisible()) {\n preventKeyNav = true;\n }\n\n break;\n }\n\n if (preventKeyNav) {\n return false;\n } else {\n return true;\n }\n });\n }\n\n placeholder.onkeydown = function (e) {\n e = e || window.event;\n var keyboard = gantt.constants.KEY_CODES;\n\n if (e.defaultPrevented || e.shiftKey && e.keyCode != keyboard.TAB) {\n return;\n }\n\n var shouldPrevent = true;\n\n switch (e.keyCode) {\n case gantt.keys.edit_save:\n controller.save();\n break;\n\n case gantt.keys.edit_cancel:\n controller.hide();\n break;\n\n case keyboard.UP:\n case keyboard.DOWN:\n if (controller.isVisible()) {\n controller.hide();\n shouldPrevent = false;\n }\n\n break;\n\n case keyboard.TAB:\n if (e.shiftKey) {\n controller.editPrevCell(true);\n } else {\n controller.editNextCell(true);\n }\n\n break;\n\n default:\n shouldPrevent = false;\n break;\n }\n\n if (shouldPrevent) {\n e.preventDefault();\n }\n };\n },\n onHide: function onHide() {},\n destroy: function destroy() {}\n};","var defaultMapping = require(\"./keyboard_mappings/default\");\n\nvar keyNavMappings = require(\"./keyboard_mappings/keyboard_navigation\");\n\nmodule.exports = function (gantt) {\n var mapping = null;\n return {\n setMapping: function setMapping(map) {\n mapping = map;\n },\n getMapping: function getMapping() {\n if (mapping) {\n return mapping;\n } else if (gantt.config.keyboard_navigation_cells && gantt.ext.keyboardNavigation) {\n return keyNavMappings;\n } else {\n return defaultMapping;\n }\n }\n };\n};","var getKeyboardMapping = require(\"./keyboard_mappings\");\n\nvar textEditorFactory = require(\"./editors/text\"),\n numberEditorFactory = require(\"./editors/number\"),\n selectEditorFactory = require(\"./editors/select\"),\n dateEditorFactory = require(\"./editors/date\"),\n predecessorEditorFactory = require(\"./editors/predecessor\"),\n durationEditorFactory = require(\"./editors/duration\");\n\nvar utils = require(\"../../../../utils/utils\");\n\nvar domHelpers = require(\"../../utils/dom_helpers\");\n\nvar eventable = require(\"../../../../utils/eventable\");\n\nvar linkedPropertiesProcessor = require(\"./linked_properties\");\n\nfunction initConfigs(gantt) {\n gantt.config.editor_types = {\n text: new (textEditorFactory(gantt))(),\n number: new (numberEditorFactory(gantt))(),\n select: new (selectEditorFactory(gantt))(),\n date: new (dateEditorFactory(gantt))(),\n predecessor: new (predecessorEditorFactory(gantt))(),\n duration: new (durationEditorFactory(gantt))()\n };\n}\n\nfunction create(gantt) {\n var keyboardMapping = getKeyboardMapping(gantt);\n var eventBus = {};\n eventable(eventBus);\n\n function createGridEditors(grid) {\n function _getGridCellFromNode(node) {\n if (!domHelpers.isChildOf(node, grid.$grid)) {\n return null;\n }\n\n var row = domHelpers.locateAttribute(node, grid.$config.item_attribute);\n var cell = domHelpers.locateAttribute(node, \"data-column-name\");\n\n if (row && cell) {\n var columnName = cell.getAttribute(\"data-column-name\");\n var id = row.getAttribute(grid.$config.item_attribute);\n return {\n id: id,\n columnName: columnName\n };\n }\n\n return null;\n }\n\n function _getEditorPosition(itemId, columnName) {\n var config = grid.$getConfig();\n var top = grid.getItemTop(itemId);\n var height = grid.getItemHeight(itemId);\n var cols = grid.getGridColumns();\n var left = 0,\n right = 0,\n width = 0;\n\n for (var i = 0; i < cols.length; i++) {\n if (cols[i].name == columnName) {\n width = cols[i].width;\n break;\n }\n\n if (config.rtl) {\n right += cols[i].width;\n } else {\n left += cols[i].width;\n }\n }\n\n if (config.rtl) {\n return {\n top: top,\n right: right,\n height: height,\n width: width\n };\n } else {\n return {\n top: top,\n left: left,\n height: height,\n width: width\n };\n }\n }\n\n function findVisibleIndex(grid, columnName) {\n var columns = grid.getGridColumns();\n\n for (var i = 0; i < columns.length; i++) {\n if (columns[i].name == columnName) {\n return i;\n }\n }\n\n return 0;\n }\n\n function _createPlaceholder(itemId, columnName) {\n var config = grid.$getConfig();\n\n var pos = _getEditorPosition(itemId, columnName);\n\n var el = document.createElement(\"div\");\n el.className = \"gantt_grid_editor_placeholder\";\n el.setAttribute(grid.$config.item_attribute, itemId);\n el.setAttribute(grid.$config.bind + \"_id\", itemId); // for backward compatibility\n\n el.setAttribute(\"data-column-name\", columnName);\n var visibleIndex = findVisibleIndex(grid, columnName);\n el.setAttribute(\"data-column-index\", visibleIndex);\n\n gantt._waiAria.inlineEditorAttr(el);\n\n if (config.rtl) {\n el.style.cssText = [\"top:\" + pos.top + \"px\", \"right:\" + pos.right + \"px\", \"width:\" + pos.width + \"px\", \"height:\" + pos.height + \"px\"].join(\";\");\n } else {\n el.style.cssText = [\"top:\" + pos.top + \"px\", \"left:\" + pos.left + \"px\", \"width:\" + pos.width + \"px\", \"height:\" + pos.height + \"px\"].join(\";\");\n }\n\n return el;\n }\n\n var updateTaskDateProperties = linkedPropertiesProcessor(gantt);\n var handlers = [];\n var ganttHandlers = [];\n var store = null;\n var controller = {\n _itemId: null,\n _columnName: null,\n _editor: null,\n _editorType: null,\n _placeholder: null,\n locateCell: _getGridCellFromNode,\n getEditorConfig: function getEditorConfig(columnName) {\n var column = grid.getColumn(columnName);\n return column.editor;\n },\n init: function init() {\n var mapping = keyboardMapping.getMapping();\n\n if (mapping.init) {\n mapping.init(this, grid);\n }\n\n store = grid.$gantt.getDatastore(grid.$config.bind);\n var self = this;\n handlers.push(store.attachEvent(\"onIdChange\", function (oldId, newId) {\n if (self._itemId == oldId) {\n self._itemId = newId;\n }\n }));\n handlers.push(store.attachEvent(\"onStoreUpdated\", function () {\n if (grid.$gantt.getState(\"batchUpdate\").batch_update) {\n return;\n }\n\n if (self.isVisible() && !store.isVisible(self._itemId)) {\n self.hide();\n }\n }));\n ganttHandlers.push(gantt.attachEvent(\"onDataRender\", function () {\n if (self._editor && self._placeholder && !domHelpers.isChildOf(self._placeholder, gantt.$root)) {\n grid.$grid_data.appendChild(self._placeholder);\n }\n }));\n\n this.init = function () {};\n },\n getState: function getState() {\n return {\n editor: this._editor,\n editorType: this._editorType,\n placeholder: this._placeholder,\n id: this._itemId,\n columnName: this._columnName\n };\n },\n startEdit: function startEdit(itemId, columnName) {\n if (this.isVisible()) {\n this.save();\n }\n\n if (!store.exists(itemId)) {\n return;\n }\n\n var editorState = {\n id: itemId,\n columnName: columnName\n };\n\n if (gantt.isReadonly(store.getItem(itemId))) {\n this.callEvent(\"onEditPrevent\", [editorState]);\n return;\n }\n\n if (this.callEvent(\"onBeforeEditStart\", [editorState]) === false) {\n this.callEvent(\"onEditPrevent\", [editorState]);\n return;\n }\n\n this.show(editorState.id, editorState.columnName);\n this.setValue();\n this.callEvent(\"onEditStart\", [editorState]);\n },\n isVisible: function isVisible() {\n return !!(this._editor && domHelpers.isChildOf(this._placeholder, gantt.$root));\n },\n show: function show(itemId, columnName) {\n if (this.isVisible()) {\n this.save();\n }\n\n var editorState = {\n id: itemId,\n columnName: columnName\n };\n var column = grid.getColumn(editorState.columnName);\n var editorConfig = this.getEditorConfig(column.name);\n if (!editorConfig) return;\n var editor = grid.$getConfig().editor_types[editorConfig.type];\n\n var placeholder = _createPlaceholder(editorState.id, editorState.columnName);\n\n grid.$grid_data.appendChild(placeholder);\n editor.show(editorState.id, column, editorConfig, placeholder);\n this._editor = editor;\n this._placeholder = placeholder;\n this._itemId = editorState.id;\n this._columnName = editorState.columnName;\n this._editorType = editorConfig.type;\n var mapping = keyboardMapping.getMapping();\n\n if (mapping.onShow) {\n mapping.onShow(this, placeholder, grid);\n }\n },\n setValue: function setValue() {\n var state = this.getState();\n var itemId = state.id,\n columnName = state.columnName;\n var column = grid.getColumn(columnName);\n var item = store.getItem(itemId);\n var editorConfig = this.getEditorConfig(columnName);\n if (!editorConfig) return;\n var value = item[editorConfig.map_to];\n\n if (editorConfig.map_to == \"auto\") {\n value = store.getItem(itemId);\n }\n\n this._editor.set_value(value, itemId, column, this._placeholder);\n\n this.focus();\n },\n focus: function focus() {\n this._editor.focus(this._placeholder);\n },\n getValue: function getValue() {\n var column = grid.getColumn(this._columnName);\n return this._editor.get_value(this._itemId, column, this._placeholder);\n },\n _getItemValue: function _getItemValue() {\n var editorConfig = this.getEditorConfig(this._columnName);\n if (!editorConfig) return;\n var item = gantt.getTask(this._itemId);\n var value = item[editorConfig.map_to];\n\n if (editorConfig.map_to == \"auto\") {\n value = store.getItem(this._itemId);\n }\n\n return value;\n },\n isChanged: function isChanged() {\n var column = grid.getColumn(this._columnName);\n\n var value = this._getItemValue();\n\n return this._editor.is_changed(value, this._itemId, column, this._placeholder);\n },\n hide: function hide() {\n if (!this._itemId) return;\n var itemId = this._itemId,\n columnName = this._columnName;\n var mapping = keyboardMapping.getMapping();\n\n if (mapping.onHide) {\n mapping.onHide(this, this._placeholder, grid);\n }\n\n this._itemId = null;\n this._columnName = null;\n this._editorType = null;\n if (!this._placeholder) return;\n\n if (this._editor && this._editor.hide) {\n this._editor.hide(this._placeholder);\n }\n\n this._editor = null;\n\n if (this._placeholder.parentNode) {\n this._placeholder.parentNode.removeChild(this._placeholder);\n }\n\n this._placeholder = null;\n this.callEvent(\"onEditEnd\", [{\n id: itemId,\n columnName: columnName\n }]);\n },\n save: function save() {\n if (!(this.isVisible() && store.exists(this._itemId) && this.isChanged())) {\n this.hide();\n return;\n }\n\n var itemId = this._itemId,\n columnName = this._columnName;\n\n if (!store.exists(itemId)) {\n return;\n }\n\n var item = store.getItem(itemId);\n var editorConfig = this.getEditorConfig(columnName);\n var editorState = {\n id: itemId,\n columnName: columnName,\n newValue: this.getValue(),\n oldValue: this._getItemValue()\n };\n\n if (this.callEvent(\"onBeforeSave\", [editorState]) !== false) {\n if (!this._editor.is_valid || this._editor.is_valid(editorState.newValue, editorState.id, grid.getColumn(columnName), this._placeholder)) {\n var mapTo = editorConfig.map_to;\n var value = editorState.newValue;\n\n if (mapTo != \"auto\") {\n item[mapTo] = value;\n updateTaskDateProperties(item, mapTo, gantt.config.inline_editors_date_processing);\n store.updateItem(itemId);\n } else {\n this._editor.save(itemId, grid.getColumn(columnName), this._placeholder);\n }\n\n this.callEvent(\"onSave\", [editorState]);\n }\n }\n\n this.hide();\n },\n _findEditableCell: function findEditableCell(start, direction) {\n var nextIndex = start;\n var columns = grid.getGridColumns();\n var nextColumn = columns[nextIndex];\n var columnName = nextColumn ? nextColumn.name : null;\n\n if (columnName) {\n while (columnName && !this.getEditorConfig(columnName)) {\n columnName = this._findEditableCell(start + direction, direction);\n }\n\n return columnName;\n }\n\n return null;\n },\n getNextCell: function moveCell(dir) {\n // GS-1257. true means to exclude hidden columns\n return this._findEditableCell(grid.getColumnIndex(this._columnName, true) + dir, dir);\n },\n getFirstCell: function getFirstCell() {\n return this._findEditableCell(0, 1);\n },\n getLastCell: function getLastCell() {\n return this._findEditableCell(grid.getGridColumns().length - 1, -1);\n },\n editNextCell: function nextCell(canChangeRow) {\n var cell = this.getNextCell(1);\n\n if (cell) {\n var nextColumn = this.getNextCell(1);\n\n if (nextColumn && this.getEditorConfig(nextColumn)) {\n this.startEdit(this._itemId, nextColumn);\n }\n } else if (canChangeRow && this.moveRow(1)) {\n var task = this.moveRow(1);\n cell = this.getFirstCell();\n\n if (cell && this.getEditorConfig(cell)) {\n this.startEdit(task, cell);\n }\n }\n },\n editPrevCell: function prevCell(canChangeRow) {\n var cell = this.getNextCell(-1);\n\n if (cell) {\n var nextColumn = this.getNextCell(-1);\n\n if (nextColumn && this.getEditorConfig(nextColumn)) {\n this.startEdit(this._itemId, nextColumn);\n }\n } else if (canChangeRow && this.moveRow(-1)) {\n var task = this.moveRow(-1);\n cell = this.getLastCell();\n\n if (cell && this.getEditorConfig(cell)) {\n this.startEdit(task, cell);\n }\n }\n },\n moveRow: function moveRow(dir) {\n var moveTask = dir > 0 ? gantt.getNext : gantt.getPrev;\n moveTask = gantt.bind(moveTask, gantt);\n var nextItem = moveTask(this._itemId); // skip readonly rows\n\n while (gantt.isTaskExists(nextItem) && gantt.isReadonly(gantt.getTask(nextItem))) {\n nextItem = moveTask(nextItem);\n }\n\n return nextItem;\n },\n editNextRow: function nextRow(skipReadonly) {\n var id = this.getState().id;\n if (!gantt.isTaskExists(id)) return;\n var next = null;\n\n if (skipReadonly) {\n next = this.moveRow(1);\n } else {\n next = gantt.getNext(id);\n }\n\n if (gantt.isTaskExists(next)) {\n this.startEdit(next, this._columnName);\n }\n },\n editPrevRow: function prevRow(skipReadonly) {\n var id = this.getState().id;\n if (!gantt.isTaskExists(id)) return;\n var prev = null;\n\n if (skipReadonly) {\n prev = this.moveRow(-1);\n } else {\n prev = gantt.getPrev(id);\n }\n\n if (gantt.isTaskExists(prev)) {\n this.startEdit(prev, this._columnName);\n }\n },\n destructor: function destructor() {\n handlers.forEach(function (handlerId) {\n store.detachEvent(handlerId);\n });\n ganttHandlers.forEach(function (handlerId) {\n gantt.detachEvent(handlerId);\n });\n handlers = [];\n ganttHandlers = [];\n store = null;\n this.hide();\n this.detachAllEvents();\n }\n };\n utils.mixin(controller, keyboardMapping);\n utils.mixin(controller, eventBus);\n return controller;\n }\n\n var inlineEditController = {\n init: initConfigs,\n createEditors: createGridEditors\n };\n utils.mixin(inlineEditController, keyboardMapping);\n utils.mixin(inlineEditController, eventBus);\n return inlineEditController;\n}\n\nmodule.exports = create;","var createStaticBgHelper = function createStaticBgHelper() {\n return {\n render: function render() {},\n destroy: function destroy() {}\n };\n};\n\nmodule.exports = {\n create: function create() {\n return createStaticBgHelper();\n }\n};","var __extends = require(\"../../../utils/extends\"),\n domHelpers = require(\"../utils/dom_helpers\"),\n utils = require(\"../../../utils/utils\"),\n env = require(\"../../../utils/env\"),\n Cell = require(\"./cell\");\n\nvar ScrollbarCell = function (_super) {\n \"use strict\";\n\n var SCROLL_MODIFIER_KEYS = [\"altKey\", \"shiftKey\", \"metaKey\"]; // it's no way to disable ctrl+wheel\n\n __extends(ScrollbarCell, _super);\n\n function ScrollbarCell(parent, config, factory, gantt) {\n var _this = _super.apply(this, arguments) || this;\n\n this.$config = utils.mixin(config, {\n scroll: \"x\"\n });\n _this._scrollHorizontalHandler = utils.bind(_this._scrollHorizontalHandler, _this);\n _this._scrollVerticalHandler = utils.bind(_this._scrollVerticalHandler, _this);\n _this._outerScrollVerticalHandler = utils.bind(_this._outerScrollVerticalHandler, _this);\n _this._outerScrollHorizontalHandler = utils.bind(_this._outerScrollHorizontalHandler, _this);\n _this._mouseWheelHandler = utils.bind(_this._mouseWheelHandler, _this);\n this.$config.hidden = true;\n var size = gantt.config.scroll_size;\n\n if (gantt.env.isIE) {\n // full element height/width must be bigger than just a browser scrollbar,\n // otherwise the scrollbar element won't be scrolled on click\n size += 1;\n }\n\n if (this._isHorizontal()) {\n _this.$config.height = size;\n _this.$parent.$config.height = size;\n } else {\n _this.$config.width = size;\n _this.$parent.$config.width = size;\n }\n\n this.$config.scrollPosition = 0;\n _this.$name = \"scroller\";\n return _this;\n }\n\n ScrollbarCell.prototype.init = function (container) {\n container.innerHTML = this.$toHTML();\n this.$view = container.firstChild;\n\n if (!this.$view) {\n this.init();\n }\n\n if (this._isVertical()) {\n this._initVertical();\n } else {\n this._initHorizontal();\n }\n\n this._initMouseWheel();\n\n this._initLinkedViews();\n };\n\n ScrollbarCell.prototype.$toHTML = function () {\n var className = this._isHorizontal() ? \"gantt_hor_scroll\" : \"gantt_ver_scroll\";\n return \"<div class='gantt_layout_cell \" + className + \"'><div style='\" + (this._isHorizontal() ? \"width:2000px\" : \"height:2000px\") + \"'></div></div>\";\n };\n\n ScrollbarCell.prototype._getRootParent = function () {\n var parent = this.$parent;\n\n while (parent && parent.$parent) {\n parent = parent.$parent;\n }\n\n if (parent) {\n return parent;\n }\n };\n\n function eachCell(root, res) {\n res.push(root);\n\n if (root.$cells) {\n for (var i = 0; i < root.$cells.length; i++) {\n eachCell(root.$cells[i], res);\n }\n }\n }\n\n ScrollbarCell.prototype._eachView = function () {\n var res = [];\n eachCell(this._getRootParent(), res);\n return res;\n };\n\n ScrollbarCell.prototype._getLinkedViews = function () {\n var views = this._eachView();\n\n var res = [];\n\n for (var i = 0; i < views.length; i++) {\n if (views[i].$config && (this._isVertical() && views[i].$config.scrollY == this.$id || this._isHorizontal() && views[i].$config.scrollX == this.$id)) {\n res.push(views[i]);\n }\n }\n\n return res;\n };\n\n ScrollbarCell.prototype._initHorizontal = function () {\n this.$scroll_hor = this.$view;\n this.$domEvents.attach(this.$view, \"scroll\", this._scrollHorizontalHandler);\n };\n\n ScrollbarCell.prototype._initLinkedViews = function () {\n var views = this._getLinkedViews();\n\n var css = this._isVertical() ? \"gantt_layout_outer_scroll gantt_layout_outer_scroll_vertical\" : \"gantt_layout_outer_scroll gantt_layout_outer_scroll_horizontal\";\n\n for (var i = 0; i < views.length; i++) {\n //views[i].$config.css = [views[i].$config.css || \"\", css].join(\" \");\n domHelpers.addClassName(views[i].$view || views[i].getNode(), css);\n }\n };\n\n ScrollbarCell.prototype._initVertical = function () {\n this.$scroll_ver = this.$view;\n this.$domEvents.attach(this.$view, \"scroll\", this._scrollVerticalHandler);\n };\n\n ScrollbarCell.prototype._updateLinkedViews = function () {};\n\n ScrollbarCell.prototype._initMouseWheel = function () {\n var ff = env.isFF;\n if (ff) this.$domEvents.attach(this._getRootParent().$view, \"wheel\", this._mouseWheelHandler, {\n passive: false\n });else this.$domEvents.attach(this._getRootParent().$view, \"mousewheel\", this._mouseWheelHandler, {\n passive: false\n });\n };\n\n ScrollbarCell.prototype.scrollHorizontally = function (left) {\n if (this._scrolling) return;\n this._scrolling = true;\n this.$scroll_hor.scrollLeft = left;\n this.$config.codeScrollLeft = left;\n left = this.$scroll_hor.scrollLeft;\n\n var views = this._getLinkedViews();\n\n for (var i = 0; i < views.length; i++) {\n if (views[i].scrollTo) {\n views[i].scrollTo(left, undefined);\n }\n }\n\n var oldSize = this.$config.scrollPosition;\n this.$config.scrollPosition = left;\n this.callEvent(\"onScroll\", [oldSize, left, this.$config.scroll]);\n this._scrolling = false;\n };\n\n ScrollbarCell.prototype.scrollVertically = function (top) {\n if (this._scrolling) return;\n this._scrolling = true;\n this.$scroll_ver.scrollTop = top;\n top = this.$scroll_ver.scrollTop;\n\n var views = this._getLinkedViews();\n\n for (var i = 0; i < views.length; i++) {\n if (views[i].scrollTo) {\n views[i].scrollTo(undefined, top);\n }\n }\n\n var oldSize = this.$config.scrollPosition;\n this.$config.scrollPosition = top;\n this.callEvent(\"onScroll\", [oldSize, top, this.$config.scroll]);\n this._scrolling = false;\n };\n\n ScrollbarCell.prototype._isVertical = function () {\n return this.$config.scroll == \"y\";\n };\n\n ScrollbarCell.prototype._isHorizontal = function () {\n return this.$config.scroll == \"x\";\n };\n\n ScrollbarCell.prototype._scrollHorizontalHandler = function (e) {\n if (this._isVertical() || this._scrolling) {\n return;\n } //in safari we can catch previous onscroll after setting new value from mouse-wheel event\n //set delay to prevent value drifiting\n\n\n if (new Date() - (this._wheel_time || 0) < 100) return true; //if (this.$gantt._touch_scroll_active) return;\n\n var left = this.$scroll_hor.scrollLeft;\n this.scrollHorizontally(left);\n this._oldLeft = this.$scroll_hor.scrollLeft;\n };\n\n ScrollbarCell.prototype._outerScrollHorizontalHandler = function (e) {\n if (this._isVertical()) {\n return;\n }\n };\n\n ScrollbarCell.prototype.show = function () {\n this.$parent.show();\n };\n\n ScrollbarCell.prototype.hide = function () {\n this.$parent.hide();\n };\n\n ScrollbarCell.prototype._getScrollSize = function () {\n var scrollSize = 0;\n var outerSize = 0;\n\n var isHorizontal = this._isHorizontal();\n\n var linked = this._getLinkedViews();\n\n var view;\n var scrollProperty = isHorizontal ? \"scrollWidth\" : \"scrollHeight\",\n innerSizeProperty = isHorizontal ? \"contentX\" : \"contentY\";\n var outerProperty = isHorizontal ? \"x\" : \"y\";\n\n var offset = this._getScrollOffset();\n\n for (var i = 0; i < linked.length; i++) {\n view = linked[i];\n if (!(view && view.$content && view.$content.getSize && !view.$config.hidden)) continue;\n var sizes = view.$content.getSize();\n var cellScrollSize;\n\n if (sizes.hasOwnProperty(scrollProperty)) {\n cellScrollSize = sizes[scrollProperty];\n } else {\n cellScrollSize = sizes[innerSizeProperty];\n }\n\n if (offset) {\n // precalculated vertical/horizontal offsets of scrollbar to emulate 4.x look\n if (sizes[innerSizeProperty] > sizes[outerProperty] && sizes[innerSizeProperty] > scrollSize && cellScrollSize > sizes[outerProperty] - offset + 2) {\n scrollSize = cellScrollSize + (isHorizontal ? 0 : 2);\n outerSize = sizes[outerProperty];\n }\n } else {\n var nonScrollableSize = Math.max(sizes[innerSizeProperty] - cellScrollSize, 0);\n var scrollableViewPortSize = Math.max(sizes[outerProperty] - nonScrollableSize, 0);\n cellScrollSize = cellScrollSize + nonScrollableSize;\n\n if (cellScrollSize > scrollableViewPortSize && cellScrollSize > scrollSize) {\n //|| (cellScrollSize === scrollSize && sizes[outerProperty] < outerSize) // same scroll width but smaller scrollable view port\n scrollSize = cellScrollSize;\n outerSize = sizes[outerProperty];\n }\n }\n }\n\n return {\n outerScroll: outerSize,\n innerScroll: scrollSize\n };\n };\n\n ScrollbarCell.prototype.scroll = function (position) {\n if (this._isHorizontal()) {\n this.scrollHorizontally(position);\n } else {\n this.scrollVertically(position);\n }\n };\n\n ScrollbarCell.prototype.getScrollState = function () {\n return {\n visible: this.isVisible(),\n direction: this.$config.scroll,\n size: this.$config.outerSize,\n scrollSize: this.$config.scrollSize || 0,\n position: this.$config.scrollPosition || 0\n };\n };\n\n ScrollbarCell.prototype.setSize = function (width, height) {\n _super.prototype.setSize.apply(this, arguments);\n\n var scrollSizes = this._getScrollSize();\n\n var ownSize = (this._isVertical() ? height : width) - this._getScrollOffset() + (this._isHorizontal() ? 1 : 0);\n\n if (scrollSizes.innerScroll && ownSize > scrollSizes.outerScroll) {\n scrollSizes.innerScroll += ownSize - scrollSizes.outerScroll;\n }\n\n this.$config.scrollSize = scrollSizes.innerScroll;\n this.$config.width = width;\n this.$config.height = height;\n\n this._setScrollSize(scrollSizes.innerScroll);\n };\n\n ScrollbarCell.prototype.isVisible = function () {\n return !!(this.$parent && this.$parent.$view.parentNode);\n };\n\n ScrollbarCell.prototype.shouldShow = function () {\n var scrollSizes = this._getScrollSize();\n\n if (!scrollSizes.innerScroll && this.$parent && this.$parent.$view.parentNode) {\n return false;\n } else if (scrollSizes.innerScroll && !(this.$parent && this.$parent.$view.parentNode)) {\n return true;\n } else {\n return false;\n }\n };\n\n ScrollbarCell.prototype.shouldHide = function () {\n var scrollSizes = this._getScrollSize();\n\n if (!scrollSizes.innerScroll && this.$parent && this.$parent.$view.parentNode) {\n return true;\n } else {\n return false;\n }\n };\n\n ScrollbarCell.prototype.toggleVisibility = function () {\n if (this.shouldHide()) {\n this.hide();\n } else if (this.shouldShow()) {\n this.show();\n }\n };\n\n ScrollbarCell.prototype._getScaleOffset = function (view) {\n var offset = 0;\n\n if (view && (view.$config.view == \"timeline\" || view.$config.view == \"grid\")) {\n offset = view.$content.$getConfig().scale_height;\n }\n\n return offset;\n };\n\n ScrollbarCell.prototype._getScrollOffset = function () {\n var offset = 0;\n\n if (this._isVertical()) {\n var parentLayout = this.$parent.$parent;\n offset = Math.max(this._getScaleOffset(parentLayout.getPrevSibling(this.$parent.$id)), this._getScaleOffset(parentLayout.getNextSibling(this.$parent.$id)));\n } else {\n var linked = this._getLinkedViews();\n\n for (var i = 0; i < linked.length; i++) {\n var view = linked[i],\n vparent = view.$parent;\n var cells = vparent.$cells;\n var last = cells[cells.length - 1];\n\n if (last && last.$config.view == \"scrollbar\" && last.$config.hidden === false) {\n offset = last.$config.width;\n break;\n }\n }\n }\n\n return offset || 0;\n };\n\n ScrollbarCell.prototype._setScrollSize = function (size) {\n var property = this._isHorizontal() ? \"width\" : \"height\";\n var scrollbar = this._isHorizontal() ? this.$scroll_hor : this.$scroll_ver;\n\n var offset = this._getScrollOffset();\n\n var node = scrollbar.firstChild;\n\n if (offset) {\n if (this._isVertical()) {\n this.$config.outerSize = this.$config.height - offset + 3;\n scrollbar.style.height = this.$config.outerSize + \"px\";\n scrollbar.style.top = offset - 1 + \"px\";\n domHelpers.addClassName(scrollbar, this.$parent._borders.top);\n domHelpers.addClassName(scrollbar.parentNode, \"gantt_task_vscroll\");\n } else {\n this.$config.outerSize = this.$config.width - offset + 1;\n scrollbar.style.width = this.$config.outerSize + \"px\"; //domHelpers.addClassName(scrollbar, this.$parent._borders.right);\n }\n } else {\n scrollbar.style.top = \"auto\";\n domHelpers.removeClassName(scrollbar, this.$parent._borders.top);\n domHelpers.removeClassName(scrollbar.parentNode, \"gantt_task_vscroll\");\n this.$config.outerSize = this.$config.height;\n }\n\n node.style[property] = size + \"px\";\n };\n\n ScrollbarCell.prototype._scrollVerticalHandler = function (e) {\n if (this._scrollHorizontalHandler() || this._scrolling) {\n return;\n } //if (this.$gantt._touch_scroll_active) return;\n\n\n var top = this.$scroll_ver.scrollTop;\n var prev = this._oldTop;\n if (top == prev) return;\n this.scrollVertically(top);\n this._oldTop = this.$scroll_ver.scrollTop;\n };\n\n ScrollbarCell.prototype._outerScrollVerticalHandler = function (e) {\n if (this._scrollHorizontalHandler()) {\n return;\n }\n };\n\n ScrollbarCell.prototype._checkWheelTarget = function (targetNode) {\n var connectedViews = this._getLinkedViews().concat(this);\n\n for (var i = 0; i < connectedViews.length; i++) {\n var node = connectedViews[i].$view;\n\n if (domHelpers.isChildOf(targetNode, node)) {\n return true;\n }\n }\n\n return false;\n };\n\n ScrollbarCell.prototype._mouseWheelHandler = function (e) {\n var target = e.target || e.srcElement;\n if (!this._checkWheelTarget(target)) return;\n this._wheel_time = new Date();\n var res = {};\n var wheelSpeed = {\n x: 1,\n y: 1\n };\n var wheelSpeedConfig = this.$gantt.config.wheel_scroll_sensitivity;\n\n if (typeof wheelSpeedConfig == \"number\" && !!wheelSpeedConfig) {\n wheelSpeed = {\n x: wheelSpeedConfig,\n y: wheelSpeedConfig\n };\n } else if ({}.toString.apply(wheelSpeedConfig) == \"[object Object]\") {\n wheelSpeed = {\n x: wheelSpeedConfig.x,\n y: wheelSpeedConfig.y\n };\n }\n\n var ff = env.isFF;\n var deltaX = ff ? e.deltaX : e.wheelDeltaX;\n var deltaY = ff ? e.deltaY : e.wheelDelta;\n var multiplier = -20;\n\n if (ff) {\n if (e.deltaMode !== 0) {\n multiplier = -40;\n } else {\n multiplier = -10;\n }\n }\n\n var wx = ff ? deltaX * multiplier * wheelSpeed.x : deltaX * 2 * wheelSpeed.x;\n var wy = ff ? deltaY * multiplier * wheelSpeed.y : deltaY * wheelSpeed.y;\n var horizontalScrollModifier = this.$gantt.config.horizontal_scroll_key;\n\n if (horizontalScrollModifier !== false) {\n if (SCROLL_MODIFIER_KEYS.indexOf(horizontalScrollModifier) >= 0) {\n if (e[horizontalScrollModifier] && !(e.deltaX || e.wheelDeltaX)) {\n // shift+mousewheel for horizontal scroll\n wx = wy * 2;\n wy = 0;\n }\n }\n }\n\n if (wx && Math.abs(wx) > Math.abs(wy)) {\n if (this._isVertical()) {\n return;\n }\n\n if (res.x) return true; //no horisontal scroll, must not block scrolling\n\n if (!this.$scroll_hor || !this.$scroll_hor.offsetWidth) return true;\n var dir = wx / -40;\n var oldLeft = this._oldLeft;\n var left = oldLeft + dir * 30;\n this.scrollHorizontally(left);\n this.$scroll_hor.scrollLeft = left; // not block scroll if position hasn't changed\n\n if (oldLeft == this.$scroll_hor.scrollLeft) {\n return true;\n }\n\n this._oldLeft = this.$scroll_hor.scrollLeft;\n } else {\n if (this._isHorizontal()) {\n return;\n }\n\n if (res.y) return true; //no vertical scroll, must not block scrolling\n\n if (!this.$scroll_ver || !this.$scroll_ver.offsetHeight) return true;\n var dir = wy / -40;\n if (typeof wy == \"undefined\") dir = e.detail;\n var oldTop = this._oldTop;\n var top = this.$scroll_ver.scrollTop + dir * 30; //if(!this.$gantt.config.prevent_default_scroll &&\n //\t(this.$gantt._cached_scroll_pos && ((this.$gantt._cached_scroll_pos.y == top) || (this.$gantt._cached_scroll_pos.y <= 0 && top <= 0)))) return true;\n\n this.scrollVertically(top);\n this.$scroll_ver.scrollTop = top; // not block scroll if position hasn't changed\n\n if (oldTop == this.$scroll_ver.scrollTop) {\n return true;\n }\n\n this._oldTop = this.$scroll_ver.scrollTop;\n }\n\n if (e.preventDefault) e.preventDefault();\n e.cancelBubble = true;\n return false;\n };\n\n return ScrollbarCell;\n}(Cell);\n\nmodule.exports = ScrollbarCell;","module.exports = null;","var __extends = require(\"../../../utils/extends\"),\n utils = require(\"../../../utils/utils\"),\n Cell = require(\"./cell\");\n\nvar ViewCell = function (_super) {\n \"use strict\";\n\n __extends(ViewCell, _super);\n\n function ViewCell(parent, config, factory) {\n var _this = _super.apply(this, arguments) || this;\n\n if (config.view) {\n if (config.id) {\n // pass id to the nested view\n this.$id = utils.uid();\n }\n\n var childConfig = utils.copy(config);\n delete childConfig.config;\n delete childConfig.templates;\n this.$content = this.$factory.createView(config.view, this, childConfig, this);\n if (!this.$content) return false;\n }\n\n _this.$name = \"viewCell\";\n return _this;\n }\n\n ViewCell.prototype.destructor = function () {\n this.clear();\n\n _super.prototype.destructor.call(this);\n };\n\n ViewCell.prototype.clear = function () {\n this.$initialized = false; // call destructor\n\n if (this.$content) {\n var method = this.$content.unload || this.$content.destructor;\n\n if (method) {\n method.call(this.$content);\n }\n }\n\n _super.prototype.clear.call(this);\n };\n\n ViewCell.prototype.scrollTo = function (left, top) {\n if (this.$content && this.$content.scrollTo) {\n this.$content.scrollTo(left, top);\n } else {\n _super.prototype.scrollTo.call(this, left, top);\n }\n };\n\n ViewCell.prototype._setContentSize = function (x, y) {\n var borders = this._getBorderSizes();\n\n if (typeof x === \"number\") {\n var outerX = x + borders.horizontal;\n this.$config.width = outerX;\n }\n\n if (typeof y === \"number\") {\n var outerY = y + borders.vertical;\n this.$config.height = outerY;\n }\n };\n\n ViewCell.prototype.setSize = function (x, y) {\n _super.prototype.setSize.call(this, x, y);\n\n if (!this.$preResize && this.$content) {\n if (!this.$initialized) {\n this.$initialized = true;\n var header = this.$view.childNodes[0];\n var content = this.$view.childNodes[1];\n if (!content) content = header;\n /*if(this.$content.$config){\r\n \tthis.$content.$config.width = this.$lastSize.contentX;\r\n \tthis.$content.$config.height = this.$lastSize.contentY;\r\n }*/\n\n this.$content.init(content);\n }\n }\n };\n\n ViewCell.prototype.setContentSize = function () {\n if (!this.$preResize && this.$content) {\n if (this.$initialized) {\n this.$content.setSize(this.$lastSize.contentX, this.$lastSize.contentY);\n }\n }\n };\n\n ViewCell.prototype.getContentSize = function () {\n var size = _super.prototype.getContentSize.call(this);\n\n if (this.$content && this.$initialized) {\n var childSize = this.$content.getSize();\n size.width = childSize.contentX === undefined ? childSize.width : childSize.contentX;\n size.height = childSize.contentY === undefined ? childSize.height : childSize.contentY;\n }\n\n var borders = this._getBorderSizes();\n\n size.width += borders.horizontal;\n size.height += borders.vertical;\n return size;\n };\n\n return ViewCell;\n}(Cell);\n\nmodule.exports = ViewCell;","var __extends = require(\"../../../utils/extends\"),\n Layout = require(\"./layout\"),\n Cell = require(\"./cell\");\n\nvar ViewLayout = function (_super) {\n \"use strict\";\n\n __extends(ViewLayout, _super);\n\n function ViewLayout(parent, config, factory) {\n var _this = _super.apply(this, arguments) || this;\n\n for (var i = 0; i < _this.$cells.length; i++) {\n _this.$cells[i].$config.hidden = i !== 0;\n }\n\n _this.$cell = _this.$cells[0];\n _this.$name = \"viewLayout\";\n return _this;\n }\n\n ViewLayout.prototype.cell = function (id) {\n var cell = _super.prototype.cell.call(this, id);\n\n if (!cell.$view) {\n this.$fill(null, this);\n }\n\n return cell;\n };\n\n ViewLayout.prototype.moveView = function (view) {\n var body = this.$view;\n\n if (this.$cell) {\n this.$cell.$config.hidden = true;\n body.removeChild(this.$cell.$view);\n }\n\n this.$cell = view;\n body.appendChild(view.$view);\n };\n\n ViewLayout.prototype.setSize = function (x, y) {\n Cell.prototype.setSize.call(this, x, y);\n };\n\n ViewLayout.prototype.setContentSize = function () {\n var size = this.$lastSize;\n this.$cell.setSize(size.contentX, size.contentY);\n };\n\n ViewLayout.prototype.getSize = function () {\n var sizes = _super.prototype.getSize.call(this);\n\n if (this.$cell) {\n var cellSize = this.$cell.getSize();\n\n if (this.$config.byMaxSize) {\n for (var i = 0; i < this.$cells.length; i++) {\n var otherCell = this.$cells[i].getSize();\n\n for (var cell in cellSize) {\n cellSize[cell] = Math.max(cellSize[cell], otherCell[cell]);\n }\n }\n }\n\n for (var size in sizes) {\n sizes[size] = sizes[size] || cellSize[size];\n }\n\n sizes.gravity = Math.max(sizes.gravity, cellSize.gravity);\n }\n\n return sizes;\n };\n\n return ViewLayout;\n}(Layout);\n\nmodule.exports = ViewLayout;","module.exports = function (item, view, config) {\n if (!item.start_date || !item.end_date) {\n return null;\n }\n\n var padding = 200;\n var startCoord = view.posFromDate(item.start_date);\n var endCoord = view.posFromDate(item.end_date);\n var left = Math.min(startCoord, endCoord) - padding;\n var right = Math.max(startCoord, endCoord) + padding;\n return {\n top: view.getItemTop(item.id),\n height: view.getItemHeight(item.id),\n left: left,\n width: right - left\n };\n};","var barRectangle = require(\"./get_bar_rectangle\");\n\nmodule.exports = function getLinkBox(item, view, config, gantt) {\n if (!gantt.isTaskExists(item.source)) {\n return null;\n }\n\n if (!gantt.isTaskExists(item.target)) {\n return null;\n }\n\n var sourceBox = barRectangle(gantt.getTask(item.source), view, gantt);\n var targetBox = barRectangle(gantt.getTask(item.target), view, gantt);\n\n if (!sourceBox || !targetBox) {\n return null;\n }\n\n var padding = 100;\n var left = Math.min(sourceBox.left, targetBox.left) - padding;\n var right = Math.max(sourceBox.left + sourceBox.width, targetBox.left + targetBox.width) + padding;\n var top = Math.min(sourceBox.top, targetBox.top) - padding;\n var bottom = Math.max(sourceBox.top + sourceBox.height, targetBox.top + targetBox.height) + padding;\n return {\n top: top,\n height: bottom - top,\n bottom: bottom,\n left: left,\n width: right - left,\n right: right\n };\n};","module.exports = function (viewport, box) {\n if (!box) {\n return false;\n }\n\n if (box.left > viewport.x_end || box.left + box.width < viewport.x) {\n return false;\n }\n\n if (box.top > viewport.y_end || box.top + box.height < viewport.y) {\n return false;\n }\n\n return true;\n};","var genericViewPortChecker = require(\"./viewport/is_in_viewport\");\n\nvar isLegacyRender = require(\"./is_legacy_smart_render\");\n\nvar basicGetRectangle = require(\"./viewport/get_grid_row_rectangle\");\n\nvar basicGetRange = require(\"./viewport/get_visible_bars_range\");\n\nvar rendererFactory = function rendererFactory(gantt) {\n //hash of dom elements is needed to redraw single bar/link\n var task_area_pulls = {},\n task_area_renderers = {};\n\n function getView(layer) {\n var view = null;\n\n if (typeof layer.view === \"string\") {\n view = gantt.$ui.getView(layer.view);\n } else if (layer.view) {\n view = layer.view;\n }\n\n return view;\n }\n\n function getRenderer(id, layer, node) {\n if (task_area_renderers[id]) return task_area_renderers[id];\n if (!layer.renderer) gantt.assert(false, \"Invalid renderer call\");\n var renderMethod = null;\n var updateMethod = null;\n var getRectangle = null;\n var renderCallbackMethod = null;\n var specializedViewPortChecker = null;\n\n if (typeof layer.renderer === \"function\") {\n renderMethod = layer.renderer;\n getRectangle = basicGetRectangle;\n } else {\n renderMethod = layer.renderer.render;\n updateMethod = layer.renderer.update;\n renderCallbackMethod = layer.renderer.onrender;\n\n if (layer.renderer.isInViewPort) {\n specializedViewPortChecker = layer.renderer.isInViewPort;\n } else {\n getRectangle = layer.renderer.getRectangle;\n }\n\n if (!getRectangle && getRectangle !== null) {\n getRectangle = basicGetRectangle;\n }\n }\n\n var filter = layer.filter;\n if (node) node.setAttribute(gantt.config.layer_attribute, true);\n task_area_renderers[id] = {\n render_item: function render_item(item, container, viewPort, layerView, viewConfig) {\n container = container || node;\n\n if (filter) {\n if (!filter(item)) {\n this.remove_item(item.id);\n return;\n }\n }\n\n var view = layerView || getView(layer);\n var config = viewConfig || (view ? view.$getConfig() : null);\n var rendererViewPort = viewPort;\n\n if (!rendererViewPort && config && config.smart_rendering) {\n rendererViewPort = view.getViewPort();\n }\n\n var dom = null;\n\n if (!isLegacyRender(gantt) && (getRectangle || specializedViewPortChecker) && rendererViewPort) {\n var isVisible = false;\n\n if (specializedViewPortChecker) {\n isVisible = specializedViewPortChecker(item, rendererViewPort, view, config, gantt);\n } else {\n isVisible = genericViewPortChecker(rendererViewPort, getRectangle(item, view, config, gantt));\n }\n\n if (isVisible) {\n dom = renderMethod.call(gantt, item, view, config, rendererViewPort);\n }\n } else {\n dom = renderMethod.call(gantt, item, view, config, rendererViewPort);\n }\n\n this.append(item, dom, container);\n var useBuffer = container.nodeType == 11; //DocumentFragment\n\n if (renderCallbackMethod && !useBuffer && dom) {\n renderCallbackMethod.call(gantt, item, dom, view);\n }\n },\n clear: function clear(container) {\n this.rendered = task_area_pulls[id] = {};\n if (!layer.append) this.clear_container(container);\n },\n clear_container: function clear_container(container) {\n container = container || node;\n\n if (container) {\n container.innerHTML = \"\";\n }\n },\n get_visible_range: function get_visible_range(datastore) {\n var view = getView(layer);\n var viewport;\n var viewConfig = view ? view.$getConfig() : null;\n\n if (viewConfig && viewConfig.smart_rendering) {\n viewport = view.getViewPort();\n }\n\n var range;\n\n if (view && viewport) {\n if (typeof layer.renderer === \"function\") {\n range = basicGetRange(gantt, view, viewConfig, datastore, viewport);\n } else if (layer.renderer && layer.renderer.getVisibleRange) {\n range = layer.renderer.getVisibleRange(gantt, view, viewConfig, datastore, viewport);\n }\n }\n\n if (!range) {\n range = {\n start: 0,\n end: datastore.count()\n };\n }\n\n return range;\n },\n prepare_data: function prepare_data(items) {\n if (layer.renderer && layer.renderer.prepareData) {\n return layer.renderer.prepareData(items, gantt, layer);\n }\n },\n render_items: function render_items(items, container) {\n container = container || node;\n var buffer = document.createDocumentFragment();\n this.clear(container);\n var viewPort = null;\n var view = getView(layer);\n var viewConfig = view ? view.$getConfig() : null;\n\n if (viewConfig && viewConfig.smart_rendering) {\n viewPort = view.getViewPort();\n }\n\n for (var i = 0, vis = items.length; i < vis; i++) {\n this.render_item(items[i], buffer, viewPort, view, viewConfig);\n }\n\n container.appendChild(buffer, container);\n var itemsSearch = {};\n items.forEach(function (item) {\n itemsSearch[item.id] = item;\n });\n var renderedItems = {};\n\n if (renderCallbackMethod) {\n var newElements = {};\n\n for (var i in this.rendered) {\n if (!renderedItems[i]) {\n newElements[i] = this.rendered[i];\n renderCallbackMethod.call(gantt, itemsSearch[i], this.rendered[i], view);\n }\n }\n }\n },\n update_items: function update_items(items, container) {\n var view = getView(layer);\n var viewConfig = view ? view.$getConfig() : null;\n\n if (!view || !view.$getConfig().smart_rendering || isLegacyRender(gantt)) {\n return;\n }\n\n if (!this.rendered) {\n return;\n }\n\n if (!(getRectangle || specializedViewPortChecker)) {\n return;\n }\n\n container = container || node;\n var buffer = document.createDocumentFragment();\n var viewPort = null;\n\n if (view) {\n viewPort = view.getViewPort();\n }\n\n var itemsSearch = {};\n items.forEach(function (item) {\n itemsSearch[item.id] = item;\n });\n var renderedItems = {};\n var nodesToRemove = {};\n\n for (var i in this.rendered) {\n nodesToRemove[i] = true;\n renderedItems[i] = true;\n }\n\n var renderCalledFor = {};\n\n for (var i = 0, vis = items.length; i < vis; i++) {\n var item = items[i];\n var itemNode = this.rendered[item.id];\n nodesToRemove[item.id] = false;\n\n if (itemNode && itemNode.parentNode) {\n var isVisible = false;\n\n if (specializedViewPortChecker) {\n isVisible = specializedViewPortChecker(item, viewPort, view, viewConfig, gantt);\n } else {\n isVisible = genericViewPortChecker(viewPort, getRectangle(item, view, viewConfig, gantt));\n }\n\n if (!isVisible) {\n nodesToRemove[item.id] = true;\n } else {\n if (updateMethod) {\n updateMethod.call(gantt, item, itemNode, view, viewConfig, viewPort);\n }\n\n this.restore(item, buffer);\n }\n } else {\n renderCalledFor[items[i].id] = true;\n this.render_item(items[i], buffer, viewPort, view, viewConfig);\n }\n }\n\n for (var i in nodesToRemove) {\n if (nodesToRemove[i]) {\n this.hide(i);\n }\n }\n\n if (buffer.childNodes.length) {\n container.appendChild(buffer, container);\n }\n\n if (renderCallbackMethod) {\n var newElements = {};\n\n for (var i in this.rendered) {\n if (!renderedItems[i] || renderCalledFor[i]) {\n newElements[i] = this.rendered[i];\n renderCallbackMethod.call(gantt, itemsSearch[i], this.rendered[i], view);\n }\n }\n }\n },\n append: function append(item, node, container) {\n if (!this.rendered) {\n return;\n }\n\n if (!node) {\n if (this.rendered[item.id]) {\n this.remove_item(item.id);\n }\n\n return;\n }\n\n if (this.rendered[item.id] && this.rendered[item.id].parentNode) {\n this.replace_item(item.id, node);\n } else {\n container.appendChild(node);\n }\n\n this.rendered[item.id] = node;\n },\n replace_item: function replace_item(item_id, newNode) {\n var item = this.rendered[item_id];\n\n if (item && item.parentNode) {\n item.parentNode.replaceChild(newNode, item);\n }\n\n this.rendered[item_id] = newNode;\n },\n remove_item: function remove_item(item_id) {\n this.hide(item_id);\n delete this.rendered[item_id];\n },\n hide: function hide(item_id) {\n var item = this.rendered[item_id];\n\n if (item && item.parentNode) {\n item.parentNode.removeChild(item);\n }\n },\n restore: function restore(item, container) {\n var dom = this.rendered[item.id];\n\n if (dom) {\n if (!dom.parentNode) {\n this.append(item, dom, container || node);\n }\n } else {\n this.render_item(item, container || node);\n }\n },\n change_id: function change_id(oldid, newid) {\n this.rendered[newid] = this.rendered[oldid];\n delete this.rendered[oldid];\n },\n rendered: task_area_pulls[id],\n node: node,\n destructor: function destructor() {\n this.clear();\n delete task_area_renderers[id];\n delete task_area_pulls[id];\n }\n };\n return task_area_renderers[id];\n }\n\n function clearRenderers() {\n for (var i in task_area_renderers) {\n getRenderer(i).destructor();\n }\n }\n\n return {\n getRenderer: getRenderer,\n clearRenderers: clearRenderers\n };\n};\n\nmodule.exports = rendererFactory;","var renderFactoryProvider = require(\"./render_factory\");\n\nvar utils = require(\"../../../utils/utils\"),\n domHelpers = require(\"../utils/dom_helpers\"),\n isLegacyRender = require(\"./is_legacy_smart_render\");\n\nvar layerFactory = function layerFactory(gantt) {\n var renderFactory = renderFactoryProvider(gantt);\n return {\n createGroup: function createGroup(getContainer, relativeRoot, defaultFilters, initLayer) {\n var renderGroup = {\n tempCollection: [],\n renderers: {},\n container: getContainer,\n filters: [],\n getLayers: function getLayers() {\n this._add(); // add pending layers\n\n\n var res = [];\n\n for (var i in this.renderers) {\n res.push(this.renderers[i]);\n }\n\n return res;\n },\n getLayer: function getLayer(id) {\n return this.renderers[id];\n },\n _add: function _add(layer) {\n if (layer) {\n layer.id = layer.id || utils.uid();\n this.tempCollection.push(layer);\n }\n\n var container = this.container();\n var pending = this.tempCollection;\n\n for (var i = 0; i < pending.length; i++) {\n layer = pending[i];\n if (!this.container() && !(layer && layer.container && domHelpers.isChildOf(layer.container, document.body))) continue;\n var node = layer.container,\n id = layer.id,\n topmost = layer.topmost;\n\n if (!node.parentNode) {\n //insert on top or below the tasks\n if (topmost) {\n container.appendChild(node);\n } else {\n var rel = relativeRoot ? relativeRoot() : container.firstChild; // GS-1274: if we don't add the second check, Gantt stops working if\n // we add the task layer without the timeline and switch to a layout with the timeline\n\n if (rel && rel.parentNode == container) container.insertBefore(node, rel);else container.appendChild(node);\n }\n }\n\n this.renderers[id] = renderFactory.getRenderer(id, layer, node);\n\n if (initLayer) {\n initLayer(layer, gantt);\n }\n\n this.tempCollection.splice(i, 1);\n i--;\n }\n },\n addLayer: function addLayer(config) {\n if (config) {\n if (typeof config == \"function\") {\n config = {\n renderer: config\n };\n }\n\n if (config.filter === undefined) {\n config.filter = mergeFilters(defaultFilters || []);\n } else if (config.filter instanceof Array) {\n config.filter.push(defaultFilters);\n config.filter = mergeFilters(config.filter);\n }\n\n if (!config.container) {\n config.container = document.createElement(\"div\");\n }\n\n var self = this;\n\n config.requestUpdate = function () {\n if (gantt.config.smart_rendering && !isLegacyRender(gantt)) {\n if (self.renderers[config.id]) {\n self.onUpdateRequest(self.renderers[config.id]);\n }\n }\n };\n }\n\n this._add(config);\n\n return config ? config.id : undefined;\n },\n onUpdateRequest: function onUpdateRequest(layer) {},\n eachLayer: function eachLayer(code) {\n for (var i in this.renderers) {\n code(this.renderers[i]);\n }\n },\n removeLayer: function removeLayer(id) {\n if (!this.renderers[id]) return;\n this.renderers[id].destructor();\n delete this.renderers[id];\n },\n clear: function clear() {\n for (var i in this.renderers) {\n this.renderers[i].destructor();\n }\n\n this.renderers = {};\n } //,\n //prepareConfig: prepareConfig\n\n };\n gantt.attachEvent(\"onDestroy\", function () {\n renderGroup.clear();\n renderGroup = null;\n });\n return renderGroup;\n }\n };\n};\n\nfunction mergeFilters(filter_methods) {\n if (!(filter_methods instanceof Array)) {\n filter_methods = Array.prototype.slice.call(arguments, 0);\n }\n\n return function (obj) {\n var res = true;\n\n for (var i = 0, len = filter_methods.length; i < len; i++) {\n var filter_method = filter_methods[i];\n\n if (filter_method) {\n res = res && filter_method(obj.id, obj) !== false;\n }\n }\n\n return res;\n };\n}\n\nmodule.exports = layerFactory;","var createLayerFactory = require(\"./render/layer_engine\");\n\nvar getVisibleTaskRange = require(\"./render/viewport/get_visible_bars_range\");\n\nvar getVisibleLinksRangeFactory = require(\"./render/viewport/factory/get_visible_link_range\");\n\nvar isLinkInViewport = require(\"./render/viewport/is_link_in_viewport\");\n\nfunction initLayer(layer, gantt) {\n if (!layer.view) {\n return;\n }\n\n var view = layer.view;\n\n if (typeof view === \"string\") {\n view = gantt.$ui.getView(view);\n }\n\n if (view && view.attachEvent) {\n view.attachEvent(\"onScroll\", function () {\n var state = gantt.$services.getService(\"state\"); // don't repaint if we're inside batchUpdate, a complete repaint will be called afterwards\n\n if (!state.getState(\"batchUpdate\").batch_update && !view.$config.$skipSmartRenderOnScroll) {\n if (layer.requestUpdate) {\n layer.requestUpdate();\n }\n }\n });\n }\n}\n\nvar createLayerEngine = function createLayerEngine(gantt) {\n var factory = createLayerFactory(gantt);\n return {\n getDataRender: function getDataRender(name) {\n return gantt.$services.getService(\"layer:\" + name) || null;\n },\n createDataRender: function createDataRender(config) {\n var name = config.name,\n defaultContainer = config.defaultContainer,\n previusSiblingContainer = config.defaultContainerSibling;\n var layers = factory.createGroup(defaultContainer, previusSiblingContainer, function (itemId, item) {\n if (layers.filters) {\n for (var i = 0; i < layers.filters.length; i++) {\n if (layers.filters[i](itemId, item) === false) {\n return false;\n }\n }\n } else {\n return true;\n }\n }, initLayer);\n gantt.$services.setService(\"layer:\" + name, function () {\n return layers;\n });\n gantt.attachEvent(\"onGanttReady\", function () {\n layers.addLayer(); // init layers on start\n });\n return layers;\n },\n init: function init() {\n var taskLayers = this.createDataRender({\n name: \"task\",\n defaultContainer: function defaultContainer() {\n if (gantt.$task_data) {\n return gantt.$task_data;\n } else if (gantt.$ui.getView(\"timeline\")) {\n return gantt.$ui.getView(\"timeline\").$task_data;\n }\n },\n defaultContainerSibling: function defaultContainerSibling() {\n if (gantt.$task_links) {\n return gantt.$task_links;\n } else if (gantt.$ui.getView(\"timeline\")) {\n return gantt.$ui.getView(\"timeline\").$task_links;\n }\n },\n filter: function filter(item) {}\n }, gantt);\n var linkLayers = this.createDataRender({\n name: \"link\",\n defaultContainer: function defaultContainer() {\n if (gantt.$task_data) {\n return gantt.$task_data;\n } else if (gantt.$ui.getView(\"timeline\")) {\n return gantt.$ui.getView(\"timeline\").$task_data;\n }\n }\n }, gantt);\n return {\n addTaskLayer: function addTaskLayer(config) {\n var rangeFunction = getVisibleTaskRange;\n\n if (typeof config === \"function\") {\n config = {\n renderer: {\n render: config,\n getVisibleRange: rangeFunction\n }\n };\n } else {\n if (config.renderer && !config.renderer.getVisibleRange) {\n config.renderer.getVisibleRange = rangeFunction;\n }\n }\n\n config.view = \"timeline\";\n return taskLayers.addLayer(config);\n },\n _getTaskLayers: function _getTaskLayers() {\n return taskLayers.getLayers();\n },\n removeTaskLayer: function removeTaskLayer(id) {\n taskLayers.removeLayer(id);\n },\n _clearTaskLayers: function _clearTaskLayers() {\n taskLayers.clear();\n },\n addLinkLayer: function addLinkLayer(config) {\n var rangeFunction = getVisibleLinksRangeFactory();\n\n if (typeof config === \"function\") {\n config = {\n renderer: {\n render: config,\n getVisibleRange: rangeFunction\n }\n };\n } else {\n if (config.renderer && !config.renderer.getVisibleRange) {\n config.renderer.getVisibleRange = rangeFunction;\n }\n }\n\n config.view = \"timeline\";\n\n if (config && config.renderer) {\n if (!config.renderer.getRectangle && !config.renderer.isInViewPort) {\n config.renderer.isInViewPort = isLinkInViewport;\n }\n }\n\n return linkLayers.addLayer(config);\n },\n _getLinkLayers: function _getLinkLayers() {\n return linkLayers.getLayers();\n },\n removeLinkLayer: function removeLinkLayer(id) {\n linkLayers.removeLayer(id);\n },\n _clearLinkLayers: function _clearLinkLayers() {\n linkLayers.clear();\n }\n };\n }\n };\n};\n\nmodule.exports = createLayerEngine;","var domHelpers = require(\"./utils/dom_helpers\");\n\nvar createMouseHandler = function (domHelpers) {\n return function (gantt) {\n var eventHandlers = {\n \"click\": {},\n \"doubleclick\": {},\n \"contextMenu\": {}\n };\n\n function addEventTarget(event, className, handler, root) {\n if (!eventHandlers[event][className]) {\n eventHandlers[event][className] = [];\n }\n\n eventHandlers[event][className].push({\n handler: handler,\n root: root\n });\n }\n\n function callHandler(eventName, className, root, args) {\n var handlers = eventHandlers[eventName][className];\n\n if (handlers) {\n for (var i = 0; i < handlers.length; i++) {\n if (!(root || handlers[i].root) || handlers[i].root === root) {\n handlers[i].handler.apply(this, args);\n }\n }\n }\n }\n\n function onClick(e) {\n e = e || window.event;\n var id = gantt.locate(e);\n var handlers = findEventHandlers(e, eventHandlers.click);\n var res = true;\n\n if (id !== null) {\n res = !gantt.checkEvent(\"onTaskClick\") || gantt.callEvent(\"onTaskClick\", [id, e]);\n } else {\n gantt.callEvent(\"onEmptyClick\", [e]);\n }\n\n if (res) {\n var default_action = callEventHandlers(handlers, e, id);\n if (!default_action) return; // GS-1025: if we don't do that, the dropdown or date select will be closed for unselected tasks\n // GS-1078: or for the built-in select inline editor\n\n switch (e.target.nodeName) {\n case \"SELECT\":\n case 'INPUT':\n return;\n } //allow task selection when the multiselect plugin is not enabled\n\n\n if (id && gantt.getTask(id) && !gantt._multiselect && gantt.config.select_task) {\n gantt.selectTask(id);\n }\n }\n }\n\n function onContextMenu(e) {\n e = e || window.event;\n var src = e.target || e.srcElement,\n taskId = gantt.locate(src),\n linkId = gantt.locate(src, gantt.config.link_attribute);\n var res = !gantt.checkEvent(\"onContextMenu\") || gantt.callEvent(\"onContextMenu\", [taskId, linkId, e]);\n\n if (!res) {\n if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n }\n\n return res;\n }\n\n function findEventHandlers(e, hash) {\n var trg = e.target || e.srcElement;\n var handlers = [];\n\n while (trg) {\n var css = domHelpers.getClassName(trg);\n\n if (css) {\n css = css.split(\" \");\n\n for (var i = 0; i < css.length; i++) {\n if (!css[i]) continue;\n\n if (hash[css[i]]) {\n var delegateHandlers = hash[css[i]];\n\n for (var h = 0; h < delegateHandlers.length; h++) {\n if (delegateHandlers[h].root) {\n if (!domHelpers.isChildOf(trg, delegateHandlers[h].root)) {\n continue;\n }\n }\n\n handlers.push(delegateHandlers[h].handler);\n }\n }\n }\n }\n\n trg = trg.parentNode;\n }\n\n return handlers;\n }\n\n function callEventHandlers(handlers, e, id) {\n var res = true;\n\n for (var i = 0; i < handlers.length; i++) {\n var handlerResult = handlers[i].call(gantt, e, id, e.target || e.srcElement);\n res = res && !(typeof handlerResult != \"undefined\" && handlerResult !== true);\n }\n\n return res;\n }\n\n function onDoubleClick(e) {\n e = e || window.event;\n var id = gantt.locate(e);\n var handlers = findEventHandlers(e, eventHandlers.doubleclick); // when doubleclick fired not on task, id === null\n\n var res = !gantt.checkEvent(\"onTaskDblClick\") || id === null || gantt.callEvent(\"onTaskDblClick\", [id, e]);\n\n if (res) {\n var default_action = callEventHandlers(handlers, e, id);\n if (!default_action) return;\n\n if (id !== null && gantt.getTask(id)) {\n if (res && gantt.config.details_on_dblclick && !gantt.isReadonly(id)) {\n gantt.showLightbox(id);\n }\n }\n }\n }\n\n function onMouseMove(e) {\n if (gantt.checkEvent(\"onMouseMove\")) {\n var id = gantt.locate(e);\n gantt._last_move_event = e;\n gantt.callEvent(\"onMouseMove\", [id, e]);\n }\n }\n\n function detach(eventName, className, handler, root) {\n if (eventHandlers[eventName] && eventHandlers[eventName][className]) {\n var handlers = eventHandlers[eventName];\n var elementHandlers = handlers[className];\n\n for (var i = 0; i < elementHandlers.length; i++) {\n if (elementHandlers[i].root == root) {\n elementHandlers.splice(i, 1);\n i--;\n }\n }\n\n if (!elementHandlers.length) {\n delete handlers[className];\n }\n }\n }\n\n var domEvents = gantt._createDomEventScope();\n\n function reset(node) {\n domEvents.detachAll();\n\n if (node) {\n domEvents.attach(node, \"click\", onClick);\n domEvents.attach(node, \"dblclick\", onDoubleClick);\n domEvents.attach(node, \"mousemove\", onMouseMove);\n domEvents.attach(node, \"contextmenu\", onContextMenu);\n }\n }\n\n return {\n reset: reset,\n global: function global(event, classname, handler) {\n addEventTarget(event, classname, handler, null);\n },\n delegate: addEventTarget,\n detach: detach,\n callHandler: callHandler,\n onDoubleClick: onDoubleClick,\n onMouseMove: onMouseMove,\n onContextMenu: onContextMenu,\n onClick: onClick,\n destructor: function destructor() {\n reset();\n eventHandlers = null;\n domEvents = null;\n }\n };\n };\n}(domHelpers);\n\nmodule.exports = {\n init: createMouseHandler\n};","var utils = require(\"../../utils/utils\");\n\nfunction extendSettings(store, parentSettings) {\n var own = this.$config[store];\n\n if (own) {\n if (!own.$extendedConfig) {\n own.$extendedConfig = true;\n Object.setPrototypeOf(own, parentSettings);\n }\n\n return own;\n } else {\n return parentSettings;\n }\n}\n\nvar configurable = function configurable(parentView) {\n var parentConfig, parentTemplates;\n return {\n $getConfig: function $getConfig() {\n if (!parentConfig) {\n parentConfig = parentView ? parentView.$getConfig() : this.$gantt.config;\n }\n\n if (!this.$config.config) {\n return parentConfig;\n } else {\n return extendSettings.call(this, \"config\", parentConfig);\n }\n },\n $getTemplates: function $getTemplates() {\n if (!parentTemplates) {\n parentTemplates = parentView ? parentView.$getTemplates() : this.$gantt.templates;\n }\n\n if (!this.$config.templates) {\n return parentTemplates;\n } else {\n return extendSettings.call(this, \"templates\", parentTemplates);\n }\n }\n };\n};\n\nmodule.exports = function (obj, parent) {\n utils.mixin(obj, configurable(parent));\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar utils = require(\"../../utils/utils\"),\n configurable = require(\"./configurable\");\n\nvar uiFactory = function createFactory(gantt) {\n var views = {};\n\n function ui(cell, parentView) {\n var content;\n var view = \"cell\";\n\n if (cell.view) {\n view = \"viewcell\";\n } else if (cell.resizer) {\n view = \"resizer\";\n } else if (cell.rows || cell.cols) {\n view = \"layout\";\n } else if (cell.views) {\n view = \"multiview\";\n }\n\n content = createView.call(this, view, null, cell, parentView);\n return content;\n }\n\n var createdViews = {};\n\n function createView(name, parent, config, parentView) {\n var creator = views[name];\n if (!creator || !creator.create) return false;\n\n if (name == \"resizer\" && !config.mode) {\n if (parentView.$config.cols) {\n config.mode = \"x\";\n } else {\n config.mode = \"y\";\n }\n }\n\n if (name == \"viewcell\" && config.view == \"scrollbar\" && !config.scroll) {\n if (parentView.$config.cols) {\n config.scroll = \"y\";\n } else {\n config.scroll = \"x\";\n }\n }\n\n var config = utils.copy(config);\n\n if (!config.id && !createdViews[config.view]) {\n config.id = config.view;\n }\n\n if (config.id && !config.css) {\n config.css = config.id + \"_cell\";\n }\n\n var view = new creator.create(parent, config, this, gantt);\n\n if (creator.configure) {\n creator.configure(view);\n }\n\n configurable(view, parentView);\n\n if (!view.$id) {\n view.$id = config.id || gantt.uid();\n }\n\n if (!view.$parent && _typeof(parent) == \"object\") {\n view.$parent = parent;\n }\n\n if (!view.$config) {\n view.$config = config;\n }\n\n if (createdViews[view.$id]) {\n view.$id = gantt.uid();\n }\n\n createdViews[view.$id] = view;\n return view;\n }\n\n function reset() {\n createdViews = {};\n }\n\n function register(name, viewConstructor, configure) {\n views[name] = {\n create: viewConstructor,\n configure: configure\n };\n }\n\n function getView(id) {\n return createdViews[id];\n }\n\n var factory = {\n initUI: ui,\n reset: reset,\n registerView: register,\n createView: createView,\n getView: getView\n };\n return factory;\n};\n\nmodule.exports = {\n createFactory: uiFactory\n};","var uiFactory = require(\"./ui_factory\"),\n mouseEvents = require(\"./mouse\"),\n createLayers = require(\"./gantt_layers\"),\n Cell = require(\"./layout/cell\"),\n Layout = require(\"./layout/layout\"),\n ViewLayout = require(\"./layout/view_layout\"),\n ViewCell = require(\"./layout/view_cell\"),\n Resizer = require(\"./layout/resizer_cell\"),\n Scrollbar = require(\"./layout/scrollbar_cell\"),\n Timeline = require(\"./timeline/timeline\"),\n Grid = require(\"./grid/grid\"),\n ResourceGrid = require(\"./grid/resource_grid\"),\n ResourceTimeline = require(\"./timeline/resource_timeline\"),\n ResourceHistogram = require(\"./timeline/resource_histogram\");\n\nvar gridEditorsFactory = require(\"./grid/editors/controller\");\n\nvar renderTaskBar = require(\"./render/task_bar_smart_render\"),\n renderSplitTaskBar = require(\"./render/task_split_render\"),\n renderRollupTaskBar = require(\"./render/task_rollup_render\"),\n renderTaskBg = require(\"./render/task_bg_render\"),\n renderLink = require(\"./render/link_render\"),\n gridRenderer = require(\"./render/task_grid_line_render\"),\n resourceMatrixRenderer = require(\"./render/resource_matrix_render\"),\n resourceHistogramRenderer = require(\"./render/resource_histogram_render\"),\n gridTaskRowResizerRenderer = require(\"./render/task_grid_row_resize_render\");\n\nvar mainGridInitializer = require(\"./grid/main_grid_initializer\");\n\nvar mainTimelineInitializer = require(\"./timeline/main_timeline_initializer\");\n\nvar mainLayoutInitializer = require(\"./main_layout_initializer\");\n\nfunction initUI(gantt) {\n function attachInitializer(view, initializer) {\n var ext = initializer(gantt);\n if (ext.onCreated) ext.onCreated(view);\n view.attachEvent(\"onReady\", function () {\n if (ext.onInitialized) ext.onInitialized(view);\n });\n view.attachEvent(\"onDestroy\", function () {\n if (ext.onDestroyed) ext.onDestroyed(view);\n });\n }\n\n var factory = uiFactory.createFactory(gantt);\n factory.registerView(\"cell\", Cell);\n factory.registerView(\"resizer\", Resizer);\n factory.registerView(\"scrollbar\", Scrollbar);\n factory.registerView(\"layout\", Layout, function (view) {\n var id = view.$config ? view.$config.id : null;\n\n if (id === \"main\") {\n attachInitializer(view, mainLayoutInitializer);\n }\n });\n factory.registerView(\"viewcell\", ViewCell);\n factory.registerView(\"multiview\", ViewLayout);\n factory.registerView(\"timeline\", Timeline, function (view) {\n var id = view.$config ? view.$config.id : null;\n\n if (id === \"timeline\" || view.$config.bind == \"task\") {\n attachInitializer(view, mainTimelineInitializer);\n }\n });\n factory.registerView(\"grid\", Grid, function (view) {\n var id = view.$config ? view.$config.id : null;\n\n if (id === \"grid\" || view.$config.bind == \"task\") {\n attachInitializer(view, mainGridInitializer);\n }\n });\n factory.registerView(\"resourceGrid\", ResourceGrid);\n factory.registerView(\"resourceTimeline\", ResourceTimeline);\n factory.registerView(\"resourceHistogram\", ResourceHistogram);\n var layersEngine = createLayers(gantt);\n var inlineEditors = gridEditorsFactory(gantt);\n gantt.ext.inlineEditors = inlineEditors;\n gantt.ext._inlineEditors = inlineEditors;\n inlineEditors.init(gantt);\n return {\n factory: factory,\n mouseEvents: mouseEvents.init(gantt),\n layersApi: layersEngine.init(),\n render: {\n gridLine: function gridLine() {\n return gridRenderer(gantt);\n },\n taskBg: function taskBg() {\n return renderTaskBg(gantt);\n },\n taskBar: function taskBar() {\n return renderTaskBar(gantt);\n },\n taskRollupBar: function taskRollupBar() {\n return renderRollupTaskBar(gantt);\n },\n taskSplitBar: function taskSplitBar() {\n return renderSplitTaskBar(gantt);\n },\n link: function link() {\n return renderLink(gantt);\n },\n resourceRow: function resourceRow() {\n return resourceMatrixRenderer(gantt);\n },\n resourceHistogram: function resourceHistogram() {\n return resourceHistogramRenderer(gantt);\n },\n gridTaskRowResizer: function gridTaskRowResizer() {\n return gridTaskRowResizerRenderer(gantt);\n }\n },\n layersService: {\n getDataRender: function getDataRender(name) {\n return layersEngine.getDataRender(name, gantt);\n },\n createDataRender: function createDataRender(config) {\n return layersEngine.createDataRender(config, gantt);\n }\n }\n };\n}\n\nmodule.exports = {\n init: initUI\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar utils = require(\"../../utils/utils\");\n\nvar domHelpers = require(\"./utils/dom_helpers\");\n\nmodule.exports = function (gantt) {\n var boxAttribute = \"data-dhxbox\";\n var _dhx_msg_cfg = null;\n\n function callback(config, result) {\n var usercall = config.callback;\n modalBox.hide(config.box);\n _dhx_msg_cfg = config.box = null;\n if (usercall) usercall(result);\n }\n\n function modal_key(event) {\n if (_dhx_msg_cfg) {\n var code = event.which || event.keyCode;\n var preventDefault = false;\n\n if (messageBox.keyboard) {\n if (code == 13 || code == 32) {\n // default behavior is to confirm/submit popup on space/enter\n // if browser focus is set on button element - do button click instead of default behavior\n var target = event.target || event.srcElement;\n\n if (domHelpers.getClassName(target).indexOf(\"gantt_popup_button\") > -1 && target.click) {\n target.click();\n } else {\n callback(_dhx_msg_cfg, true);\n preventDefault = true;\n }\n }\n\n if (code == 27) {\n callback(_dhx_msg_cfg, false);\n preventDefault = true;\n }\n }\n\n if (preventDefault) {\n if (event.preventDefault) {\n event.preventDefault();\n }\n\n return !(event.cancelBubble = true);\n }\n\n return;\n }\n }\n\n var eventElement = domHelpers.getRootNode(gantt.$root) || document;\n gantt.event(eventElement, \"keydown\", modal_key, true);\n\n function modality(mode) {\n if (!modality.cover) {\n modality.cover = document.createElement(\"div\"); //necessary for IE only\n\n modality.cover.onkeydown = modal_key;\n modality.cover.className = \"dhx_modal_cover\";\n document.body.appendChild(modality.cover);\n }\n\n modality.cover.style.display = mode ? \"inline-block\" : \"none\";\n }\n\n function button(text, className, result) {\n var buttonAriaAttrs = gantt._waiAria.messageButtonAttrString(text);\n\n var name = className.toLowerCase().replace(/ /g, \"_\");\n var button_css = \"gantt_\" + name + \"_button\";\n return \"<div \" + buttonAriaAttrs + \" class='gantt_popup_button \" + button_css + \"' data-result='\" + result + \"' result='\" + result + \"' ><div>\" + text + \"</div></div>\";\n }\n\n function info(text) {\n if (!messageBox.area) {\n messageBox.area = document.createElement(\"div\");\n messageBox.area.className = \"gantt_message_area\";\n messageBox.area.style[messageBox.position] = \"5px\";\n document.body.appendChild(messageBox.area);\n }\n\n messageBox.hide(text.id);\n var message = document.createElement(\"div\");\n message.innerHTML = \"<div>\" + text.text + \"</div>\";\n message.className = \"gantt-info gantt-\" + text.type;\n\n message.onclick = function () {\n messageBox.hide(text.id);\n text = null;\n };\n\n gantt._waiAria.messageInfoAttr(message);\n\n if (messageBox.position == \"bottom\" && messageBox.area.firstChild) messageBox.area.insertBefore(message, messageBox.area.firstChild);else messageBox.area.appendChild(message);\n if (text.expire > 0) messageBox.timers[text.id] = window.setTimeout(function () {\n // GS-1213: We need that when Gantt is destroyed\n if (messageBox) messageBox.hide(text.id);\n }, text.expire);\n messageBox.pull[text.id] = message;\n message = null;\n return text.id;\n }\n\n function getFirstDefined() {\n var values = [].slice.apply(arguments, [0]);\n\n for (var i = 0; i < values.length; i++) {\n if (values[i]) {\n return values[i];\n }\n }\n }\n\n function _boxStructure(config, ok, cancel) {\n var box = document.createElement(\"div\");\n var contentId = utils.uid();\n\n gantt._waiAria.messageModalAttr(box, contentId);\n\n box.className = \" gantt_modal_box gantt-\" + config.type;\n box.setAttribute(boxAttribute, 1);\n var inner = '';\n if (config.width) box.style.width = config.width;\n if (config.height) box.style.height = config.height;\n if (config.title) inner += '<div class=\"gantt_popup_title\">' + config.title + '</div>';\n inner += '<div class=\"gantt_popup_text\" id=\"' + contentId + '\"><span>' + (config.content ? '' : config.text) + '</span></div><div class=\"gantt_popup_controls\">';\n if (ok) inner += button(getFirstDefined(config.ok, gantt.locale.labels.message_ok, \"OK\"), \"ok\", true);\n if (cancel) inner += button(getFirstDefined(config.cancel, gantt.locale.labels.message_cancel, \"Cancel\"), \"cancel\", false);\n\n if (config.buttons) {\n for (var i = 0; i < config.buttons.length; i++) {\n var btn = config.buttons[i];\n\n if (_typeof(btn) == \"object\") {\n // Support { label:\"Save\", css:\"main_button\", value:\"save\" }\n var label = btn.label;\n var css = btn.css || \"gantt_\" + btn.label.toLowerCase() + \"_button\";\n var value = btn.value || i;\n inner += button(label, css, value);\n } else {\n inner += button(btn, btn, i);\n }\n }\n }\n\n inner += '</div>';\n box.innerHTML = inner;\n\n if (config.content) {\n var node = config.content;\n if (typeof node == \"string\") node = document.getElementById(node);\n if (node.style.display == 'none') node.style.display = \"\";\n box.childNodes[config.title ? 1 : 0].appendChild(node);\n }\n\n box.onclick = function (event) {\n var source = event.target || event.srcElement;\n if (!source.className) source = source.parentNode;\n\n if (domHelpers.closest(source, \".gantt_popup_button\")) {\n var result = source.getAttribute(\"data-result\");\n result = result == \"true\" || (result == \"false\" ? false : result);\n callback(config, result);\n }\n };\n\n config.box = box;\n if (ok || cancel) _dhx_msg_cfg = config;\n return box;\n }\n\n function _createBox(config, ok, cancel) {\n var box = config.tagName ? config : _boxStructure(config, ok, cancel);\n if (!config.hidden) modality(true);\n document.body.appendChild(box);\n var x = Math.abs(Math.floor(((window.innerWidth || document.documentElement.offsetWidth) - box.offsetWidth) / 2));\n var y = Math.abs(Math.floor(((window.innerHeight || document.documentElement.offsetHeight) - box.offsetHeight) / 2));\n if (config.position == \"top\") box.style.top = \"-3px\";else box.style.top = y + 'px';\n box.style.left = x + 'px'; //necessary for IE only\n\n box.onkeydown = modal_key;\n modalBox.focus(box);\n if (config.hidden) modalBox.hide(box);\n gantt.callEvent(\"onMessagePopup\", [box]);\n return box;\n }\n\n function alertPopup(config) {\n return _createBox(config, true, false);\n }\n\n function confirmPopup(config) {\n return _createBox(config, true, true);\n }\n\n function boxPopup(config) {\n return _createBox(config);\n }\n\n function box_params(text, type, callback) {\n if (_typeof(text) != \"object\") {\n if (typeof type == \"function\") {\n callback = type;\n type = \"\";\n }\n\n text = {\n text: text,\n type: type,\n callback: callback\n };\n }\n\n return text;\n }\n\n function params(text, type, expire, id) {\n if (_typeof(text) != \"object\") text = {\n text: text,\n type: type,\n expire: expire,\n id: id\n };\n text.id = text.id || utils.uid();\n text.expire = text.expire || messageBox.expire;\n return text;\n }\n\n var alertBox = function alertBox() {\n var text = box_params.apply(this, arguments);\n text.type = text.type || \"confirm\";\n return alertPopup(text);\n };\n\n var confirmBox = function confirmBox() {\n var text = box_params.apply(this, arguments);\n text.type = text.type || \"alert\";\n return confirmPopup(text);\n };\n\n var modalBox = function modalBox() {\n var text = box_params.apply(this, arguments);\n text.type = text.type || \"alert\";\n return boxPopup(text);\n };\n\n modalBox.hide = function (node) {\n while (node && node.getAttribute && !node.getAttribute(boxAttribute)) {\n node = node.parentNode;\n }\n\n if (node) {\n node.parentNode.removeChild(node);\n modality(false);\n gantt.callEvent(\"onAfterMessagePopup\", [node]);\n }\n };\n\n modalBox.focus = function (node) {\n setTimeout(function () {\n var focusable = domHelpers.getFocusableNodes(node);\n\n if (focusable.length) {\n if (focusable[0].focus) focusable[0].focus();\n }\n }, 1);\n };\n\n var messageBox = function messageBox(text, type, expire, id) {\n text = params.apply(this, arguments);\n text.type = text.type || \"info\";\n var subtype = text.type.split(\"-\")[0];\n\n switch (subtype) {\n case \"alert\":\n return alertPopup(text);\n\n case \"confirm\":\n return confirmPopup(text);\n\n case \"modalbox\":\n return boxPopup(text);\n\n default:\n return info(text);\n }\n };\n\n messageBox.seed = new Date().valueOf();\n messageBox.uid = utils.uid;\n messageBox.expire = 4000;\n messageBox.keyboard = true;\n messageBox.position = \"top\";\n messageBox.pull = {};\n messageBox.timers = {};\n\n messageBox.hideAll = function () {\n for (var key in messageBox.pull) {\n messageBox.hide(key);\n }\n };\n\n messageBox.hide = function (id) {\n var obj = messageBox.pull[id];\n\n if (obj && obj.parentNode) {\n window.setTimeout(function () {\n obj.parentNode.removeChild(obj);\n obj = null;\n }, 2000);\n obj.className += \" hidden\";\n if (messageBox.timers[id]) window.clearTimeout(messageBox.timers[id]);\n delete messageBox.pull[id];\n }\n };\n\n var popups = [];\n gantt.attachEvent(\"onMessagePopup\", function (box) {\n popups.push(box);\n });\n gantt.attachEvent(\"onAfterMessagePopup\", function (box) {\n for (var i = 0; i < popups.length; i++) {\n if (popups[i] === box) {\n popups.splice(i, 1);\n i--;\n }\n }\n });\n gantt.attachEvent(\"onDestroy\", function () {\n if (modality.cover && modality.cover.parentNode) {\n modality.cover.parentNode.removeChild(modality.cover);\n }\n\n for (var i = 0; i < popups.length; i++) {\n if (popups[i].parentNode) {\n popups[i].parentNode.removeChild(popups[i]);\n }\n }\n\n popups = null;\n\n if (messageBox.area && messageBox.area.parentNode) {\n messageBox.area.parentNode.removeChild(messageBox.area);\n }\n\n messageBox = null;\n });\n return {\n alert: alertBox,\n confirm: confirmBox,\n message: messageBox,\n modalbox: modalBox\n };\n};","module.exports = function (gantt) {\n var utils = require(\"../utils/utils\");\n\n var env = require(\"../utils/env\");\n\n var isHeadless = require(\"../utils/is_headless\");\n\n if (!env.isNode) {\n var domHelpers = require(\"./ui/utils/dom_helpers\");\n\n var codeHelpers = require(\"../utils/helpers\");\n\n gantt.utils = {\n arrayFind: codeHelpers.arrayFind,\n dom: domHelpers\n };\n\n var domEvents = require(\"./ui/utils/dom_event_scope\")();\n\n gantt.event = domEvents.attach;\n gantt.eventRemove = domEvents.detach;\n gantt._eventRemoveAll = domEvents.detachAll;\n gantt._createDomEventScope = domEvents.extend;\n utils.mixin(gantt, require(\"./ui/message\")(gantt));\n\n var uiApi = require(\"./ui/index\").init(gantt);\n\n gantt.$ui = uiApi.factory;\n gantt.$ui.layers = uiApi.render;\n gantt.$mouseEvents = uiApi.mouseEvents;\n gantt.$services.setService(\"mouseEvents\", function () {\n return gantt.$mouseEvents;\n });\n gantt.mixin(gantt, uiApi.layersApi);\n\n require(\"./data_task_layers\")(gantt);\n\n gantt.$services.setService(\"layers\", function () {\n return uiApi.layersService;\n });\n\n var createLayoutFacade = require(\"./facades/layout\");\n\n gantt.mixin(gantt, createLayoutFacade());\n\n require(\"./ui/skin\")(gantt);\n\n require(\"../css/skins/skyblue\")(gantt);\n\n require(\"../css/skins/meadow\")(gantt);\n\n require(\"../css/skins/terrace\")(gantt);\n\n require(\"../css/skins/broadway\")(gantt);\n\n require(\"../css/skins/material\")(gantt);\n\n require(\"../css/skins/contrast_black\")(gantt);\n\n require(\"../css/skins/contrast_white\")(gantt);\n\n require(\"./ui/plugins\")(gantt);\n\n require(\"./ui/touch\")(gantt);\n\n require(\"./ui/lightbox\")(gantt);\n\n require(\"./ui/lightbox/lightbox_optional_time\")(gantt);\n\n require(\"./ui/wai_aria\")(gantt);\n\n gantt.locate = function (e) {\n var trg = domHelpers.getTargetNode(e); // ignore empty rows/cells of the timeline\n\n if (domHelpers.closest(trg, \".gantt_task_row\")) {\n return null;\n }\n\n var targetAttribute = arguments[1] || this.config.task_attribute;\n var node = domHelpers.locateAttribute(trg, targetAttribute);\n\n if (node) {\n return node.getAttribute(targetAttribute);\n } else {\n return null;\n }\n };\n\n gantt._locate_css = function (e, classname, strict) {\n return domHelpers.locateClassName(e, classname, strict);\n };\n\n gantt._locateHTML = function (e, attribute) {\n return domHelpers.locateAttribute(e, attribute || this.config.task_attribute);\n };\n }\n\n gantt.attachEvent(\"onParse\", function () {\n if (!isHeadless(gantt)) {\n gantt.attachEvent(\"onGanttRender\", function () {\n if (gantt.config.initial_scroll) {\n var firstTask = gantt.getTaskByIndex(0);\n var id = firstTask ? firstTask.id : gantt.config.root_id; // GS-1450. Don't scroll to the task if there is no timeline\n\n if (gantt.isTaskExists(id) && gantt.$task && gantt.utils.dom.isChildOf(gantt.$task, gantt.$container)) {\n gantt.showTask(id);\n }\n }\n }, {\n once: true\n });\n }\n });\n gantt.attachEvent(\"onBeforeGanttReady\", function () {\n if (!this.config.scroll_size) this.config.scroll_size = domHelpers.getScrollSize() || 1;\n\n if (!isHeadless(gantt)) {\n // detach listeners before clearing old DOM, possible IE errors when accessing detached nodes\n this._eventRemoveAll();\n\n this.$mouseEvents.reset();\n this.resetLightbox();\n }\n }); // GS-1261: scroll the views to the right side when RTL is enabled\n\n gantt.attachEvent(\"onGanttReady\", function () {\n if (!isHeadless(gantt) && gantt.config.rtl) {\n gantt.$layout.getCellsByType(\"viewCell\").forEach(function (cell) {\n var attachedScrollbar = cell.$config.scrollX;\n if (!attachedScrollbar) return;\n var scrollbar = gantt.$ui.getView(attachedScrollbar);\n if (scrollbar) scrollbar.scrollTo(scrollbar.$config.scrollSize, 0);\n });\n }\n }); // GS-1649: check if extensions are connected via files\n\n gantt.attachEvent(\"onGanttReady\", function () {\n if (!isHeadless(gantt)) {\n var activePlugins = gantt.plugins();\n var availablePlugins = {\n auto_scheduling: gantt.autoSchedule,\n click_drag: gantt.ext.clickDrag,\n critical_path: gantt.isCriticalTask,\n drag_timeline: gantt.ext.dragTimeline,\n export_api: gantt.exportToPDF,\n fullscreen: gantt.ext.fullscreen,\n grouping: gantt.groupBy,\n keyboard_navigation: gantt.ext.keyboardNavigation,\n marker: gantt.addMarker,\n multiselect: gantt.eachSelectedTask,\n overlay: gantt.ext.overlay,\n quick_info: gantt.templates.quick_info_content,\n tooltip: gantt.ext.tooltips,\n undo: gantt.undo\n };\n\n for (var plugin in availablePlugins) {\n if (availablePlugins[plugin] && !activePlugins[plugin]) {\n // eslint-disable-next-line no-console\n console.warn(\"You connected the '\".concat(plugin, \"' extension via an obsolete file. \\nTo fix it, you need to remove the obsolete file and connect the extension via the plugins method: https://docs.dhtmlx.com/gantt/api__gantt_plugins.html\"));\n }\n }\n }\n });\n};","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"小褨褔械薪褜\", \"袥褞褌懈泄\", \"袘械褉械蟹械薪褜\", \"袣胁褨褌械薪褜\", \"孝褉邪胁械薪褜\", \"效械褉胁械薪褜\", \"袥懈锌械薪褜\", \"小械褉锌械薪褜\", \"袙械褉械褋械薪褜\", \"袞芯胁褌械薪褜\", \"袥懈褋褌芯锌邪写\", \"袚褉褍写械薪褜\"],\r\n\t\tmonth_short: [\"小褨褔\", \"袥褞褌\", \"袘械褉\", \"袣胁褨\", \"孝褉邪\", \"效械褉\", \"袥懈锌\", \"小械褉\", \"袙械褉\", \"袞芯胁\", \"袥懈褋\", \"袚褉褍\"],\r\n\t\tday_full: [\"袧械写褨谢褟\", \"袩芯薪械写褨谢芯泻\", \"袙褨胁褌芯褉芯泻\", \"小械褉械写邪\", \"效械褌胁械褉\", \"袩'褟褌薪懈褑褟\", \"小褍斜芯褌邪\"],\r\n\t\tday_short: [\"袧械写\", \"袩芯薪\", \"袙褨胁\", \"小械褉\", \"效械褌\", \"袩褌薪\", \"小褍斜\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"袧芯胁械 蟹邪胁写邪薪薪褟\",\r\n\t\ticon_save: \"袟斜械褉械谐褌懈\",\r\n\t\ticon_cancel: \"袙褨写屑褨薪邪\",\r\n\t\ticon_details: \"袛械褌邪谢褨\",\r\n\t\ticon_edit: \"袪械写邪谐褍胁邪褌懈\",\r\n\t\ticon_delete: \"袙懈谢褍褔懈褌懈\",\r\n\t\tconfirm_closing: \"\", // 袙邪褕褨 蟹屑褨薪懈 胁褌褉邪褌褟褌褜褋褟. 袙懈 胁锌械胁薪械薪褨 ?\r\n\t\tconfirm_deleting: \"袩芯写褨褟 胁懈谢褍褔懈褌褜褋褟 薪邪蟹邪胁卸写懈. 袙懈 胁锌械胁薪械薪褨?\",\r\n\t\tsection_description: \"袨锌懈褋\",\r\n\t\tsection_time: \"效邪褋芯胁懈泄 锌褉芯屑褨卸芯泻\",\r\n\t\tsection_type: \"孝懈锌\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"袙褨写屑褨薪邪\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n * updated by @levkar at https://github.com/DHTMLX/gantt/pull/10\r\n */\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Ocak\", \"艦ubat\", \"Mart\", \"Nisan\", \"May谋s\", \"Haziran\", \"Temmuz\", \"A臒ustos\", \"Eyl眉l\", \"Ekim\", \"Kas谋m\", \"Aral谋k\"],\r\n\t\tmonth_short: [\"Oca\", \"艦ub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A臒u\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\r\n\t\tday_full: [\"Pazar\", \"Pazartesi\", \"Sal谋\", \"脟ar艧amba\", \"Per艧embe\", \"Cuma\", \"Cumartesi\"],\r\n\t\tday_short: [\"Paz\", \"Pzt\", \"Sal\", \"脟ar\", \"Per\", \"Cum\", \"Cmt\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Yeni g枚rev\",\r\n\t\ticon_save: \"Kaydet\",\r\n\t\ticon_cancel: \"陌ptal\",\r\n\t\ticon_details: \"Detaylar\",\r\n\t\ticon_edit: \"D眉zenle\",\r\n\t\ticon_delete: \"Sil\",\r\n\t\tconfirm_closing: \"\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"G枚rev silinecek, emin misiniz?\",\r\n\t\tsection_description: \"A莽谋klama\",\r\n\t\tsection_time: \"Zaman Aral谋臒谋\",\r\n\t\tsection_type: \"Tip\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"G枚rev Ad谋\",\r\n\t\tcolumn_start_date: \"Ba艧lang谋莽\",\r\n\t\tcolumn_duration: \"S眉re\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Ba臒lant谋\",\r\n\t\tconfirm_link_deleting: \"silinecek\",\r\n\t\tlink_start: \" (ba艧lang谋莽)\",\r\n\t\tlink_end: \" (biti艧)\",\r\n\r\n\t\ttype_task: \"G枚rev\",\r\n\t\ttype_project: \"Proje\",\r\n\t\ttype_milestone: \"Kilometreta艧谋\",\r\n\r\n\r\n\t\tminutes: \"Dakika\",\r\n\t\thours: \"Saat\",\r\n\t\tdays: \"G眉n\",\r\n\t\tweeks: \"Hafta\",\r\n\t\tmonths: \"Ay\",\r\n\t\tyears: \"Y谋l\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"脻ptal\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n\tTranslation by Peter Eriksson\r\n */\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Januari\", \"Februari\", \"Mars\", \"April\", \"Maj\", \"Juni\", \"Juli\", \"Augusti\", \"September\", \"Oktober\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Maj\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"S枚ndag\", \"M氓ndag\", \"Tisdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"L枚rdag\"],\r\n\t\tday_short: [\"S枚n\", \"M氓n\", \"Tis\", \"Ons\", \"Tor\", \"Fre\", \"L枚r\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Ny uppgift\",\r\n\t\ticon_save: \"Spara\",\r\n\t\ticon_cancel: \"Avbryt\",\r\n\t\ticon_details: \"Detajer\",\r\n\t\ticon_edit: \"脛ndra\",\r\n\t\ticon_delete: \"Ta bort\",\r\n\t\tconfirm_closing: \"\",\r\n\t\tconfirm_deleting: \"脛r du s盲ker p氓 att du vill ta bort h盲ndelsen permanent?\",\r\n\t\tsection_description: \"Beskrivning\",\r\n\t\tsection_time: \"Tid\",\r\n\t\tsection_type: \"Typ\",\r\n\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Uppgiftsnamn\",\r\n\t\tcolumn_start_date: \"Starttid\",\r\n\t\tcolumn_duration: \"Varaktighet\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\r\n\t\tlink: \"L盲nk\",\r\n\t\tconfirm_link_deleting: \"kommer tas bort\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (slut)\",\r\n\t\ttype_task: \"Uppgift\",\r\n\t\ttype_project: \"Projekt\",\r\n\t\ttype_milestone: \"Milstolpe\",\r\n\r\n\t\tminutes: \"Minuter\",\r\n\t\thours: \"Timmar\",\r\n\t\tdays: \"Dagar\",\r\n\t\tweeks: \"Veckor\",\r\n\t\tmonths: \"M氓nader\",\r\n\t\tyears: \"脜r\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Avbryt\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Janu谩r\", \"Febru谩r\", \"Marec\", \"Apr铆l\", \"M谩j\", \"J煤n\", \"J煤l\", \"August\", \"September\", \"Okt贸ber\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"M谩j\", \"J煤n\", \"J煤l\", \"Aug\", \"Sept\", \"Okt\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"Nede木a\", \"Pondelok\", \"Utorok\", \"Streda\", \"艩tvrtok\", \"Piatok\", \"Sobota\"],\r\n\t\tday_short: [\"Ne\", \"Po\", \"Ut\", \"St\", \"艩t\", \"Pi\", \"So\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nov谩 煤loha\",\r\n\t\ticon_save: \"Ulo啪i钮\",\r\n\t\ticon_cancel: \"Sp盲钮\",\r\n\t\ticon_details: \"Detail\",\r\n\t\ticon_edit: \"Edituj\",\r\n\t\ticon_delete: \"Zmaza钮\",\r\n\t\tconfirm_closing: \"Va拧e zmeny nebud煤 ulo啪en茅. Skuto膷ne?\", // Va拧e zm臎ny budou ztraceny, opravdu ?\r\n\t\tconfirm_deleting: \"Udalos钮 bude natrvalo vymazan谩. Skuto膷ne?\",\r\n\t\tsection_description: \"Pozn谩mky\",\r\n\t\tsection_time: \"Doba platnosti\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Sp盲钮\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Marec\", \"April\", \"Maj\", \"Junij\", \"Julij\", \"Avgust\", \"September\", \"Oktober\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Maj\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"Nedelja\", \"Ponedeljek\", \"Torek\", \"Sreda\", \"膶etrtek\", \"Petek\", \"Sobota\"],\r\n\t\tday_short: [\"Ned\", \"Pon\", \"Tor\", \"Sre\", \"膶et\", \"Pet\", \"Sob\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nova naloga\",\r\n\t\ticon_save: \"Shrani\",\r\n\t\ticon_cancel: \"Prekli膷i\",\r\n\t\ticon_details: \"Podrobnosti\",\r\n\t\ticon_edit: \"Uredi\",\r\n\t\ticon_delete: \"Izbri拧i\",\r\n\t\tconfirm_closing: \"\", // Spremembe ne bodo shranjene. 沤elite nadaljevati ?\r\n\t\tconfirm_deleting: \"Dogodek bo izbrisan. 沤elite nadaljevati?\",\r\n\t\tsection_description: \"Opis\",\r\n\t\tsection_time: \"膶asovni okvir\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Prekli膷i\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"携薪胁邪褉褜\", \"肖械胁褉邪谢褜\", \"袦邪褉褌\", \"袗锌褉械谢褜\", \"Ma泄\", \"袠褞薪褜\", \"袠褞谢褜\", \"袗胁谐褍褋褌\", \"小械薪褌褟斜褉褜\", \"O泻褌褟斜褉褜\", \"袧芯褟斜褉褜\", \"袛械泻邪斜褉褜\"],\r\n\t\tmonth_short: [\"携薪胁\", \"肖械胁\", \"Ma褉\", \"A锌褉\", \"Ma泄\", \"袠褞薪\", \"袠褞谢\", \"A胁谐\", \"小械薪\", \"袨泻褌\", \"袧芯褟\", \"袛械泻\"],\r\n\t\tday_full: [\"袙芯褋泻褉械褋械薪褜械\", \"袩芯薪械写械谢褜薪懈泻\", \"袙褌芯褉薪懈泻\", \"小褉械写邪\", \"效械褌胁械褉谐\", \"袩褟褌薪懈褑邪\", \"小褍斜斜芯褌邪\"],\r\n\t\tday_short: [\"袙褋\", \"袩薪\", \"袙褌\", \"小褉\", \"效褌\", \"袩褌\", \"小斜\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"袧芯胁芯械 蟹邪写邪薪懈械\",\r\n\t\ticon_save: \"小芯褏褉邪薪懈褌褜\",\r\n\t\ticon_cancel: \"袨褌屑械薪懈褌褜\",\r\n\t\ticon_details: \"袛械褌邪谢懈\",\r\n\t\ticon_edit: \"袠蟹屑械薪懈褌褜\",\r\n\t\ticon_delete: \"校写邪谢懈褌褜\",\r\n\t\tconfirm_closing: \"\", // 袙邪褕懈 懈蟹屑械薪械薪懈褟 斜褍写褍褌 锌芯褌械褉褟薪褘, 锌褉芯写芯谢卸懈褌褜?\r\n\t\tconfirm_deleting: \"小芯斜褘褌懈械 斜褍写械褌 褍写邪谢械薪芯 斜械蟹胁芯蟹胁褉邪褌薪芯, 锌褉芯写芯谢卸懈褌褜?\",\r\n\t\tsection_description: \"袨锌懈褋邪薪懈械\",\r\n\t\tsection_time: \"袩械褉懈芯写 胁褉械屑械薪懈\",\r\n\t\tsection_type: \"孝懈锌\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"袠小袪\",\r\n\t\tcolumn_text: \"袟邪写邪褔邪\",\r\n\t\tcolumn_start_date: \"袧邪褔邪谢芯\",\r\n\t\tcolumn_duration: \"袛谢懈褌械谢褜薪芯褋褌褜\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"小胁褟蟹褜\",\r\n\t\tconfirm_link_deleting: \"斜褍写械褌 褍写邪谢械薪邪\",\r\n\t\tlink_start: \" (薪邪褔邪谢芯)\",\r\n\t\tlink_end: \" (泻芯薪械褑)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"袦懈薪褍褌邪\",\r\n\t\thours: \"效邪褋\",\r\n\t\tdays: \"袛械薪褜\",\r\n\t\tweeks: \"袧械写械谢褟\",\r\n\t\tmonths: \"袦械褋褟褑\",\r\n\t\tyears: \"袚芯写\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"袨褌屑械薪懈褌褜\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"薪邪褔薪懈褌械 胁胁芯写懈褌褜 褋谢芯胁芯 写谢褟 褎懈谢褜褌褉邪褑懈懈\",\r\n\t\tresources_filter_label: \"褋锌褉褟褌邪褌褜 薪械 褍褋褌邪薪芯胁谢械薪薪褘械\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n\tTraducere de Ovidiu Lixandru: http://www.madball.ro\r\n */\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Ianuarie\", \"Februarie\", \"Martie\", \"Aprilie\", \"Mai\", \"Iunie\", \"Iulie\", \"August\", \"Septembrie\", \"Octombrie\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Ian\", \"Feb\", \"Mar\", \"Apr\", \"Mai\", \"Iun\", \"Iul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"Duminica\", \"Luni\", \"Marti\", \"Miercuri\", \"Joi\", \"Vineri\", \"Sambata\"],\r\n\t\tday_short: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sa\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Sarcina noua\",\r\n\t\ticon_save: \"Salveaza\",\r\n\t\ticon_cancel: \"Anuleaza\",\r\n\t\ticon_details: \"Detalii\",\r\n\t\ticon_edit: \"Editeaza\",\r\n\t\ticon_delete: \"Sterge\",\r\n\t\tconfirm_closing: \"Schimbarile nu vor fi salvate, esti sigur?\",// Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"Evenimentul va fi sters permanent, esti sigur?\",\r\n\t\tsection_description: \"Descriere\",\r\n\t\tsection_time: \"Interval\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Anuleaza\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n\r\n TRANSLATION BY MATTHEUS PIROVANI RORIZ GON袟ALVES\r\n\r\n mattheusroriz@hotmail.com / mattheus.pirovani@gmail.com /\r\n\r\n www.atrixian.com.br\r\n\r\n\r\n Updated by Jorge Albernaz Martins\r\n\r\n jorgefox@hotmail.com\r\n\r\n www.redfox.inf.br\r\n\r\n JorgeFox\r\n\r\n*/\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Janeiro\", \"Fevereiro\", \"Mar莽o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\r\n\t\tmonth_short: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\r\n\t\tday_full: [\"Domingo\", \"Segunda\", \"Ter莽a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S谩bado\"],\r\n\t\tday_short: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"Sab\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nova tarefa\",\r\n\t\ticon_save: \"Salvar\",\r\n\t\ticon_cancel: \"Cancelar\",\r\n\t\ticon_details: \"Detalhes\",\r\n\t\ticon_edit: \"Editar\",\r\n\t\ticon_delete: \"Excluir\",\r\n\t\tconfirm_closing: \"\",// Suas altera莽玫es ser茫o perdidas, confirme?\r\n\t\tconfirm_deleting: \"As tarefas ser茫o excluidas permanentemente, confirme?\",\r\n\t\tsection_description: \"Descri莽茫o\",\r\n\t\tsection_time: \"Per铆odo\",\r\n\t\tsection_type: \"Tipo\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"EAP\",\r\n\t\tcolumn_text: \"Nome tarefa\",\r\n\t\tcolumn_start_date: \"Data in铆cio\",\r\n\t\tcolumn_duration: \"Dura莽茫o\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"Ser谩 exclu铆do!\",\r\n\t\tlink_start: \" (in铆cio)\",\r\n\t\tlink_end: \" (fim)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Projeto\",\r\n\t\ttype_milestone: \"Marco\",\r\n\r\n\r\n\t\tminutes: \"Minutos\",\r\n\t\thours: \"Horas\",\r\n\t\tdays: \"Dias\",\r\n\t\tweeks: \"Semanas\",\r\n\t\tmonths: \"Meses\",\r\n\t\tyears: \"Anos\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Cancelar\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Restri莽茫o\",\r\n\t\tconstraint_type: \"Tipo Restri莽茫o\",\r\n\t\tconstraint_date: \"Data restri莽茫o\",\r\n\t\tasap: \"Mais breve poss铆vel\",\r\n\t\talap: \"Mais tarde poss铆vel\",\r\n\t\tsnet: \"N茫o come莽ar antes de\",\r\n\t\tsnlt: \"N茫o come莽ar depois de\",\r\n\t\tfnet: \"N茫o terminar antes de\",\r\n\t\tfnlt: \"N茫o terminar depois de\",\r\n\t\tmso: \"Precisa come莽ar em\",\r\n\t\tmfo: \"Precisa terminar em\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"Tipo de filtros\",\r\n\t\tresources_filter_label: \"Ocultar vazios\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Stycze艅\", \"Luty\", \"Marzec\", \"Kwiecie艅\", \"Maj\", \"Czerwiec\", \"Lipiec\", \"Sierpie艅\", \"Wrzesie艅\", \"Pa藕dziernik\", \"Listopad\", \"Grudzie艅\"],\r\n\t\tmonth_short: [\"Sty\", \"Lut\", \"Mar\", \"Kwi\", \"Maj\", \"Cze\", \"Lip\", \"Sie\", \"Wrz\", \"Pa藕\", \"Lis\", \"Gru\"],\r\n\t\tday_full: [\"Niedziela\", \"Poniedzia艂ek\", \"Wtorek\", \"艢roda\", \"Czwartek\", \"Pi膮tek\", \"Sobota\"],\r\n\t\tday_short: [\"Nie\", \"Pon\", \"Wto\", \"艢ro\", \"Czw\", \"Pi膮\", \"Sob\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nowe zadanie\",\r\n\t\ticon_save: \"Zapisz\",\r\n\t\ticon_cancel: \"Anuluj\",\r\n\t\ticon_details: \"Szczeg贸艂y\",\r\n\t\ticon_edit: \"Edytuj\",\r\n\t\ticon_delete: \"Usu艅\",\r\n\t\tconfirm_closing: \"\", // Zmiany zostan膮 usuni臋te, jeste艣 pewien?\r\n\t\tconfirm_deleting: \"Zdarzenie zostanie usuni臋te na zawsze, kontynuowa膰?\",\r\n\t\tsection_description: \"Opis\",\r\n\t\tsection_time: \"Okres czasu\",\r\n\t\tsection_type: \"Typ\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Nazwa zadania\",\r\n\t\tcolumn_start_date: \"Pocz膮tek\",\r\n\t\tcolumn_duration: \"Czas trwania\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"zostanie usuni臋ty\",\r\n\t\tlink_start: \" (pocz膮tek)\",\r\n\t\tlink_end: \" (koniec)\",\r\n\r\n\t\ttype_task: \"Zadanie\",\r\n\t\ttype_project: \"Projekt\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minuty\",\r\n\t\thours: \"Godziny\",\r\n\t\tdays: \"Dni\",\r\n\t\tweeks: \"Tydzie艅\",\r\n\t\tmonths: \"Miesi膮ce\",\r\n\t\tyears: \"Lata\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Anuluj\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Mars\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Desember\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Des\"],\r\n\t\tday_full: [\"S酶ndag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"L酶rdag\"],\r\n\t\tday_short: [\"S酶n\", \"Man\", \"Tir\", \"Ons\", \"Tor\", \"Fre\", \"L酶r\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Ny oppgave\",\r\n\t\ticon_save: \"Lagre\",\r\n\t\ticon_cancel: \"Avbryt\",\r\n\t\ticon_details: \"Detaljer\",\r\n\t\ticon_edit: \"Endre\",\r\n\t\ticon_delete: \"Slett\",\r\n\t\tconfirm_closing: \"Endringer blir ikke lagret, er du sikker?\", // Endringer blir ikke lagret, er du sikker?\r\n\t\tconfirm_deleting: \"Oppf酶ringen vil bli slettet, er du sikker?\",\r\n\t\tsection_description: \"Beskrivelse\",\r\n\t\tsection_time: \"Tidsperiode\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Avbryt\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Januari\", \"Februari\", \"Maart\", \"April\", \"Mei\", \"Juni\", \"Juli\", \"Augustus\", \"September\", \"Oktober\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"mrt\", \"Apr\", \"Mei\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"Zondag\", \"Maandag\", \"Dinsdag\", \"Woensdag\", \"Donderdag\", \"Vrijdag\", \"Zaterdag\"],\r\n\t\tday_short: [\"Zo\", \"Ma\", \"Di\", \"Wo\", \"Do\", \"Vr\", \"Za\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nieuwe taak\",\r\n\t\ticon_save: \"Opslaan\",\r\n\t\ticon_cancel: \"Annuleren\",\r\n\t\ticon_details: \"Details\",\r\n\t\ticon_edit: \"Bewerken\",\r\n\t\ticon_delete: \"Verwijderen\",\r\n\t\tconfirm_closing: \"\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"Item zal permanent worden verwijderd, doorgaan?\",\r\n\t\tsection_description: \"Beschrijving\",\r\n\t\tsection_time: \"Tijd periode\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Taak omschrijving\",\r\n\t\tcolumn_start_date: \"Startdatum\",\r\n\t\tcolumn_duration: \"Duur\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Koppeling\",\r\n\t\tconfirm_link_deleting: \"zal worden verwijderd\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (eind)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"minuten\",\r\n\t\thours: \"uren\",\r\n\t\tdays: \"dagen\",\r\n\t\tweeks: \"weken\",\r\n\t\tmonths: \"maanden\",\r\n\t\tyears: \"jaren\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Annuleren\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Mars\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Desember\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Des\"],\r\n\t\tday_full: [\"S酶ndag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"L酶rdag\"],\r\n\t\tday_short: [\"S酶n\", \"Mon\", \"Tir\", \"Ons\", \"Tor\", \"Fre\", \"L酶r\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Ny oppgave\",\r\n\t\ticon_save: \"Lagre\",\r\n\t\ticon_cancel: \"Avbryt\",\r\n\t\ticon_details: \"Detaljer\",\r\n\t\ticon_edit: \"Rediger\",\r\n\t\ticon_delete: \"Slett\",\r\n\t\tconfirm_closing: \"\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"Hendelsen vil bli slettet permanent. Er du sikker?\",\r\n\t\tsection_description: \"Beskrivelse\",\r\n\t\tsection_time: \"Tidsperiode\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Avbryt\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","export default class LocaleManager{\r\n\tprivate _locales:{[key:string]: IGanttLocale };\r\n\r\n\tconstructor(config: {[key:string]: IGanttLocale }){\r\n\t\tthis._locales = {};\r\n\t\tfor(const i in config){\r\n\t\t\tthis._locales[i] = config[i];\r\n\t\t}\r\n\t}\r\n\r\n\taddLocale = (name: string, locale: IGanttLocale) => {\r\n\t\tthis._locales[name] = locale;\r\n\t}\r\n\r\n\tgetLocale = (name: string): IGanttLocale => {\r\n\t\treturn this._locales[name];\r\n\t}\r\n}","/*\r\n\tTranslated by cjkim@dbvalley.com\r\n*/\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"1鞗擻", \"2鞗擻", \"3鞗擻", \"4鞗擻", \"5鞗擻", \"6鞗擻", \"7鞗擻", \"8鞗擻", \"9鞗擻", \"10鞗擻", \"11鞗擻", \"12鞗擻"],\r\n\t\tmonth_short: [\"1鞗擻", \"2鞗擻", \"3鞗擻", \"4鞗擻", \"5鞗擻", \"6鞗擻", \"7鞗擻", \"8鞗擻", \"9鞗擻", \"10鞗擻", \"11鞗擻", \"12鞗擻"],\r\n\t\tday_full: [\"鞚检殧鞚糪", \"鞗旍殧鞚糪", \"頇旍殧鞚糪", \"靾橃殧鞚糪", \"氇╈殧鞚糪", \"旮堨殧鞚糪", \"韱犾殧鞚糪"],\r\n\t\tday_short: [\"鞚糪", \"鞗擻", \"頇擻", \"靾榎", \"氇‐", \"旮圽", \"韱燶"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"鞚措鞐嗠姅 鞛戩梾\",\r\n\t\ticon_save: \"鞝�鞛",\r\n\t\ticon_cancel: \"旆唽\",\r\n\t\ticon_details: \"靹鸽秬 靷暛\",\r\n\t\ticon_edit: \"靾橃爼\",\r\n\t\ticon_delete: \"靷牅\",\r\n\t\tconfirm_closing: \"\",\r\n\t\tconfirm_deleting: \"鞛戩梾鞚� 靷牅頃橃嫓瓴犾姷雼堦箤?\",\r\n\t\tsection_description: \"靹る獏\",\r\n\t\tsection_time: \"旮瓣皠\",\r\n\t\tsection_type: \"Type\",\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"鞛戩梾氇匼",\r\n\t\tcolumn_start_date: \"鞁滌瀾鞚糪",\r\n\t\tcolumn_duration: \"旮瓣皠\",\r\n\t\tcolumn_add: \"\",\r\n\t\tlink: \"鞝勳牅\",\r\n\t\tconfirm_link_deleting: \"靷牅 頃橃嫓瓴犾姷雼堦箤?\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\t\ttype_task: \"鞛戩梾\",\r\n\t\ttype_project: \"頂勲鞝濏姼\",\r\n\t\ttype_milestone: \"毵堨澕鞀ろ啢\",\r\n\t\tminutes: \"攵刓",\r\n\t\thours: \"鞁滉皠\",\r\n\t\tdays: \"鞚糪",\r\n\t\tweeks: \"欤糪",\r\n\t\tmonths: \"雼琝",\r\n\t\tyears: \"雲刓",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"旆唽\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n Translation by Genexus Japan Inc.\r\n */\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"1鏈圽", \"2鏈圽", \"3鏈圽", \"4鏈圽", \"5鏈圽", \"6鏈圽", \"7鏈圽", \"8鏈圽", \"9鏈圽", \"10鏈圽", \"11鏈圽", \"12鏈圽"],\r\n\t\tmonth_short: [\"1鏈圽", \"2鏈圽", \"3鏈圽", \"4鏈圽", \"5鏈圽", \"6鏈圽", \"7鏈圽", \"8鏈圽", \"9鏈圽", \"10鏈圽", \"11鏈圽", \"12鏈圽"],\r\n\t\tday_full: [\"鏃ユ洔鏃", \"鏈堟洔鏃", \"鐏洔鏃", \"姘存洔鏃", \"鏈ㄦ洔鏃", \"閲戞洔鏃", \"鍦熸洔鏃"],\r\n\t\tday_short: [\"鏃", \"鏈圽", \"鐏玕", \"姘碶", \"鏈╘", \"閲慭", \"鍦焅"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"鏂般仐銇勪粫浜媆",\r\n\t\ticon_save: \"淇濆瓨\",\r\n\t\ticon_cancel: \"銈儯銉炽偦銉玕",\r\n\t\ticon_details: \"瑭崇窗\",\r\n\t\ticon_edit: \"绶ㄩ泦\",\r\n\t\ticon_delete: \"鍓婇櫎\",\r\n\t\tconfirm_closing: \"\", // 澶夋洿銇屽彇銈婃秷銇曘倢銇俱仚銆佸疁銇椼亜銇с仚銇嬶紵\r\n\t\tconfirm_deleting: \"銈ゃ儥銉炽儓瀹屽叏銇墛闄ゃ仌銈屻伨銇欍�佸疁銇椼亜銇с仚銇嬶紵\",\r\n\t\tsection_description: \"銉囥偣銈儶銉椼偡銉с兂\",\r\n\t\tsection_time: \"鏈熼枔\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"銈儯銉炽偦銉玕",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n Update 29/12/2015:\r\n New labels translation by ARCANGELI CLAUDIO\r\n\r\n */\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Gennaio\", \"Febbraio\", \"Marzo\", \"Aprile\", \"Maggio\", \"Giugno\", \"Luglio\", \"Agosto\", \"Settembre\", \"Ottobre\", \"Novembre\", \"Dicembre\"],\r\n\t\tmonth_short: [\"Gen\", \"Feb\", \"Mar\", \"Apr\", \"Mag\", \"Giu\", \"Lug\", \"Ago\", \"Set\", \"Ott\", \"Nov\", \"Dic\"],\r\n\t\tday_full: [\"Domenica\", \"Luned矛\", \"Marted矛\", \"Mercoled矛\", \"Gioved矛\", \"Venerd矛\", \"Sabato\"],\r\n\t\tday_short: [\"Dom\", \"Lun\", \"Mar\", \"Mer\", \"Gio\", \"Ven\", \"Sab\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nuovo compito\",\r\n\t\ticon_save: \"Salva\",\r\n\t\ticon_cancel: \"Chiudi\",\r\n\t\ticon_details: \"Dettagli\",\r\n\t\ticon_edit: \"Modifica\",\r\n\t\ticon_delete: \"Elimina\",\r\n\t\tconfirm_closing: \"\",// \"Sei sicuro di confermare la chiusura?\",\r\n\t\tconfirm_deleting: \"Sei sicuro di confermare l'eliminazione?\",\r\n\t\tsection_description: \"Descrizione\",\r\n\t\tsection_time: \"Periodo di tempo\",\r\n\t\tsection_type: \"Tipo\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Nome Attivit脿\",\r\n\t\tcolumn_start_date: \"Inizio\",\r\n\t\tcolumn_duration: \"Durata\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"sar脿 eliminato\",\r\n\t\tlink_start: \" (inizio)\",\r\n\t\tlink_end: \" (fine)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minuti\",\r\n\t\thours: \"Ore\",\r\n\t\tdays: \"Giorni\",\r\n\t\tweeks: \"Settimane\",\r\n\t\tmonths: \"Mesi\",\r\n\t\tyears: \"Anni\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Chiudi\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Januari\", \"Februari\", \"Maret\", \"April\", \"Mei\", \"Juni\", \"Juli\", \"Agustus\", \"September\", \"Oktober\", \"November\", \"Desember\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Mei\", \"Jun\", \"Jul\", \"Ags\", \"Sep\", \"Okt\", \"Nov\", \"Des\"],\r\n\t\tday_full: [\"Minggu\", \"Senin\", \"Selasa\", \"Rabu\", \"Kamis\", \"Jumat\", \"Sabtu\"],\r\n\t\tday_short: [\"Ming\", \"Sen\", \"Sel\", \"Rab\", \"Kam\", \"Jum\", \"Sab\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Tugas baru\",\r\n\t\ticon_save: \"Simpan\",\r\n\t\ticon_cancel: \"Batal\",\r\n\t\ticon_details: \"Detail\",\r\n\t\ticon_edit: \"Edit\",\r\n\t\ticon_delete: \"Hapus\",\r\n\t\tconfirm_closing: \"\", /* Perubahan tidak akan disimpan ? */\r\n\t\tconfirm_deleting: \"Acara akan dihapus\",\r\n\t\tsection_description: \"Keterangan\",\r\n\t\tsection_time: \"Periode\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Batal\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Janu谩r\", \"Febru谩r\", \"M谩rcius\", \"脕prilis\", \"M谩jus\", \"J煤nius\", \"J煤lius\", \"Augusztus\", \"Szeptember\", \"Okt贸ber\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"M谩r\", \"脕pr\", \"M谩j\", \"J煤n\", \"J煤l\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"Vas谩rnap\", \"H茅tf玫\", \"Kedd\", \"Szerda\", \"Cs眉t枚rt枚k\", \"P茅ntek\", \"szombat\"],\r\n\t\tday_short: [\"Va\", \"H茅\", \"Ke\", \"Sze\", \"Cs眉\", \"P茅\", \"Szo\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"脷j feladat\",\r\n\t\ticon_save: \"Ment茅s\",\r\n\t\ticon_cancel: \"M茅gse\",\r\n\t\ticon_details: \"R茅szletek\",\r\n\t\ticon_edit: \"Szerkeszt茅s\",\r\n\t\ticon_delete: \"T枚rl茅s\",\r\n\t\tconfirm_closing: \"\", // A v谩ltoz谩sok elvesznek, biztosan folytatja? \"\r\n\t\tconfirm_deleting: \"Az esem茅ny t枚r枚lve lesz, biztosan folytatja?\",\r\n\t\tsection_description: \"Le铆r谩s\",\r\n\t\tsection_time: \"Id玫szak\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"M茅gse\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n Translation by Davor\r\n http://docs.dhtmlx.com/gantt/desktop__localization.html#comment-2569116291\r\n */\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Sije膷anj\", \"Velja膷a\", \"O啪ujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\r\n\t\tmonth_short: [\"Sij\", \"Velj\", \"O啪u\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\r\n\t\tday_full: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"膶etvrtak\", \"Petak\", \"Subota\"],\r\n\t\tday_short: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"膶et\", \"Pet\", \"Sub\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Novi Zadatak\",\r\n\t\ticon_save: \"Spremi\",\r\n\t\ticon_cancel: \"Odustani\",\r\n\t\ticon_details: \"Detalji\",\r\n\t\ticon_edit: \"Izmjeni\",\r\n\t\ticon_delete: \"Obri拧i\",\r\n\t\tconfirm_closing: \"\",\r\n\t\tconfirm_deleting: \"Zadatak 膰e biti trajno izbrisan, jeste li sigurni?\",\r\n\t\tsection_description: \"Opis\",\r\n\t\tsection_time: \"Vremenski Period\",\r\n\t\tsection_type: \"Tip\",\r\n\r\n\t\t/* grid columns */\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Naziv Zadatka\",\r\n\t\tcolumn_start_date: \"Po膷etno Vrijeme\",\r\n\t\tcolumn_duration: \"Trajanje\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Poveznica\",\r\n\t\tconfirm_link_deleting: \"膰e biti izbrisan\",\r\n\t\tlink_start: \" (po膷etak)\",\r\n\t\tlink_end: \" (kraj)\",\r\n\r\n\t\ttype_task: \"Zadatak\",\r\n\t\ttype_project: \"Projekt\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\t\tminutes: \"Minute\",\r\n\t\thours: \"Sati\",\r\n\t\tdays: \"Dani\",\r\n\t\tweeks: \"Tjedni\",\r\n\t\tmonths: \"Mjeseci\",\r\n\t\tyears: \"Godine\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Odustani\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"讬谞讜讗专\", \"驻讘专讜讗专\", \"诪专抓\", \"讗驻专讬诇\", \"诪讗讬\", \"讬讜谞讬\", \"讬讜诇讬\", \"讗讜讙讜住讟\", \"住驻讟诪讘专\", \"讗讜拽讟讜讘专\", \"谞讜讘诪讘专\", \"讚爪诪讘专\"],\r\n\t\tmonth_short: [\"讬谞讜\", \"驻讘专\", \"诪专抓\", \"讗驻专\", \"诪讗讬\", \"讬讜谞\", \"讬讜诇\", \"讗讜讙\", \"住驻讟\", \"讗讜拽\", \"谞讜讘\", \"讚爪诪\"],\r\n\t\tday_full: [\"专讗砖讜谉\", \"砖谞讬\", \"砖诇讬砖讬\", \"专讘讬注讬\", \"讞诪讬砖讬\", \"砖讬砖讬\", \"砖讘转\"],\r\n\t\tday_short: [\"讗\", \"讘\", \"讙\", \"讚\", \"讛\", \"讜\", \"砖\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"诪砖讬诪讛 讞讚砖\",\r\n\t\ticon_save: \"砖诪讜专\",\r\n\t\ticon_cancel: \"讘讟诇\",\r\n\t\ticon_details: \"驻专讟讬诐\",\r\n\t\ticon_edit: \"注专讜讱\",\r\n\t\ticon_delete: \"诪讞拽\",\r\n\t\tconfirm_closing: \"\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"讗专讜注 讬诪讞拽 住讜驻讬转.诇讛诪砖讬讱?\",\r\n\t\tsection_description: \"讛住讘专\",\r\n\t\tsection_time: \"转拽讜驻讛\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"讘讟诇\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Janvier\", \"F茅vrier\", \"Mars\", \"Avril\", \"Mai\", \"Juin\", \"Juillet\", \"Ao没t\", \"Septembre\", \"Octobre\", \"Novembre\", \"D茅cembre\"],\r\n\t\tmonth_short: [\"Jan\", \"F茅v\", \"Mar\", \"Avr\", \"Mai\", \"Juin\", \"Juil\", \"Ao没\", \"Sep\", \"Oct\", \"Nov\", \"D茅c\"],\r\n\t\tday_full: [\"Dimanche\", \"Lundi\", \"Mardi\", \"Mercredi\", \"Jeudi\", \"Vendredi\", \"Samedi\"],\r\n\t\tday_short: [\"Dim\", \"Lun\", \"Mar\", \"Mer\", \"Jeu\", \"Ven\", \"Sam\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nouvelle t芒che\",\r\n\t\ticon_save: \"Enregistrer\",\r\n\t\ticon_cancel: \"Annuler\",\r\n\t\ticon_details: \"D茅tails\",\r\n\t\ticon_edit: \"Modifier\",\r\n\t\ticon_delete: \"Effacer\",\r\n\t\tconfirm_closing: \"\",// Vos modifications seront perdus, 锚tes-vous s没r ?\r\n\t\tconfirm_deleting: \"L'茅v茅nement sera effac茅 sans appel, 锚tes-vous s没r ?\",\r\n\r\n\t\tsection_description: \"Description\",\r\n\t\tsection_time: \"P茅riode\",\r\n\t\tsection_type: \"Type\",\r\n\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"OTP\",\r\n\t\tcolumn_text: \"Nom de la t芒che\",\r\n\t\tcolumn_start_date: \"Date initiale\",\r\n\t\tcolumn_duration: \"Dur茅e\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Le lien\",\r\n\t\tconfirm_link_deleting: \"sera supprim茅\",\r\n\t\tlink_start: \"(d茅but)\",\r\n\t\tlink_end: \"(fin)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Heures\",\r\n\t\tdays: \"Jours\",\r\n\t\tweeks: \"Semaines\",\r\n\t\tmonths: \"Mois\",\r\n\t\tyears: \"Ann茅es\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Annuler\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Tammikuu\", \"Helmikuu\", \"Maaliskuu\", \"Huhtikuu\", \"Toukokuu\", \"Kesäkuu\", \"Heinäkuu\", \"Elokuu\", \"Syyskuu\", \"Lokakuu\", \"Marraskuu\", \"Joulukuu\"],\r\n\t\tmonth_short: [\"Tam\", \"Hel\", \"Maa\", \"Huh\", \"Tou\", \"Kes\", \"Hei\", \"Elo\", \"Syy\", \"Lok\", \"Mar\", \"Jou\"],\r\n\t\tday_full: [\"Sunnuntai\", \"Maanantai\", \"Tiistai\", \"Keskiviikko\", \"Torstai\", \"Perjantai\", \"Lauantai\"],\r\n\t\tday_short: [\"Su\", \"Ma\", \"Ti\", \"Ke\", \"To\", \"Pe\", \"La\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Uusi teht盲v盲\",\r\n\t\ticon_save: \"Tallenna\",\r\n\t\ticon_cancel: \"Peru\",\r\n\t\ticon_details: \"Tiedot\",\r\n\t\ticon_edit: \"Muokkaa\",\r\n\t\ticon_delete: \"Poista\",\r\n\t\tconfirm_closing: \"\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"Haluatko varmasti poistaa tapahtuman?\",\r\n\t\tsection_description: \"Kuvaus\",\r\n\t\tsection_time: \"Aikajakso\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Peru\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n dhtmlxGantt Persian (Farsi, fa_IR) locale by Mohammad Shokri http://slashsbin.com/\r\n */\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\r\n\t\t\t\"跇丕賳賵蹖賴\",\r\n\t\t\t\"賮賵乇蹖賴\",\r\n\t\t\t\"賲丕乇爻\",\r\n\t\t\t\"丌賵乇蹖賱\",\r\n\t\t\t\"賲賴\",\r\n\t\t\t\"跇賵卅賳\",\r\n\t\t\t\"跇賵卅蹖賴\",\r\n\t\t\t\"丕賵鬲\",\r\n\t\t\t\"爻倬鬲丕賲亘乇\",\r\n\t\t\t\"丕讴鬲亘乇\",\r\n\t\t\t\"賳賵丕賲亘乇\",\r\n\t\t\t\"丿爻丕賲亘乇\"\r\n\t\t],\r\n\t\tmonth_short: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"],\r\n\t\tday_full: [\r\n\t\t\t\"賷讴卮賳亘賴\",\r\n\t\t\t\"丿賵卮賳亘賴\",\r\n\t\t\t\"爻賴鈥屫促嗀ㄙ嘰",\r\n\t\t\t\"趩賴丕乇卮賳亘賴\",\r\n\t\t\t\"倬賳噩卮賳亘賴\",\r\n\t\t\t\"噩賲毓賴\",\r\n\t\t\t\"卮賳亘賴\"\r\n\t\t],\r\n\t\tday_short: [\r\n\t\t\t\"蹖\",\r\n\t\t\t\"丿\",\r\n\t\t\t\"爻\",\r\n\t\t\t\"趩\",\r\n\t\t\t\"倬\",\r\n\t\t\t\"噩\",\r\n\t\t\t\"卮\"\r\n\t\t]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"賵馗蹖賮賴 噩丿蹖丿\",\r\n\t\ticon_save: \"匕禺蹖乇賴\",\r\n\t\ticon_cancel: \"賱睾賵\",\r\n\t\ticon_details: \"噩夭蹖蹖丕鬲\",\r\n\t\ticon_edit: \"賵蹖乇丕蹖卮\",\r\n\t\ticon_delete: \"丨匕賮\",\r\n\t\tconfirm_closing: \"鬲睾蹖蹖乇丕鬲 卮賲丕 丕夭丿爻鬲 禺賵丕賴丿 乇賮鬲貙 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿責\",\r\n\t\tconfirm_deleting: \"丕蹖賳 賲賵乇丿 亘乇丕蹖 賴賲蹖卮賴 丨匕賮 禺賵丕賴丿 卮丿貙 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿責\",\r\n\t\tsection_description: \"鬲賵囟蹖丨丕鬲\",\r\n\t\tsection_time: \"賲丿鬲 夭賲丕賳\",\r\n\t\tsection_type: \"賳賵毓\",\r\n\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"毓賳賵丕賳\",\r\n\t\tcolumn_start_date: \"夭賲丕賳 卮乇賵毓\",\r\n\t\tcolumn_duration: \"賲丿鬲\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"丕乇鬲亘丕胤\",\r\n\t\tconfirm_link_deleting: \"丨匕賮 禺賵丕賴丿 卮丿\",\r\n\t\tlink_start: \" (丌睾丕夭)\",\r\n\t\tlink_end: \" (倬丕蹖丕賳)\",\r\n\r\n\t\ttype_task: \"賵馗蹖賮賴\",\r\n\t\ttype_project: \"倬乇賵跇賴\",\r\n\t\ttype_milestone: \"賳诏丕乇卮\",\r\n\r\n\t\tminutes: \"丿賯丕蹖賯\",\r\n\t\thours: \"爻丕毓丕鬲\",\r\n\t\tdays: \"乇賵夭賴丕\",\r\n\t\tweeks: \"賴賮鬲賴\",\r\n\t\tmonths: \"賲丕賴鈥屬囏",\r\n\t\tyears: \"爻丕賱鈥屬囏",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"鬲丕蹖蹖丿\",\r\n\t\tmessage_cancel: \"賱睾賵\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n @Autor Manuel Fernandez Panzuela - www.mfernandez.es\r\n\r\n Update 30/10/2015:\r\n Translation of new labels by Jorge Macias\r\n https://disqus.com/by/disqus_bTuZk1voC7/\r\n */\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Enero\", \"Febrero\", \"Marzo\", \"Abril\", \"Mayo\", \"Junio\", \"Julio\", \"Agosto\", \"Septiembre\", \"Octubre\", \"Noviembre\", \"Diciembre\"],\r\n\t\tmonth_short: [\"Ene\", \"Feb\", \"Mar\", \"Abr\", \"May\", \"Jun\", \"Jul\", \"Ago\", \"Sep\", \"Oct\", \"Nov\", \"Dic\"],\r\n\t\tday_full: [\"Domingo\", \"Lunes\", \"Martes\", \"Mi茅rcoles\", \"Jueves\", \"Viernes\", \"S谩bado\"],\r\n\t\tday_short: [\"Dom\", \"Lun\", \"Mar\", \"Mi茅\", \"Jue\", \"Vie\", \"S谩b\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nueva tarea\",\r\n\t\ticon_save: \"Guardar\",\r\n\t\ticon_cancel: \"Cancelar\",\r\n\t\ticon_details: \"Detalles\",\r\n\t\ticon_edit: \"Editar\",\r\n\t\ticon_delete: \"Eliminar\",\r\n\t\tconfirm_closing: \"\", // \"Sus cambios se perder谩n, continuar ?\"\r\n\t\tconfirm_deleting: \"El evento se borrar谩 definitivamente, 驴continuar?\",\r\n\t\tsection_description: \"Descripci贸n\",\r\n\t\tsection_time: \"Per铆odo\",\r\n\t\tsection_type: \"Tipo\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"EDT\",\r\n\t\tcolumn_text: \"Tarea\",\r\n\t\tcolumn_start_date: \"Inicio\",\r\n\t\tcolumn_duration: \"Duraci贸n\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Enlace\",\r\n\t\tconfirm_link_deleting: \"ser谩 borrada\",\r\n\t\tlink_start: \" (inicio)\",\r\n\t\tlink_end: \" (fin)\",\r\n\r\n\t\ttype_task: \"Tarea\",\r\n\t\ttype_project: \"Proyecto\",\r\n\t\ttype_milestone: \"Hito\",\r\n\r\n\r\n\t\tminutes: \"Minutos\",\r\n\t\thours: \"Horas\",\r\n\t\tdays: \"D铆as\",\r\n\t\tweeks: \"Semanas\",\r\n\t\tmonths: \"Meses\",\r\n\t\tyears: \"A帽os\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Cancelar\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\r\n\t\tday_short: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"New task\",\r\n\t\ticon_save: \"Save\",\r\n\t\ticon_cancel: \"Cancel\",\r\n\t\ticon_details: \"Details\",\r\n\t\ticon_edit: \"Edit\",\r\n\t\ticon_delete: \"Delete\",\r\n\t\tconfirm_closing: \"\",// Your changes will be lost, are you sure?\r\n\t\tconfirm_deleting: \"Task will be deleted permanently, are you sure?\",\r\n\t\tsection_description: \"Description\",\r\n\t\tsection_time: \"Time period\",\r\n\t\tsection_type: \"Type\",\r\n\r\n\t\t/* grid columns */\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Cancel\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"螜伪谓慰蠀维蟻喂慰蟼\", \"桅蔚尾蟻慰蠀维蟻喂慰蟼\", \"螠维蟻蟿喂慰蟼\", \"螒蟺蟻委位喂慰蟼\", \"螠维蠆慰蟼\", \"螜慰蠉谓喂慰蟼\", \"螜慰蠉位喂慰蟼\", \"螒蠉纬慰蠀蟽蟿慰蟼\", \"危蔚蟺蟿苇渭尾蟻喂慰蟼\", \"螣魏蟿蠋尾蟻喂慰蟼\", \"螡慰苇渭尾蟻喂慰蟼\", \"螖蔚魏苇渭尾蟻喂慰蟼\"],\r\n\t\tmonth_short: [\"螜螒螡\", \"桅螘螔\", \"螠螒巍\", \"螒螤巍\", \"螠螒螜\", \"螜螣违螡\", \"螜螣违螞\", \"螒违螕\", \"危螘螤\", \"螣螝韦\", \"螡螣螘\", \"螖螘螝\"],\r\n\t\tday_full: [\"螝蠀蟻喂伪魏萎\", \"螖蔚蠀蟿苇蟻伪\", \"韦蟻委蟿畏\", \"韦蔚蟿维蟻蟿畏\", \"螤苇渭蟺蟿畏\", \"螤伪蟻伪蟽魏蔚蠀萎\", \"螝蠀蟻喂伪魏萎\"],\r\n\t\tday_short: [\"螝违\", \"螖螘\", \"韦巍\", \"韦螘\", \"螤螘\", \"螤螒\", \"危螒\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"螡苇伪 蔚蟻纬伪蟽委伪\",\r\n\t\ticon_save: \"螒蟺慰胃萎魏蔚蠀蟽畏\",\r\n\t\ticon_cancel: \"螁魏蠀蟻慰\",\r\n\t\ticon_details: \"螞蔚蟺蟿慰渭苇蟻蔚喂蔚蟼\",\r\n\t\ticon_edit: \"螘蟺蔚尉蔚蟻纬伪蟽委伪\",\r\n\t\ticon_delete: \"螖喂伪纬蟻伪蠁萎\",\r\n\t\tconfirm_closing: \"\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"韦慰 苇蟻纬慰 胃伪 未喂伪纬蟻伪蠁蔚委 慰蟻喂蟽蟿喂魏维. 螛苇位蔚蟿蔚 谓伪 蟽蠀谓蔚蠂委蟽蔚蟿蔚;\",\r\n\t\tsection_description: \"螤蔚蟻喂纬蟻伪蠁萎\",\r\n\t\tsection_time: \"围蟻慰谓喂魏萎 蟺蔚蟻委慰未慰蟼\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"螁魏蠀蟻慰\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\" Januar\", \" Februar\", \" M盲rz \", \" April\", \" Mai\", \" Juni\", \" Juli\", \" August\", \" September \", \" Oktober\", \" November \", \" Dezember\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"M盲r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\r\n\t\tday_full: [\"Sonntag\", \"Montag\", \"Dienstag\", \" Mittwoch\", \" Donnerstag\", \"Freitag\", \"Samstag\"],\r\n\t\tday_short: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Neue Aufgabe\",\r\n\t\ticon_save: \"Speichern\",\r\n\t\ticon_cancel: \"Abbrechen\",\r\n\t\ticon_details: \"Details\",\r\n\t\ticon_edit: \"脛ndern\",\r\n\t\ticon_delete: \"L枚schen\",\r\n\t\tconfirm_closing: \"\", // \"Ihre Ver盲nderungen werden verloren sein, wollen Sie erg盲nzen? \"\r\n\t\tconfirm_deleting: \"Der Eintrag wird gel枚scht\",\r\n\t\tsection_description: \"Beschreibung\",\r\n\t\tsection_time: \"Zeitspanne\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"PSP\",\r\n\t\tcolumn_text: \"Task-Namen\",\r\n\t\tcolumn_start_date: \"Startzeit\",\r\n\t\tcolumn_duration: \"Dauer\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"werden gel枚scht\",\r\n\t\tlink_start: \"(starten)\",\r\n\t\tlink_end: \"(ende)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minuten\",\r\n\t\thours: \"Stunden\",\r\n\t\tdays: \"Tage\",\r\n\t\tweeks: \"Wochen\",\r\n\t\tmonths: \"Monate\",\r\n\t\tyears: \"Jahre\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Abbrechen\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Regel\",\r\n\t\tconstraint_type: \"Regel\",\r\n\t\tconstraint_date: \"Regel - Datum\",\r\n\t\tasap: \"So bald wie m枚glich\",\r\n\t\talap: \"So sp盲t wie m枚glich\",\r\n\t\tsnet: \"Beginn nicht vor\",\r\n\t\tsnlt: \"Beginn nicht sp盲ter als\",\r\n\t\tfnet: \"Fertigstellung nicht vor\",\r\n\t\tfnlt: \"Fertigstellung nicht sp盲ter als\",\r\n\t\tmso: \"Muss beginnen am\",\r\n\t\tmfo: \"Muss fertig sein am\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Marts\", \"April\", \"Maj\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"December\"],\r\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Maj\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\r\n\t\tday_full: [\"S酶ndag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"L酶rdag\"],\r\n\t\tday_short: [\"S酶n\", \"Man\", \"Tir\", \"Ons\", \"Tor\", \"Fre\", \"L酶r\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Ny opgave\",\r\n\t\ticon_save: \"Gem\",\r\n\t\ticon_cancel: \"Fortryd\",\r\n\t\ticon_details: \"Detaljer\",\r\n\t\ticon_edit: \"Tilret\",\r\n\t\ticon_delete: \"Slet\",\r\n\t\tconfirm_closing: \"Dine rettelser vil g氓 tabt.. Er dy sikker?\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"Bigivenheden vil blive slettet permanent. Er du sikker?\",\r\n\t\tsection_description: \"Beskrivelse\",\r\n\t\tsection_time: \"Tidsperiode\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Fortryd\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Leden\", \"脷nor\", \"B艡ezen\", \"Duben\", \"Kv臎ten\", \"膶erven\", \"膶ervenec\", \"Srpen\", \"Z谩艡铆\", \"艠铆jen\", \"Listopad\", \"Prosinec\"],\r\n\t\tmonth_short: [\"Led\", \"脷n\", \"B艡e\", \"Dub\", \"Kv臎\", \"膶er\", \"膶ec\", \"Srp\", \"Z谩艡铆\", \"艠铆j\", \"List\", \"Pro\"],\r\n\t\tday_full: [\"Ned臎le\", \"Pond臎l铆\", \"脷ter媒\", \"St艡eda\", \"膶tvrtek\", \"P谩tek\", \"Sobota\"],\r\n\t\tday_short: [\"Ne\", \"Po\", \"脷t\", \"St\", \"膶t\", \"P谩\", \"So\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nov谩 pr谩ce\",\r\n\t\ticon_save: \"Ulo啪it\",\r\n\t\ticon_cancel: \"Zp臎t\",\r\n\t\ticon_details: \"Detail\",\r\n\t\ticon_edit: \"Edituj\",\r\n\t\ticon_delete: \"Smazat\",\r\n\t\tconfirm_closing: \"\", // Va拧e zm臎ny budou ztraceny, opravdu ?\r\n\t\tconfirm_deleting: \"Ud谩lost bude trvale smaz谩na, opravdu?\",\r\n\t\tsection_description: \"Pozn谩mky\",\r\n\t\tsection_time: \"Doba platnosti\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Zp臎t\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\nTranslation by FreezeSoul\r\n\r\nUpdate 26/10/2015:\r\nTranslation of new labels by zwh8800\r\n https://github.com/DHTMLX/gantt/pull/7\r\n\r\n*/\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"涓�鏈圽", \"浜屾湀\", \"涓夋湀\", \"鍥涙湀\", \"浜旀湀\", \"鍏湀\", \"涓冩湀\", \"鍏湀\", \"涔濇湀\", \"鍗佹湀\", \"鍗佷竴鏈圽", \"鍗佷簩鏈圽"],\r\n\t\tmonth_short: [\"1鏈圽", \"2鏈圽", \"3鏈圽", \"4鏈圽", \"5鏈圽", \"6鏈圽", \"7鏈圽", \"8鏈圽", \"9鏈圽", \"10鏈圽", \"11鏈圽", \"12鏈圽"],\r\n\t\tday_full: [\"鏄熸湡鏃", \"鏄熸湡涓�\", \"鏄熸湡浜孿", \"鏄熸湡涓塡", \"鏄熸湡鍥沑", \"鏄熸湡浜擻", \"鏄熸湡鍏璡"],\r\n\t\tday_short: [\"鏃", \"涓�\", \"浜孿", \"涓塡", \"鍥沑", \"浜擻", \"鍏璡"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"鏂颁换鍕橽",\r\n\t\ticon_save: \"淇濆瓨\",\r\n\t\ticon_cancel: \"鍏抽棴\",\r\n\t\ticon_details: \"璇︾粏\",\r\n\t\ticon_edit: \"缂栬緫\",\r\n\t\ticon_delete: \"鍒犻櫎\",\r\n\t\tconfirm_closing: \"璇风‘璁ゆ槸鍚︽挙閿�淇敼!\", // Your changes will be lost, are your sure?\r\n\t\tconfirm_deleting: \"鏄惁鍒犻櫎鏃ョ▼?\",\r\n\t\tsection_description: \"鎻忚堪\",\r\n\t\tsection_time: \"鏃堕棿鑼冨洿\",\r\n\t\tsection_type: \"绫诲瀷\",\r\n\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"宸ヤ綔鍒嗚В缁撴瀯\",\r\n\t\tcolumn_text: \"浠诲姟鍚峔",\r\n\t\tcolumn_start_date: \"寮�濮嬫椂闂碶",\r\n\t\tcolumn_duration: \"鎸佺画鏃堕棿\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\r\n\t\tlink: \"鍏宠仈\",\r\n\t\tconfirm_link_deleting: \"灏嗚鍒犻櫎\",\r\n\t\tlink_start: \" (寮�濮�)\",\r\n\t\tlink_end: \" (缁撴潫)\",\r\n\r\n\t\ttype_task: \"浠诲姟\",\r\n\t\ttype_project: \"椤圭洰\",\r\n\t\ttype_milestone: \"閲岀▼纰慭",\r\n\r\n\t\tminutes: \"鍒嗛挓\",\r\n\t\thours: \"灏忔椂\",\r\n\t\tdays: \"澶‐",\r\n\t\tweeks: \"鍛╘",\r\n\t\tmonths: \"鏈圽",\r\n\t\tyears: \"骞碶",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"鍏抽棴\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","/*\r\n @Traducido por Vicente Adria Bohigues - vicenteadria@hotmail.com\r\n */\r\n\r\nconst locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"Gener\", \"Febrer\", \"Mar莽\", \"Abril\", \"Maig\", \"Juny\", \"Juliol\", \"Agost\", \"Setembre\", \"Octubre\", \"Novembre\", \"Desembre\"],\r\n\t\tmonth_short: [\"Gen\", \"Feb\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Oct\", \"Nov\", \"Des\"],\r\n\t\tday_full: [\"Diumenge\", \"Dilluns\", \"Dimarts\", \"Dimecres\", \"Dijous\", \"Divendres\", \"Dissabte\"],\r\n\t\tday_short: [\"Dg\", \"Dl\", \"Dm\", \"Dc\", \"Dj\", \"Dv\", \"Ds\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"Nova tasca\",\r\n\t\ticon_save: \"Guardar\",\r\n\t\ticon_cancel: \"Cancel路lar\",\r\n\t\ticon_details: \"Detalls\",\r\n\t\ticon_edit: \"Editar\",\r\n\t\ticon_delete: \"Esborrar\",\r\n\t\tconfirm_closing: \"\", // \"Els seus canvis es perdr脿n, continuar ?\"\r\n\t\tconfirm_deleting: \"L'esdeveniment s'esborrar脿 definitivament, continuar ?\",\r\n\t\tsection_description: \"Descripci贸\",\r\n\t\tsection_time: \"Periode de temps\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"Cancel路lar\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"小褌褍写蟹械薪褜\", \"袥褞褌褘\", \"小邪泻邪胁褨泻\", \"袣褉邪褋邪胁褨泻\", \"Ma泄\", \"效褝褉胁械薪褜\", \"袥褨锌械薪褜\", \"袞薪褨胁械薪褜\", \"袙械褉邪褋械薪褜\", \"袣邪褋褌褉褘褔薪褨泻\", \"袥褨褋褌邪锌邪写\", \"小薪械卸邪薪褜\"],\r\n\t\tmonth_short: [\"小褌褍写蟹\", \"袥褞褌\", \"小邪泻\", \"袣褉邪褋\", \"Ma泄\", \"效褝褉\", \"袥褨锌\", \"袞薪褨胁\", \"袙械褉\", \"袣邪褋褌\", \"袥褨褋褌\", \"小薪械卸\"],\r\n\t\tday_full: [\"袧褟写蟹械谢褟\", \"袩邪薪褟写蟹械谢邪泻\", \"袗褳褌芯褉邪泻\", \"小械褉邪写邪\", \"效邪褑胁械褉\", \"袩褟褌薪褨褑邪\", \"小褍斜芯褌邪\"],\r\n\t\tday_short: [\"袧写\", \"袩薪\", \"袗褳褌\", \"小褉\", \"效褑胁\", \"袩褌\", \"小斜\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"袧芯胁邪械 蟹邪写邪薪薪械\",\r\n\t\ticon_save: \"袟邪褏邪胁邪褑褜\",\r\n\t\ticon_cancel: \"袗写屑褟薪褨褑褜\",\r\n\t\ticon_details: \"袛褝褌邪谢褨\",\r\n\t\ticon_edit: \"袟屑褟薪褨褑褜\",\r\n\t\ticon_delete: \"袙褘写邪谢褨褑褜\",\r\n\t\tconfirm_closing: \"\", // 校薪械褋械薪褘褟 蟹屑械薪褘 斜褍写褍褑褜 褋褌褉邪褔邪薪褘, 锌褉邪褑褟谐薪褍褑褜?\r\n\t\tconfirm_deleting: \"袩邪写蟹械褟 斜褍写蟹械 胁褘写邪谢械薪邪 薪械蟹胁邪褉芯褌薪邪, 锌褉邪褑褟谐薪褍褑褜?\",\r\n\t\tsection_description: \"袗锌褨褋邪薪薪械\",\r\n\t\tsection_time: \"袩械褉褘褟写 褔邪褋褍\",\r\n\t\tsection_type: \"孝褘锌\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"袉小袪\",\r\n\t\tcolumn_text: \"袟邪写邪褔邪\",\r\n\t\tcolumn_start_date: \"袩邪褔邪褌邪泻\",\r\n\t\tcolumn_duration: \"袩褉邪褑褟谐\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"小褍胁褟蟹褜\",\r\n\t\tconfirm_link_deleting: \"斜褍写蟹械 胁褘写邪谢械薪邪\",\r\n\t\tlink_start: \"(锌邪褔邪褌邪泻)\",\r\n\t\tlink_end: \"(泻邪薪械褑)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\r\n\t\tminutes: \"啸胁i谢i薪邪\",\r\n\t\thours: \"袚邪写蟹i薪邪\",\r\n\t\tdays: \"袛蟹械薪褜\",\r\n\t\tweeks: \"孝褘写蟹械薪褜\",\r\n\t\tmonths: \"袦械褋褟褑\",\r\n\t\tyears: \"袚芯写\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"袗写屑褟薪褨褑褜\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","const locale: IGanttLocale = {\r\n\tdate: {\r\n\t\tmonth_full: [\"賰丕賳賵賳 丕賱孬丕賳賷\", \"卮亘丕胤\", \"丌匕丕乇\", \"賳賷爻丕賳\", \"兀賷丕乇\", \"丨夭賷乇丕賳\", \"鬲賲賵夭\", \"丌亘\", \"兀賷賱賵賱\", \"鬲卮乇賷賳 丕賱兀賵賱\", \"鬲卮乇賷賳 丕賱孬丕賳賷\", \"賰丕賳賵賳 丕賱兀賵賱\"],\r\n\t\tmonth_short: [\"賷賳丕賷乇\", \"賮亘乇丕賷乇\", \"賲丕乇爻\", \"兀亘乇賷賱\", \"賲丕賷賵\", \"賷賵賳賷賵\", \"賷賵賱賷賵\", \"兀睾爻胤爻\", \"爻亘鬲賲亘乇\", \"兀賰鬲賵亘乇\", \"賳賵賮賲亘乇\", \"丿賷爻賲亘乇\"],\r\n\t\tday_full: [\"丕賱兀丨丿\", \"丕賱兀孬賳賷賳\", \"兀賱孬賱丕孬丕亍\", \"丕賱兀乇亘毓丕亍\", \"兀賱丨賲賷爻\", \"兀賱噩賲毓丞\", \"丕賱爻亘鬲\"],\r\n\t\tday_short: [\"丕丨丿\", \"丕孬賳賷賳\", \"孬賱丕孬丕亍\", \"丕乇亘毓丕亍\", \"禺賲賷爻\", \"噩賲毓丞\", \"爻亘鬲\"]\r\n\t},\r\n\tlabels: {\r\n\t\tnew_task: \"賲賴賲丞 噩丿賷丿\",\r\n\t\ticon_save: \"丕禺夭賳\",\r\n\t\ticon_cancel: \"丕賱睾丕亍\",\r\n\t\ticon_details: \"鬲賮丕氐賷賱\",\r\n\t\ticon_edit: \"鬲丨乇賷乇\",\r\n\t\ticon_delete: \"丨匕賮\",\r\n\t\tconfirm_closing: \"丕賱鬲睾賷賷乇丕鬲 爻賵賮 鬲囟賷毓, 賴賱 丕賳鬲 賲鬲兀賰丿責\", // Your changes will be lost, are your sure ?\r\n\t\tconfirm_deleting: \"丕賱丨丿孬 爻賷鬲賲 丨匕賮賴丕 賳賴丕卅賷丕 貙 賴賱 兀賳鬲 賲鬲兀賰丿責\",\r\n\t\tsection_description: \"丕賱賵氐賮\",\r\n\t\tsection_time: \"丕賱賮鬲乇丞 丕賱夭賲賳賷丞\",\r\n\t\tsection_type: \"Type\",\r\n\t\t/* grid columns */\r\n\r\n\t\tcolumn_wbs: \"WBS\",\r\n\t\tcolumn_text: \"Task name\",\r\n\t\tcolumn_start_date: \"Start time\",\r\n\t\tcolumn_duration: \"Duration\",\r\n\t\tcolumn_add: \"\",\r\n\r\n\t\t/* link confirmation */\r\n\t\tlink: \"Link\",\r\n\t\tconfirm_link_deleting: \"will be deleted\",\r\n\t\tlink_start: \" (start)\",\r\n\t\tlink_end: \" (end)\",\r\n\r\n\t\ttype_task: \"Task\",\r\n\t\ttype_project: \"Project\",\r\n\t\ttype_milestone: \"Milestone\",\r\n\r\n\t\tminutes: \"Minutes\",\r\n\t\thours: \"Hours\",\r\n\t\tdays: \"Days\",\r\n\t\tweeks: \"Week\",\r\n\t\tmonths: \"Months\",\r\n\t\tyears: \"Years\",\r\n\r\n\t\t/* message popup */\r\n\t\tmessage_ok: \"OK\",\r\n\t\tmessage_cancel: \"丕賱睾丕亍\",\r\n\r\n\t\t/* constraints */\r\n\t\tsection_constraint: \"Constraint\",\r\n\t\tconstraint_type: \"Constraint type\",\r\n\t\tconstraint_date: \"Constraint date\",\r\n\t\tasap: \"As Soon As Possible\",\r\n\t\talap: \"As Late As Possible\",\r\n\t\tsnet: \"Start No Earlier Than\",\r\n\t\tsnlt: \"Start No Later Than\",\r\n\t\tfnet: \"Finish No Earlier Than\",\r\n\t\tfnlt: \"Finish No Later Than\",\r\n\t\tmso: \"Must Start On\",\r\n\t\tmfo: \"Must Finish On\",\r\n\r\n\t\t/* resource control */\r\n\t\tresources_filter_placeholder: \"type to filter\",\r\n\t\tresources_filter_label: \"hide empty\",\r\n\r\n\t\t/* empty state screen */\r\n\t\tempty_state_text_link: \"Click here\",\r\n\t\tempty_state_text_description: \"to create your first task\"\r\n\t}\r\n};\r\n\r\nexport default locale;\r\n","import ar from \"./locale_ar\";\r\nimport be from \"./locale_be\";\r\nimport ca from \"./locale_ca\";\r\nimport cn from \"./locale_cn\";\r\nimport cs from \"./locale_cs\";\r\nimport da from \"./locale_da\";\r\nimport de from \"./locale_de\";\r\nimport el from \"./locale_el\";\r\nimport en from \"./locale_en\";\r\nimport es from \"./locale_es\";\r\nimport fa from \"./locale_fa\";\r\nimport fi from \"./locale_fi\";\r\nimport fr from \"./locale_fr\";\r\nimport he from \"./locale_he\";\r\nimport hr from \"./locale_hr\";\r\nimport hu from \"./locale_hu\";\r\nimport id from \"./locale_id\";\r\nimport it from \"./locale_it\";\r\nimport jp from \"./locale_jp\";\r\nimport kr from \"./locale_kr\";\r\n\r\nimport LocaleManager from \"./locale_manager\";\r\n\r\nimport nb from \"./locale_nb\";\r\nimport nl from \"./locale_nl\";\r\nimport no from \"./locale_no\";\r\nimport pl from \"./locale_pl\";\r\nimport pt from \"./locale_pt\";\r\nimport ro from \"./locale_ro\";\r\nimport ru from \"./locale_ru\";\r\nimport si from \"./locale_si\";\r\nimport sk from \"./locale_sk\";\r\nimport sv from \"./locale_sv\";\r\nimport tr from \"./locale_tr\";\r\nimport ua from \"./locale_ua\";\r\n\r\nexport default function(){\r\n\treturn new LocaleManager({\r\n\t\ten,\r\n\t\tar,\r\n\t\tbe,\r\n\t\tca,\r\n\t\tcn,\r\n\t\tcs,\r\n\t\tda,\r\n\t\tde,\r\n\t\tel,\r\n\t\tes,\r\n\t\tfa,\r\n\t\tfi,\r\n\t\tfr,\r\n\t\the,\r\n\t\thr,\r\n\t\thu,\r\n\t\tid,\r\n\t\tit,\r\n\t\tjp,\r\n\t\tkr,\r\n\t\tnb,\r\n\t\tnl,\r\n\t\tno,\r\n\t\tpl,\r\n\t\tpt,\r\n\t\tro,\r\n\t\tru,\r\n\t\tsi,\r\n\t\tsk,\r\n\t\tsv,\r\n\t\ttr,\r\n\t\tua\r\n\t});\r\n}","// all builds except for evaluation version get this mockup\r\n// the evaluation build gets actual codes\r\nexport default () => {};","function extend(gantt) {\n gantt.destructor = function () {\n this.clearAll();\n this.callEvent(\"onDestroy\", []);\n\n if (this.$root) {\n delete this.$root.gantt;\n }\n\n if (this._eventRemoveAll) {\n this._eventRemoveAll();\n }\n\n if (this.$layout) {\n this.$layout.destructor();\n }\n\n if (this.resetLightbox) {\n this.resetLightbox();\n }\n\n if (this._dp && this._dp.destructor) {\n this._dp.destructor();\n }\n\n this.$services.destructor(); // detachAllEvents should be called last, because in components may be attached events\n\n this.detachAllEvents();\n\n for (var i in this) {\n if (i.indexOf(\"$\") === 0) {\n delete this[i];\n }\n }\n\n this.$destroyed = true;\n };\n}\n\nmodule.exports = extend;","/*\r\n \tasserts will be removed in final code, so you can place them anythere\r\n\twithout caring about performance impacts\r\n*/\nmodule.exports = function (gantt) {\n return function assert(check, message) {\n if (!check) {\n if (gantt.config.show_errors && gantt.callEvent(\"onError\", [message]) !== false) {\n if (gantt.message) {\n gantt.message({\n type: \"error\",\n text: message,\n expire: -1\n });\n } else {\n // eslint-disable-next-line\n console.log(message);\n } // eslint-disable-next-line no-debugger\n\n\n debugger;\n }\n }\n };\n};","function addResizeListener(gantt) {\n var containerStyles = window.getComputedStyle(gantt.$root);\n\n if (containerStyles.getPropertyValue(\"position\") == \"static\") {\n gantt.$root.style.position = \"relative\";\n }\n\n var resizeWatcher = document.createElement('iframe');\n resizeWatcher.className = \"gantt_container_resize_watcher\";\n resizeWatcher.tabIndex = -1;\n\n if (gantt.config.wai_aria_attributes) {\n resizeWatcher.setAttribute(\"role\", \"none\");\n resizeWatcher.setAttribute(\"aria-hidden\", true);\n }\n\n var salesforce_environment = !!window[\"Sfdc\"] || !!window[\"$A\"] || window[\"Aura\"];\n\n if (salesforce_environment) {\n gantt.config.container_resize_method = \"timeout\";\n } // in some environments (namely, in SalesForce) iframe.contentWindow is not available\n\n\n gantt.$root.appendChild(resizeWatcher);\n\n if (resizeWatcher.contentWindow) {\n listenWindowResize(gantt, resizeWatcher.contentWindow);\n } else {\n // if so - ditch the iframe and fallback to listening the main window resize\n gantt.$root.removeChild(resizeWatcher);\n listenWindowResize(gantt, window);\n }\n}\n\nfunction listenWindowResize(gantt, window) {\n var resizeTimeout = gantt.config.container_resize_timeout || 20;\n var resizeDelay;\n\n if (gantt.config.container_resize_method == \"timeout\") {\n lowlevelResizeWatcher();\n } else {\n try {\n gantt.event(window, \"resize\", function () {\n if (gantt.$scrollbarRepaint) {\n gantt.$scrollbarRepaint = null;\n } else {\n repaintGantt();\n }\n });\n } catch (e) {\n lowlevelResizeWatcher();\n }\n }\n\n function repaintGantt() {\n clearTimeout(resizeDelay);\n resizeDelay = setTimeout(function () {\n if (!gantt.$destroyed) {\n gantt.render();\n }\n }, resizeTimeout);\n }\n\n var previousHeight = gantt.$root.offsetHeight;\n var previousWidth = gantt.$root.offsetWidth;\n\n function lowlevelResizeWatcher() {\n if (gantt.$root.offsetHeight != previousHeight || gantt.$root.offsetWidth != previousWidth) {\n repaintGantt();\n }\n\n previousHeight = gantt.$root.offsetHeight;\n previousWidth = gantt.$root.offsetWidth;\n setTimeout(lowlevelResizeWatcher, resizeTimeout);\n }\n}\n\nmodule.exports = addResizeListener;","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar domHelpers = require(\"./ui/utils/dom_helpers\"),\n helpers = require(\"../utils/helpers\");\n\nvar isHeadless = require(\"../utils/is_headless\");\n\nvar addResizeListener = require(\"./ui/resize_listener\");\n\nmodule.exports = function (gantt) {\n var calculateScaleRange = require(\"./gantt_data_range\");\n\n gantt.assert = require(\"./common/assert\")(gantt);\n\n function isHTMLElement(node) {\n try {\n node.cloneNode(false);\n } catch (e) {\n return false;\n }\n\n return true;\n }\n\n var invalidContainerMessage = \"Invalid value of the first argument of `gantt.init`. Supported values: HTMLElement, String (element id).\" + \"This error means that either invalid object is passed into `gantt.init` or that the element with the specified ID doesn't exist on the page when `gantt.init` is called.\";\n\n function validateNode(node) {\n if (!node || typeof node == 'string' && document.getElementById(node)) return true;\n if (isHTMLElement(node)) return true;\n gantt.assert(false, invalidContainerMessage);\n throw new Error(invalidContainerMessage);\n } //initial initialization\n\n\n gantt.init = function (node, from, to) {\n if (gantt.env.isNode) {\n node = null; // for the nodejs version\n } else {\n validateNode(node); // for the web version\n }\n\n if (from && to) {\n this.config.start_date = this._min_date = new Date(from);\n this.config.end_date = this._max_date = new Date(to);\n }\n\n this.date.init(); //can be called only once\n\n this.init = function (node) {\n if (gantt.env.isNode) {\n node = null; // for the nodejs version\n } else {\n validateNode(node); // for the web version\n }\n\n if (this.$container && this.$container.parentNode) {\n this.$container.parentNode.removeChild(this.$container);\n this.$container = null;\n }\n\n if (this.$layout) {\n this.$layout.clear();\n }\n\n this._reinit(node);\n };\n\n this._reinit(node);\n };\n\n gantt._quickRefresh = function (code) {\n var stores = this._getDatastores.call(this);\n\n for (var i = 0; i < stores.length; i++) {\n stores[i]._quick_refresh = true;\n }\n\n code();\n\n for (var i = 0; i < stores.length; i++) {\n stores[i]._quick_refresh = false;\n }\n };\n\n var dropLayout = function dropLayout() {\n if (this._clearTaskLayers) {\n this._clearTaskLayers();\n }\n\n if (this._clearLinkLayers) {\n this._clearLinkLayers();\n }\n\n if (this.$layout) {\n this.$layout.destructor();\n this.$layout = null;\n this.$ui.reset();\n }\n }.bind(gantt);\n\n var rebuildLayout = function rebuildLayout() {\n if (isHeadless(gantt)) {\n return;\n }\n\n this.$root.innerHTML = \"\";\n this.$root.gantt = this;\n calculateScaleRange(this);\n this.config.layout.id = \"main\";\n this.$layout = this.$ui.createView(\"layout\", this.$root, this.config.layout);\n this.$layout.attachEvent(\"onBeforeResize\", function () {\n var storeNames = gantt.$services.getService(\"datastores\");\n\n for (var i = 0; i < storeNames.length; i++) {\n gantt.getDatastore(storeNames[i]).filter();\n\n if (gantt.$data.tasksStore._skipTaskRecalculation) {\n // do not repaint items, they will be repainted later in the onStoreUpdate event\n if (gantt.$data.tasksStore._skipTaskRecalculation != \"lightbox\") {\n gantt.$data.tasksStore._skipTaskRecalculation = false;\n }\n } else {\n gantt.getDatastore(storeNames[i]).callEvent(\"onBeforeRefreshAll\", []);\n }\n }\n });\n this.$layout.attachEvent(\"onResize\", function () {\n gantt._quickRefresh(function () {\n gantt.refreshData();\n });\n });\n this.callEvent(\"onGanttLayoutReady\", []);\n this.$layout.render();\n this.$container = this.$layout.$container.firstChild;\n addResizeListener(this);\n }.bind(gantt);\n\n gantt.resetLayout = function () {\n dropLayout();\n rebuildLayout();\n this.render();\n };\n\n gantt._reinit = function (node) {\n this.callEvent(\"onBeforeGanttReady\", []);\n\n this._update_flags();\n\n var config = this.$services.getService(\"templateLoader\");\n config.initTemplates(this);\n dropLayout();\n this.$root = null;\n\n if (node) {\n this.$root = domHelpers.toNode(node);\n rebuildLayout();\n this.$mouseEvents.reset(this.$root);\n }\n\n this.callEvent(\"onTemplatesReady\", []);\n this.callEvent(\"onGanttReady\", []);\n this.render();\n };\n\n gantt.$click = {\n buttons: {\n \"edit\": function edit(id) {\n if (gantt.isReadonly(gantt.getTask(id))) {\n return;\n }\n\n gantt.showLightbox(id);\n },\n \"delete\": function _delete(id) {\n var task = gantt.getTask(id);\n\n if (gantt.isReadonly(task)) {\n return;\n }\n\n var question = gantt.locale.labels.confirm_deleting;\n var title = gantt.locale.labels.confirm_deleting_title;\n\n gantt._simple_confirm(question, title, function () {\n if (!gantt.isTaskExists(id)) {\n gantt.hideLightbox();\n return;\n }\n\n if (task.$new) {\n // GS-2170. Do not recalculate the indexes and dates of other tasks\n // as they will be recalculated in the `refreshData`\n gantt.$data.tasksStore._skipTaskRecalculation = \"lightbox\";\n gantt.silent(function () {\n gantt.deleteTask(id, true);\n });\n gantt.$data.tasksStore._skipTaskRecalculation = false;\n gantt.refreshData();\n } else {\n gantt.$data.tasksStore._skipTaskRecalculation = true;\n gantt.deleteTask(id);\n }\n\n gantt.hideLightbox();\n });\n }\n }\n }; //renders self\n\n gantt.render = function () {\n this.callEvent(\"onBeforeGanttRender\", []);\n var visibleDate;\n\n if (!isHeadless(gantt)) {\n if (!this.config.sort && this._sort) {\n this._sort = undefined;\n }\n\n if (this.$root) {\n if (this.config.rtl) {\n this.$root.classList.add(\"gantt_rtl\");\n this.$root.firstChild.classList.add(\"gantt_rtl\"); // GS-1499\n } else {\n this.$root.classList.remove(\"gantt_rtl\");\n this.$root.firstChild.classList.remove(\"gantt_rtl\"); // GS-1499\n }\n }\n\n var pos = this.getScrollState();\n var posX = pos ? pos.x : 0;\n\n if (this._getHorizontalScrollbar()) {\n var scrollbar = this._getHorizontalScrollbar();\n\n posX = scrollbar.$config.codeScrollLeft || posX || 0;\n }\n\n visibleDate = null;\n\n if (posX) {\n visibleDate = gantt.dateFromPos(posX + this.config.task_scroll_offset);\n }\n }\n\n calculateScaleRange(this);\n\n if (!isHeadless(gantt)) {\n this.$layout.$config.autosize = this.config.autosize;\n var preserveScroll = this.config.preserve_scroll;\n this.config.preserve_scroll = false; // prevent scrolling from layout resize, scroll will be called here later on\n\n this.$layout.resize();\n this.config.preserve_scroll = preserveScroll;\n\n if (this.config.preserve_scroll && pos) {\n // GS-1640: We need pos.y, otherwise part of the timeline won't be rendered if the scrollbar disappeared\n if (posX || pos.y) {\n var new_pos = gantt.getScrollState();\n var new_date = gantt.dateFromPos(new_pos.x);\n\n if (!(+visibleDate == +new_date && new_pos.y == pos.y)) {\n var posX = null;\n var posY = null;\n\n if (visibleDate) {\n var posX = Math.max(gantt.posFromDate(visibleDate) - gantt.config.task_scroll_offset, 0);\n }\n\n if (pos.y) {\n posY = pos.y;\n }\n\n gantt.scrollTo(posX, posY);\n }\n } // GS-1640: We need to reset the scroll position for the grid if the scrollbar disappeared and\n // the grid and timeline have different scrollbars\n\n\n var gridCell = gantt.$ui.getView(\"grid\");\n\n if (gridCell) {\n var attachedScrollbar = gridCell.$config.scrollY;\n var verticalScrollbar = gantt.$ui.getView(attachedScrollbar);\n\n if (verticalScrollbar) {\n var scrollbarNodeVisible = gantt.utils.dom.isChildOf(verticalScrollbar.$view, gantt.$container);\n\n if (!scrollbarNodeVisible) {\n gridCell.scrollTo(undefined, 0);\n }\n }\n }\n }\n } else {\n gantt.refreshData();\n }\n\n this.callEvent(\"onGanttRender\", []);\n }; //TODO: add layout.resize method that wouldn't trigger data repaint\n\n\n gantt.setSizes = gantt.render;\n\n gantt.getTaskRowNode = function (id) {\n var els = this.$grid_data.childNodes;\n var attribute = this.config.task_attribute;\n\n for (var i = 0; i < els.length; i++) {\n if (els[i].getAttribute) {\n var value = els[i].getAttribute(attribute);\n if (value == id) return els[i];\n }\n }\n\n return null;\n };\n\n gantt.changeLightboxType = function (type) {\n if (this.getLightboxType() == type) return true;\n\n gantt._silent_redraw_lightbox(type);\n };\n\n gantt._get_link_type = function (from_start, to_start) {\n var type = null;\n\n if (from_start && to_start) {\n type = gantt.config.links.start_to_start;\n } else if (!from_start && to_start) {\n type = gantt.config.links.finish_to_start;\n } else if (!from_start && !to_start) {\n type = gantt.config.links.finish_to_finish;\n } else if (from_start && !to_start) {\n type = gantt.config.links.start_to_finish;\n }\n\n return type;\n };\n\n gantt.isLinkAllowed = function (from, to, from_start, to_start) {\n var link = null;\n\n if (_typeof(from) == \"object\") {\n link = from;\n } else {\n link = {\n source: from,\n target: to,\n type: this._get_link_type(from_start, to_start)\n };\n }\n\n if (!link) return false;\n if (!(link.source && link.target && link.type)) return false;\n if (link.source == link.target) return false;\n var res = true; //any custom rules\n\n if (this.checkEvent(\"onLinkValidation\")) res = this.callEvent(\"onLinkValidation\", [link]);\n return res;\n };\n\n gantt._correct_dst_change = function (date, prevOffset, step, unit) {\n var time_unit = helpers.getSecondsInUnit(unit) * step;\n\n if (time_unit > 60 * 60 && time_unit < 60 * 60 * 24) {\n //correct dst change only if current unit is more than one hour and less than day (days have own checking), e.g. 12h\n var offsetChanged = date.getTimezoneOffset() - prevOffset;\n\n if (offsetChanged) {\n date = gantt.date.add(date, offsetChanged, \"minute\");\n }\n }\n\n return date;\n };\n\n gantt.isSplitTask = function (task) {\n gantt.assert(task && task instanceof Object, \"Invalid argument <b>task</b>=\" + task + \" of gantt.isSplitTask. Task object was expected\");\n return this.$data.tasksStore._isSplitItem(task);\n };\n\n gantt._is_icon_open_click = function (e) {\n if (!e) return false;\n var target = e.target || e.srcElement;\n if (!(target && target.className)) return false;\n var className = domHelpers.getClassName(target);\n if (className.indexOf(\"gantt_tree_icon\") !== -1 && (className.indexOf(\"gantt_close\") !== -1 || className.indexOf(\"gantt_open\") !== -1)) return true;\n return false;\n };\n};","/*\r\n reuse results of functions that can be recalculated during rendering\r\n greatly increases the rendering speed when critical path enabled\r\n Sample - 94_dev/critical_path.html\r\n\r\n */\nmodule.exports = function (gantt) {\n gantt._cached_functions = {\n cache: {},\n mode: false,\n critical_path_mode: false,\n wrap_methods: function wrap_methods(methods, object) {\n if (object._prefetch_originals) {\n for (var i in object._prefetch_originals) {\n object[i] = object._prefetch_originals[i];\n }\n }\n\n object._prefetch_originals = {};\n\n for (var i = 0; i < methods.length; i++) {\n this.prefetch(methods[i], object);\n }\n },\n prefetch: function prefetch(methodname, host) {\n var original = host[methodname];\n\n if (original) {\n var optimizer = this;\n host._prefetch_originals[methodname] = original;\n\n host[methodname] = function get_prefetched_value() {\n var argumentsArray = new Array(arguments.length);\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n argumentsArray[i] = arguments[i];\n }\n\n if (optimizer.active) {\n var args = optimizer.get_arguments_hash(Array.prototype.slice.call(argumentsArray));\n\n if (!optimizer.cache[methodname]) {\n optimizer.cache[methodname] = {};\n }\n\n var cached_values = optimizer.cache[methodname];\n\n if (optimizer.has_cached_value(cached_values, args)) {\n return optimizer.get_cached_value(cached_values, args);\n } else {\n var value = original.apply(this, argumentsArray);\n optimizer.cache_value(cached_values, args, value);\n return value;\n }\n }\n\n return original.apply(this, argumentsArray);\n };\n }\n\n return original;\n },\n cache_value: function cache_value(cache, arguments_hash, value) {\n if (this.is_date(value)) value = new Date(value);\n cache[arguments_hash] = value;\n },\n has_cached_value: function has_cached_value(cache, arguments_hash) {\n return cache.hasOwnProperty(arguments_hash);\n },\n get_cached_value: function get_cached_value(cache, arguments_hash) {\n var data = cache[arguments_hash]; //for cached dates - return copy\n\n if (this.is_date(data)) {\n data = new Date(data);\n }\n\n return data;\n },\n is_date: function is_date(value) {\n return value && value.getUTCDate;\n },\n get_arguments_hash: function get_arguments_hash(args) {\n var values = [];\n\n for (var i = 0; i < args.length; i++) {\n values.push(this.stringify_argument(args[i]));\n }\n\n return \"(\" + values.join(\";\") + \")\";\n },\n stringify_argument: function stringify_argument(value) {\n //expecting task or link, or any other data entries, dates and primitive values\n var ret = \"\";\n\n if (value.id) {\n ret = value.id;\n } else if (this.is_date(value)) {\n ret = value.valueOf();\n } else {\n ret = value;\n }\n\n return ret + \"\";\n },\n activate: function activate() {\n this.clear();\n this.active = true;\n },\n deactivate: function deactivate() {\n this.clear();\n this.active = false;\n },\n clear: function clear() {\n this.cache = {};\n },\n setup: function setup(gantt) {\n var override_gantt = [];\n var gantt_methods = ['_isProjectEnd', '_getProjectEnd', '_getSlack'];\n\n if (this.mode == 'auto') {\n if (gantt.config.highlight_critical_path) {\n override_gantt = gantt_methods;\n }\n } else if (this.mode === true) {\n override_gantt = gantt_methods;\n }\n\n this.wrap_methods(override_gantt, gantt);\n },\n update_if_changed: function update_if_changed(gantt) {\n var changed = this.critical_path_mode != gantt.config.highlight_critical_path || this.mode !== gantt.config.optimize_render;\n\n if (changed) {\n this.critical_path_mode = gantt.config.highlight_critical_path;\n this.mode = gantt.config.optimize_render;\n this.setup(gantt);\n }\n }\n };\n\n function activate() {\n gantt._cached_functions.update_if_changed(gantt);\n\n if (!gantt._cached_functions.active) {\n gantt._cached_functions.activate();\n }\n\n return true;\n }\n\n gantt.attachEvent(\"onBeforeGanttRender\", activate);\n gantt.attachEvent(\"onBeforeDataRender\", activate);\n gantt.attachEvent(\"onBeforeSmartRender\", function () {\n activate();\n });\n gantt.attachEvent(\"onBeforeParse\", activate);\n gantt.attachEvent(\"onDataRender\", function () {\n gantt._cached_functions.deactivate();\n });\n var deactivTimeout = null;\n gantt.attachEvent(\"onSmartRender\", function () {\n if (deactivTimeout) clearTimeout(deactivTimeout);\n deactivTimeout = setTimeout(function () {\n gantt._cached_functions.deactivate();\n }, 1000);\n });\n gantt.attachEvent(\"onBeforeGanttReady\", function () {\n gantt._cached_functions.update_if_changed(gantt);\n\n return true;\n });\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nmodule.exports = function (gantt) {\n gantt.getTaskType = function (type) {\n var checkType = type;\n\n if (type && _typeof(type) == \"object\") {\n checkType = type.type;\n }\n\n for (var i in this.config.types) {\n if (this.config.types[i] == checkType) {\n return checkType;\n }\n }\n\n return gantt.config.types.task;\n };\n};","// all builds except for evaluation version get this mockup\r\n// the evaluation build gets actual codes\r\nexport default () => {};","var helpers = require(\"../utils/helpers\");\n\nmodule.exports = function (gantt) {\n gantt.isUnscheduledTask = function (task) {\n gantt.assert(task && task instanceof Object, \"Invalid argument <b>task</b>=\" + task + \" of gantt.isUnscheduledTask. Task object was expected\");\n return !!task.unscheduled || !task.start_date;\n };\n\n gantt._isAllowedUnscheduledTask = function (task) {\n return !!(task.unscheduled && gantt.config.show_unscheduled);\n };\n\n gantt._isTaskInTimelineLimits = function (task) {\n var taskStart = task.start_date ? task.start_date.valueOf() : null;\n var taskEnd = task.end_date ? task.end_date.valueOf() : null;\n return !!(taskStart && taskEnd && taskStart <= this._max_date.valueOf() && taskEnd >= this._min_date.valueOf());\n };\n\n gantt.isTaskVisible = function (id) {\n if (!this.isTaskExists(id)) {\n return false;\n }\n\n var task = this.getTask(id);\n\n if (!(this._isAllowedUnscheduledTask(task) || this._isTaskInTimelineLimits(task))) {\n return false;\n }\n\n return !!(this.getGlobalTaskIndex(id) >= 0);\n };\n\n gantt._getProjectEnd = function () {\n if (gantt.config.project_end) {\n return gantt.config.project_end;\n } else {\n var tasks = gantt.getTaskByTime();\n tasks = tasks.sort(function (a, b) {\n return +a.end_date > +b.end_date ? 1 : -1;\n });\n return tasks.length ? tasks[tasks.length - 1].end_date : null;\n }\n };\n\n gantt._getProjectStart = function () {\n if (gantt.config.project_start) {\n return gantt.config.project_start;\n } // use timeline start if project start is not specified\n\n\n if (gantt.config.start_date) {\n return gantt.config.start_date;\n }\n\n if (gantt.getState().min_date) {\n return gantt.getState().min_date;\n } // earliest task start if neither project start nor timeline are specified\n\n\n var tasks = gantt.getTaskByTime();\n tasks = tasks.sort(function (a, b) {\n return +a.start_date > +b.start_date ? 1 : -1;\n });\n return tasks.length ? tasks[0].start_date : null;\n };\n\n var getDefaultTaskDate = function getDefaultTaskDate(item, parent_id) {\n var parentExists = parent_id && parent_id != gantt.config.root_id && gantt.isTaskExists(parent_id);\n var parent = parentExists ? gantt.getTask(parent_id) : false,\n startDate = null;\n\n if (parent) {\n if (gantt.config.schedule_from_end) {\n startDate = gantt.calculateEndDate({\n start_date: parent.end_date,\n duration: -gantt.config.duration_step,\n task: item\n });\n } else {\n startDate = parent.start_date;\n }\n } else if (gantt.config.schedule_from_end) {\n startDate = gantt.calculateEndDate({\n start_date: gantt._getProjectEnd(),\n duration: -gantt.config.duration_step,\n task: item\n });\n } else {\n var first = gantt.getTaskByIndex(0);\n startDate = first ? first.start_date ? first.start_date : first.end_date ? gantt.calculateEndDate({\n start_date: first.end_date,\n duration: -gantt.config.duration_step,\n task: item\n }) : null : gantt.config.start_date || gantt.getState().min_date;\n }\n\n gantt.assert(startDate, \"Invalid dates\");\n return new Date(startDate);\n };\n\n gantt._set_default_task_timing = function (task) {\n task.start_date = task.start_date || getDefaultTaskDate(task, gantt.getParent(task));\n task.duration = task.duration || gantt.config.duration_step;\n task.end_date = task.end_date || gantt.calculateEndDate(task);\n };\n\n gantt.createTask = function (item, parent, index) {\n item = item || {};\n if (!gantt.defined(item.id)) item.id = gantt.uid();\n\n if (!item.start_date) {\n item.start_date = getDefaultTaskDate(item, parent);\n }\n\n if (item.text === undefined) {\n item.text = gantt.locale.labels.new_task;\n }\n\n if (item.duration === undefined) {\n item.duration = 1;\n }\n\n if (this.isTaskExists(parent)) {\n this.setParent(item, parent, true);\n var parentObj = this.getTask(parent);\n parentObj.$open = true;\n }\n\n if (!this.callEvent(\"onTaskCreated\", [item])) {\n return null;\n }\n\n if (this.config.details_on_create) {\n //GS-761: assert unique ID\n if (gantt.isTaskExists(item.id)) {\n var task = gantt.getTask(item.id);\n\n if (task.$index != item.$index) {\n // Someone may try to mistakenly add a task with the same ID, and most likely\n // use the string format for the dates. Gantt shouldn't break in this scenario\n if (item.start_date && typeof item.start_date === \"string\") {\n item.start_date = this.date.parseDate(item.start_date, \"parse_date\");\n }\n\n if (item.end_date && typeof item.end_date === \"string\") {\n item.end_date = this.date.parseDate(item.end_date, \"parse_date\");\n }\n\n this.$data.tasksStore.updateItem(item.id, item);\n }\n } else {\n item.$new = true;\n this.silent(function () {\n gantt.$data.tasksStore.addItem(item, index);\n });\n }\n\n this.selectTask(item.id);\n this.refreshData();\n this.showLightbox(item.id);\n } else {\n if (this.addTask(item, parent, index)) {\n this.showTask(item.id);\n this.selectTask(item.id);\n }\n }\n\n return item.id;\n };\n\n gantt._update_flags = function (oldid, newid) {\n // TODO: need a proper way to update all possible flags\n var store = gantt.$data.tasksStore;\n\n if (oldid === undefined) {\n this._lightbox_id = null;\n store.silent(function () {\n store.unselect();\n }); // GS-1522. If we have multiselect, unselect all previously selected tasks\n\n if (this.getSelectedTasks) {\n this._multiselect.reset();\n }\n\n if (this._tasks_dnd && this._tasks_dnd.drag) {\n this._tasks_dnd.drag.id = null;\n }\n } else {\n if (this._lightbox_id == oldid) this._lightbox_id = newid; // TODO: probably can be removed\n\n if (store.getSelectedId() == oldid) {\n store.silent(function () {\n store.unselect(oldid);\n store.select(newid);\n });\n }\n\n if (this._tasks_dnd && this._tasks_dnd.drag && this._tasks_dnd.drag.id == oldid) {\n this._tasks_dnd.drag.id = newid;\n }\n }\n };\n\n var getTaskTimingMode = function getTaskTimingMode(task, force) {\n var task_type = gantt.getTaskType(task.type);\n var state = {\n type: task_type,\n $no_start: false,\n $no_end: false\n };\n\n if (!force && task_type == task.$rendered_type) {\n state.$no_start = task.$no_start;\n state.$no_end = task.$no_end;\n return state;\n }\n\n if (task_type == gantt.config.types.project) {\n //project duration is always defined by children duration\n state.$no_end = state.$no_start = true;\n } else if (task_type != gantt.config.types.milestone) {\n //tasks can have fixed duration, children duration(as projects), or one date fixed, and other defined by nested items\n state.$no_end = !(task.end_date || task.duration);\n state.$no_start = !task.start_date;\n\n if (gantt._isAllowedUnscheduledTask(task)) {\n state.$no_end = state.$no_start = false;\n }\n }\n\n return state;\n };\n\n gantt._init_task_timing = function (task) {\n var task_mode = getTaskTimingMode(task, true);\n var dirty = task.$rendered_type != task_mode.type;\n var task_type = task_mode.type;\n\n if (dirty) {\n task.$no_start = task_mode.$no_start;\n task.$no_end = task_mode.$no_end;\n task.$rendered_type = task_mode.type;\n }\n\n if (dirty && task_type != this.config.types.milestone) {\n if (task_type == this.config.types.project) {\n //project duration is always defined by children duration\n this._set_default_task_timing(task);\n\n task.$calculate_duration = false; // do not recalculate duration below\n }\n }\n\n if (task_type == this.config.types.milestone) {\n task.end_date = task.start_date;\n }\n\n if (task.start_date && task.end_date && task.$calculate_duration !== false) {\n task.duration = this.calculateDuration(task);\n }\n\n if (!task.$calculate_duration) {\n task.$calculate_duration = true;\n }\n\n if (!task.end_date) {\n task.end_date = task.start_date;\n }\n\n task.duration = task.duration || 0; // GS-1145. We should let tasks to have 0 duration if user wants it\n\n if (this.config.min_duration === 0 && task.duration === 0) {\n task.$no_end = false;\n } // work calendar of task has changed\n\n\n var effectiveCalendar = this.getTaskCalendar(task);\n\n if (task.$effective_calendar && task.$effective_calendar !== effectiveCalendar.id) {\n updateTaskTiming(task);\n\n if (this.config.inherit_calendar && this.isSummaryTask(task)) {\n this.eachTask(function (child) {\n updateTaskTiming(child);\n }, task.id);\n }\n }\n\n task.$effective_calendar = effectiveCalendar.id;\n };\n\n function updateTaskTiming(task) {\n task.$effective_calendar = gantt.getTaskCalendar(task).id;\n task.start_date = gantt.getClosestWorkTime({\n dir: \"future\",\n date: task.start_date,\n unit: gantt.config.duration_unit,\n task: task\n });\n task.end_date = gantt.calculateEndDate(task);\n }\n\n gantt.isSummaryTask = function (task) {\n gantt.assert(task && task instanceof Object, \"Invalid argument <b>task</b>=\" + task + \" of gantt.isSummaryTask. Task object was expected\");\n var mode = getTaskTimingMode(task);\n return !!(mode.$no_end || mode.$no_start);\n }; // downward calculation of project duration\n\n\n gantt.resetProjectDates = function (task) {\n var taskMode = getTaskTimingMode(task);\n\n if (taskMode.$no_end || taskMode.$no_start) {\n var info = getSubtaskInfo(task.id);\n assignProjectDates.call(this, task, taskMode, info.start_date, info.end_date);\n task.$rollup = info.rollup;\n }\n };\n\n function assignProjectDates(task, taskTiming, from, to) {\n if (taskTiming.$no_start) {\n if (from) {\n task.start_date = new Date(from);\n } else {\n task.start_date = getDefaultTaskDate(task, this.getParent(task));\n }\n }\n\n if (taskTiming.$no_end) {\n if (to) {\n task.end_date = new Date(to);\n } else {\n task.end_date = this.calculateEndDate({\n start_date: task.start_date,\n duration: this.config.duration_step,\n task: task\n });\n }\n }\n\n if (taskTiming.$no_start || taskTiming.$no_end) {\n this._init_task_timing(task);\n }\n }\n\n gantt.getSubtaskDuration = function (taskId) {\n var res = 0,\n root = taskId !== undefined ? taskId : gantt.config.root_id;\n this.eachTask(function (child) {\n if (this.getTaskType(child.type) == gantt.config.types.project || this.isUnscheduledTask(child)) return;\n res += child.duration;\n }, root);\n return res;\n };\n\n function getSubtaskInfo(taskId) {\n var min = null,\n max = null,\n root = taskId !== undefined ? taskId : gantt.config.root_id,\n rollup = [];\n gantt.eachTask(function (child) {\n if (gantt.getTaskType(child.type) == gantt.config.types.project || gantt.isUnscheduledTask(child)) return;\n\n if (child.rollup) {\n rollup.push(child.id);\n }\n\n if (child.start_date && !child.$no_start && (!min || min > child.start_date.valueOf())) min = child.start_date.valueOf();\n if (child.end_date && !child.$no_end && (!max || max < child.end_date.valueOf())) max = child.end_date.valueOf();\n }, root);\n return {\n start_date: min ? new Date(min) : null,\n end_date: max ? new Date(max) : null,\n rollup: rollup\n };\n }\n\n gantt.getSubtaskDates = function (task_id) {\n var info = getSubtaskInfo(task_id);\n return {\n start_date: info.start_date,\n end_date: info.end_date\n };\n }; // upward calculation of project duration\n\n\n gantt._update_parents = function (taskId, silent, updateAll) {\n if (!taskId) return;\n var task = this.getTask(taskId);\n\n if (task.rollup) {\n updateAll = true;\n }\n\n var pid = this.getParent(task);\n var taskTiming = getTaskTimingMode(task);\n var has_changed = true; // GS-761 the dates check is necessary for adding empty tasks: gantt.addTask({id:\"2\"})\n\n if (updateAll || task.start_date && task.end_date && (taskTiming.$no_start || taskTiming.$no_end)) {\n var oldStart = task.start_date.valueOf(),\n oldEnd = task.end_date.valueOf();\n gantt.resetProjectDates(task); // not refresh parent projects if dates hasn't changed\n\n if (!updateAll && oldStart == task.start_date.valueOf() && oldEnd == task.end_date.valueOf()) {\n has_changed = false;\n }\n\n if (has_changed && !silent) {\n this.refreshTask(task.id, true);\n }\n }\n\n if (has_changed && pid && this.isTaskExists(pid)) {\n this._update_parents(pid, silent, updateAll);\n }\n };\n\n gantt.roundDate = function (config) {\n var scale = gantt.getScale();\n\n if (helpers.isDate(config)) {\n config = {\n date: config,\n unit: scale ? scale.unit : gantt.config.duration_unit,\n step: scale ? scale.step : gantt.config.duration_step\n };\n }\n\n var date = config.date,\n steps = config.step,\n unit = config.unit;\n\n if (!scale) {\n return date;\n }\n\n var upper, lower, colIndex;\n\n if (unit == scale.unit && steps == scale.step && +date >= +scale.min_date && +date <= +scale.max_date) {\n //find date in time scale config\n colIndex = Math.floor(gantt.columnIndexByDate(date));\n\n if (!scale.trace_x[colIndex]) {\n colIndex -= 1; // end of time scale\n\n if (scale.rtl) {\n colIndex = 0;\n }\n }\n\n lower = new Date(scale.trace_x[colIndex]);\n upper = gantt.date.add(lower, steps, unit);\n } else {\n colIndex = Math.floor(gantt.columnIndexByDate(date));\n upper = gantt.date[unit + \"_start\"](new Date(scale.min_date));\n\n if (scale.trace_x[colIndex]) {\n upper = gantt.date[unit + \"_start\"](scale.trace_x[colIndex]); // end of time scale\n }\n\n while (+upper < +date) {\n upper = gantt.date[unit + \"_start\"](gantt.date.add(upper, steps, unit));\n var tzOffset = upper.getTimezoneOffset();\n upper = gantt._correct_dst_change(upper, tzOffset, upper, unit);\n if (gantt.date[unit + '_start']) upper = gantt.date[unit + '_start'](upper);\n }\n\n lower = gantt.date.add(upper, -1 * steps, unit);\n }\n\n if (config.dir && config.dir == 'future') return upper;\n if (config.dir && config.dir == 'past') return lower;\n\n if (Math.abs(date - lower) < Math.abs(upper - date)) {\n return lower;\n } else {\n return upper;\n }\n };\n\n gantt.correctTaskWorkTime = function (task) {\n if (gantt.config.work_time && gantt.config.correct_work_time) {\n if (!this.isWorkTime(task.start_date, undefined, task)) {\n task.start_date = this.getClosestWorkTime({\n date: task.start_date,\n dir: 'future',\n task: task\n });\n task.end_date = this.calculateEndDate(task);\n } else if (!this.isWorkTime(new Date(+task.end_date - 1), undefined, task)) {\n task.end_date = this.calculateEndDate(task);\n }\n }\n };\n\n gantt.attachEvent(\"onBeforeTaskUpdate\", function (id, task) {\n gantt._init_task_timing(task);\n\n return true;\n });\n gantt.attachEvent(\"onBeforeTaskAdd\", function (id, task) {\n gantt._init_task_timing(task);\n\n return true;\n });\n gantt.attachEvent(\"onAfterTaskMove\", function (id, parent, tindex) {\n gantt._init_task_timing(gantt.getTask(id));\n\n return true;\n });\n};","// TODO: rework public api for date methods\nvar utils = require(\"../../utils/utils\");\n\nvar createWorkTimeFacade = function createWorkTimeFacade(calendarManager, timeCalculator) {\n return {\n getWorkHours: function getWorkHours(date) {\n return timeCalculator.getWorkHours(date);\n },\n setWorkTime: function setWorkTime(config) {\n return timeCalculator.setWorkTime(config);\n },\n unsetWorkTime: function unsetWorkTime(config) {\n timeCalculator.unsetWorkTime(config);\n },\n isWorkTime: function isWorkTime(date, unit, task) {\n return timeCalculator.isWorkTime(date, unit, task);\n },\n getClosestWorkTime: function getClosestWorkTime(config) {\n return timeCalculator.getClosestWorkTime(config);\n },\n calculateDuration: function calculateDuration(start_date, end_date, task) {\n return timeCalculator.calculateDuration(start_date, end_date, task);\n },\n _hasDuration: function _hasDuration(start_date, end_date, task) {\n return timeCalculator.hasDuration(start_date, end_date, task);\n },\n calculateEndDate: function calculateEndDate(start, duration, unit, task) {\n return timeCalculator.calculateEndDate(start, duration, unit, task);\n },\n mergeCalendars: utils.bind(calendarManager.mergeCalendars, calendarManager),\n createCalendar: utils.bind(calendarManager.createCalendar, calendarManager),\n addCalendar: utils.bind(calendarManager.addCalendar, calendarManager),\n getCalendar: utils.bind(calendarManager.getCalendar, calendarManager),\n getCalendars: utils.bind(calendarManager.getCalendars, calendarManager),\n getResourceCalendar: utils.bind(calendarManager.getResourceCalendar, calendarManager),\n getTaskCalendar: utils.bind(calendarManager.getTaskCalendar, calendarManager),\n deleteCalendar: utils.bind(calendarManager.deleteCalendar, calendarManager)\n };\n};\n\nmodule.exports = {\n create: createWorkTimeFacade\n};","function CalendarDisabledTimeStrategy(gantt, argumentsHelper) {\n this.argumentsHelper = argumentsHelper;\n this.$gantt = gantt;\n}\n\nCalendarDisabledTimeStrategy.prototype = {\n getWorkHours: function getWorkHours() {\n return [0, 24];\n },\n setWorkTime: function setWorkTime() {\n return true;\n },\n unsetWorkTime: function unsetWorkTime() {\n return true;\n },\n isWorkTime: function isWorkTime() {\n return true;\n },\n getClosestWorkTime: function getClosestWorkTime(config) {\n var config = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);\n return config.date;\n },\n calculateDuration: function calculateDuration() {\n var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n var from = config.start_date,\n to = config.end_date,\n unit = config.unit,\n step = config.step;\n return this._calculateDuration(from, to, unit, step);\n },\n _calculateDuration: function _calculateDuration(start, end, unit, step) {\n var dateHelper = this.$gantt.date;\n var fixedUnits = {\n \"week\": 1000 * 60 * 60 * 24 * 7,\n \"day\": 1000 * 60 * 60 * 24,\n \"hour\": 1000 * 60 * 60,\n \"minute\": 1000 * 60\n };\n var res = 0;\n\n if (fixedUnits[unit]) {\n res = Math.round((end - start) / (step * fixedUnits[unit]));\n } else {\n var from = new Date(start),\n to = new Date(end);\n\n while (from.valueOf() < to.valueOf()) {\n res += 1;\n from = dateHelper.add(from, step, unit);\n }\n\n if (from.valueOf() != end.valueOf()) {\n res += (to - from) / (dateHelper.add(from, step, unit) - from);\n }\n }\n\n return Math.round(res);\n },\n hasDuration: function hasDuration() {\n var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n var from = config.start_date,\n to = config.end_date,\n unit = config.unit;\n\n if (!unit) {\n return false;\n }\n\n from = new Date(from);\n to = new Date(to);\n return from.valueOf() < to.valueOf();\n },\n hasWorkTime: function hasWorkTime() {\n return true;\n },\n equals: function equals(calendar) {\n if (!(calendar instanceof CalendarDisabledTimeStrategy)) {\n return false;\n }\n\n return true;\n },\n calculateEndDate: function calculateEndDate() {\n var config = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);\n var start = config.start_date,\n duration = config.duration,\n unit = config.unit,\n step = config.step;\n return this.$gantt.date.add(start, step * duration, unit);\n }\n};\nmodule.exports = CalendarDisabledTimeStrategy;","var createArgumentsHelper = require(\"./calendar_arguments_helper\"),\n NoWorkTimeCalendar = require(\"./strategy/no_work_time\");\n\nfunction TimeCalculator(calendarManager) {\n this.$gantt = calendarManager.$gantt;\n this.argumentsHelper = createArgumentsHelper(this.$gantt);\n this.calendarManager = calendarManager;\n this.$disabledCalendar = new NoWorkTimeCalendar(this.$gantt, this.argumentsHelper);\n}\n\nTimeCalculator.prototype = {\n _getCalendar: function _getCalendar(config) {\n var calendar;\n\n if (!this.$gantt.config.work_time) {\n calendar = this.$disabledCalendar;\n } else {\n var manager = this.calendarManager;\n\n if (config.task) {\n calendar = manager.getTaskCalendar(config.task);\n } else if (config.id) {\n calendar = manager.getTaskCalendar(config);\n } else if (config.calendar) {\n calendar = config.calendar;\n }\n\n if (!calendar) {\n calendar = manager.getTaskCalendar();\n }\n }\n\n return calendar;\n },\n getWorkHours: function getWorkHours(config) {\n config = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments);\n\n var calendar = this._getCalendar(config);\n\n return calendar.getWorkHours(config.date);\n },\n setWorkTime: function setWorkTime(config, calendar) {\n config = this.argumentsHelper.setWorkTimeArguments.apply(this.argumentsHelper, arguments);\n if (!calendar) calendar = this.calendarManager.getCalendar(); // Global\n\n return calendar.setWorkTime(config);\n },\n unsetWorkTime: function unsetWorkTime(config, calendar) {\n config = this.argumentsHelper.unsetWorkTimeArguments.apply(this.argumentsHelper, arguments);\n if (!calendar) calendar = this.calendarManager.getCalendar(); // Global\n\n return calendar.unsetWorkTime(config);\n },\n isWorkTime: function isWorkTime(date, unit, task, calendar) {\n var config = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);\n calendar = this._getCalendar(config);\n return calendar.isWorkTime(config);\n },\n getClosestWorkTime: function getClosestWorkTime(config) {\n config = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);\n\n var calendar = this._getCalendar(config);\n\n return calendar.getClosestWorkTime(config);\n },\n calculateDuration: function calculateDuration() {\n // start_date_date, end_date, task\n var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n\n var calendar = this._getCalendar(config);\n\n return calendar.calculateDuration(config);\n },\n hasDuration: function hasDuration() {\n var config = this.argumentsHelper.hasDurationArguments.apply(this.argumentsHelper, arguments);\n\n var calendar = this._getCalendar(config);\n\n return calendar.hasDuration(config);\n },\n calculateEndDate: function calculateEndDate(config) {\n // start_date, duration, unit, task\n var config = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);\n\n var calendar = this._getCalendar(config);\n\n return calendar.calculateEndDate(config);\n }\n};\nmodule.exports = TimeCalculator;","module.exports = function () {\n function getResourcesCalendarKey(resourceAssignments) {\n return resourceAssignments.map(function (res) {\n if (res && res.resource_id) {\n return res.resource_id;\n } else {\n return res;\n }\n }).sort().join(\"-\");\n }\n\n var dynamicCalendars = {};\n\n function mergeResourceCalendars(resourceAssignments, manager) {\n return manager.mergeCalendars(resourceAssignments.map(function (assignment) {\n var resourceId = assignment && assignment.resource_id ? assignment.resource_id : assignment;\n return manager.getResourceCalendar(resourceId);\n }));\n }\n\n function getCalendarIdFromMultipleResources(resourceAssignments, manager) {\n var key = getResourcesCalendarKey(resourceAssignments);\n\n if (!resourceAssignments.length) {\n return null;\n } else if (resourceAssignments.length === 1) {\n return manager.getResourceCalendar(key).id;\n } else if (dynamicCalendars[key]) {\n return dynamicCalendars[key].id;\n } else {\n var tempCalendar = mergeResourceCalendars(resourceAssignments, manager);\n dynamicCalendars[key] = tempCalendar;\n return manager.addCalendar(tempCalendar);\n }\n }\n\n return {\n getCalendarIdFromMultipleResources: getCalendarIdFromMultipleResources\n };\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nmodule.exports = {\n isLegacyResourceCalendarFormat: function isLegacyResourceCalendarFormat(resourceCalendarsProperty) {\n // modern format:\n //gantt.config.resource_calendars = {\n //\tresourceId: calendarId,\n //\tresourceId: calendarId,\n //\tresourceId: calendarId\n //\t};\n // legacy format:\n // gantt.config.resource_calendars = {\n //\t\"resourceProperty\": {\n //\t\tresourceId: calendarId,\n //\t\tresourceId: calendarId,\n //\t\tresourceId: calendarId\n //\t\t}\n //\t};\n if (!resourceCalendarsProperty) {\n return false;\n }\n\n for (var i in resourceCalendarsProperty) {\n if (resourceCalendarsProperty[i] && _typeof(resourceCalendarsProperty[i]) === \"object\") {\n return true;\n }\n }\n\n return false;\n },\n getResourceProperty: function getResourceProperty(config) {\n var resourceCalendarsConfig = config.resource_calendars;\n var propertyName = config.resource_property;\n\n if (this.isLegacyResourceCalendarFormat(resourceCalendarsConfig)) {\n for (var i in config) {\n propertyName = i;\n break;\n }\n }\n\n return propertyName;\n },\n getCalendarIdFromLegacyConfig: function getCalendarIdFromLegacyConfig(task, config) {\n if (config) {\n for (var field in config) {\n var resource = config[field];\n\n if (task[field]) {\n var calendarId = resource[task[field]];\n\n if (calendarId) {\n return calendarId;\n }\n }\n }\n }\n\n return null;\n }\n};","export class DateDurationCache {\r\n\tprivate _cache: any;\r\n\tconstructor() {\r\n\t\tthis.clear();\r\n\t}\r\n\r\n\t_getCacheObject(startDate: Date, unit: string, step:number){\r\n\t\tconst cache = this._cache;\r\n\t\tif (!cache[unit]) {\r\n\t\t\tcache[unit] = [];\r\n\t\t}\r\n\t\tlet unitCache = cache[unit];\r\n\t\tif(!unitCache) {\r\n\t\t\tunitCache = cache[unit] = {};\r\n\t\t}\r\n\r\n\t\tlet stepCache = unitCache[step];\r\n\t\tif(!stepCache) {\r\n\t\t\tstepCache = unitCache[step] = {};\r\n\t\t}\r\n\r\n\t\tconst year = startDate.getFullYear();\r\n\t\tlet yearCache = stepCache[year];\r\n\t\tif(!yearCache){\r\n\t\t\tyearCache = stepCache[year] = {durations: {}, endDates: {}};\r\n\t\t}\r\n\r\n\t\treturn yearCache;\r\n\t}\r\n\t_endDateCacheKey(startDate: number, duration: number){\r\n\t\treturn String(startDate) + \"-\" + String(duration);\r\n\t}\r\n\t_durationCacheKey(startDate: number, endDate: number){\r\n\t\treturn String(startDate) + \"-\" + String(endDate);\r\n\t}\r\n\tgetEndDate(startDate: Date, duration: number, unit: string, step: number, compute: () => Date): number|null{\r\n\t\tconst cache = this._getCacheObject(startDate, unit, step);\r\n\r\n\t\tconst startDateTimestamp = startDate.valueOf();\r\n\t\tconst key = this._endDateCacheKey(startDateTimestamp, duration);\r\n\t\tlet endDate;\r\n\t\tif(cache.endDates[key] === undefined){\r\n\t\t\tconst result = compute();\r\n\t\t\tconst resultTimestamp = result.valueOf();\r\n\t\t\tcache.endDates[key] = resultTimestamp;\r\n\t\t\tcache.durations[this._durationCacheKey(startDateTimestamp, resultTimestamp)] = duration;\r\n\t\t\tendDate = result;\r\n\t\t}else{\r\n\t\t\tendDate = new Date(cache.endDates[key]);\r\n\t\t}\r\n\r\n\t\treturn endDate;\r\n\t}\r\n\r\n\tgetDuration(startDate: Date, endDate: Date, unit: string, step: number, compute: () => number): number|null{\r\n\t\tconst cache = this._getCacheObject(startDate, unit, step);\r\n\r\n\t\tconst startDateTimestamp = startDate.valueOf();\r\n\t\tconst endDateTimestamp = endDate.valueOf();\r\n\t\tconst key = this._durationCacheKey(startDateTimestamp, endDateTimestamp);\r\n\t\tlet duration;\r\n\t\tif(cache.durations[key] === undefined){\r\n\t\t\tconst result = compute();\r\n\t\t\tcache.durations[key] = result.valueOf();\r\n\r\n\t\t\t// can't populate end date due to logic of end date calculation, current unit tests capture it\r\n\t\t\t// cache.endDates[this._endDateCacheKey(startDateTimestamp, result)] = endDateTimestamp;\r\n\t\t\tduration = result;\r\n\t\t}else{\r\n\t\t\tduration = cache.durations[key];\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\t}\r\n\r\n\tclear(): void{\r\n\t\tthis._cache = {};\r\n\t}\r\n}","\r\n\r\nexport class LargerUnitsCache {\r\n\tprivate _weekCache: Map<number, number>;\r\n\tprivate _monthCache: Map<number, number>;\r\n\tprivate _calendar: any;\r\n\tconstructor(calendar) {\r\n\t\tthis.clear();\r\n\t\tthis._calendar = calendar;\r\n\t}\r\n\r\n\tgetMinutesPerWeek = (weekStart: Date) => {\r\n\t\tconst key = weekStart.valueOf();\r\n\r\n\t\tif(this._weekCache.has(key)){\r\n\t\t\treturn this._weekCache.get(key);\r\n\t\t}\r\n\r\n\t\tconst calendar = this._calendar;\r\n\t\tconst gantt = this._calendar.$gantt;\r\n\r\n\t\tlet minutesPerWeek = 0;\r\n\t\tlet start = gantt.date.week_start(new Date(weekStart));\r\n\t\tfor(let i = 0; i < 7; i++){\r\n\t\t\tminutesPerWeek += calendar.getHoursPerDay(start) * 60;\r\n\t\t\tstart = gantt.date.add(start, 1, \"day\");\r\n\t\t}\r\n\r\n\t\tthis._weekCache.set(key, minutesPerWeek);\r\n\t\treturn minutesPerWeek;\r\n\t}\r\n\r\n\tgetMinutesPerMonth = (monthStart: Date) => {\r\n\t\tconst key = monthStart.valueOf();\r\n\r\n\t\tif(this._monthCache.has(key)){\r\n\t\t\treturn this._monthCache.get(key);\r\n\t\t}\r\n\r\n\t\tconst calendar = this._calendar;\r\n\t\tconst gantt = this._calendar.$gantt;\r\n\r\n\t\tlet minutesPerMonth = 0;\r\n\t\tlet start = gantt.date.week_start(new Date(monthStart));\r\n\t\tconst nextMonth = gantt.date.add(start, 1, \"month\").valueOf();\r\n\t\twhile(start.valueOf() < nextMonth){\r\n\t\t\tminutesPerMonth += calendar.getHoursPerDay(start) * 60;\r\n\t\t\tstart = gantt.date.add(start, 1, \"day\");\r\n\t\t}\r\n\r\n\t\tthis._monthCache.set(key, minutesPerMonth);\r\n\t\treturn minutesPerMonth;\r\n\t}\r\n\r\n\tclear = (): void => {\r\n\t\tthis._weekCache = new Map<number, number>();\r\n\t\tthis._monthCache = new Map<number, number>();\r\n\t}\r\n}","import { IWorkUnitCache } from \"./workunit_cache_interface\";\r\n\r\nexport class WorkUnitsObjectCache implements IWorkUnitCache {\r\n\tprivate _cache: any;\r\n\tconstructor() {\r\n\t\tthis.clear();\r\n\t}\r\n\r\n\tgetItem(unit: string, timestamp: string, value: Date): number|boolean {\r\n\t\tconst cache = this._cache;\r\n\t\tif (cache && cache[unit]) {\r\n\t\t\tconst units = cache[unit];\r\n\t\t\tif(units === undefined){\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\tconst subCache = units[value.getFullYear()];\r\n\t\t\tif (subCache && subCache[timestamp] !== undefined) {\r\n\t\t\t\treturn subCache[timestamp];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn -1;\r\n\t}\r\n\tsetItem(unit: string, timestamp: string, value: boolean, rawValue: Date): void {\r\n\t\tif (!unit || !timestamp) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst cache = this._cache;\r\n\r\n\t\tif (!cache) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!cache[unit]) {\r\n\t\t\tcache[unit] = [];\r\n\t\t}\r\n\t\tconst unitCache = cache[unit];\r\n\r\n\t\tconst year = rawValue.getFullYear();\r\n\t\tlet yearCache = unitCache[year];\r\n\t\tif(!yearCache){\r\n\t\t\tyearCache = unitCache[year] = {};\r\n\t\t}\r\n\t\tyearCache[timestamp] = value;\r\n\t}\r\n\tclear(): void{\r\n\t\tthis._cache = {};\r\n\t}\r\n}","\r\n\r\nimport { IWorkUnitCache } from \"./workunit_cache_interface\";\r\n\r\nexport class WorkUnitsMapCache implements IWorkUnitCache {\r\n\tprivate _cache: Map<string, Array<Map<string, boolean>>>;\r\n\tconstructor() {\r\n\t\tthis.clear();\r\n\t}\r\n\r\n\tgetItem(unit: string, timestamp: string, value: Date): number|boolean {\r\n\t\tif (this._cache.has(unit)) {\r\n\t\t\tconst unitCache = this._cache.get(unit);\r\n\r\n\t\t\tconst subCache = unitCache[value.getFullYear()];\r\n\t\t\tif (subCache && subCache.has(timestamp)) {\r\n\t\t\t\treturn subCache.get(timestamp);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn -1;\r\n\t}\r\n\tsetItem(unit: string, timestamp: string, value: boolean, rawValue: Date): void {\r\n\t\tif (!unit || !timestamp) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst cache = this._cache;\r\n\t\tconst year = rawValue.getFullYear();\r\n\r\n\t\tlet unitCache;\r\n\t\tif (!cache.has(unit)) {\r\n\t\t\tunitCache = [];\r\n\t\t\tcache.set(unit, unitCache);\r\n\t\t} else {\r\n\t\t\tunitCache = cache.get(unit);\r\n\t\t}\r\n\r\n\t\tlet yearCache = unitCache[year];\r\n\t\tif(!yearCache){\r\n\t\t\tyearCache = unitCache[year] = new Map<string, boolean>();\r\n\t\t}\r\n\r\n\r\n\t\tyearCache.set(timestamp, value);\r\n\t}\r\n\tclear(): void{\r\n\t\tthis._cache = new Map<string, Array<Map<string, boolean>>>();\r\n\t}\r\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar createCacheObject = require(\"./work_unit_cache\").createCacheObject;\n\nvar LargerUnitsCache = require(\"./work_unit_cache\").LargerUnitsCache;\n\nvar utils = require(\"../../../utils/utils\");\n\nvar DateDurationCache = require(\"./work_unit_cache/date_duration_cache\").DateDurationCache;\n\nfunction CalendarWorkTimeStrategy(gantt, argumentsHelper) {\n this.argumentsHelper = argumentsHelper;\n this.$gantt = gantt;\n this._workingUnitsCache = createCacheObject();\n this._largeUnitsCache = new LargerUnitsCache(this);\n this._dateDurationCache = new DateDurationCache();\n this._worktime = null;\n this._cached_timestamps = {};\n this._cached_timestamps_count = 0;\n}\n\nCalendarWorkTimeStrategy.prototype = {\n units: [\"year\", \"month\", \"week\", \"day\", \"hour\", \"minute\"],\n _clearCaches: function _clearCaches() {\n this._workingUnitsCache.clear();\n\n this._largeUnitsCache.clear();\n\n this._dateDurationCache.clear();\n },\n // cache previously calculated worktime\n _getUnitOrder: function _getUnitOrder(unit) {\n for (var i = 0, len = this.units.length; i < len; i++) {\n if (this.units[i] == unit) return i;\n }\n },\n _resetTimestampCache: function _resetTimestampCache() {\n this._cached_timestamps = {};\n this._cached_timestamps_count = 0;\n },\n _timestamp: function _timestamp(settings) {\n // minor optimization, store calculated timestamps to reduce computations\n // reset cache when number of keys exceeds large number where key lookup may became more expensive than the recalculation\n if (this._cached_timestamps_count > 1000000) {\n this._resetTimestampCache();\n }\n\n var timestamp = null;\n\n if (settings.day || settings.day === 0) {\n timestamp = settings.day;\n } else if (settings.date) {\n var value = String(settings.date.valueOf());\n\n if (this._cached_timestamps[value]) {\n timestamp = this._cached_timestamps[value];\n } else {\n // store worktime datestamp in utc so it could be recognized in different timezones (e.g. opened locally and sent to the export service in different timezone)\n timestamp = Date.UTC(settings.date.getFullYear(), settings.date.getMonth(), settings.date.getDate());\n this._cached_timestamps[value] = timestamp;\n this._cached_timestamps_count++;\n }\n }\n\n return timestamp;\n },\n _checkIfWorkingUnit: function _checkIfWorkingUnit(date, unit) {\n // GS-596: If unit is larger than day or has a custom logic\n if (!this[\"_is_work_\" + unit]) {\n var from = this.$gantt.date[\"\".concat(unit, \"_start\")](new Date(date));\n var to = this.$gantt.date.add(from, 1, unit);\n return this.hasDuration(from, to);\n }\n\n return this[\"_is_work_\" + unit](date);\n },\n //checkings for particular time units\n //methods for month-year-week can be defined, otherwise always return 'true'\n _is_work_day: function _is_work_day(date) {\n var val = this._getWorkHours(date);\n\n if (Array.isArray(val)) {\n return val.length > 0;\n }\n\n return false;\n },\n _is_work_hour: function _is_work_hour(date) {\n var hours = this._getWorkHours(date); // [{start: 8*60*60, end: 12*60*60}, {start: 13*60*60, end: 17*60*60}]\n\n\n var value = date.getHours();\n\n for (var i = 0; i < hours.length; i++) {\n if (value >= hours[i].startHour && value < hours[i].endHour) {\n return true;\n }\n }\n\n return false;\n },\n _getTimeOfDayStamp: function _getTimeOfDayStamp(date, dayEnd) {\n var hours = date.getHours();\n\n if (!date.getHours() && !date.getMinutes() && dayEnd) {\n hours = 24;\n }\n\n return hours * 60 * 60 + date.getMinutes() * 60;\n },\n _is_work_minute: function _is_work_minute(date) {\n var hours = this._getWorkHours(date); // [{start: 8*60*60, end: 12*60*60}, {start: 13*60*60, end: 17*60*60}]\n\n\n var checkTime = this._getTimeOfDayStamp(date);\n\n for (var i = 0; i < hours.length; i++) {\n if (checkTime >= hours[i].start && checkTime < hours[i].end) {\n return true;\n }\n }\n\n return false;\n },\n _nextDate: function _nextDate(start, unit, step) {\n return this.$gantt.date.add(start, step, unit);\n },\n _getWorkUnitsBetweenGeneric: function _getWorkUnitsBetweenGeneric(from, to, unit, step) {\n var dateHelper = this.$gantt.date;\n var start = new Date(from),\n end = new Date(to);\n step = step || 1;\n var units = 0;\n var next = null;\n var stepStart, stepEnd; // calculating decimal durations, i.e. 2016-09-20 00:05:00 - 2016-09-20 01:00:00 ~ 0.95 instead of 1\n // and also 2016-09-20 00:00:00 - 2016-09-20 00:05:00 ~ 0.05 instead of 1\n // durations must be rounded later\n\n var checkFirst = false;\n stepStart = dateHelper[unit + \"_start\"](new Date(start));\n\n if (stepStart.valueOf() != start.valueOf()) {\n checkFirst = true;\n }\n\n var checkLast = false;\n stepEnd = dateHelper[unit + \"_start\"](new Date(to));\n\n if (stepEnd.valueOf() != to.valueOf()) {\n checkLast = true;\n }\n\n var isLastStep = false;\n\n while (start.valueOf() < end.valueOf()) {\n next = this._nextDate(start, unit, step);\n isLastStep = next.valueOf() > end.valueOf();\n\n if (this._isWorkTime(start, unit)) {\n if (checkFirst || checkLast && isLastStep) {\n stepStart = dateHelper[unit + \"_start\"](new Date(start));\n stepEnd = dateHelper.add(stepStart, step, unit);\n }\n\n if (checkFirst) {\n checkFirst = false;\n next = this._nextDate(stepStart, unit, step);\n units += (stepEnd.valueOf() - start.valueOf()) / (stepEnd.valueOf() - stepStart.valueOf());\n } else if (checkLast && isLastStep) {\n checkLast = false;\n units += (end.valueOf() - start.valueOf()) / (stepEnd.valueOf() - stepStart.valueOf());\n } else {\n units++;\n }\n } else {\n var unitOrder = this._getUnitOrder(unit);\n\n var biggerTimeUnit = this.units[unitOrder - 1];\n\n if (biggerTimeUnit && !this._isWorkTime(start, biggerTimeUnit)) {\n next = this._getClosestWorkTimeFuture(start, biggerTimeUnit);\n }\n }\n\n start = next;\n }\n\n return units;\n },\n _getMinutesPerHour: function _getMinutesPerHour(date) {\n var hourStart = this._getTimeOfDayStamp(date);\n\n var hourEnd = this._getTimeOfDayStamp(this._nextDate(date, \"hour\", 1));\n\n if (hourEnd === 0) {\n hourEnd = 24 * 60 * 60;\n }\n\n var worktimes = this._getWorkHours(date);\n\n for (var i = 0; i < worktimes.length; i++) {\n var interval = worktimes[i];\n\n if (hourStart >= interval.start && hourEnd <= interval.end) {\n return 60; // hour inside a working interval, all hour is a work hour\n } else if (hourStart < interval.end && hourEnd > interval.start) {\n // hour is partially work time\n var duration = Math.min(hourEnd, interval.end) - Math.max(hourStart, interval.start);\n return duration / 60;\n }\n }\n\n return 0;\n },\n _getMinutesPerDay: function _getMinutesPerDay(date) {\n var hours = this._getWorkHours(date);\n\n var res = 0;\n hours.forEach(function (interval) {\n res += interval.durationMinutes;\n });\n return res;\n },\n getHoursPerDay: function getHoursPerDay(date) {\n var hours = this._getWorkHours(date);\n\n var res = 0;\n hours.forEach(function (interval) {\n res += interval.durationHours;\n });\n return res;\n },\n _getWorkUnitsForRange: function _getWorkUnitsForRange(from, to, unit, step) {\n var total = 0;\n var start = new Date(from),\n end = new Date(to);\n var getUnitsPerDay;\n\n if (unit == \"minute\") {\n getUnitsPerDay = utils.bind(this._getMinutesPerDay, this);\n } else {\n getUnitsPerDay = utils.bind(this.getHoursPerDay, this);\n }\n\n while (start.valueOf() < end.valueOf()) {\n if (end - start > 1000 * 60 * 60 * 24 * 32 && start.getDate() === 0) {\n var units = this._largeUnitsCache.getMinutesPerMonth(start);\n\n if (unit == \"hour\") {\n units = units / 60;\n }\n\n total += units;\n start = this.$gantt.date.add(start, 1, \"month\");\n continue;\n } else if (end - start > 1000 * 60 * 60 * 24 * 16) {\n var weekStart = this.$gantt.date.week_start(new Date(start));\n\n if (start.valueOf() === weekStart.valueOf()) {\n var units = this._largeUnitsCache.getMinutesPerWeek(start);\n\n if (unit == \"hour\") {\n units = units / 60;\n }\n\n total += units;\n start = this.$gantt.date.add(start, 7, \"day\");\n continue;\n }\n } //\tif (this._isWorkTime(start, \"day\")) {\n\n\n total += getUnitsPerDay(start); //\t}\n\n start = this._nextDate(start, \"day\", 1);\n }\n\n return total / step;\n },\n _getMinutesBetweenSingleDay: function _getMinutesBetweenSingleDay(from, to) {\n var range = this._getIntervalTimestamp(from, to);\n\n var worktimes = this._getWorkHours(from);\n\n var result = 0;\n\n for (var i = 0; i < worktimes.length; i++) {\n var interval = worktimes[i];\n\n if (range.end >= interval.start && range.start <= interval.end) {\n var minuteFrom = Math.max(interval.start, range.start);\n var minuteTo = Math.min(interval.end, range.end);\n result += (minuteTo - minuteFrom) / 60;\n range.start = minuteTo;\n }\n }\n\n return Math.floor(result);\n },\n _getMinutesBetween: function _getMinutesBetween(from, to, unit, step) {\n var start = new Date(from),\n end = new Date(to);\n step = step || 1;\n var firstDayStart = new Date(start);\n var firstDayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(start)), 1, \"day\");\n\n if (end.valueOf() <= firstDayEnd.valueOf()) {\n return this._getMinutesBetweenSingleDay(from, to);\n } else {\n var lastDayStart = this.$gantt.date.day_start(new Date(end));\n var lastDayEnd = end;\n\n var startPart = this._getMinutesBetweenSingleDay(firstDayStart, firstDayEnd);\n\n var endPart = this._getMinutesBetweenSingleDay(lastDayStart, lastDayEnd);\n\n var rangePart = this._getWorkUnitsForRange(firstDayEnd, lastDayStart, unit, step);\n\n var total = startPart + rangePart + endPart;\n return total;\n }\n },\n // optimized method for calculating work units duration of large time spans\n // implemented for hours and minutes units, bigger time units don't benefit from the optimization so much\n _getHoursBetween: function _getHoursBetween(from, to, unit, step) {\n var start = new Date(from),\n end = new Date(to);\n step = step || 1;\n var firstDayStart = new Date(start);\n var firstDayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(start)), 1, \"day\");\n\n if (end.valueOf() <= firstDayEnd.valueOf()) {\n return Math.round(this._getMinutesBetweenSingleDay(from, to) / 60);\n } else {\n var lastDayStart = this.$gantt.date.day_start(new Date(end));\n var lastDayEnd = end;\n var startPart = this._getMinutesBetweenSingleDay(firstDayStart, firstDayEnd, unit, step) / 60;\n var endPart = this._getMinutesBetweenSingleDay(lastDayStart, lastDayEnd, unit, step) / 60;\n\n var rangePart = this._getWorkUnitsForRange(firstDayEnd, lastDayStart, unit, step);\n\n var total = startPart + rangePart + endPart;\n return Math.round(total);\n }\n },\n getConfig: function getConfig() {\n return this._worktime;\n },\n _setConfig: function _setConfig(settings) {\n this._worktime = settings;\n\n this._parseSettings();\n\n this._clearCaches();\n },\n _parseSettings: function _parseSettings() {\n var settings = this.getConfig();\n settings.parsed = {\n dates: {},\n hours: null,\n haveCustomWeeks: false,\n customWeeks: {},\n customWeeksRangeStart: null,\n customWeeksRangeEnd: null,\n customWeeksBoundaries: []\n };\n settings.parsed.hours = this._parseHours(settings.hours);\n\n for (var i in settings.dates) {\n settings.parsed.dates[i] = this._parseHours(settings.dates[i]);\n }\n\n if (settings.customWeeks) {\n var minCustomRangeStart = null;\n var maxCustomRangeEnd = null;\n\n for (var i in settings.customWeeks) {\n var customTime = settings.customWeeks[i];\n\n if (customTime.from && customTime.to) {\n var rangeStart = customTime.from;\n var rangeEnd = customTime.to;\n\n if (!minCustomRangeStart || minCustomRangeStart > rangeStart.valueOf()) {\n minCustomRangeStart = rangeStart.valueOf();\n }\n\n if (!maxCustomRangeEnd || maxCustomRangeEnd < rangeEnd.valueOf()) {\n maxCustomRangeEnd = rangeEnd.valueOf();\n }\n\n settings.parsed.customWeeksBoundaries.push({\n from: rangeStart.valueOf(),\n fromReadable: new Date(rangeStart),\n to: rangeEnd.valueOf(),\n toReadable: new Date(rangeEnd),\n name: i\n });\n settings.parsed.haveCustomWeeks = true;\n var currentWeek = settings.parsed.customWeeks[i] = {\n from: customTime.from,\n to: customTime.to,\n hours: this._parseHours(customTime.hours),\n dates: {}\n };\n\n for (var d in customTime.dates) {\n currentWeek.dates[d] = this._parseHours(customTime.dates[d]);\n }\n }\n }\n\n settings.parsed.customWeeksRangeStart = minCustomRangeStart;\n settings.parsed.customWeeksRangeEnd = maxCustomRangeEnd;\n }\n },\n _tryChangeCalendarSettings: function _tryChangeCalendarSettings(payload) {\n var backup = JSON.stringify(this.getConfig());\n payload();\n\n if (!this.hasWorkTime()) {\n //\tthis.$gantt.assert(false, \"Invalid calendar settings, no worktime available\");\n this._setConfig(JSON.parse(backup));\n\n this._clearCaches();\n\n return false;\n }\n\n return true;\n },\n _arraysEqual: function _arraysEqual(a, b) {\n if (a === b) return true;\n if (!a || !b) return false;\n if (a.length != b.length) return false;\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n\n return true;\n },\n _compareSettings: function _compareSettings(mySettings, thatSettings) {\n if (!this._arraysEqual(mySettings.hours, thatSettings.hours)) {\n return false;\n }\n\n var myDays = Object.keys(mySettings.dates);\n var otherDates = Object.keys(thatSettings.dates);\n myDays.sort();\n otherDates.sort();\n\n if (!this._arraysEqual(myDays, otherDates)) {\n return false;\n }\n\n for (var i = 0; i < myDays.length; i++) {\n var timestamp = myDays[i];\n var myHours = mySettings.dates[timestamp];\n var otherHours = mySettings.dates[timestamp]; // day settings not equal\n\n if (myHours !== otherHours && // but still can be two arrays with the equivalent hour settings\n !(Array.isArray(myHours) && Array.isArray(otherHours) && this._arraysEqual(myHours, otherHours))) {\n return false;\n }\n }\n\n return true;\n },\n equals: function equals(calendar) {\n if (!(calendar instanceof CalendarWorkTimeStrategy)) {\n return false;\n }\n\n var mySettings = this.getConfig();\n var thatSettings = calendar.getConfig();\n\n if (!this._compareSettings(mySettings, thatSettings)) {\n return false;\n }\n\n if (mySettings.parsed.haveCustomWeeks && thatSettings.parsed.haveCustomWeeks) {\n if (mySettings.parsed.customWeeksBoundaries.length != thatSettings.parsed.customWeeksBoundaries.length) {\n return false;\n }\n\n for (var i in mySettings.parsed.customWeeks) {\n var myWeek = mySettings.parsed.customWeeks[i];\n var thatWeek = thatSettings.parsed.customWeeks[i];\n\n if (!thatWeek) {\n return false;\n }\n\n if (!this._compareSettings(myWeek, thatWeek)) {\n return false;\n }\n }\n } else if (mySettings.parse.haveCustomWeeks !== thatSettings.parsed.haveCustomWeeks) {\n return false;\n }\n\n return true;\n },\n getWorkHours: function getWorkHours() {\n var config = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments);\n return this._getWorkHours(config.date, false);\n },\n _getWorkHours: function _getWorkHours(date, parsed) {\n var calendar = this.getConfig();\n\n if (parsed !== false) {\n calendar = calendar.parsed;\n }\n\n if (!date) {\n return calendar.hours;\n }\n\n var dateValue = this._timestamp({\n date: date\n });\n\n if (calendar.haveCustomWeeks) {\n if (calendar.customWeeksRangeStart <= dateValue && calendar.customWeeksRangeEnd > dateValue) {\n for (var i = 0; i < calendar.customWeeksBoundaries.length; i++) {\n if (calendar.customWeeksBoundaries[i].from <= dateValue && calendar.customWeeksBoundaries[i].to > dateValue) {\n calendar = calendar.customWeeks[calendar.customWeeksBoundaries[i].name];\n break;\n }\n }\n }\n }\n\n var hours = true;\n\n if (calendar.dates[dateValue] !== undefined) {\n hours = calendar.dates[dateValue]; //custom day\n } else if (calendar.dates[date.getDay()] !== undefined) {\n hours = calendar.dates[date.getDay()]; //week day\n }\n\n if (hours === true) {\n return calendar.hours;\n } else if (hours) {\n return hours;\n }\n\n return [];\n },\n _getIntervalTimestamp: function _getIntervalTimestamp(from, to) {\n var res = {\n start: 0,\n end: 0\n };\n res.start = from.getHours() * 60 * 60 + from.getMinutes() * 60 + from.getSeconds();\n var endHours = to.getHours();\n\n if (!endHours && !to.getMinutes() && !to.getSeconds() && from.valueOf() < to.valueOf()) {\n endHours = 24;\n }\n\n res.end = endHours * 60 * 60 + to.getMinutes() * 60 + to.getSeconds();\n return res;\n },\n _parseHours: function _parseHours(hours) {\n if (Array.isArray(hours)) {\n var timestampRanges = []; // worktime as seconds range\n\n hours.forEach(function (hour) {\n if (typeof hour === \"number\") {\n timestampRanges.push(hour * 60 * 60);\n } else if (typeof hour === \"string\") {\n // \"12-13\", or \"12:00-13:00\", or \"12:00:00-13:00:00\"\n hour.split(\"-\").map(function (time) {\n return time.trim();\n }).forEach(function (part) {\n var parsed = part.split(\":\").map(function (time) {\n return time.trim();\n });\n var value = parseInt(parsed[0] * 60 * 60);\n\n if (parsed[1]) {\n value += parseInt(parsed[1] * 60);\n }\n\n if (parsed[2]) {\n value += parseInt(parsed[2]);\n }\n\n timestampRanges.push(value);\n });\n }\n });\n var timerangeConfig = [];\n\n for (var i = 0; i < timestampRanges.length; i += 2) {\n var start = timestampRanges[i];\n var end = timestampRanges[i + 1];\n var duration = end - start;\n timerangeConfig.push({\n start: start,\n end: end,\n startHour: Math.floor(start / (60 * 60)),\n startMinute: Math.floor(start / 60),\n endHour: Math.ceil(end / (60 * 60)),\n endMinute: Math.ceil(end / 60),\n durationSeconds: duration,\n durationMinutes: duration / 60,\n durationHours: duration / (60 * 60)\n });\n }\n\n return timerangeConfig;\n } else {\n return hours;\n }\n },\n setWorkTime: function setWorkTime(settings) {\n return this._tryChangeCalendarSettings(utils.bind(function () {\n var hours = settings.hours !== undefined ? settings.hours : true;\n\n var timestamp = this._timestamp(settings);\n\n var calendarConfig = this.getConfig();\n\n if (timestamp !== null) {\n calendarConfig.dates[timestamp] = hours;\n } else if (!settings.customWeeks) {\n calendarConfig.hours = hours;\n }\n\n if (settings.customWeeks) {\n if (!calendarConfig.customWeeks) {\n calendarConfig.customWeeks = {};\n } // GS-1867. allow setWorkTime to exclude dates in the customWeeks range\n\n\n if (typeof settings.customWeeks == \"string\") {\n if (timestamp !== null) {\n calendarConfig.customWeeks[settings.customWeeks].dates[timestamp] = hours;\n } else if (!settings.customWeeks) {\n calendarConfig.customWeeks[settings.customWeeks].hours = hours;\n }\n } else if (_typeof(settings.customWeeks) === \"object\" && Function.prototype.toString.call(settings.customWeeks.constructor) === \"function Object() { [native code] }\") {\n for (var i in settings.customWeeks) {\n calendarConfig.customWeeks[i] = settings.customWeeks[i];\n }\n }\n }\n\n this._parseSettings();\n\n this._clearCaches();\n }, this));\n },\n unsetWorkTime: function unsetWorkTime(settings) {\n return this._tryChangeCalendarSettings(utils.bind(function () {\n if (!settings) {\n this.reset_calendar();\n } else {\n var timestamp = this._timestamp(settings);\n\n if (timestamp !== null) {\n delete this.getConfig().dates[timestamp];\n }\n } // Load updated settings and clear work units cache\n\n\n this._parseSettings();\n\n this._clearCaches();\n }, this));\n },\n _isWorkTime: function _isWorkTime(date, unit) {\n // Check if this item has in the cache\n var useCache = true; //unit === \"day\"; // use cache only for days. In case of hours/minutes cache size grows too large and the overhead exceeds the gains\n\n var isWorkUnit = -1;\n var dateKey = null;\n\n if (useCache) {\n // use string keys\n dateKey = String(date.valueOf());\n isWorkUnit = this._workingUnitsCache.getItem(unit, dateKey, date);\n }\n\n if (isWorkUnit == -1) {\n // calculate if not cached\n isWorkUnit = this._checkIfWorkingUnit(date, unit);\n\n if (useCache) {\n this._workingUnitsCache.setItem(unit, dateKey, isWorkUnit, date);\n }\n }\n\n return isWorkUnit;\n },\n isWorkTime: function isWorkTime() {\n var config = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);\n return this._isWorkTime(config.date, config.unit);\n },\n calculateDuration: function calculateDuration() {\n var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n\n if (!config.unit) {\n return false;\n } //return this._calculateDuration(config.start_date, config.end_date, config.unit, config.step);\n\n\n var self = this;\n return this._dateDurationCache.getDuration(config.start_date, config.end_date, config.unit, config.step, function () {\n return self._calculateDuration(config.start_date, config.end_date, config.unit, config.step);\n });\n },\n _calculateDuration: function _calculateDuration(from, to, unit, step) {\n var res = 0;\n var sign = 1;\n\n if (from.valueOf() > to.valueOf()) {\n var tmp = to;\n to = from;\n from = tmp;\n sign = -1;\n }\n\n if (unit == \"hour\" && step == 1) {\n res = this._getHoursBetween(from, to, unit, step);\n } else if (unit == \"minute\" && step == 1) {\n // quick calculation for minutes with 1 minute step\n res = this._getMinutesBetween(from, to, unit, step);\n } else {\n res = this._getWorkUnitsBetweenGeneric(from, to, unit, step);\n } // getWorkUnits.. returns decimal durations\n\n\n return sign * Math.round(res);\n },\n hasDuration: function hasDuration() {\n var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n var from = config.start_date,\n to = config.end_date,\n unit = config.unit,\n step = config.step;\n\n if (!unit) {\n return false;\n }\n\n var start = new Date(from),\n end = new Date(to);\n step = step || 1;\n\n while (start.valueOf() < end.valueOf()) {\n if (this._isWorkTime(start, unit)) return true;\n start = this._nextDate(start, unit, step);\n }\n\n return false;\n },\n calculateEndDate: function calculateEndDate() {\n var config = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);\n var from = config.start_date,\n duration = config.duration,\n unit = config.unit,\n step = config.step;\n if (!unit) return false;\n var mult = config.duration >= 0 ? 1 : -1;\n duration = Math.abs(duration * 1); //\tvar endDate = this._calculateEndDate(from, duration, unit, step * mult);\n //\treturn endDate;\n\n var self = this;\n return this._dateDurationCache.getEndDate(from, duration, unit, step * mult, function () {\n return self._calculateEndDate(from, duration, unit, step * mult);\n });\n },\n _calculateEndDate: function _calculateEndDate(from, duration, unit, step) {\n if (!unit) return false;\n\n if (step == 1 && unit == \"minute\") {\n return this._calculateMinuteEndDate(from, duration, step);\n } else if (step == -1 && unit == \"minute\") {\n return this._subtractMinuteDate(from, duration, step);\n } else if (step == 1 && unit == \"hour\") {\n return this._calculateHourEndDate(from, duration, step);\n } else {\n var interval = this._addInterval(from, duration, unit, step, null);\n\n return interval.end;\n }\n },\n _addInterval: function _addInterval(start, duration, unit, step, stopAction) {\n var added = 0;\n var current = start;\n var dstShift = false;\n\n while (added < duration && !(stopAction && stopAction(current))) {\n var next = this._nextDate(current, unit, step); // GS-1501. Correct hours after DST change\n\n\n if (unit == \"day\") {\n dstShift = dstShift || !current.getHours() && next.getHours();\n\n if (dstShift) {\n next.setHours(0);\n\n if (next.getHours()) {// the day when the timezone is changed, try to correct hours next time\n } else {\n dstShift = false;\n }\n }\n }\n\n var dateValue = new Date(next.valueOf() + 1);\n\n if (step > 0) {\n dateValue = new Date(next.valueOf() - 1);\n }\n\n var workTimeCheck = this._isWorkTime(dateValue, unit);\n\n if (workTimeCheck && !dstShift) {\n added++;\n }\n\n current = next;\n }\n\n return {\n end: current,\n start: start,\n added: added\n };\n },\n _addHoursUntilDayEnd: function _addHoursUntilDayEnd(from, duration) {\n var dayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(from)), 1, \"day\");\n var added = 0;\n var left = duration;\n\n var range = this._getIntervalTimestamp(from, dayEnd);\n\n var worktimes = this._getWorkHours(from);\n\n for (var i = 0; i < worktimes.length && added < duration; i++) {\n var interval = worktimes[i];\n\n if (range.end >= interval.start && range.start <= interval.end) {\n var minuteFrom = Math.max(interval.start, range.start);\n var minuteTo = Math.min(interval.end, range.end);\n var rangeHours = (minuteTo - minuteFrom) / (60 * 60);\n\n if (rangeHours > left) {\n rangeHours = left;\n minuteTo = minuteFrom + left * 60 * 60;\n }\n\n var addHours = Math.round((minuteTo - minuteFrom) / (60 * 60));\n added += addHours;\n left -= addHours;\n range.start = minuteTo;\n }\n }\n\n var intervalEnd = dayEnd;\n\n if (added === duration) {\n intervalEnd = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, range.start);\n }\n\n return {\n added: added,\n end: intervalEnd\n };\n },\n _calculateHourEndDate: function _calculateHourEndDate(from, duration, step) {\n var start = new Date(from),\n added = 0;\n step = step || 1;\n duration = Math.abs(duration * 1);\n\n var interval = this._addHoursUntilDayEnd(start, duration);\n\n added = interval.added;\n start = interval.end;\n var durationLeft = duration - added;\n\n if (durationLeft) {\n var current = start;\n\n while (added < duration) {\n var next = this._nextDate(current, \"day\", step); // reset to day start in case DST switch happens in the process\n\n\n next.setHours(0);\n next.setMinutes(0);\n next.setSeconds(0);\n var hoursPerDay = 0;\n\n if (step > 0) {\n hoursPerDay = this.getHoursPerDay(new Date(next.valueOf() - 1));\n } else {\n hoursPerDay = this.getHoursPerDay(new Date(next.valueOf() + 1));\n }\n\n if (added + hoursPerDay >= duration) {\n break;\n } else {\n added += hoursPerDay;\n }\n\n current = next;\n }\n\n start = current;\n }\n\n if (added < duration) {\n var durationLeft = duration - added;\n interval = this._addHoursUntilDayEnd(start, durationLeft);\n start = interval.end;\n }\n\n return start;\n },\n _addMinutesUntilHourEnd: function _addMinutesUntilHourEnd(from, duration) {\n if (from.getMinutes() === 0) {\n // already at hour end\n return {\n added: 0,\n end: new Date(from)\n };\n }\n\n var hourEnd = this.$gantt.date.add(this.$gantt.date.hour_start(new Date(from)), 1, \"hour\");\n var added = 0;\n var left = duration;\n\n var range = this._getIntervalTimestamp(from, hourEnd);\n\n var worktimes = this._getWorkHours(from);\n\n for (var i = 0; i < worktimes.length && added < duration; i++) {\n var interval = worktimes[i];\n\n if (range.end >= interval.start && range.start <= interval.end) {\n var minuteFrom = Math.max(interval.start, range.start);\n var minuteTo = Math.min(interval.end, range.end);\n var rangeMinutes = (minuteTo - minuteFrom) / 60;\n\n if (rangeMinutes > left) {\n rangeMinutes = left;\n minuteTo = minuteFrom + left * 60;\n } // TODO: verify testcase https://dhtmlxsupport.teamwork.com/desk/tickets/9625700/messages\n\n /*if (rangeMinutes === 0) {\r\n \trangeMinutes = left;\r\n \tminuteTo = minuteFrom + (left * 60);\r\n }*/\n\n\n var addMinutes = Math.round((minuteTo - minuteFrom) / 60);\n left -= addMinutes;\n added += addMinutes;\n range.start = minuteTo;\n }\n }\n\n var intervalEnd = hourEnd;\n\n if (added === duration) {\n intervalEnd = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, range.start);\n }\n\n return {\n added: added,\n end: intervalEnd\n };\n },\n _subtractMinutesUntilHourStart: function _subtractMinutesUntilHourStart(from, duration) {\n var hourStart = this.$gantt.date.hour_start(new Date(from));\n var added = 0;\n var left = duration;\n var hourStartTimestamp = hourStart.getHours() * 60 * 60 + hourStart.getMinutes() * 60 + hourStart.getSeconds();\n var initialDateTimestamp = from.getHours() * 60 * 60 + from.getMinutes() * 60 + from.getSeconds();\n\n var worktimes = this._getWorkHours(from);\n\n for (var i = worktimes.length - 1; i >= 0 && added < duration; i--) {\n var interval = worktimes[i];\n\n if (initialDateTimestamp > interval.start && hourStartTimestamp <= interval.end) {\n var minuteFrom = Math.min(initialDateTimestamp, interval.end);\n var minuteTo = Math.max(hourStartTimestamp, interval.start); //\tvar minuteFrom = Math.max(interval.start, currentHour.start);\n //\tvar minuteTo = Math.min(interval.end, currentHour.end);\n\n var rangeMinutes = (minuteFrom - minuteTo) / 60;\n\n if (rangeMinutes > left) {\n rangeMinutes = left;\n minuteTo = minuteFrom - left * 60;\n } // TODO: verify testcase https://dhtmlxsupport.teamwork.com/desk/tickets/9625700/messages\n\n /*if (rangeMinutes === 0) {\r\n \trangeMinutes = left;\r\n \tminuteTo = minuteFrom - (left * 60);\r\n }*/\n\n\n var addMinutes = Math.abs(Math.round((minuteFrom - minuteTo) / 60));\n left -= addMinutes;\n added += addMinutes;\n initialDateTimestamp = minuteTo;\n }\n }\n\n var intervalEnd = hourStart;\n\n if (added === duration) {\n intervalEnd = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, initialDateTimestamp);\n }\n\n return {\n added: added,\n end: intervalEnd\n };\n },\n _subtractMinuteDate: function _subtractMinuteDate(from, duration, step) {\n var start = new Date(from),\n added = 0;\n step = step || -1;\n duration = Math.abs(duration * 1);\n duration = Math.round(duration);\n\n var minutePrecision = this._isMinutePrecision(start);\n\n var addedInterval = this._subtractMinutesUntilHourStart(start, duration);\n\n added += addedInterval.added;\n start = addedInterval.end;\n var calculatedDay = 0;\n var daySchedule = [];\n var minutesInDay = 0;\n\n while (added < duration) {\n var dayStart = this.$gantt.date.day_start(new Date(start));\n var iterateFromDayEnd = false;\n\n if (start.valueOf() === dayStart.valueOf()) {\n dayStart = this.$gantt.date.add(dayStart, -1, \"day\");\n iterateFromDayEnd = true;\n } //var dayStartTimestamp = this.$gantt.date.day_start(new Date(start)).valueOf();\n\n\n var dayEnd = new Date(dayStart.getFullYear(), dayStart.getMonth(), dayStart.getDate(), 23, 59, 59, 999).valueOf();\n\n if (dayEnd !== calculatedDay) {\n daySchedule = this._getWorkHours(dayStart);\n minutesInDay = this._getMinutesPerDay(dayStart);\n calculatedDay = dayEnd;\n }\n\n var left = duration - added;\n\n var timestamp = this._getTimeOfDayStamp(start, iterateFromDayEnd);\n\n if (!daySchedule.length || !minutesInDay) {\n start = this.$gantt.date.add(start, -1, \"day\");\n continue;\n }\n\n if (daySchedule[daySchedule.length - 1].end <= timestamp) {\n if (left > minutesInDay) {\n added += minutesInDay;\n start = this.$gantt.date.add(start, -1, \"day\");\n continue;\n }\n }\n\n var isWorkHour = false;\n var workInterval = null;\n var prevInterval = null;\n\n for (var i = daySchedule.length - 1; i >= 0; i--) {\n if (daySchedule[i].start < timestamp - 1 && daySchedule[i].end >= timestamp - 1) {\n isWorkHour = true;\n workInterval = daySchedule[i];\n prevInterval = daySchedule[i - 1];\n break;\n }\n }\n\n if (isWorkHour) {\n // we're at the end of worktime interval and subtracting more than the duration of the interval\n // -> subtract the duration of the interval and move to the start of the interval (we're moving from end)\n if (timestamp === workInterval.end && left >= workInterval.durationMinutes) {\n added += workInterval.durationMinutes;\n start = this.$gantt.date.add(start, -workInterval.durationMinutes, \"minute\");\n } // worktime is set in whole hours (no intervals like 9:15-10:00)\n // the amount we need to subtract lies inside the interval\n else if (!minutePrecision && left <= timestamp / 60 - workInterval.startMinute) {\n added += left;\n start = this.$gantt.date.add(start, -left, \"minute\");\n } else if (minutePrecision) {\n // GS-2129. If the working time is set in minutes, we accumulate the working time in minutes from right to left\n // duration we need to subtract lies completely inside the work interval\n if (left <= timestamp / 60 - workInterval.startMinute) {\n added += left;\n start = this.$gantt.date.add(start, -left, \"minute\");\n } else {\n // we need to go trough multiple work intervals to subtract needed time\n added += timestamp / 60 - workInterval.startMinute;\n\n if (prevInterval) {\n start = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, prevInterval.end);\n } else {\n start = this.$gantt.date.day_start(start);\n }\n }\n } else {\n var minutesInHour = this._getMinutesPerHour(start);\n\n if (minutesInHour <= left) {\n added += minutesInHour;\n start = this._nextDate(start, \"hour\", step);\n } else {\n addedInterval = this._subtractMinutesUntilHourStart(start, left);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n }\n } else {\n if (start.getHours() === 0 && start.getMinutes() === 0 && start.getSeconds() === 0) {\n var prev = this._getClosestWorkTimePast(start, \"hour\");\n\n if (prev.valueOf() === start.valueOf()) {\n var prev = this.$gantt.date.add(start, -1, \"day\");\n\n var times = this._getWorkHours(prev);\n\n if (times.length) {\n var lastInterval = times[times.length - 1];\n prev.setSeconds(lastInterval.durationSeconds);\n }\n }\n\n start = prev;\n } else {\n start = this._getClosestWorkTimePast(new Date(start - 1), \"hour\");\n }\n }\n }\n\n if (added < duration) {\n var durationLeft = duration - added;\n addedInterval = this._subtractMinutesUntilHourStart(start, durationLeft);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n\n return start;\n },\n _calculateMinuteEndDate: function _calculateMinuteEndDate(from, duration, step) {\n var start = new Date(from),\n added = 0;\n step = step || 1;\n duration = Math.abs(duration * 1);\n duration = Math.round(duration);\n\n var addedInterval = this._addMinutesUntilHourEnd(start, duration);\n\n added += addedInterval.added;\n start = addedInterval.end;\n var calculatedDay = 0;\n var daySchedule = [];\n var minutesInDay = 0;\n\n var minutePrecision = this._isMinutePrecision(start);\n\n while (added < duration) {\n var dayStart = this.$gantt.date.day_start(new Date(start)).valueOf();\n\n if (dayStart !== calculatedDay) {\n daySchedule = this._getWorkHours(start);\n minutesInDay = this._getMinutesPerDay(start);\n calculatedDay = dayStart;\n }\n\n var left = duration - added;\n\n var timestamp = this._getTimeOfDayStamp(start);\n\n if (!daySchedule.length || !minutesInDay) {\n start = this.$gantt.date.add(this.$gantt.date.day_start(start), 1, \"day\");\n continue;\n }\n\n if (daySchedule[0].start >= timestamp) {\n if (left >= minutesInDay) {\n added += minutesInDay;\n\n if (left == minutesInDay) {\n start = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, daySchedule[daySchedule.length - 1].end);\n break;\n } else {\n start = this.$gantt.date.add(start, 1, \"day\");\n start = this.$gantt.date.day_start(start);\n }\n\n continue;\n }\n }\n\n var isWorkHour = false;\n var workInterval = null;\n\n for (var i = 0; i < daySchedule.length; i++) {\n if (daySchedule[i].start <= timestamp && daySchedule[i].end > timestamp) {\n isWorkHour = true;\n workInterval = daySchedule[i];\n break;\n }\n }\n\n if (isWorkHour) {\n if (timestamp === workInterval.start && left >= workInterval.durationMinutes) {\n added += workInterval.durationMinutes;\n start = this.$gantt.date.add(start, workInterval.durationMinutes, \"minute\");\n } else if (left <= workInterval.endMinute - timestamp / 60) {\n added += left;\n start = this.$gantt.date.add(start, left, \"minute\");\n } else {\n var minutesInHour = this._getMinutesPerHour(start);\n\n if (minutesInHour <= left) {\n added += minutesInHour; // when the working time settings are set in minutes move to the next minutes\n\n if (minutePrecision) {\n start = this.$gantt.date.add(start, minutesInHour, \"minute\");\n } else {\n start = this._nextDate(start, \"hour\", step);\n }\n } else {\n addedInterval = this._addMinutesUntilHourEnd(start, left);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n }\n } else {\n start = this._getClosestWorkTimeFuture(start, \"hour\");\n }\n }\n\n if (added < duration) {\n var durationLeft = duration - added;\n addedInterval = this._addMinutesUntilHourEnd(start, durationLeft);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n\n return start;\n },\n getClosestWorkTime: function getClosestWorkTime() {\n var settings = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);\n return this._getClosestWorkTime(settings.date, settings.unit, settings.dir);\n },\n _getClosestWorkTime: function _getClosestWorkTime(inputDate, unit, direction) {\n var result = new Date(inputDate);\n\n if (this._isWorkTime(result, unit)) {\n return result;\n }\n\n result = this.$gantt.date[unit + '_start'](result);\n\n if (direction == 'any' || !direction) {\n var closestFuture = this._getClosestWorkTimeFuture(result, unit);\n\n var closestPast = this._getClosestWorkTimePast(result, unit);\n\n if (Math.abs(closestFuture - inputDate) <= Math.abs(inputDate - closestPast)) {\n result = closestFuture;\n } else {\n result = closestPast;\n }\n } else if (direction == \"past\") {\n result = this._getClosestWorkTimePast(result, unit);\n } else {\n result = this._getClosestWorkTimeFuture(result, unit);\n }\n\n return result;\n },\n _getClosestWorkTimeFuture: function _getClosestWorkTimeFuture(date, unit) {\n return this._getClosestWorkTimeGeneric(date, unit, 1);\n },\n _getClosestWorkTimePast: function _getClosestWorkTimePast(date, unit) {\n var result = this._getClosestWorkTimeGeneric(date, unit, -1); // should return the end of the closest work interval\n\n\n return this.$gantt.date.add(result, 1, unit);\n },\n _findClosestTimeInDay: function _findClosestTimeInDay(date, direction, worktimes) {\n var start = new Date(date);\n var resultDate = null;\n var fromDayEnd = false;\n\n if (!this._getWorkHours(start).length) {\n start = this._getClosestWorkTime(start, \"day\", direction < 0 ? \"past\" : \"future\");\n\n if (direction < 0) {\n start = new Date(start.valueOf() - 1);\n fromDayEnd = true;\n }\n\n worktimes = this._getWorkHours(start);\n }\n\n var value = this._getTimeOfDayStamp(start);\n\n if (fromDayEnd) {\n value = this._getTimeOfDayStamp(new Date(start.valueOf() + 1), fromDayEnd);\n }\n\n if (direction > 0) {\n for (var i = 0; i < worktimes.length; i++) {\n if (worktimes[i].start >= value) {\n resultDate = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, worktimes[i].start);\n break;\n }\n }\n } else {\n for (var i = worktimes.length - 1; i >= 0; i--) {\n if (worktimes[i].end <= value) {\n resultDate = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, worktimes[i].end);\n break;\n } else if (worktimes[i].end > value && worktimes[i].start <= value) {\n resultDate = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, value);\n break;\n }\n }\n }\n\n return resultDate;\n },\n _getClosestWorkMinute: function _getClosestWorkMinute(date, unit, direction) {\n var start = new Date(date);\n\n var worktimes = this._getWorkHours(start);\n\n var resultDate = this._findClosestTimeInDay(start, direction, worktimes);\n\n if (!resultDate) {\n start = this.calculateEndDate(start, direction, \"day\");\n\n if (direction > 0) {\n start = this.$gantt.date.day_start(start);\n } else {\n start = this.$gantt.date.day_start(start);\n start = this.$gantt.date.add(start, 1, \"day\");\n start = new Date(start.valueOf() - 1);\n }\n\n worktimes = this._getWorkHours(start);\n resultDate = this._findClosestTimeInDay(start, direction, worktimes);\n }\n\n if (direction < 0) {\n // getClosestWorkTimePast adds one time unit to the result date after this\n resultDate = this.$gantt.date.add(resultDate, -1, unit);\n }\n\n return resultDate;\n },\n _getClosestWorkTimeGeneric: function _getClosestWorkTimeGeneric(date, unit, increment) {\n if (unit === \"hour\" || unit === \"minute\") {\n return this._getClosestWorkMinute(date, unit, increment);\n }\n\n var unitOrder = this._getUnitOrder(unit),\n biggerTimeUnit = this.units[unitOrder - 1];\n\n var result = date; // be extra sure we won't fall into infinite loop, 3k seems big enough\n\n var maximumLoop = 3000,\n count = 0;\n\n while (!this._isWorkTime(result, unit)) {\n if (biggerTimeUnit && !this._isWorkTime(result, biggerTimeUnit)) {\n // if we look for closest work hour and detect a week-end - first find the closest work day,\n // and continue iterations after that\n if (increment > 0) {\n result = this._getClosestWorkTimeFuture(result, biggerTimeUnit);\n } else {\n result = this._getClosestWorkTimePast(result, biggerTimeUnit);\n }\n\n if (this._isWorkTime(result, unit)) {\n break;\n }\n }\n\n count++;\n\n if (count > maximumLoop) {\n this.$gantt.assert(false, \"Invalid working time check\");\n return false;\n }\n\n var tzOffset = result.getTimezoneOffset();\n result = this.$gantt.date.add(result, increment, unit);\n result = this.$gantt._correct_dst_change(result, tzOffset, increment, unit);\n\n if (this.$gantt.date[unit + '_start']) {\n result = this.$gantt.date[unit + '_start'](result);\n }\n }\n\n return result;\n },\n\n /**\r\n * Check whether this calendar has working time. Calendar has working time only if there are regular working days of week\r\n *\r\n */\n hasWorkTime: function hasWorkTime() {\n var worktime = this.getConfig();\n var dates = worktime.dates;\n var daysOfWeek = [0, 1, 2, 3, 4, 5, 6];\n var exceptions = [];\n\n for (var i in worktime.dates) {\n if (Number(i) > 6) {\n exceptions.push(Number(i));\n }\n }\n\n var hasRegularHours = this._checkWorkHours(worktime.hours);\n\n var result = false;\n daysOfWeek.forEach(function (day) {\n if (result) {\n return;\n }\n\n var dayConfig = dates[day];\n\n if (dayConfig === true) {\n // workday uses global hours\n result = hasRegularHours;\n } else if (Array.isArray(dayConfig)) {\n // workday uses custom hours\n result = this._checkWorkHours(dayConfig);\n }\n }.bind(this));\n return result;\n },\n _checkWorkHours: function _checkWorkHours(hoursArray) {\n if (hoursArray.length === 0) {\n return false;\n }\n\n var result = false;\n\n for (var i = 0; i < hoursArray.length; i += 2) {\n if (hoursArray[i] !== hoursArray[i + 1]) {\n result = true;\n }\n }\n\n return result;\n },\n _isMinutePrecision: function _isMinutePrecision(date) {\n var minutePrecision = false;\n\n this._getWorkHours(date).forEach(function (interval) {\n if (interval.startMinute % 60 || interval.endMinute % 60) {\n minutePrecision = true;\n }\n });\n\n return minutePrecision;\n }\n};\nmodule.exports = CalendarWorkTimeStrategy;","var utils = require(\"../../../utils/utils\");\n\nfunction WorkTimeCalendarMerger() {}\n\nWorkTimeCalendarMerger.prototype = {\n /**\r\n * convert hours array items into objects, e.g. [8, 12, 17, 18] -> [{start: 8, end: 12}, {start:17, end:18}]\r\n * @param {Array} hoursArray\r\n */\n _getIntervals: function _getIntervals(hoursArray) {\n var result = [];\n\n for (var i = 0; i < hoursArray.length; i += 2) {\n result.push({\n start: hoursArray[i],\n end: hoursArray[i + 1]\n });\n }\n\n return result;\n },\n\n /**\r\n * Convert ranges config into hours array\r\n * [{start: 8, end: 12}, {start:17, end:18}] --> [8, 12, 17, 18]\r\n * @param {*} intervalsArray\r\n */\n _toHoursArray: function _toHoursArray(intervalsArray) {\n var result = [];\n\n function toFixed(value) {\n var str = String(value);\n\n if (str.length < 2) {\n str = \"0\" + str;\n }\n\n return str;\n }\n\n function formatHHMM(secondsValue) {\n var hours = Math.floor(secondsValue / (60 * 60));\n var minutePart = secondsValue - hours * 60 * 60;\n var minutes = Math.floor(minutePart / 60);\n return hours + \":\" + toFixed(minutes);\n }\n\n for (var i = 0; i < intervalsArray.length; i++) {\n result.push(formatHHMM(intervalsArray[i].start) + \"-\" + formatHHMM(intervalsArray[i].end));\n }\n\n return result;\n },\n\n /**\r\n * Build intersection of hour intervals. e.g.\r\n * first: [{start: 8, end: 12}, {start:13, end:18}]\r\n * second: [{start: 10, end: 15}]\r\n * result: [{start: 10, end: 12}, {start: 13, end: 15}]\r\n * @param {Array} first\r\n * @param {Array} second\r\n */\n _intersectHourRanges: function _intersectHourRanges(first, second) {\n var result = [];\n var baseArray = first.length > second.length ? first : second;\n var overridesArray = first === baseArray ? second : first;\n baseArray = baseArray.slice();\n overridesArray = overridesArray.slice();\n var result = [];\n\n for (var i = 0; i < baseArray.length; i++) {\n var base = baseArray[i];\n\n for (var j = 0; j < overridesArray.length; j++) {\n var current = overridesArray[j];\n\n if (current.start < base.end && current.end > base.start) {\n result.push({\n start: Math.max(base.start, current.start),\n end: Math.min(base.end, current.end)\n });\n\n if (base.end > current.end) {\n overridesArray.splice(j, 1);\n j--;\n i--;\n }\n }\n }\n }\n\n return result;\n },\n\n /**\r\n * Reduce the number of ranges in config when possible,\r\n * joins ranges that can be merged\r\n * parts: [{start: 8, end: 12}, {start:12, end:13}, {start: 15, end: 17}]\r\n * result: [{start: 8, end: 13}, {start: 15, end: 17}]\r\n * @param {Array} parts\r\n */\n _mergeAdjacentIntervals: function _mergeAdjacentIntervals(parts) {\n var result = parts.slice();\n result.sort(function (a, b) {\n return a.start - b.start;\n });\n var base = result[0];\n\n for (var i = 1; i < result.length; i++) {\n var current = result[i];\n\n if (current.start <= base.end) {\n if (current.end > base.end) {\n base.end = current.end;\n }\n\n result.splice(i, 1);\n i--;\n } else {\n base = current;\n }\n }\n\n return result;\n },\n _mergeHoursConfig: function _mergeHoursConfig(firstHours, secondHours) {\n //var firstIntervals = this._getIntervals(firstHours);\n //var secondIntervals = this._getIntervals(secondHours);\n return this._mergeAdjacentIntervals(this._intersectHourRanges(firstHours, secondHours));\n },\n merge: function merge(first, second) {\n var firstConfig = utils.copy(first.getConfig().parsed);\n var secondConfig = utils.copy(second.getConfig().parsed);\n var mergedSettings = {\n hours: this._toHoursArray(this._mergeHoursConfig(firstConfig.hours, secondConfig.hours)),\n dates: {},\n customWeeks: {}\n };\n\n for (var i in firstConfig.dates) {\n var firstDate = firstConfig.dates[i];\n var secondDate = secondConfig.dates[i]; // if this key is a working date in both calendars\n\n if (firstDate && secondDate) {\n // if at least one of working date is set by hours config - build intersection\n if (Array.isArray(firstDate) || Array.isArray(secondDate)) {\n var firstHours = Array.isArray(firstDate) ? firstDate : firstConfig.hours;\n var secondHours = Array.isArray(secondDate) ? secondDate : secondConfig.hours;\n mergedSettings.dates[i] = this._toHoursArray(this._mergeHoursConfig(firstHours, secondHours));\n } else {\n // date will use global hours\n mergedSettings.dates[i] = true;\n }\n } else {\n mergedSettings.dates[i] = false;\n }\n } // transfer and overwrite custom week calendars\n\n\n if (firstConfig.customWeeks) {\n for (var i in firstConfig.customWeeks) {\n mergedSettings.customWeeks[i] = firstConfig.customWeeks[i];\n }\n }\n\n if (secondConfig.customWeeks) {\n for (var i in secondConfig.customWeeks) {\n mergedSettings.customWeeks[i] = secondConfig.customWeeks[i];\n }\n }\n\n return mergedSettings;\n }\n};\nmodule.exports = WorkTimeCalendarMerger;","var utils = require(\"../../utils/utils\");\n\nvar createArgumentsHelper = require(\"./calendar_arguments_helper\");\n\nvar CalendarMergeHelper = require(\"./strategy/work_calendar_merger\");\n\nvar CalendarWorkTimeStrategy = require(\"./strategy/calendar_strategy\");\n\nvar legacyResourceCalendarConfig = require(\"./legacy_resource_config\");\n\nvar dynamicResourceCalendars = require(\"./dynamic_resource_calendars\")();\n\nfunction CalendarManager(gantt) {\n this.$gantt = gantt;\n this._calendars = {};\n this._legacyConfig = undefined;\n this.$gantt.attachEvent(\"onGanttReady\", function () {\n if (this.$gantt.config.resource_calendars) {\n this._isLegacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(this.$gantt.config.resource_calendars);\n }\n }.bind(this));\n this.$gantt.attachEvent(\"onBeforeGanttReady\", function () {\n this.createDefaultCalendars();\n }.bind(this));\n this.$gantt.attachEvent(\"onBeforeGanttRender\", function () {\n this.createDefaultCalendars();\n }.bind(this));\n}\n\nCalendarManager.prototype = {\n _calendars: {},\n _convertWorkTimeSettings: function _convertWorkTimeSettings(settings) {\n var days = settings.days;\n\n if (days && !settings.dates) {\n settings.dates = settings.dates || {};\n\n for (var i = 0; i < days.length; i++) {\n settings.dates[i] = days[i];\n\n if (!(days[i] instanceof Array)) {\n settings.dates[i] = !!days[i];\n }\n }\n }\n\n delete settings.days;\n return settings;\n },\n mergeCalendars: function mergeCalendars() {\n var calendars = [];\n var args = arguments;\n\n if (Array.isArray(args[0])) {\n calendars = args[0].slice();\n } else {\n for (var i = 0; i < arguments.length; i++) {\n calendars.push(arguments[i]);\n }\n }\n\n var mergeHelper = new CalendarMergeHelper();\n var result;\n calendars.forEach(function (calendar) {\n if (!result) {\n result = calendar;\n } else {\n result = this._createCalendarFromConfig(mergeHelper.merge(result, calendar));\n }\n }.bind(this));\n return this.createCalendar(result);\n },\n _createCalendarFromConfig: function _createCalendarFromConfig(config) {\n var apiCore = new CalendarWorkTimeStrategy(this.$gantt, createArgumentsHelper(this.$gantt));\n apiCore.id = String(utils.uid());\n\n var preparedConfig = this._convertWorkTimeSettings(config);\n\n if (preparedConfig.customWeeks) {\n for (var i in preparedConfig.customWeeks) {\n preparedConfig.customWeeks[i] = this._convertWorkTimeSettings(preparedConfig.customWeeks[i]);\n }\n }\n\n apiCore._setConfig(preparedConfig);\n\n return apiCore;\n },\n createCalendar: function createCalendar(parentCalendar) {\n var settings;\n\n if (!parentCalendar) {\n parentCalendar = {};\n }\n\n if (parentCalendar.getConfig) {\n settings = utils.copy(parentCalendar.getConfig());\n } else if (parentCalendar.worktime) {\n settings = utils.copy(parentCalendar.worktime);\n } else {\n settings = utils.copy(parentCalendar);\n }\n\n var defaults = utils.copy(this.defaults.fulltime.worktime);\n utils.mixin(settings, defaults);\n return this._createCalendarFromConfig(settings);\n },\n getCalendar: function getCalendar(id) {\n id = id || \"global\";\n var calendar = this._calendars[id];\n\n if (!calendar) {\n this.createDefaultCalendars();\n calendar = this._calendars[id];\n }\n\n return calendar;\n },\n getCalendars: function getCalendars() {\n var res = [];\n\n for (var i in this._calendars) {\n res.push(this.getCalendar(i));\n }\n\n return res;\n },\n _getOwnCalendar: function _getOwnCalendar(task) {\n var config = this.$gantt.config;\n\n if (task[config.calendar_property]) {\n return this.getCalendar(task[config.calendar_property]);\n }\n\n if (config.resource_calendars) {\n var calendar;\n var calendarId;\n var resourceProperty;\n\n if (this._legacyConfig === false) {\n resourceProperty = config.resource_property;\n } else {\n resourceProperty = legacyResourceCalendarConfig.getResourceProperty(config);\n }\n\n if (Array.isArray(task[resourceProperty])) {\n // if multiple resources are attached to the task - merge their calendars\n if (config.dynamic_resource_calendars) {\n calendarId = dynamicResourceCalendars.getCalendarIdFromMultipleResources(task[resourceProperty], this);\n }\n } else {\n if (this._legacyConfig === undefined) {\n this._legacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(config.resource_calendars);\n }\n\n if (this._legacyConfig) {\n var calendarId = legacyResourceCalendarConfig.getCalendarIdFromLegacyConfig(task, config.resource_calendars);\n } else if (resourceProperty && task[resourceProperty] && config.resource_calendars[task[resourceProperty]]) {\n var calendar = this.getResourceCalendar(task[resourceProperty]);\n }\n }\n\n if (calendarId) {\n calendar = this.getCalendar(calendarId);\n }\n\n if (calendar) {\n return calendar;\n }\n }\n\n return null;\n },\n\n /**\r\n * Returns calendar assigned to the specified resource.\r\n * Returns the global calendar if no custom calendar is associated with the resource.\r\n * @param {(string|number|Object)} resource - resource object or resource id\r\n * @returns {object} Calendar object\r\n */\n getResourceCalendar: function getResourceCalendar(resource) {\n if (resource === null || resource === undefined) {\n return this.getCalendar();\n }\n\n var resourceId = null; // if task id is provided\n\n if (typeof resource === \"number\" || typeof resource === \"string\") {\n resourceId = resource;\n } else {\n resourceId = resource.id || resource.key;\n }\n\n var config = this.$gantt.config;\n var calendarsConfig = config.resource_calendars;\n var calendarId = null;\n\n if (calendarsConfig) {\n if (this._legacyConfig === undefined) {\n this._legacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(config.resource_calendars);\n }\n\n if (this._legacyConfig) {\n for (var field in calendarsConfig) {\n if (calendarsConfig[field][resourceId]) {\n calendarId = calendarsConfig[field][resourceId];\n break;\n }\n }\n } else {\n var calendarId = calendarsConfig[resourceId];\n }\n\n if (calendarId) {\n return this.getCalendar(calendarId);\n }\n }\n\n return this.getCalendar();\n },\n\n /**\r\n * Returns the calendar assigned to a task.\r\n * - Returns a calendar assigned via task[gantt.config.calendar_property] if specified.\r\n * - Returns a calendar assigned to the task resource if specified.\r\n * - Returns the global calendar otherwise.\r\n * @param {(string|number|Object)} task - task object or task id\r\n * @returns {object} Calendar object\r\n */\n getTaskCalendar: function getTaskCalendar(task) {\n var gantt = this.$gantt;\n var taskObject;\n\n if (task === null || task === undefined) {\n return this.getCalendar();\n } // if task id is provided\n\n\n if ((typeof task === \"number\" || typeof task === \"string\") && gantt.isTaskExists(task)) {\n taskObject = gantt.getTask(task);\n } else {\n taskObject = task;\n }\n\n if (!taskObject) {\n return this.getCalendar();\n }\n\n var calendar = this._getOwnCalendar(taskObject);\n\n var groupMode = !!gantt.getState().group_mode;\n\n if (!calendar && gantt.config.inherit_calendar && gantt.isTaskExists(taskObject.parent)) {\n // GS-1579 group mode overrides tree hierarchy, iterate using `.parent` property, instead of using eachParent iterator\n var currentTask = taskObject;\n\n while (gantt.isTaskExists(currentTask.parent)) {\n currentTask = gantt.getTask(currentTask.parent);\n\n if (gantt.isSummaryTask(currentTask)) {\n calendar = this._getOwnCalendar(currentTask);\n\n if (calendar) {\n break;\n }\n }\n }\n\n if (groupMode && !calendar) {\n // if group mode and inherit_calendars is enabled - preserve previously applied parent calendar\n // we may need it when groupBy parses grouped data, old parent may be not loaded yet\n if (task.$effective_calendar) {\n calendar = this.getCalendar(task.$effective_calendar);\n }\n }\n }\n\n return calendar || this.getCalendar();\n },\n addCalendar: function addCalendar(calendar) {\n // puts new calendar to Global Storage - gantt.calendarManager._calendars {}\n if (!this.isCalendar(calendar)) {\n var id = calendar.id;\n calendar = this.createCalendar(calendar);\n calendar.id = id;\n } // validate/check if empty calendar\n\n\n if (!calendar._tryChangeCalendarSettings(function () {})) {\n this.$gantt.callEvent(\"onCalendarError\", [{\n message: \"Invalid calendar settings, no worktime available\"\n }, calendar]);\n return null;\n } else {\n var config = this.$gantt.config;\n calendar.id = calendar.id || utils.uid();\n this._calendars[calendar.id] = calendar;\n if (!config.worktimes) config.worktimes = {};\n config.worktimes[calendar.id] = calendar.getConfig();\n return calendar.id;\n }\n },\n deleteCalendar: function deleteCalendar(calendar) {\n var config = this.$gantt.config;\n if (!calendar) return false;\n\n if (this._calendars[calendar]) {\n delete this._calendars[calendar];\n if (config.worktimes && config.worktimes[calendar]) delete config.worktimes[calendar];\n return true;\n } else {\n return false;\n }\n },\n restoreConfigCalendars: function restoreConfigCalendars(configs) {\n for (var i in configs) {\n if (this._calendars[i]) continue;\n var settings = configs[i];\n var calendar = this.createCalendar(settings);\n calendar.id = i;\n this.addCalendar(calendar);\n }\n },\n defaults: {\n global: {\n id: \"global\",\n worktime: {\n hours: [8, 12, 13, 17],\n days: [0, 1, 1, 1, 1, 1, 0]\n }\n },\n fulltime: {\n id: \"fulltime\",\n worktime: {\n hours: [0, 24],\n days: [1, 1, 1, 1, 1, 1, 1]\n }\n }\n },\n createDefaultCalendars: function createDefaultCalendars() {\n var config = this.$gantt.config;\n this.restoreConfigCalendars(this.defaults);\n this.restoreConfigCalendars(config.worktimes);\n },\n isCalendar: function isCalendar(possibleCalendar) {\n // because we don't have any way to check without dependency to CalendarWorkTimeStrategy\n var props = [possibleCalendar.isWorkTime, possibleCalendar.setWorkTime, possibleCalendar.getWorkHours, possibleCalendar.unsetWorkTime, possibleCalendar.getClosestWorkTime, possibleCalendar.calculateDuration, possibleCalendar.hasDuration, possibleCalendar.calculateEndDate];\n return props.every(function (entry) {\n return entry instanceof Function;\n });\n }\n};\nmodule.exports = CalendarManager;","var CalendarManager = require(\"./calendar_manager\"),\n TimeCalculator = require(\"./time_calculator\"),\n worktimeFacadeFactory = require(\"../facades/worktime_calendars\"),\n utils = require(\"../../utils/utils\");\n\nmodule.exports = function (gantt) {\n var manager = new CalendarManager(gantt),\n timeCalculator = new TimeCalculator(manager);\n var facade = worktimeFacadeFactory.create(manager, timeCalculator);\n utils.mixin(gantt, facade);\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar helpers = require(\"../utils/helpers\");\n\nmodule.exports = function (gantt) {\n gantt.load = function (url, type, callback) {\n this._load_url = url;\n this.assert(arguments.length, \"Invalid load arguments\");\n var tp = 'json',\n cl = null;\n\n if (arguments.length >= 3) {\n tp = type;\n cl = callback;\n } else {\n if (typeof arguments[1] == \"string\") tp = arguments[1];else if (typeof arguments[1] == \"function\") cl = arguments[1];\n }\n\n this._load_type = tp;\n this.callEvent(\"onLoadStart\", [url, tp]);\n return this.ajax.get(url, gantt.bind(function (l) {\n this.on_load(l, tp);\n this.callEvent(\"onLoadEnd\", [url, tp]);\n if (typeof cl == \"function\") cl.call(this);\n }, this));\n };\n\n gantt.parse = function (data, type) {\n this.on_load({\n xmlDoc: {\n responseText: data\n }\n }, type);\n };\n\n gantt.serialize = function (type) {\n type = type || \"json\";\n return this[type].serialize();\n };\n /*\r\n tasks and relations\r\n {\r\n data:[\r\n \t{\r\n \t\t\"id\":\"string\",\r\n \t\t\"text\":\"...\",\r\n \t\t\"start_date\":\"Date or string\",\r\n \t\t\"end_date\":\"Date or string\",\r\n \t\t\"duration\":\"number\",\r\n \t\t\"progress\":\"0..1\",\r\n \t\t\"parent_id\":\"string\",\r\n \t\t\"order\":\"number\"\r\n \t},...],\r\n links:[\r\n \t{\r\n \t\tid:\"string\",\r\n \t\tsource:\"string\",\r\n \t\ttarget:\"string\",\r\n \t\ttype:\"string\"\r\n \t},...],\r\n collections:{\r\n \t\tcollectionName:[\r\n \t\t\t{key:, label:, optional:...},...\r\n \t\t],...\r\n \t}\r\n }\r\n \n * */\n\n\n gantt.on_load = function (resp, type) {\n if (resp.xmlDoc && resp.xmlDoc.status === 404) {\n // work if we don't have a file at current url\n this.assert(false, \"Failed to load the data from <a href='\" + resp.xmlDoc.responseURL + \"' target='_blank'>\" + resp.xmlDoc.responseURL + \"</a>, server returns 404\");\n return;\n }\n\n if (gantt.$destroyed) {\n return;\n }\n\n this.callEvent(\"onBeforeParse\", []);\n if (!type) type = \"json\";\n this.assert(this[type], \"Invalid data type:'\" + type + \"'\");\n var raw = resp.xmlDoc.responseText;\n var data = this[type].parse(raw, resp);\n\n this._process_loading(data);\n };\n\n function attachAssignmentsToTasks(tasks, assignments) {\n var assignmentsByTasks = {};\n assignments.forEach(function (a) {\n if (!assignmentsByTasks[a.task_id]) {\n assignmentsByTasks[a.task_id] = [];\n }\n\n assignmentsByTasks[a.task_id].push(a);\n });\n tasks.forEach(function (t) {\n t[gantt.config.resource_property] = assignmentsByTasks[t.id] || [];\n });\n }\n\n gantt._process_loading = function (data) {\n if (data.collections) this._load_collections(data.collections);\n\n if (data.resources && this.$data.resourcesStore) {\n this.$data.resourcesStore.parse(data.resources);\n }\n\n var tasks = data.data || data.tasks;\n\n if (data.assignments) {\n attachAssignmentsToTasks(tasks, data.assignments);\n }\n\n this.$data.tasksStore.parse(tasks);\n var links = data.links || (data.collections ? data.collections.links : []);\n this.$data.linksStore.parse(links); //this._sync_links();\n\n this.callEvent(\"onParse\", []);\n this.render();\n };\n\n gantt._load_collections = function (collections) {\n var collections_loaded = false;\n\n for (var key in collections) {\n if (collections.hasOwnProperty(key)) {\n collections_loaded = true;\n var collection = collections[key]; // GS-1728. Create an empty serverList if it doesn't exist\n\n this.serverList[key] = this.serverList[key] || [];\n var arr = this.serverList[key];\n if (!arr) continue;\n arr.splice(0, arr.length); //clear old options\n\n for (var j = 0; j < collection.length; j++) {\n var option = collection[j];\n var obj = this.copy(option);\n obj.key = obj.value; // resulting option object\n\n for (var option_key in option) {\n if (option.hasOwnProperty(option_key)) {\n if (option_key == \"value\" || option_key == \"label\") continue;\n obj[option_key] = option[option_key]; // obj['value'] = option['value']\n }\n }\n\n arr.push(obj);\n }\n }\n }\n\n if (collections_loaded) this.callEvent(\"onOptionsLoad\", []);\n };\n\n gantt.attachEvent(\"onBeforeTaskDisplay\", function (id, task) {\n return !task.$ignore;\n });\n\n function jsonParseError(data) {\n gantt.assert(false, \"Can't parse data: incorrect value of gantt.parse or gantt.load method. \" + \"Actual argument value: \" + JSON.stringify(data));\n throw new Error(\"Invalid argument for gantt.parse or gantt.load. An object or a JSON string of format https://docs.dhtmlx.com/gantt/desktop__supported_data_formats.html#json is expected. Actual argument value: \" + JSON.stringify(data));\n }\n\n gantt.json = {\n parse: function parse(data) {\n if (!data) {\n jsonParseError(data);\n }\n\n if (typeof data == \"string\") {\n if ((typeof JSON === \"undefined\" ? \"undefined\" : _typeof(JSON)) != undefined) {\n try {\n data = JSON.parse(data);\n } catch (e) {\n jsonParseError(data);\n }\n } else {\n gantt.assert(false, \"JSON is not supported\");\n }\n }\n\n if (!data.data && !data.tasks) {\n jsonParseError(data);\n }\n\n if (data.dhx_security) gantt.security_key = data.dhx_security;\n return data;\n },\n serializeTask: function serializeTask(task) {\n return this._copyObject(task);\n },\n serializeLink: function serializeLink(link) {\n return this._copyLink(link);\n },\n _copyLink: function _copyLink(obj) {\n var copy = {};\n\n for (var key in obj) {\n copy[key] = obj[key];\n }\n\n return copy;\n },\n _copyObject: function _copyObject(obj) {\n var copy = {};\n\n for (var key in obj) {\n if (key.charAt(0) == \"$\") continue;\n copy[key] = obj[key];\n\n if (helpers.isDate(copy[key])) {\n copy[key] = gantt.defined(gantt.templates.xml_format) ? gantt.templates.xml_format(copy[key]) : gantt.templates.format_date(copy[key]);\n }\n }\n\n return copy;\n },\n serialize: function serialize() {\n var tasks = [];\n var links = [];\n gantt.eachTask(function (obj) {\n gantt.resetProjectDates(obj);\n tasks.push(this.serializeTask(obj));\n }, gantt.config.root_id, this);\n var rawLinks = gantt.getLinks();\n\n for (var i = 0; i < rawLinks.length; i++) {\n links.push(this.serializeLink(rawLinks[i]));\n }\n\n return {\n data: tasks,\n links: links\n };\n }\n };\n /*\r\n <data>\r\n \t<task id:\"some\" parent_id=\"0\" progress=\"0.5\">\r\n \t\t<text>My task 1</text>\r\n \t\t<start_date>16.08.2013</start_date>\r\n \t\t<end_date>22.08.2013</end_date>\r\n \t</task>\r\n \t<coll_options>\r\n \t\t<links>\r\n \t\t\t<link source='a1' target='b2' type='c3' />\r\n \t\t</links>\r\n \t</coll_options>\r\n </data>\r\n */\n\n function xmlParseError(data) {\n gantt.assert(false, \"Can't parse data: incorrect value of gantt.parse or gantt.load method. \" + \"Actual argument value: \" + JSON.stringify(data));\n throw new Error(\"Invalid argument for gantt.parse or gantt.load. An XML of format https://docs.dhtmlx.com/gantt/desktop__supported_data_formats.html#xmldhtmlxgantt20 is expected. Actual argument value: \" + JSON.stringify(data));\n }\n\n gantt.xml = {\n _xmlNodeToJSON: function _xmlNodeToJSON(node, attrs_only) {\n var t = {};\n\n for (var i = 0; i < node.attributes.length; i++) {\n t[node.attributes[i].name] = node.attributes[i].value;\n }\n\n if (!attrs_only) {\n for (var i = 0; i < node.childNodes.length; i++) {\n var child = node.childNodes[i];\n if (child.nodeType == 1) t[child.tagName] = child.firstChild ? child.firstChild.nodeValue : \"\";\n }\n\n if (!t.text) t.text = node.firstChild ? node.firstChild.nodeValue : \"\";\n }\n\n return t;\n },\n _getCollections: function _getCollections(loader) {\n var collection = {};\n var opts = gantt.ajax.xpath(\"//coll_options\", loader);\n\n for (var i = 0; i < opts.length; i++) {\n var bind = opts[i].getAttribute(\"for\");\n var arr = collection[bind] = [];\n var itms = gantt.ajax.xpath(\".//item\", opts[i]);\n\n for (var j = 0; j < itms.length; j++) {\n var itm = itms[j];\n var attrs = itm.attributes;\n var obj = {\n key: itms[j].getAttribute(\"value\"),\n label: itms[j].getAttribute(\"label\")\n };\n\n for (var k = 0; k < attrs.length; k++) {\n var attr = attrs[k];\n if (attr.nodeName == \"value\" || attr.nodeName == \"label\") continue;\n obj[attr.nodeName] = attr.nodeValue;\n }\n\n arr.push(obj);\n }\n }\n\n return collection;\n },\n _getXML: function _getXML(text, loader, toptag) {\n toptag = toptag || \"data\";\n\n if (!loader.getXMLTopNode) {\n loader = gantt.ajax.parse(loader);\n }\n\n var xml = gantt.ajax.xmltop(toptag, loader.xmlDoc);\n\n if (!xml || xml.tagName != toptag) {\n xmlParseError(text);\n }\n\n var skey = xml.getAttribute(\"dhx_security\");\n if (skey) gantt.security_key = skey;\n return xml;\n },\n parse: function parse(text, loader) {\n loader = this._getXML(text, loader);\n var data = {};\n var evs = data.data = [];\n var xml = gantt.ajax.xpath(\"//task\", loader);\n\n for (var i = 0; i < xml.length; i++) {\n evs[i] = this._xmlNodeToJSON(xml[i]);\n }\n\n data.collections = this._getCollections(loader);\n return data;\n },\n _copyLink: function _copyLink(obj) {\n return \"<item id='\" + obj.id + \"' source='\" + obj.source + \"' target='\" + obj.target + \"' type='\" + obj.type + \"' />\";\n },\n _copyObject: function _copyObject(obj) {\n return \"<task id='\" + obj.id + \"' parent='\" + (obj.parent || \"\") + \"' start_date='\" + obj.start_date + \"' duration='\" + obj.duration + \"' open='\" + !!obj.open + \"' progress='\" + obj.progress + \"' end_date='\" + obj.end_date + \"'><![CDATA[\" + obj.text + \"]]></task>\";\n },\n serialize: function serialize() {\n var tasks = [];\n var links = [];\n var json = gantt.json.serialize();\n\n for (var i = 0, len = json.data.length; i < len; i++) {\n tasks.push(this._copyObject(json.data[i]));\n }\n\n for (var i = 0, len = json.links.length; i < len; i++) {\n links.push(this._copyLink(json.links[i]));\n }\n\n return \"<data>\" + tasks.join(\"\") + \"<coll_options for='links'>\" + links.join(\"\") + \"</coll_options></data>\";\n }\n };\n gantt.oldxml = {\n parse: function parse(text, loader) {\n loader = gantt.xml._getXML(text, loader, \"projects\");\n var data = {\n collections: {\n links: []\n }\n };\n var evs = data.data = [];\n var xml = gantt.ajax.xpath(\"//task\", loader);\n\n for (var i = 0; i < xml.length; i++) {\n evs[i] = gantt.xml._xmlNodeToJSON(xml[i]);\n var parent = xml[i].parentNode;\n if (parent.tagName == \"project\") evs[i].parent = \"project-\" + parent.getAttribute(\"id\");else evs[i].parent = parent.parentNode.getAttribute(\"id\");\n }\n\n xml = gantt.ajax.xpath(\"//project\", loader);\n\n for (var i = 0; i < xml.length; i++) {\n var ev = gantt.xml._xmlNodeToJSON(xml[i], true);\n\n ev.id = \"project-\" + ev.id;\n evs.push(ev);\n }\n\n for (var i = 0; i < evs.length; i++) {\n var ev = evs[i];\n ev.start_date = ev.startdate || ev.est;\n ev.end_date = ev.enddate;\n ev.text = ev.name;\n ev.duration = ev.duration / 8;\n ev.open = 1;\n if (!ev.duration && !ev.end_date) ev.duration = 1;\n if (ev.predecessortasks) data.collections.links.push({\n target: ev.id,\n source: ev.predecessortasks,\n type: gantt.config.links.finish_to_start\n });\n }\n\n return data;\n },\n serialize: function serialize() {\n gantt.message(\"Serialization to 'old XML' is not implemented\");\n }\n };\n\n gantt.serverList = function (name, array) {\n if (array) {\n this.serverList[name] = array.slice(0);\n } else if (!this.serverList[name]) {\n this.serverList[name] = [];\n }\n\n return this.serverList[name];\n };\n};","module.exports = function (gantt) {\n gantt.isReadonly = function (item) {\n if ((typeof item == \"number\" || typeof item == \"string\") && gantt.isTaskExists(item)) {\n item = gantt.getTask(item);\n }\n\n if (item && item[this.config.editable_property]) {\n return false;\n } else {\n return item && item[this.config.readonly_property] || this.config.readonly;\n }\n };\n};","module.exports = function (gantt) {\n gantt.getGridColumn = function (name) {\n var columns = gantt.config.columns;\n\n for (var i = 0; i < columns.length; i++) {\n if (columns[i].name == name) return columns[i];\n }\n\n return null;\n };\n\n gantt.getGridColumns = function () {\n return gantt.config.columns.slice();\n };\n};","const SENSITIVITY = 20;\r\nconst TIMEOUT = 50;\r\nconst SCROLLSTEP = 10;\r\n\r\nexport default class ScrollableGrid {\r\n\tpublic getCurrentX;\r\n\tprivate $gantt;\r\n\tprivate $grid;\r\n\tprivate _dnd;\r\n\tprivate _scrollView;\r\n\tprivate _scrollOrder: 0 | 1 | -1 = 0;\r\n\r\n\tconstructor(params) {\r\n\t\tconst {gantt, grid, dnd, getCurrentX} = params;\r\n\t\tthis.$gantt = gantt;\r\n\t\tthis.$grid = grid;\r\n\t\tthis._dnd = dnd;\r\n\t\tthis.getCurrentX = getCurrentX;\r\n\t\tthis._scrollView = this.$gantt.$ui.getView(this.$grid.$config.scrollX);\r\n\t\tthis.attachEvents();\r\n\t}\r\n\tattachEvents() {\r\n\t\tif (this.isScrollable()) {\r\n\t\t\tthis._dnd.attachEvent(\"onDragMove\", (obj, e) => {\r\n\t\t\t\tconst gridBoundingRect = this.$grid.$grid.getBoundingClientRect();\r\n\t\t\t\tconst maxLeft = gridBoundingRect.right;\r\n\t\t\t\tconst minLeft = gridBoundingRect.left;\r\n\t\t\t\tconst currentX = this.getCurrentX(e.clientX);\r\n\r\n\t\t\t\tif (currentX >= maxLeft - SENSITIVITY) {\r\n\t\t\t\t\tthis.autoscrollRight();\r\n\t\t\t\t\tthis.autoscrollStart();\r\n\t\t\t\t}\r\n\t\t\t\tif (currentX <= minLeft + SENSITIVITY) {\r\n\t\t\t\t\tthis.autoscrollLeft();\r\n\t\t\t\t\tthis.autoscrollStart();\r\n\t\t\t\t}\r\n\t\t\t\tif (currentX < maxLeft - SENSITIVITY && currentX > minLeft + SENSITIVITY) {\r\n\t\t\t\t\tthis.autoscrollStop();\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t\tthis._dnd.attachEvent(\"onDragEnd\", () => {\r\n\t\t\t\tthis.autoscrollStop();\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tautoscrollStart() {\r\n\t\tif (this._scrollOrder === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst scrollStep = SCROLLSTEP * this._scrollOrder;\r\n\t\tconst scrollState = this._scrollView.getScrollState();\r\n\t\tthis._scrollView.scrollTo(scrollState.position + scrollStep);\r\n\t\tsetTimeout(() => { this.autoscrollStart(); }, TIMEOUT);\r\n\t}\r\n\tautoscrollRight() {\r\n\t\tthis._scrollOrder = 1;\r\n\t}\r\n\tautoscrollLeft() {\r\n\t\tthis._scrollOrder = -1;\r\n\t}\r\n\tautoscrollStop() {\r\n\t\tthis._scrollOrder = 0;\r\n\t}\r\n\tgetCorrection() {\r\n\t\tif (!this.isScrollable()) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\treturn this._scrollView.getScrollState().position;\r\n\t}\r\n\tisScrollable() {\r\n\t\treturn !!this.$grid.$config.scrollable;\r\n\t}\r\n}","import * as domHelpers from \"../../utils/dom_helpers\";\r\nimport ScrollableGrid from \"./scrollable_grid\";\r\n\r\nconst COLUMN_ID_ATTR_NAME = \"data-column-id\";\r\n\r\nexport class ColumnsGridDnd {\r\n\tprivate $gantt;\r\n\tprivate $grid;\r\n\tprivate _dragX;\r\n\tprivate _dnd;\r\n\tprivate _originAutoscroll;\r\n\tprivate _scrollableGrid: ScrollableGrid;\r\n\tprivate _draggedCell;\r\n\tprivate _targetMarker = null;\r\n\tprivate _gridConfig;\r\n\tconstructor(gantt, grid) {\r\n\t\tthis.$gantt = gantt;\r\n\t\tthis.$grid = grid;\r\n\t}\r\n\tinit() {\r\n\t\tconst DND = this.$gantt.$services.getService(\"dnd\");\r\n\t\tthis._dnd = new DND(this.$grid.$grid_scale, { updates_per_second: 60 });\r\n\t\tthis._scrollableGrid = new ScrollableGrid({\r\n\t\t\tgantt: this.$gantt,\r\n\t\t\tgrid: this.$grid,\r\n\t\t\tdnd: this._dnd,\r\n\t\t\tgetCurrentX: this.calculateCurrentPosition\r\n\t\t});\r\n\t\tthis.attachEvents();\r\n\t}\r\n\tattachEvents() {\r\n\t\tthis._dnd.attachEvent(\"onBeforeDragStart\", (obj, e) => {\r\n\t\t\tthis._draggedCell = this.$gantt.utils.dom.closest(e.target, \".gantt_grid_head_cell\");\r\n\t\t\tif(!this._draggedCell){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst columns = this.$grid.$getConfig().columns;\r\n\t\t\tconst columnName = this._draggedCell.getAttribute(COLUMN_ID_ATTR_NAME);\r\n\t\t\tlet draggedColumn;\r\n\t\t\tlet draggedIndex;\r\n\t\t\tcolumns.map(function(column, index){\r\n\t\t\t\tif(column.name === columnName){\r\n\t\t\t\t\tdraggedColumn = column;\r\n\t\t\t\t\tdraggedIndex = index;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (this.$grid.callEvent(\"onBeforeColumnDragStart\", [{ draggedColumn, draggedIndex}]) === false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (!this._draggedCell || !draggedColumn) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tthis._gridConfig = this.$grid.$getConfig();\r\n\t\t\tthis._originAutoscroll = this.$gantt.config.autoscroll;\r\n\t\t\tthis.$gantt.config.autoscroll = false;\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tthis._dnd.attachEvent(\"onAfterDragStart\", (obj, e) => {\r\n\t\t\tif (!this._draggedCell) {\r\n\t\t\t\treturn; // GS-1333: don't try to reorder a column when we resize it\r\n\t\t\t}\r\n\t\t\tthis._dnd.config.column = this._draggedCell.getAttribute(COLUMN_ID_ATTR_NAME);\r\n\t\t\tthis._dnd.config.marker.innerHTML = this._draggedCell.outerHTML;\r\n\t\t\tthis._dnd.config.marker.classList.add(\"gantt_column_drag_marker\");\r\n\t\t\tthis._dnd.config.marker.style.height = this._gridConfig.scale_height + \"px\";\r\n\t\t\tthis._dnd.config.marker.style.lineHeight = this._gridConfig.scale_height + \"px\";\r\n\t\t\tthis._draggedCell.classList.add(\"gantt_grid_head_cell_dragged\");\r\n\t\t});\r\n\r\n\t\tthis._dnd.attachEvent(\"onDragMove\", (obj, e) => {\r\n\t\t\tif(!this._draggedCell){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._dragX = e.clientX;\r\n\t\t\tconst x = this.calculateCurrentPosition(e.clientX);\r\n\t\t\tconst columnIndexes = this.findColumnsIndexes();\r\n\t\t\tconst targetIndex = columnIndexes.targetIndex;\r\n\t\t\tconst draggedIndex = columnIndexes.draggedIndex;\r\n\t\t\tconst columns = this.$grid.$getConfig().columns;\r\n\r\n\t\t\tconst draggedColumn = columns[draggedIndex];\r\n\t\t\tconst targetColumn = columns[targetIndex];\r\n\t\t\tif (this.$grid.callEvent(\"onColumnDragMove\", [{ draggedColumn, targetColumn, draggedIndex, targetIndex }]) === false) {\r\n\t\t\t\tthis.cleanTargetMarker();\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tthis.setMarkerPosition(x);\r\n\t\t\tthis.drawTargetMarker(columnIndexes);\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tthis._dnd.attachEvent(\"onDragEnd\", () => {\r\n\t\t\tif (!this._draggedCell) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis.$gantt.config.autoscroll = this._originAutoscroll;\r\n\t\t\tthis._draggedCell.classList.remove(\"gantt_grid_head_cell_dragged\");\r\n\t\t\tthis.cleanTargetMarker();\r\n\t\t\tthis.reorderColumns();\r\n\t\t});\r\n\r\n\t}\r\n\treorderColumns() {\r\n\t\tconst { targetIndex, draggedIndex } = this.findColumnsIndexes();\r\n\r\n\t\tconst columns = this.$grid.$getConfig().columns;\r\n\t\tconst draggedColumn = columns[draggedIndex];\r\n\t\tconst targetColumn = columns[targetIndex];\r\n\r\n\t\tif (this.$grid.callEvent(\"onBeforeColumnReorder\", [{ draggedColumn, targetColumn, draggedIndex, targetIndex }]) === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (targetIndex === draggedIndex) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tcolumns.splice(draggedIndex, 1);\r\n\t\tcolumns.splice(targetIndex, 0, draggedColumn);\r\n\t\tthis.$gantt.render();\r\n\t\tthis.$grid.callEvent(\"onAfterColumnReorder\", [{ draggedColumn, targetColumn, draggedIndex, targetIndex }]);\r\n\t}\r\n\tfindColumnsIndexes() {\r\n\t\tconst draggedId = this._dnd.config.column;\r\n\t\tconst columns = this.$grid.$getConfig().columns;\r\n\t\tlet targetIndex: number;\r\n\t\tlet draggedIndex: number;\r\n\t\tlet xBefore: number;\r\n\t\tlet xAfter: number;\r\n\t\tconst currentColumn = { startX: 0, endX: 0 };\r\n\r\n\t\tlet start = 0;\r\n\t\tlet end = columns.length - 1;\r\n\t\tlet compare = (a, b) => a <= b;\r\n\t\tlet next = (index) => ++index;\r\n\t\tif (this.$gantt.config.rtl) {\r\n\t\t\tstart = columns.length - 1;\r\n\t\t\tend = 0;\r\n\t\t\tcompare = (a, b) => a >= b;\r\n\t\t\tnext = (index) => --index;\r\n\t\t}\r\n\r\n\t\tlet columnRelativePos: number;\r\n\r\n\t\tconst relativeX = this._dragX - this.$grid.$grid.getBoundingClientRect().left + this._scrollableGrid.getCorrection();\r\n\t\tfor (let i = start; compare(i, end); i = next(i)) {\r\n\t\t\tif (targetIndex !== undefined && draggedIndex !== undefined) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif(!columns[i].hide) {\r\n\t\t\t\tcurrentColumn.startX = currentColumn.endX;\r\n\t\t\t\tcurrentColumn.endX += columns[i].width;\r\n\r\n\t\t\t\t// if drop on a column or drop after the last column\r\n\t\t\t\tif (relativeX >= currentColumn.startX && (relativeX <= currentColumn.endX || !compare(next(i), end))) {\r\n\t\t\t\t\ttargetIndex = i;\r\n\t\t\t\t\txBefore = currentColumn.startX;\r\n\t\t\t\t\txAfter = currentColumn.endX;\r\n\t\t\t\t\tcolumnRelativePos = (relativeX - currentColumn.startX) / (currentColumn.endX - currentColumn.startX);\r\n\t\t\t\t}\r\n\t\t\t\tif (draggedId === columns[i].name) {\r\n\t\t\t\t\tdraggedIndex = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttargetIndex,\r\n\t\t\tdraggedIndex,\r\n\t\t\txBefore,\r\n\t\t\txAfter,\r\n\t\t\tcolumnRelativePos\r\n\t\t};\r\n\t}\r\n\tsetMarkerPosition(x: number, y: number = 10) {\r\n\t\tconst { marker } = this._dnd.config;\r\n\t\tconst gridOffset = this._dnd._obj.getBoundingClientRect();\r\n\t\tmarker.style.top = `${gridOffset.y + y}px`;\r\n\t\tmarker.style.left = `${x}px`;\r\n\t}\r\n\tcalculateCurrentPosition = (eventX: number) => {\r\n\t\tconst gridBoundingRect = this.$grid.$grid.getBoundingClientRect();\r\n\t\tconst maxLeft = gridBoundingRect.right;\r\n\t\tconst minLeft = gridBoundingRect.left;\r\n\t\tlet x = eventX;\r\n\t\tif (x > maxLeft) {\r\n\t\t\tx = maxLeft;\r\n\t\t}\r\n\t\tif (x < minLeft) {\r\n\t\t\tx = minLeft;\r\n\t\t}\r\n\t\treturn x;\r\n\t}\r\n\tdrawTargetMarker({ targetIndex, draggedIndex, xBefore, xAfter, columnRelativePos }) {\r\n\t\tif (!this._targetMarker) {\r\n\t\t\tthis._targetMarker = document.createElement(\"div\");\r\n\t\t\tdomHelpers.addClassName(this._targetMarker, \"gantt_grid_target_marker\");\r\n\t\t\tthis._targetMarker.style.display = \"none\";\r\n\t\t\tthis._targetMarker.style.height = `${this._gridConfig.scale_height}px`;\r\n\t\t}\r\n\r\n\t\t// marker can be detached after gantt.render\r\n\t\tif(!this._targetMarker.parentNode){\r\n\t\t\tthis.$grid.$grid_scale.appendChild(this._targetMarker);\r\n\t\t}\r\n\r\n\t\tlet nextPosition: number;\r\n\t\tif (targetIndex > draggedIndex) {\r\n\t\t\tnextPosition = xAfter;\r\n\t\t} else if (targetIndex < draggedIndex) {\r\n\t\t\tnextPosition = xBefore;\r\n\t\t} else {\r\n\t\t\tif(columnRelativePos > 0.5){\r\n\t\t\t\tnextPosition = xAfter;\r\n\t\t\t}else{\r\n\t\t\t\tnextPosition = xBefore;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._targetMarker.style.left = `${nextPosition}px`;\r\n\t\tthis._targetMarker.style.display = \"block\";\r\n\t}\r\n\tcleanTargetMarker() {\r\n\t\tif (this._targetMarker && this._targetMarker.parentNode) {\r\n\t\t\tthis.$grid.$grid_scale.removeChild(this._targetMarker);\r\n\t\t}\r\n\t\tthis._targetMarker = null;\r\n\t}\r\n}","import {ColumnsGridDnd} from \"./column_grid_dnd\";\r\nexport default ColumnsGridDnd;","var domHelpers = require(\"../utils/dom_helpers\");\n\nfunction createRowResizer(gantt, grid) {\n var _task_grid_row_resize = {\n row_before_start: gantt.bind(function (dnd, obj, e) {\n var config = grid.$getConfig();\n var store = grid.$config.rowStore;\n var el = domHelpers.locateAttribute(e, config.task_grid_row_resizer_attribute);\n if (!el) return false;\n var row_id = this.locate(e, config.task_grid_row_resizer_attribute),\n row = store.getItem(row_id);\n if (grid.callEvent(\"onBeforeRowResize\", [row]) === false) return false;\n }, gantt),\n row_after_start: gantt.bind(function (dnd, obj, e) {\n var config = grid.$getConfig();\n var row_id = this.locate(e, config.task_grid_row_resizer_attribute);\n dnd.config.marker.innerHTML = \"\";\n dnd.config.marker.className += \" gantt_row_grid_resize_area\";\n dnd.config.marker.style.width = grid.$grid.offsetWidth + \"px\";\n dnd.config.drag_id = row_id;\n }, gantt),\n row_drag_move: gantt.bind(function (dnd, obj, e) {\n var store = grid.$config.rowStore;\n var config = grid.$getConfig();\n var dd = dnd.config;\n var id = dd.drag_id,\n itemHeight = grid.getItemHeight(id),\n itemTop = grid.getItemTop(id);\n var pos = domHelpers.getNodePosition(grid.$grid_data),\n pointerPosition = parseInt(dd.marker.style.top, 10),\n markerStartPosition = itemTop + pos.y,\n marker_height = 0,\n minPointerPosition = config.min_task_grid_row_height;\n marker_height = pointerPosition - markerStartPosition;\n\n if (marker_height < minPointerPosition) {\n marker_height = minPointerPosition;\n }\n\n dd.marker.style.left = pos.x + \"px\";\n dd.marker.style.top = markerStartPosition - 1 + \"px\";\n dd.marker.style.height = Math.abs(marker_height) + 1 + \"px\";\n dd.marker_height = marker_height;\n grid.callEvent(\"onRowResize\", [id, store.getItem(id), marker_height + itemHeight]);\n return true;\n }, gantt),\n row_drag_end: gantt.bind(function (dnd, obj, e) {\n var store = grid.$config.rowStore;\n var dd = dnd.config;\n var id = dd.drag_id,\n item = store.getItem(id),\n oldItemHeight = grid.getItemHeight(id);\n var finalHeight = dd.marker_height;\n if (grid.callEvent(\"onBeforeRowResizeEnd\", [id, item, finalHeight]) === false) return;\n if (item.row_height == finalHeight) return;\n item.row_height = finalHeight;\n gantt.updateTask(id);\n grid.callEvent(\"onAfterRowResize\", [id, item, oldItemHeight, finalHeight]);\n this.render();\n }, gantt)\n }; // calls the initialization of the D'n'D events for resize elements\n\n var _init_resize = function _init_resize() {\n var DnD = gantt.$services.getService(\"dnd\");\n var config = grid.$getConfig();\n var dnd = new DnD(grid.$grid_data, {\n updates_per_second: 60\n });\n if (gantt.defined(config.dnd_sensitivity)) dnd.config.sensitivity = config.dnd_sensitivity;\n dnd.attachEvent(\"onBeforeDragStart\", function (obj, e) {\n return _task_grid_row_resize.row_before_start(dnd, obj, e);\n });\n dnd.attachEvent(\"onAfterDragStart\", function (obj, e) {\n return _task_grid_row_resize.row_after_start(dnd, obj, e);\n });\n dnd.attachEvent(\"onDragMove\", function (obj, e) {\n return _task_grid_row_resize.row_drag_move(dnd, obj, e);\n });\n dnd.attachEvent(\"onDragEnd\", function (obj, e) {\n return _task_grid_row_resize.row_drag_end(dnd, obj, e);\n });\n };\n\n return {\n init: _init_resize\n };\n}\n\nmodule.exports = createRowResizer;","function createHelper(view) {\n var cachedRowHeight = -1;\n var canUseSimpleCalc = -1;\n return {\n resetCache: function resetCache() {\n cachedRowHeight = -1;\n canUseSimpleCalc = -1;\n },\n _getRowHeight: function _getRowHeight() {\n if (cachedRowHeight === -1) {\n cachedRowHeight = view.$getConfig().row_height;\n }\n\n return cachedRowHeight;\n },\n _refreshState: function _refreshState() {\n this.resetCache();\n canUseSimpleCalc = true;\n var store = view.$config.rowStore;\n\n if (!store) {\n return;\n }\n\n var globalRowHeight = this._getRowHeight();\n\n for (var i = 0; i < store.fullOrder.length; i++) {\n var item = store.getItem(store.fullOrder[i]); // GS-1491: ignore the task when it is filtered:\n\n if (!item) {\n continue;\n }\n\n if (item.row_height && item.row_height !== globalRowHeight) {\n canUseSimpleCalc = false;\n break;\n }\n }\n },\n canUseSimpleCalculation: function canUseSimpleCalculation() {\n if (canUseSimpleCalc === -1) {\n this._refreshState();\n }\n\n return canUseSimpleCalc;\n },\n\n /**\r\n * Get top coordinate by row index (order)\r\n * @param {number} index\r\n */\n getRowTop: function getRowTop(index) {\n var store = view.$config.rowStore;\n\n if (!store) {\n return 0;\n }\n\n return index * this._getRowHeight();\n },\n\n /**\r\n * Get height of the item by item id\r\n * @param {*} itemId\r\n */\n getItemHeight: function getItemHeight(itemId) {\n return this._getRowHeight();\n },\n\n /**\r\n * Get total height of items\r\n */\n getTotalHeight: function getTotalHeight() {\n if (view.$config.rowStore) {\n var store = view.$config.rowStore;\n return store.countVisible() * this._getRowHeight();\n } else {\n return 0;\n }\n },\n\n /**\r\n * Get item by top position\r\n * @param {*} top\r\n */\n getItemIndexByTopPosition: function getItemIndexByTopPosition(top) {\n if (view.$config.rowStore) {\n return Math.floor(top / this._getRowHeight());\n } else {\n return 0;\n }\n }\n };\n}\n\nmodule.exports = createHelper;","function createResizer(gantt, grid) {\n return {\n init: function init() {},\n doOnRender: function doOnRender() {}\n };\n}\n\nmodule.exports = createResizer;","var Grid = require(\"./ui/grid/grid\");\n\nmodule.exports = function (gantt) {\n require(\"./grid_column_api.gpl\")(gantt);\n\n Grid.prototype.getGridColumns = function () {\n var config = this.$getConfig();\n var columns = config.columns,\n visibleColumns = [];\n\n for (var i = 0; i < columns.length; i++) {\n if (!columns[i].hide) visibleColumns.push(columns[i]);\n }\n\n return visibleColumns;\n };\n};","module.exports = function (gantt) {\n var TreeDataStore = require(\"./datastore/treedatastore\");\n\n var loadedBranches = {};\n gantt.attachEvent(\"onClearAll\", function () {\n loadedBranches = {};\n });\n var oldHasChildren = TreeDataStore.prototype.hasChild;\n\n gantt.$data.tasksStore.hasChild = function (id) {\n if (!gantt.config.branch_loading) {\n return oldHasChildren.call(this, id);\n } else {\n if (oldHasChildren.call(this, id)) return true;\n\n if (this.exists(id)) {\n return this.getItem(id)[gantt.config.branch_loading_property];\n }\n }\n\n return false;\n };\n\n function needLoading(id) {\n if (gantt.config.branch_loading && gantt._load_url) {\n var alreadyLoaded = !!loadedBranches[id]; // call ajax only if branch has children\n\n if (!alreadyLoaded && !gantt.getChildren(id).length && gantt.hasChild(id)) {\n return true;\n }\n }\n\n return false;\n }\n\n gantt.attachEvent(\"onTaskOpened\", function (id) {\n if (gantt.config.branch_loading && gantt._load_url) {\n // call ajax only if branch has children\n if (needLoading(id)) {\n var url = gantt._load_url;\n url = url.replace(/(\\?|&)?parent_id=.+&?/, \"\");\n var param = url.indexOf(\"?\") >= 0 ? \"&\" : \"?\";\n var y = gantt.getScrollState().y || 0;\n var requestData = {\n taskId: id,\n url: url + param + \"parent_id=\" + encodeURIComponent(id)\n };\n\n if (gantt.callEvent(\"onBeforeBranchLoading\", [requestData]) === false) {\n return;\n }\n\n gantt.load(requestData.url, this._load_type, function () {\n if (y) {\n gantt.scrollTo(null, y);\n }\n\n gantt.callEvent(\"onAfterBranchLoading\", [requestData]);\n });\n loadedBranches[id] = true;\n }\n }\n });\n};","export default function(gantt: any){\r\n\r\n\tgantt.ext = gantt.ext || {};\r\n\tgantt.config.show_empty_state = false;\r\n\r\n\tgantt.ext.emptyStateElement = gantt.ext.emptyStateElement || {\r\n\t\tisEnabled() {\r\n\t\t\treturn gantt.config.show_empty_state === true;\r\n\t\t},\r\n\t\tisGanttEmpty(){\r\n\t\t\treturn !gantt.getTaskByTime().length;\r\n\t\t},\r\n\t\trenderContent(container){\r\n\t\t\tconst placeholderTextElement = `<div class='gantt_empty_state_text'>\r\n <div class='gantt_empty_state_text_link' data-empty-state-create-task>${gantt.locale.labels.empty_state_text_link}</div>\r\n <div class='gantt_empty_state_text_description'>${gantt.locale.labels.empty_state_text_description}</div>\r\n </div>`;\r\n\t\t\tconst placeholderImageElement = \"<div class='gantt_empty_state_image'></div>\";\r\n\r\n\t\t\tconst placeholderContainer = `<div class='gantt_empty_state'>${placeholderImageElement}${placeholderTextElement}</div>`;\r\n\t\t\tcontainer.innerHTML = placeholderContainer;\r\n\t\t},\r\n\r\n\t\tclickEvents: [],\r\n\t\tattachAddTaskEvent(){\r\n\t\t\tconst id = gantt.attachEvent(\"onEmptyClick\", function(e){\r\n\t\t\t\tconst domHelpers = gantt.utils.dom;\r\n\t\t\t\tconst gridPlaceholder = domHelpers.closest(e.target, \"[data-empty-state-create-task]\");\r\n\t\t\t\tif (gridPlaceholder){\r\n\t\t\t\t\tgantt.createTask({\r\n\t\t\t\t\t\tid: gantt.uid(),\r\n\t\t\t\t\t\ttext: \"New Task\"\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.clickEvents.push(id);\r\n\t\t},\r\n\t\tdetachAddTaskEvents(){\r\n\t\t\tthis.clickEvents.forEach(function(event){\r\n\t\t\t\tgantt.detachEvent(event);\r\n\t\t\t});\r\n\t\t\tthis.clickEvents = [];\r\n\t\t},\r\n\r\n\t\tgetContainer(){\r\n\t\t\tif (gantt.$container) {\r\n\t\t\t\tconst domHelpers = gantt.utils.dom;\r\n\t\t\t\tif (gantt.$container.contains(gantt.$grid_data)) {\r\n\t\t\t\t\treturn domHelpers.closest(gantt.$grid_data, \".gantt_layout_content\");\r\n\t\t\t\t}\r\n\t\t\t\tif (gantt.$container.contains(gantt.$task_data)){\r\n\t\t\t\t\treturn domHelpers.closest(gantt.$task_data, \".gantt_layout_content\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t},\r\n\r\n\t\tgetNode(){\r\n\t\t\tconst container = this.getContainer();\r\n\t\t\tif (!container){\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tconst emptyStateElementNode = container.querySelector(\".gantt_empty_state_wrapper\");\r\n\t\t\treturn emptyStateElementNode;\r\n\t\t},\r\n\r\n\t\tshow(){\r\n\t\t\tconst container = this.getContainer();\r\n\t\t\tif (!container && this.isGanttEmpty()){\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tconst wrapper = document.createElement(\"div\");\r\n\t\t\twrapper.className = \"gantt_empty_state_wrapper\";\r\n\t\t\twrapper.style.marginTop = (gantt.config.scale_height - container.offsetHeight) + \"px\";\r\n\t\t\tconst oldNodes = gantt.$container.querySelectorAll(\".gantt_empty_state_wrapper\");\r\n\t\t\t// for IE11\r\n\t\t\tArray.prototype.forEach.call(oldNodes, function(node){\r\n\t\t\t\tnode.parentNode.removeChild(node);\r\n\t\t\t});\r\n\r\n\t\t\tthis.detachAddTaskEvents();\r\n\t\t\tthis.attachAddTaskEvent();\r\n\r\n\t\t\tcontainer.appendChild(wrapper);\r\n\t\t\tthis.renderContent(wrapper);\r\n\t\t},\r\n\t\thide(){\r\n\t\t\tconst emptyStateElementNode = this.getNode();\r\n\t\t\tif (emptyStateElementNode){\r\n\t\t\t\temptyStateElementNode.parentNode.removeChild(emptyStateElementNode);\r\n\t\t\t} else{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t},\r\n\t\tinit(){ }\r\n\t};\r\n\r\n\tgantt.attachEvent(\"onDataRender\", function() {\r\n\t\tconst emptyStateElement = gantt.ext.emptyStateElement;\r\n\t\tif (emptyStateElement.isEnabled() && emptyStateElement.isGanttEmpty()) {\r\n\t\t\temptyStateElement.show();\r\n\t\t} else {\r\n\t\t\temptyStateElement.hide();\r\n\t\t}\r\n\t});\r\n\r\n\r\n\r\n\r\n}\r\n","export default class LinkFormatterSimple implements ILinkFormatter {\r\n\tstatic create = (settings: ILinkFormatterConfig = null, gantt: any): LinkFormatterSimple => {\r\n\t\treturn new LinkFormatterSimple(gantt);\r\n\t}\r\n\tprotected _linkReg: RegExp;\r\n\tprotected _gantt: any;\r\n\r\n\tconstructor(gantt: any) {\r\n\t\tthis._linkReg = /^[0-9\\.]+/;\r\n\t\tthis._gantt = gantt;\r\n\t}\r\n\r\n\tformat = (link: ILink) : string => {\r\n\t\tconst wbs = this._getWBSCode(link.source);\r\n\t\treturn wbs;\r\n\t}\r\n\r\n\tcanParse = (value: string) : boolean => {\r\n\t\treturn this._linkReg.test(value);\r\n\t}\r\n\tparse = (value: string) : ILink => {\r\n\t\tif(!this.canParse(value)){\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst linkPart = this._linkReg.exec(value)[0].trim();\r\n\r\n\t\tconst source = this._findSource(linkPart) || null;\r\n\r\n\t\treturn {\r\n\t\t\tid: undefined,\r\n\t\t\tsource,\r\n\t\t\ttarget: null,\r\n\t\t\ttype: this._gantt.config.links.finish_to_start,\r\n\t\t\tlag: 0\r\n\t\t};\r\n\t}\r\n\r\n\tprotected _getWBSCode = (source: number | string) => {\r\n\t\tconst pred = this._gantt.getTask(source);\r\n\t\treturn this._gantt.getWBSCode(pred);\r\n\t}\r\n\r\n\tprotected _findSource = (value: string) => {\r\n\t\tconst reqTemplate = new RegExp(\"^[0-9\\.]+\", \"i\");\r\n\t\tif(reqTemplate.exec(value)){\r\n\t\t\tconst wbs = reqTemplate.exec(value)[0];\r\n\t\t\tconst task = this._gantt.getTaskByWBSCode(wbs);\r\n\t\t\tif(task){\r\n\t\t\t\treturn task.id;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n}","var DurationFormatter = require(\"../common/duration_formatter\")[\"default\"];\n\nvar LinkFormatter = require(\"../common/link_formatter\")[\"default\"];\n\nmodule.exports = function (gantt) {\n gantt.ext.formatters = {\n durationFormatter: function durationFormatter(settings) {\n if (!settings) {\n settings = {};\n }\n\n if (!settings.store) {\n settings.store = gantt.config.duration_unit;\n }\n\n if (!settings.enter) {\n settings.enter = gantt.config.duration_unit;\n }\n\n return DurationFormatter.create(settings, gantt);\n },\n linkFormatter: function linkFormatter(settings) {\n return LinkFormatter.create(settings, gantt);\n }\n };\n};","module.exports = function (gantt) {\n function isEnabled() {\n return gantt.config.auto_types && // if enabled\n gantt.getTaskType(gantt.config.types.project) == gantt.config.types.project; // and supported\n }\n\n function callIfEnabled(callback) {\n return function () {\n if (!isEnabled()) {\n return true;\n }\n\n return callback.apply(this, arguments);\n };\n }\n\n function checkTaskType(id, changedTypes) {\n var task = gantt.getTask(id);\n var targetType = getTaskTypeToUpdate(task);\n\n if (targetType !== false && gantt.getTaskType(task) !== targetType) {\n changedTypes.$needsUpdate = true;\n changedTypes[task.id] = {\n task: task,\n type: targetType\n };\n }\n }\n\n function getUpdatedTypes(id, changedTypes) {\n changedTypes = changedTypes || {};\n checkTaskType(id, changedTypes);\n gantt.eachParent(function (parent) {\n checkTaskType(parent.id, changedTypes);\n }, id);\n return changedTypes;\n }\n\n function applyChanges(changedTypes) {\n for (var i in changedTypes) {\n if (changedTypes[i] && changedTypes[i].task) {\n var task = changedTypes[i].task;\n task.type = changedTypes[i].type;\n gantt.updateTask(task.id);\n }\n }\n }\n\n function updateParentTypes(startId) {\n if (gantt.getState().group_mode) {\n return;\n }\n\n var changedTypes = getUpdatedTypes(startId);\n\n if (changedTypes.$needsUpdate) {\n gantt.batchUpdate(function () {\n applyChanges(changedTypes);\n });\n }\n }\n\n var delTaskParent;\n\n function updateTaskType(task, targetType) {\n if (!gantt.getState().group_mode) {\n task.type = targetType;\n gantt.updateTask(task.id);\n }\n }\n\n function getTaskTypeToUpdate(task) {\n var allTypes = gantt.config.types;\n var hasChildren = gantt.hasChild(task.id);\n var taskType = gantt.getTaskType(task.type);\n\n if (hasChildren && taskType === allTypes.task) {\n return allTypes.project;\n }\n\n if (!hasChildren && taskType === allTypes.project) {\n return allTypes.task;\n }\n\n return false;\n }\n\n var isParsingDone = true;\n gantt.attachEvent(\"onParse\", callIfEnabled(function () {\n isParsingDone = false;\n\n if (gantt.getState().group_mode) {\n return;\n }\n\n gantt.batchUpdate(function () {\n gantt.eachTask(function (task) {\n var targetType = getTaskTypeToUpdate(task);\n\n if (targetType !== false) {\n updateTaskType(task, targetType);\n }\n });\n });\n isParsingDone = true;\n }));\n gantt.attachEvent(\"onAfterTaskAdd\", callIfEnabled(function (id) {\n if (isParsingDone) {\n updateParentTypes(id);\n }\n }));\n gantt.attachEvent(\"onAfterTaskUpdate\", callIfEnabled(function (id) {\n if (isParsingDone) {\n updateParentTypes(id);\n }\n }));\n\n function updateAfterRemoveChild(id) {\n if (id != gantt.config.root_id && gantt.isTaskExists(id)) {\n updateParentTypes(id);\n }\n }\n\n gantt.attachEvent(\"onBeforeTaskDelete\", callIfEnabled(function (id, task) {\n delTaskParent = gantt.getParent(id);\n return true;\n }));\n gantt.attachEvent(\"onAfterTaskDelete\", callIfEnabled(function (id, task) {\n updateAfterRemoveChild(delTaskParent);\n }));\n var originalRowDndParent;\n gantt.attachEvent(\"onRowDragStart\", callIfEnabled(function (id, target, e) {\n originalRowDndParent = gantt.getParent(id);\n return true;\n }));\n gantt.attachEvent(\"onRowDragEnd\", callIfEnabled(function (id, target) {\n updateAfterRemoveChild(originalRowDndParent);\n updateParentTypes(id);\n }));\n var originalMoveTaskParent;\n gantt.attachEvent(\"onBeforeTaskMove\", callIfEnabled(function (sid, parent, tindex) {\n originalMoveTaskParent = gantt.getParent(sid);\n return true;\n }));\n gantt.attachEvent(\"onAfterTaskMove\", callIfEnabled(function (id, parent, tindex) {\n if (document.querySelector(\".gantt_drag_marker\")) {\n // vertical dnd in progress\n return;\n }\n\n updateAfterRemoveChild(originalMoveTaskParent);\n updateParentTypes(id);\n }));\n};","module.exports = function addPlaceholder(gantt) {\n function isEnabled() {\n return gantt.config.placeholder_task;\n }\n\n function callIfEnabled(callback) {\n return function () {\n if (!isEnabled()) {\n return true;\n }\n\n return callback.apply(this, arguments);\n };\n }\n\n function silenceDataProcessor(dataProcessor) {\n if (dataProcessor && !dataProcessor._silencedPlaceholder) {\n dataProcessor._silencedPlaceholder = true;\n dataProcessor.attachEvent(\"onBeforeUpdate\", callIfEnabled(function (id, state, data) {\n if (data.type == gantt.config.types.placeholder) {\n dataProcessor.setUpdated(id, false);\n return false;\n }\n\n return true;\n }));\n }\n }\n\n function insertPlaceholder() {\n var placeholders = gantt.getTaskBy(\"type\", gantt.config.types.placeholder);\n\n if (!placeholders.length || !gantt.isTaskExists(placeholders[0].id)) {\n var placeholder = {\n unscheduled: true,\n type: gantt.config.types.placeholder,\n duration: 0,\n text: gantt.locale.labels.new_task\n };\n\n if (gantt.callEvent(\"onTaskCreated\", [placeholder]) === false) {\n return;\n }\n\n gantt.addTask(placeholder);\n }\n }\n\n function afterEdit(id) {\n var item = gantt.getTask(id);\n\n if (item.type == gantt.config.types.placeholder) {\n if (item.start_date && item.end_date && item.unscheduled) {\n item.unscheduled = false;\n }\n\n gantt.batchUpdate(function () {\n var newTask = gantt.copy(item);\n gantt.silent(function () {\n gantt.deleteTask(item.id);\n });\n delete newTask[\"!nativeeditor_status\"];\n newTask.type = gantt.config.types.task;\n newTask.id = gantt.uid();\n gantt.addTask(newTask); //insertPlaceholder();\n });\n }\n }\n\n gantt.config.types.placeholder = \"placeholder\";\n gantt.attachEvent(\"onDataProcessorReady\", callIfEnabled(silenceDataProcessor));\n var ready = false;\n gantt.attachEvent(\"onGanttReady\", function () {\n if (ready) {\n return;\n }\n\n ready = true;\n gantt.attachEvent(\"onAfterTaskUpdate\", callIfEnabled(afterEdit));\n gantt.attachEvent(\"onAfterTaskAdd\", callIfEnabled(function (id, task) {\n if (task.type != gantt.config.types.placeholder) {\n var placeholders = gantt.getTaskBy(\"type\", gantt.config.types.placeholder);\n placeholders.forEach(function (p) {\n gantt.silent(function () {\n if (gantt.isTaskExists(p.id)) gantt.deleteTask(p.id);\n });\n });\n insertPlaceholder();\n }\n }));\n gantt.attachEvent(\"onParse\", callIfEnabled(insertPlaceholder));\n });\n\n function isPlaceholderTask(taskId) {\n if (gantt.config.types.placeholder && gantt.isTaskExists(taskId)) {\n var task = gantt.getTask(taskId);\n\n if (task.type == gantt.config.types.placeholder) {\n return true;\n }\n }\n\n return false;\n }\n\n function isPlaceholderLink(link) {\n if (isPlaceholderTask(link.source) || isPlaceholderTask(link.target)) {\n return true;\n }\n\n return false;\n }\n\n gantt.attachEvent(\"onLinkValidation\", function (link) {\n if (isPlaceholderLink(link)) {\n return false;\n }\n\n return true;\n });\n gantt.attachEvent(\"onBeforeLinkAdd\", function (id, link) {\n if (isPlaceholderLink(link)) {\n return false;\n }\n\n return true;\n });\n gantt.attachEvent(\"onBeforeUndoStack\", function (action) {\n for (var i = 0; i < action.commands.length; i++) {\n var command = action.commands[i];\n\n if (command.entity === \"task\" && command.value.type === gantt.config.types.placeholder) {\n action.commands.splice(i, 1);\n i--;\n }\n }\n\n return true;\n });\n};","module.exports = function (gantt) {\n var resourceAssignmentsProperty = \"$resourceAssignments\";\n gantt.config.resource_assignment_store = \"resourceAssignments\";\n gantt.config.process_resource_assignments = true;\n var resourceAssignmentFormats = {\n auto: \"auto\",\n singleValue: \"singleValue\",\n valueArray: \"valueArray\",\n resourceValueArray: \"resourceValueArray\",\n assignmentsArray: \"assignmentsArray\"\n };\n var resourceAssignmentFormat = resourceAssignmentFormats.auto; //\"primitiveSingle\";//\"primitive\";//\"object\"|\"assignment\"\n\n var assignmentModes = {\n fixedDates: \"fixedDates\",\n fixedDuration: \"fixedDuration\",\n \"default\": \"default\"\n };\n\n function initAssignmentFields(item, task) {\n if (item.start_date) {\n item.start_date = gantt.date.parseDate(item.start_date, \"parse_date\");\n } else {\n item.start_date = null;\n }\n\n if (item.end_date) {\n item.end_date = gantt.date.parseDate(item.end_date, \"parse_date\");\n } else {\n item.end_date = null;\n }\n\n var delay = Number(item.delay);\n var initDelay = false;\n\n if (!isNaN(delay)) {\n item.delay = delay;\n } else {\n item.delay = 0;\n initDelay = true;\n }\n\n if (!gantt.defined(item.value)) {\n item.value = null;\n }\n\n if (!item.task_id || !item.resource_id) {\n return false;\n }\n\n item.mode = item.mode || assignmentModes[\"default\"];\n\n if (item.mode === assignmentModes.fixedDuration) {\n if (isNaN(Number(item.duration))) {\n task = task || gantt.getTask(item.task_id);\n item.duration = gantt.calculateDuration({\n start_date: item.start_date,\n end_date: item.end_date,\n id: task\n });\n }\n\n if (initDelay) {\n task = task || gantt.getTask(item.task_id);\n item.delay = gantt.calculateDuration({\n start_date: task.start_date,\n end_date: item.start_date,\n id: task\n });\n }\n }\n\n if (item.mode !== assignmentModes.fixedDates && (task || gantt.isTaskExists(item.task_id))) {\n task = task || gantt.getTask(item.task_id);\n\n var timing = _assignmentTimeFromTask(item, task);\n\n item.start_date = timing.start_date;\n item.end_date = timing.end_date;\n item.duration = timing.duration;\n }\n } // gantt init\n\n\n var resourceAssignmentsStore = gantt.createDatastore({\n name: gantt.config.resource_assignment_store,\n initItem: function initItem(item) {\n if (!item.id) {\n item.id = gantt.uid();\n }\n\n initAssignmentFields(item);\n return item;\n }\n });\n gantt.$data.assignmentsStore = resourceAssignmentsStore;\n\n function _assignmentTimeFromTask(assignment, task) {\n if (assignment.mode === assignmentModes.fixedDates) {\n return {\n start_date: assignment.start_date,\n end_date: assignment.end_date,\n duration: assignment.duration\n };\n } else {\n var start = assignment.delay ? gantt.calculateEndDate({\n start_date: task.start_date,\n duration: assignment.delay,\n task: task\n }) : new Date(task.start_date);\n var end;\n var duration;\n\n if (assignment.mode === assignmentModes.fixedDuration) {\n end = gantt.calculateEndDate({\n start_date: start,\n duration: assignment.duration,\n task: task\n });\n duration = assignment.duration;\n } else {\n end = new Date(task.end_date);\n duration = task.duration - assignment.delay;\n }\n }\n\n return {\n start_date: start,\n end_date: end,\n duration: duration\n };\n } // data loading\n\n\n function _makeAssignmentsFromTask(task) {\n var property = gantt.config.resource_property;\n var assignments = task[property];\n var resourceAssignments = [];\n var detectFormat = resourceAssignmentFormat === resourceAssignmentFormats.auto;\n\n if (gantt.defined(assignments) && assignments) {\n if (!Array.isArray(assignments)) {\n assignments = [assignments];\n\n if (detectFormat) {\n resourceAssignmentFormat = resourceAssignmentFormats.singleValue;\n detectFormat = false;\n }\n }\n\n var usedIds = {};\n assignments.forEach(function (res) {\n if (!res.resource_id) {\n // when resource is a string/number\n res = {\n resource_id: res\n };\n\n if (detectFormat) {\n resourceAssignmentFormat = resourceAssignmentFormats.valueArray;\n detectFormat = false;\n } //\tisSimpleArray = true;\n\n }\n\n if (detectFormat) {\n if (res.id && res.resource_id) {\n resourceAssignmentFormat = resourceAssignmentFormats.assignmentsArray;\n detectFormat = false;\n } else {\n resourceAssignmentFormat = resourceAssignmentFormats.resourceValueArray;\n detectFormat = false;\n }\n }\n\n var defaultMode = assignmentModes[\"default\"];\n\n if (!res.mode) {\n if (res.start_date && res.end_date || res.start_date && res.duration) {\n defaultMode = assignmentModes.fixedDuration;\n }\n }\n\n var id;\n\n if (!res.id && res.$id && !usedIds[res.$id]) {\n id = res.$id;\n } else if (res.id && !usedIds[res.id]) {\n id = res.id;\n } else {\n id = gantt.uid();\n }\n\n usedIds[id] = true;\n var assignment = {\n id: id,\n start_date: res.start_date,\n duration: res.duration,\n end_date: res.end_date,\n delay: res.delay,\n task_id: task.id,\n resource_id: res.resource_id,\n value: res.value,\n mode: res.mode || defaultMode\n };\n\n if (!(assignment.start_date && assignment.start_date.getMonth && assignment.end_date && assignment.end_date.getMonth && typeof assignment.duration === \"number\")) {\n initAssignmentFields(assignment, task);\n }\n\n resourceAssignments.push(assignment);\n });\n }\n\n return resourceAssignments;\n }\n\n function _updateTaskBack(taskId) {\n // GS-1493. In some cases, the resource assignment store has the tasks that no longer exist\n if (!gantt.isTaskExists(taskId)) {\n return;\n }\n\n var task = gantt.getTask(taskId);\n var assignments = gantt.getTaskAssignments(task.id);\n\n _assignAssignments(task, assignments);\n }\n\n function _assignAssignments(task, assignments) {\n assignments.sort(function (a, b) {\n if (a.start_date && b.start_date && a.start_date.valueOf() != b.start_date.valueOf()) {\n return a.start_date - b.start_date;\n } else {\n return 0;\n }\n });\n\n if (resourceAssignmentFormat == resourceAssignmentFormats.assignmentsArray) {\n task[gantt.config.resource_property] = assignments;\n } else if (resourceAssignmentFormat == resourceAssignmentFormats.resourceValueArray) {\n task[gantt.config.resource_property] = assignments.map(function (a) {\n return {\n $id: a.id,\n start_date: a.start_date,\n duration: a.duration,\n end_date: a.end_date,\n delay: a.delay,\n resource_id: a.resource_id,\n value: a.value,\n mode: a.mode\n };\n });\n }\n\n task[resourceAssignmentsProperty] = assignments;\n }\n\n function _loadAssignmentsFromTask(task) {\n var assignments = _makeAssignmentsFromTask(task);\n\n var taskAssignments = [];\n assignments.forEach(function (a) {\n a.id = a.id || gantt.uid(); //var newId = resourceAssignmentsStore.addItem(a);\n\n taskAssignments.push(a);\n });\n return assignments;\n }\n\n function diffAssignments(taskValues, assignmentsStoreValues) {\n var result = {\n inBoth: [],\n inTaskNotInStore: [],\n inStoreNotInTask: []\n };\n\n if (resourceAssignmentFormat == resourceAssignmentFormats.singleValue) {\n var taskOwner = taskValues[0];\n var ownerId = taskOwner ? taskOwner.resource_id : null;\n var foundOwnerAssignment = false;\n assignmentsStoreValues.forEach(function (a) {\n if (a.resource_id != ownerId) {\n result.inStoreNotInTask.push(a);\n } else if (a.resource_id == ownerId) {\n result.inBoth.push({\n store: a,\n task: taskOwner\n });\n foundOwnerAssignment = true;\n }\n });\n\n if (!foundOwnerAssignment && taskOwner) {\n result.inTaskNotInStore.push(taskOwner);\n }\n } else if (resourceAssignmentFormat == resourceAssignmentFormats.valueArray) {\n var taskSearch = {};\n var storeSearch = {};\n var processedIds = {};\n taskValues.forEach(function (a) {\n taskSearch[a.resource_id] = a;\n });\n assignmentsStoreValues.forEach(function (a) {\n storeSearch[a.resource_id] = a;\n });\n taskValues.concat(assignmentsStoreValues).forEach(function (a) {\n if (processedIds[a.resource_id]) {\n return;\n }\n\n processedIds[a.resource_id] = true;\n var inTask = taskSearch[a.resource_id];\n var inStore = storeSearch[a.resource_id];\n\n if (inTask && inStore) {\n result.inBoth.push({\n store: inStore,\n task: inTask\n });\n } else if (inTask && !inStore) {\n result.inTaskNotInStore.push(inTask);\n } else if (!inTask && inStore) {\n result.inStoreNotInTask.push(inStore);\n }\n });\n } else if (resourceAssignmentFormat == resourceAssignmentFormats.assignmentsArray || resourceAssignmentFormat == resourceAssignmentFormats.resourceValueArray) {\n var taskSearch = {};\n var storeSearch = {};\n var processedIds = {};\n taskValues.forEach(function (a) {\n taskSearch[a.id || a.$id] = a;\n });\n assignmentsStoreValues.forEach(function (a) {\n storeSearch[a.id] = a;\n });\n taskValues.concat(assignmentsStoreValues).forEach(function (a) {\n var id = a.id || a.$id;\n\n if (processedIds[id]) {\n return;\n }\n\n processedIds[id] = true;\n var inTask = taskSearch[id];\n var inStore = storeSearch[id];\n\n if (inTask && inStore) {\n result.inBoth.push({\n store: inStore,\n task: inTask\n });\n } else if (inTask && !inStore) {\n result.inTaskNotInStore.push(inTask);\n } else if (!inTask && inStore) {\n result.inStoreNotInTask.push(inStore);\n }\n });\n }\n\n return result;\n }\n\n function assignmentHasChanged(source, target) {\n var ignoreFields = {\n id: true\n };\n\n for (var i in source) {\n if (!ignoreFields[i]) {\n if (String(source[i]) !== String(target[i])) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n function updateAssignment(source, target) {\n var ignoreFields = {\n id: true\n };\n\n for (var i in source) {\n if (!ignoreFields[i]) {\n target[i] = source[i];\n }\n }\n }\n\n function _syncAssignments(task, storeAssignments) {\n var tasksAssignments = _makeAssignmentsFromTask(task);\n\n var diff = diffAssignments(tasksAssignments, storeAssignments);\n diff.inStoreNotInTask.forEach(function (a) {\n resourceAssignmentsStore.removeItem(a.id);\n });\n diff.inTaskNotInStore.forEach(function (a) {\n resourceAssignmentsStore.addItem(a);\n });\n diff.inBoth.forEach(function (a) {\n if (assignmentHasChanged(a.task, a.store)) {\n updateAssignment(a.task, a.store);\n resourceAssignmentsStore.updateItem(a.store.id);\n } else {\n if (a.task.start_date && a.task.end_date && a.task.mode !== assignmentModes.fixedDates) {\n var timing = _assignmentTimeFromTask(a.store, task);\n\n if (a.store.start_date.valueOf() != timing.start_date.valueOf() || a.store.end_date.valueOf() != timing.end_date.valueOf()) {\n a.store.start_date = timing.start_date;\n a.store.end_date = timing.end_date;\n a.store.duration = timing.duration;\n resourceAssignmentsStore.updateItem(a.store.id);\n }\n }\n }\n });\n\n _updateTaskBack(task.id);\n }\n\n function _syncOnTaskUpdate(task) {\n var storeAssignments = task[resourceAssignmentsProperty] || resourceAssignmentsStore.find(function (a) {\n return a.task_id == task.id;\n });\n\n _syncAssignments(task, storeAssignments);\n }\n\n function _syncOnTaskDelete(ids) {\n var idsSearch = {};\n ids.forEach(function (id) {\n idsSearch[id] = true;\n });\n var taskResources = resourceAssignmentsStore.find(function (a) {\n return idsSearch[a.task_id];\n });\n taskResources.forEach(function (a) {\n resourceAssignmentsStore.removeItem(a.id);\n });\n }\n\n gantt.attachEvent(\"onGanttReady\", function () {\n if (gantt.config.process_resource_assignments) {\n gantt.attachEvent(\"onParse\", function () {\n gantt.silent(function () {\n resourceAssignmentsStore.clearAll();\n var totalAssignments = [];\n gantt.eachTask(function (task) {\n if (task.type === gantt.config.types.project) {\n return;\n }\n\n var assignments = _loadAssignmentsFromTask(task);\n\n _assignAssignments(task, assignments);\n\n assignments.forEach(function (a) {\n totalAssignments.push(a);\n });\n });\n resourceAssignmentsStore.parse(totalAssignments);\n });\n });\n var batchUpdate = false;\n var needUpdate = false;\n var needUpdateFor = {};\n var undoBatchCancel = false;\n gantt.attachEvent(\"onBeforeBatchUpdate\", function () {\n batchUpdate = true;\n });\n gantt.attachEvent(\"onAfterBatchUpdate\", function () {\n if (needUpdate) {\n var assignmentsHash = {};\n\n for (var i in needUpdateFor) {\n assignmentsHash[i] = gantt.getTaskAssignments(needUpdateFor[i].id);\n }\n\n for (var i in needUpdateFor) {\n _syncAssignments(needUpdateFor[i], assignmentsHash[i]);\n }\n }\n\n needUpdate = false;\n batchUpdate = false;\n needUpdateFor = {};\n });\n gantt.attachEvent(\"onTaskCreated\", function (item) {\n var assignments = _loadAssignmentsFromTask(item);\n\n resourceAssignmentsStore.parse(assignments);\n\n _assignAssignments(item, assignments);\n\n return true;\n });\n gantt.attachEvent(\"onAfterTaskUpdate\", function (id, item) {\n if (batchUpdate) {\n needUpdate = true;\n needUpdateFor[id] = item;\n } else {\n _syncOnTaskUpdate(item);\n }\n });\n gantt.attachEvent(\"onAfterTaskAdd\", function (id, item) {\n if (batchUpdate) {\n needUpdate = true;\n needUpdateFor[id] = item;\n } else {\n _syncOnTaskUpdate(item);\n }\n });\n /*\tgantt.attachEvent(\"onRowDragMove\", function (id) {\r\n \t\t_syncOnTaskUpdate(gantt.getTask(id));\r\n \t});*/\n\n gantt.attachEvent(\"onRowDragEnd\", function (id) {\n _syncOnTaskUpdate(gantt.getTask(id));\n });\n gantt.$data.tasksStore.attachEvent(\"onAfterDeleteConfirmed\", function (id, item) {\n var deleteIds = [id];\n gantt.eachTask(function (task) {\n deleteIds.push(task.id);\n }, id);\n\n _syncOnTaskDelete(deleteIds);\n });\n gantt.$data.tasksStore.attachEvent(\"onClearAll\", function () {\n resourceAssignmentsCache = null;\n resourceTaskAssignmentsCache = null;\n taskAssignmentsCache = null;\n resourceAssignmentsStore.clearAll();\n return true;\n });\n gantt.attachEvent(\"onTaskIdChange\", function (id, new_id) {\n var taskResources = resourceAssignmentsStore.find(function (a) {\n return a.task_id == id;\n });\n taskResources.forEach(function (a) {\n a.task_id = new_id;\n resourceAssignmentsStore.updateItem(a.id);\n });\n\n _updateTaskBack(new_id); //any custom logic here\n\n }); // GS-2144. When we Undo something, the cache should be reset\n // during the `onStoreUpdated` event to properly update the assignments\n\n gantt.attachEvent(\"onBeforeUndo\", function (action) {\n undoBatchCancel = true;\n return true;\n });\n gantt.attachEvent(\"onAfterUndo\", function (action) {\n undoBatchCancel = true;\n });\n var resourceAssignmentsCache = null;\n var resourceTaskAssignmentsCache = null;\n var taskAssignmentsCache = null;\n resourceAssignmentsStore.attachEvent(\"onStoreUpdated\", function resetCache() {\n if (batchUpdate && !undoBatchCancel) {\n return true;\n }\n\n resourceAssignmentsCache = null;\n resourceTaskAssignmentsCache = null;\n taskAssignmentsCache = null;\n return true;\n });\n\n gantt.getResourceAssignments = function (resourceId, taskId) {\n var searchTaskId = gantt.defined(taskId) && taskId !== null;\n\n if (resourceAssignmentsCache === null) {\n resourceAssignmentsCache = {};\n resourceTaskAssignmentsCache = {};\n resourceAssignmentsStore.eachItem(function (a) {\n if (!resourceAssignmentsCache[a.resource_id]) {\n resourceAssignmentsCache[a.resource_id] = [];\n }\n\n resourceAssignmentsCache[a.resource_id].push(a);\n var resourceTaskCacheKey = a.resource_id + \"-\" + a.task_id;\n\n if (!resourceTaskAssignmentsCache[resourceTaskCacheKey]) {\n resourceTaskAssignmentsCache[resourceTaskCacheKey] = [];\n }\n\n resourceTaskAssignmentsCache[resourceTaskCacheKey].push(a);\n });\n }\n\n if (searchTaskId) {\n return (resourceTaskAssignmentsCache[resourceId + \"-\" + taskId] || []).slice();\n } else {\n return (resourceAssignmentsCache[resourceId] || []).slice();\n }\n };\n\n gantt.getTaskAssignments = function (taskId) {\n if (taskAssignmentsCache === null) {\n var result = [];\n taskAssignmentsCache = {};\n resourceAssignmentsStore.eachItem(function (a) {\n if (!taskAssignmentsCache[a.task_id]) {\n taskAssignmentsCache[a.task_id] = [];\n }\n\n taskAssignmentsCache[a.task_id].push(a);\n\n if (a.task_id == taskId) {\n result.push(a);\n }\n });\n }\n\n return (taskAssignmentsCache[taskId] || []).slice();\n };\n\n gantt.getTaskResources = function (taskId) {\n var store = gantt.getDatastore(\"resource\");\n var assignments = gantt.getTaskAssignments(taskId);\n var uniqueResources = {};\n assignments.forEach(function (a) {\n if (!uniqueResources[a.resource_id]) {\n uniqueResources[a.resource_id] = a.resource_id;\n }\n });\n var resources = [];\n\n for (var i in uniqueResources) {\n var res = store.getItem(uniqueResources[i]);\n\n if (res) {\n resources.push(res);\n }\n }\n\n return resources;\n };\n\n gantt.updateTaskAssignments = _updateTaskBack;\n }\n }, {\n once: true\n });\n};","var helpers = require(\"../../utils/helpers\");\n\nfunction createResourceMethods(gantt) {\n var resourceTaskCache = {};\n var singleResourceCacheBuilt = false;\n gantt.$data.tasksStore.attachEvent(\"onStoreUpdated\", function () {\n resourceTaskCache = {};\n singleResourceCacheBuilt = false;\n });\n gantt.attachEvent(\"onBeforeGanttRender\", function () {\n resourceTaskCache = {};\n });\n\n function getTaskBy(propertyName, propertyValue, typeFilter) {\n if (typeof propertyName == \"function\") {\n return filterResourceTasks(propertyName);\n } else {\n if (helpers.isArray(propertyValue)) {\n return getResourceTasks(propertyName, propertyValue, typeFilter);\n } else {\n return getResourceTasks(propertyName, [propertyValue], typeFilter);\n }\n }\n }\n\n function filterResourceTasks(filter) {\n var res = [];\n gantt.eachTask(function (task) {\n if (filter(task)) {\n res.push(task);\n }\n });\n return res;\n }\n\n var falsyValuePrefix = String(Math.random());\n\n function resourceHashFunction(value) {\n if (value === null) {\n return falsyValuePrefix + String(value);\n }\n\n return String(value);\n }\n\n function getCacheKey(resourceIds, property, typeFilter) {\n if (Array.isArray(resourceIds)) {\n return resourceIds.map(function (value) {\n return resourceHashFunction(value);\n }).join(\"_\") + \"_\".concat(property, \"_\").concat(typeFilter);\n } else {\n return resourceHashFunction(resourceIds) + \"_\".concat(property, \"_\").concat(typeFilter);\n }\n }\n\n function getResourceTasks(property, resourceIds, typeFilter) {\n var res;\n var cacheKey = getCacheKey(resourceIds, property, JSON.stringify(typeFilter));\n var matchingResources = {};\n helpers.forEach(resourceIds, function (resourceId) {\n matchingResources[resourceHashFunction(resourceId)] = true;\n });\n\n if (!resourceTaskCache[cacheKey]) {\n res = resourceTaskCache[cacheKey] = [];\n gantt.eachTask(function (task) {\n if (typeFilter) {\n if (!typeFilter[gantt.getTaskType(task)]) {\n return;\n }\n } else if (task.type == gantt.config.types.project) {\n return;\n }\n\n if (property in task) {\n var resourceValue;\n\n if (!helpers.isArray(task[property])) {\n resourceValue = [task[property]];\n } else {\n resourceValue = task[property];\n }\n\n helpers.forEach(resourceValue, function (value) {\n var resourceValue = value && value.resource_id ? value.resource_id : value;\n\n if (matchingResources[resourceHashFunction(resourceValue)]) {\n res.push(task);\n } else if (!singleResourceCacheBuilt) {\n var key = getCacheKey(value, property);\n\n if (!resourceTaskCache[key]) {\n resourceTaskCache[key] = [];\n }\n\n resourceTaskCache[key].push(task);\n }\n });\n }\n });\n singleResourceCacheBuilt = true;\n } else {\n res = resourceTaskCache[cacheKey];\n }\n\n return res;\n }\n\n function selectAssignments(resourceId, taskId, result) {\n var property = gantt.config.resource_property;\n var owners = [];\n\n if (gantt.getDatastore(\"task\").exists(taskId)) {\n var task = gantt.getTask(taskId);\n owners = task[property] || [];\n }\n\n if (!Array.isArray(owners)) {\n owners = [owners];\n }\n\n for (var i = 0; i < owners.length; i++) {\n if (owners[i].resource_id == resourceId) {\n result.push({\n task_id: task.id,\n resource_id: owners[i].resource_id,\n value: owners[i].value\n });\n }\n }\n }\n\n function getResourceAssignments(resourceId, taskId) {\n // resource assignment as an independent module:\n // {taskId:, resourceId, value}\n // TODO: probably should add a separate datastore for these\n var assignments = [];\n var property = gantt.config.resource_property;\n\n if (taskId !== undefined) {\n selectAssignments(resourceId, taskId, assignments);\n } else {\n var tasks = gantt.getTaskBy(property, resourceId);\n tasks.forEach(function (task) {\n selectAssignments(resourceId, task.id, assignments);\n });\n }\n\n return assignments;\n }\n\n return {\n getTaskBy: getTaskBy,\n getResourceAssignments: getResourceAssignments\n };\n}\n\nfunction createHelper(gantt) {\n var resourcePlugin = {\n renderEditableLabel: function renderEditableLabel(start_date, end_date, resource, tasks, assignments) {\n var editable = gantt.config.readonly ? \"\" : \"contenteditable\";\n\n if (start_date < resource.end_date && end_date > resource.start_date) {\n for (var i = 0; i < assignments.length; i++) {\n var a = assignments[i];\n return \"<div \" + editable + \" data-assignment-cell data-assignment-id='\" + a.id + \"'\" + \" data-row-id='\" + resource.id + \"'\" + \" data-task='\" + resource.$task_id + \"'\" + \" data-start-date='\" + gantt.templates.format_date(start_date) + \"'\" + \" data-end-date='\" + gantt.templates.format_date(end_date) + \"'>\" + a.value + \"</div>\";\n }\n\n return \"<div \" + editable + \" data-assignment-cell data-empty \" + \" data-row-id='\" + resource.id + \"'\" + \" data-resource-id='\" + resource.$resource_id + \"'\" + \" data-task='\" + resource.$task_id + \"'\" + \" data-start-date='\" + gantt.templates.format_date(start_date) + \"'\" + \"' data-end-date='\" + gantt.templates.format_date(end_date) + \"'>-</div>\";\n }\n\n return \"\";\n },\n renderSummaryLabel: function renderSummaryLabel(start_date, end_date, resource, tasks, assignments) {\n var sum = assignments.reduce(function (total, assignment) {\n return total + Number(assignment.value);\n }, 0);\n\n if (sum % 1) {\n sum = Math.round(sum * 10) / 10;\n }\n\n if (sum) {\n return \"<div>\" + sum + \"</div>\";\n }\n\n return \"\";\n },\n editableResourceCellTemplate: function editableResourceCellTemplate(start_date, end_date, resource, tasks, assignments) {\n if (resource.$role === \"task\") {\n return resourcePlugin.renderEditableLabel(start_date, end_date, resource, tasks, assignments);\n } else {\n return resourcePlugin.renderSummaryLabel(start_date, end_date, resource, tasks, assignments);\n }\n },\n editableResourceCellClass: function editableResourceCellClass(start_date, end_date, resource, tasks, assignments) {\n var css = [];\n css.push(\"resource_marker\");\n\n if (resource.$role === \"task\") {\n css.push(\"task_cell\");\n } else {\n css.push(\"resource_cell\");\n }\n\n var sum = assignments.reduce(function (total, assignment) {\n return total + Number(assignment.value);\n }, 0);\n var capacity = Number(resource.capacity);\n\n if (isNaN(capacity)) {\n capacity = 8;\n }\n\n if (sum <= capacity) {\n css.push(\"workday_ok\");\n } else {\n css.push(\"workday_over\");\n }\n\n return css.join(\" \");\n },\n getSummaryResourceAssignments: function getResourceAssignments(resourceId) {\n var assignments;\n var store = gantt.getDatastore(gantt.config.resource_store);\n var resource = store.getItem(resourceId);\n\n if (resource.$role === \"task\") {\n assignments = gantt.getResourceAssignments(resource.$resource_id, resource.$task_id);\n } else {\n assignments = gantt.getResourceAssignments(resourceId);\n\n if (store.eachItem) {\n store.eachItem(function (childResource) {\n if (childResource.$role !== \"task\") {\n assignments = assignments.concat(gantt.getResourceAssignments(childResource.id));\n }\n }, resourceId);\n }\n }\n\n return assignments;\n },\n initEditableDiagram: function initEditableDiagram() {\n gantt.config.resource_render_empty_cells = true;\n\n (function () {\n /// salesforce locker workaround\n // SF removes 'contenteditable' attribute from cells\n // restore it on render\n var timeoutId = null;\n\n function makeEditable() {\n if (timeoutId) {\n cancelAnimationFrame(timeoutId);\n }\n\n timeoutId = requestAnimationFrame(function () {\n var cells = Array.prototype.slice.call(gantt.$container.querySelectorAll(\".resourceTimeline_cell [data-assignment-cell]\"));\n cells.forEach(function (cell) {\n cell.contentEditable = true;\n });\n });\n return true;\n }\n\n gantt.attachEvent(\"onGanttReady\", function () {\n gantt.getDatastore(gantt.config.resource_assignment_store).attachEvent(\"onStoreUpdated\", makeEditable);\n gantt.getDatastore(gantt.config.resource_store).attachEvent(\"onStoreUpdated\", makeEditable);\n }, {\n once: true\n });\n gantt.attachEvent(\"onGanttLayoutReady\", function () {\n var ganttViews = gantt.$layout.getCellsByType(\"viewCell\");\n ganttViews.forEach(function (view) {\n if (view.$config && view.$config.view === \"resourceTimeline\" && view.$content) {\n view.$content.attachEvent(\"onScroll\", makeEditable);\n }\n });\n });\n })();\n\n gantt.attachEvent(\"onGanttReady\", function () {\n var assignmentEditInProcess = false;\n gantt.event(gantt.$container, \"keypress\", function (e) {\n var target = e.target.closest(\".resourceTimeline_cell [data-assignment-cell]\");\n\n if (target) {\n if (e.keyCode === 13 || e.keyCode === 27) {\n target.blur();\n }\n }\n });\n gantt.event(gantt.$container, \"focusout\", function (e) {\n if (assignmentEditInProcess) {\n return;\n }\n\n assignmentEditInProcess = true;\n setTimeout(function () {\n assignmentEditInProcess = false;\n }, 300);\n var target = e.target.closest(\".resourceTimeline_cell [data-assignment-cell]\");\n\n if (target) {\n var strValue = (target.innerText || \"\").trim();\n\n if (strValue == \"-\") {\n strValue = \"0\";\n }\n\n var value = Number(strValue);\n var rowId = target.getAttribute(\"data-row-id\");\n var assignmentId = target.getAttribute(\"data-assignment-id\");\n var taskId = target.getAttribute(\"data-task\");\n var resourceId = target.getAttribute(\"data-resource-id\");\n var startDate = gantt.templates.parse_date(target.getAttribute(\"data-start-date\"));\n var endDate = gantt.templates.parse_date(target.getAttribute(\"data-end-date\"));\n var assignmentStore = gantt.getDatastore(gantt.config.resource_assignment_store);\n\n if (isNaN(value)) {\n gantt.getDatastore(gantt.config.resource_store).refresh(rowId);\n } else {\n var task = gantt.getTask(taskId); // GS-2141. Track the changes by the Undo extension\n\n if (gantt.plugins().undo) {\n gantt.ext.undo.saveState(taskId, \"task\");\n }\n\n if (assignmentId) {\n var assignment = assignmentStore.getItem(assignmentId);\n\n if (value === assignment.value) {\n return;\n }\n\n if (assignment.start_date.valueOf() === startDate.valueOf() && assignment.end_date.valueOf() === endDate.valueOf()) {\n assignment.value = value;\n\n if (!value) {\n assignmentStore.removeItem(assignment.id);\n } else {\n assignmentStore.updateItem(assignment.id);\n }\n } else {\n if (assignment.end_date.valueOf() > endDate.valueOf()) {\n var nextChunk = gantt.copy(assignment);\n nextChunk.id = gantt.uid();\n nextChunk.start_date = endDate;\n nextChunk.duration = gantt.calculateDuration({\n start_date: nextChunk.start_date,\n end_date: nextChunk.end_date,\n task: task\n });\n nextChunk.delay = gantt.calculateDuration({\n start_date: task.start_date,\n end_date: nextChunk.start_date,\n task: task\n });\n nextChunk.mode = assignment.mode || \"default\";\n\n if (nextChunk.duration !== 0) {\n assignmentStore.addItem(nextChunk);\n }\n }\n\n if (assignment.start_date.valueOf() < startDate.valueOf()) {\n assignment.end_date = startDate;\n assignment.duration = gantt.calculateDuration({\n start_date: assignment.start_date,\n end_date: assignment.end_date,\n task: task\n });\n assignment.mode = \"fixedDuration\";\n\n if (assignment.duration === 0) {\n assignmentStore.removeItem(assignment.id);\n } else {\n assignmentStore.updateItem(assignment.id);\n }\n } else {\n assignmentStore.removeItem(assignment.id);\n }\n\n if (value) {\n assignmentStore.addItem({\n task_id: assignment.task_id,\n resource_id: assignment.resource_id,\n value: value,\n start_date: startDate,\n end_date: endDate,\n duration: gantt.calculateDuration({\n start_date: startDate,\n end_date: endDate,\n task: task\n }),\n delay: gantt.calculateDuration({\n start_date: task.start_date,\n end_date: startDate,\n task: task\n }),\n mode: \"fixedDuration\"\n });\n }\n }\n\n gantt.updateTaskAssignments(task.id);\n gantt.updateTask(task.id);\n } else if (value) {\n var assignment = {\n task_id: taskId,\n resource_id: resourceId,\n value: value,\n start_date: startDate,\n end_date: endDate,\n duration: gantt.calculateDuration({\n start_date: startDate,\n end_date: endDate,\n task: task\n }),\n delay: gantt.calculateDuration({\n start_date: task.start_date,\n end_date: startDate,\n task: task\n }),\n mode: \"fixedDuration\"\n };\n assignmentStore.addItem(assignment);\n gantt.updateTaskAssignments(task.id);\n gantt.updateTask(task.id);\n }\n }\n }\n });\n }, {\n once: true\n });\n }\n };\n return resourcePlugin;\n}\n\nmodule.exports = function (gantt) {\n var methods = createResourceMethods(gantt);\n gantt.ext.resources = createHelper(gantt);\n gantt.config.resources = {\n dataprocessor_assignments: false,\n dataprocessor_resources: false,\n editable_resource_diagram: false,\n resource_store: {\n type: \"treeDataStore\",\n fetchTasks: false,\n initItem: function initItem(item) {\n item.parent = item.parent || gantt.config.root_id;\n item[gantt.config.resource_property] = item.parent;\n item.open = true;\n return item;\n }\n },\n lightbox_resources: function selectResourceControlOptions(resources) {\n var lightboxOptions = [];\n var store = gantt.getDatastore(gantt.config.resource_store);\n resources.forEach(function (res) {\n if (!store.hasChild(res.id)) {\n var copy = gantt.copy(res);\n copy.key = res.id;\n copy.label = res.text;\n lightboxOptions.push(copy);\n }\n });\n return lightboxOptions;\n }\n };\n gantt.attachEvent(\"onBeforeGanttReady\", function () {\n if (gantt.getDatastore(gantt.config.resource_store)) {\n return;\n }\n\n var resourceStoreConfig = gantt.config.resources ? gantt.config.resources.resource_store : undefined;\n var fetchTasks = resourceStoreConfig ? resourceStoreConfig.fetchTasks : undefined;\n\n if (gantt.config.resources && gantt.config.resources.editable_resource_diagram) {\n fetchTasks = true;\n }\n\n var initItems = function initItems(item) {\n item.parent = item.parent || gantt.config.root_id;\n item[gantt.config.resource_property] = item.parent;\n item.open = true;\n return item;\n };\n\n if (resourceStoreConfig && resourceStoreConfig.initItem) {\n initItems = resourceStoreConfig.initItem;\n }\n\n var storeType = resourceStoreConfig && resourceStoreConfig.type ? resourceStoreConfig.type : \"treeDatastore\";\n gantt.$resourcesStore = gantt.createDatastore({\n name: gantt.config.resource_store,\n type: storeType,\n fetchTasks: fetchTasks !== undefined ? fetchTasks : false,\n initItem: initItems\n });\n gantt.$data.resourcesStore = gantt.$resourcesStore;\n gantt.$resourcesStore.attachEvent(\"onParse\", function () {\n function selectResourceControlOptions(resources) {\n var lightboxOptions = [];\n resources.forEach(function (res) {\n if (!gantt.$resourcesStore.hasChild(res.id)) {\n var copy = gantt.copy(res);\n copy.key = res.id;\n copy.label = res.text;\n lightboxOptions.push(copy);\n }\n });\n return lightboxOptions;\n }\n\n var lightboxOptionsFnc = selectResourceControlOptions;\n\n if (gantt.config.resources && gantt.config.resources.lightbox_resources) {\n lightboxOptionsFnc = gantt.config.resources.lightbox_resources;\n }\n\n var options = lightboxOptionsFnc(gantt.$resourcesStore.getItems());\n gantt.updateCollection(\"resourceOptions\", options);\n });\n });\n gantt.getTaskBy = methods.getTaskBy;\n gantt.getResourceAssignments = methods.getResourceAssignments;\n gantt.config.resource_property = \"owner_id\";\n gantt.config.resource_store = \"resource\";\n gantt.config.resource_render_empty_cells = false;\n /**\r\n * these are placeholder functions that should be redefined by the user\r\n */\n\n gantt.templates.histogram_cell_class = function (start_date, end_date, resource, tasks, assignments) {};\n\n gantt.templates.histogram_cell_label = function (start_date, end_date, resource, tasks, assignments) {\n return tasks.length + \"/3\";\n };\n\n gantt.templates.histogram_cell_allocated = function (start_date, end_date, resource, tasks, assignments) {\n return tasks.length / 3;\n };\n\n gantt.templates.histogram_cell_capacity = function (start_date, end_date, resource, tasks, assignments) {\n return 0;\n };\n\n var defaultResourceCellClass = function defaultResourceCellClass(start, end, resource, tasks, assignments) {\n var css = \"\";\n\n if (tasks.length <= 1) {\n css = \"gantt_resource_marker_ok\";\n } else {\n css = \"gantt_resource_marker_overtime\";\n }\n\n return css;\n };\n\n var defaultResourceCellTemplate = function defaultResourceCellTemplate(start, end, resource, tasks, assignments) {\n return tasks.length * 8;\n };\n\n gantt.templates.resource_cell_value = defaultResourceCellTemplate;\n gantt.templates.resource_cell_class = defaultResourceCellClass; //editable_resource_diagram\n\n gantt.attachEvent(\"onBeforeGanttReady\", function () {\n if (gantt.config.resources && gantt.config.resources.editable_resource_diagram) {\n gantt.config.resource_render_empty_cells = true;\n\n if (gantt.templates.resource_cell_value === defaultResourceCellTemplate) {\n gantt.templates.resource_cell_value = gantt.ext.resources.editableResourceCellTemplate;\n }\n\n if (gantt.templates.resource_cell_class === defaultResourceCellClass) {\n gantt.templates.resource_cell_class = gantt.ext.resources.editableResourceCellClass;\n }\n\n gantt.ext.resources.initEditableDiagram(gantt);\n }\n });\n};","var createWbs = function createWbs(gantt) {\n return {\n _needRecalc: true,\n reset: function reset() {\n this._needRecalc = true;\n },\n _isRecalcNeeded: function _isRecalcNeeded() {\n return !this._isGroupSort() && this._needRecalc;\n },\n _isGroupSort: function _isGroupSort() {\n return !!gantt.getState().group_mode;\n },\n _getWBSCode: function _getWBSCode(task) {\n if (!task) return \"\";\n\n if (this._isRecalcNeeded()) {\n this._calcWBS();\n }\n\n if (task.$virtual) return \"\";\n if (this._isGroupSort()) return task.$wbs || \"\";\n\n if (!task.$wbs) {\n this.reset();\n\n this._calcWBS();\n }\n\n return task.$wbs;\n },\n _setWBSCode: function _setWBSCode(task, value) {\n task.$wbs = value;\n },\n getWBSCode: function getWBSCode(task) {\n return this._getWBSCode(task);\n },\n getByWBSCode: function getByWBSCode(code) {\n var parts = code.split(\".\");\n var currentNode = gantt.config.root_id;\n\n for (var i = 0; i < parts.length; i++) {\n var children = gantt.getChildren(currentNode);\n var index = parts[i] * 1 - 1;\n\n if (gantt.isTaskExists(children[index])) {\n currentNode = children[index];\n } else {\n return null;\n }\n }\n\n if (gantt.isTaskExists(currentNode)) {\n return gantt.getTask(currentNode);\n } else {\n return null;\n }\n },\n _calcWBS: function _calcWBS() {\n if (!this._isRecalcNeeded()) return;\n var _isFirst = true;\n gantt.eachTask(function (ch) {\n if (_isFirst) {\n _isFirst = false;\n\n this._setWBSCode(ch, \"1\");\n\n return;\n }\n\n var _prevSibling = gantt.getPrevSibling(ch.id);\n\n if (_prevSibling !== null) {\n var _wbs = gantt.getTask(_prevSibling).$wbs;\n\n if (_wbs) {\n _wbs = _wbs.split(\".\");\n _wbs[_wbs.length - 1]++;\n\n this._setWBSCode(ch, _wbs.join(\".\"));\n }\n } else {\n var _parent = gantt.getParent(ch.id);\n\n this._setWBSCode(ch, gantt.getTask(_parent).$wbs + \".1\");\n }\n }, gantt.config.root_id, this);\n this._needRecalc = false;\n }\n };\n};\n\nmodule.exports = function (gantt) {\n var wbs = createWbs(gantt);\n\n gantt.getWBSCode = function getWBSCode(task) {\n return wbs.getWBSCode(task);\n };\n\n gantt.getTaskByWBSCode = function (code) {\n return wbs.getByWBSCode(code);\n };\n\n function resetCache() {\n wbs.reset();\n return true;\n }\n\n gantt.attachEvent(\"onAfterTaskMove\", resetCache);\n gantt.attachEvent(\"onBeforeParse\", resetCache);\n gantt.attachEvent(\"onAfterTaskDelete\", resetCache);\n gantt.attachEvent(\"onAfterTaskAdd\", resetCache);\n gantt.attachEvent(\"onAfterSort\", resetCache);\n};","var global = require(\"../../utils/global\");\n\nfunction createMethod(gantt) {\n var methods = {};\n var isActive = false;\n\n function disableMethod(methodName, dummyMethod) {\n dummyMethod = typeof dummyMethod == \"function\" ? dummyMethod : function () {};\n\n if (!methods[methodName]) {\n methods[methodName] = this[methodName];\n this[methodName] = dummyMethod;\n }\n }\n\n function restoreMethod(methodName) {\n if (methods[methodName]) {\n this[methodName] = methods[methodName];\n methods[methodName] = null;\n }\n }\n\n function disableMethods(methodsHash) {\n for (var i in methodsHash) {\n disableMethod.call(this, i, methodsHash[i]);\n }\n }\n\n function restoreMethods() {\n for (var i in methods) {\n restoreMethod.call(this, i);\n }\n }\n\n function batchUpdatePayload(callback) {\n try {\n callback();\n } catch (e) {\n global.console.error(e);\n }\n }\n\n var state = gantt.$services.getService(\"state\");\n state.registerProvider(\"batchUpdate\", function () {\n return {\n batch_update: isActive\n };\n }, false);\n return function batchUpdate(callback, noRedraw) {\n if (isActive) {\n // batch mode is already active\n batchUpdatePayload(callback);\n return;\n }\n\n var call_dp = this._dp && this._dp.updateMode != \"off\";\n var dp_mode;\n\n if (call_dp) {\n dp_mode = this._dp.updateMode;\n\n this._dp.setUpdateMode(\"off\");\n } // temporary disable some methods while updating multiple tasks\n\n\n var resetProjects = {};\n var methods = {\n \"render\": true,\n \"refreshData\": true,\n \"refreshTask\": true,\n \"refreshLink\": true,\n \"resetProjectDates\": function resetProjectDates(task) {\n resetProjects[task.id] = task;\n }\n };\n disableMethods.call(this, methods);\n isActive = true;\n this.callEvent(\"onBeforeBatchUpdate\", []);\n batchUpdatePayload(callback);\n this.callEvent(\"onAfterBatchUpdate\", []);\n restoreMethods.call(this); // do required updates after changes applied\n\n for (var i in resetProjects) {\n this.resetProjectDates(resetProjects[i]);\n }\n\n isActive = false;\n\n if (!noRedraw) {\n this.render();\n }\n\n if (call_dp) {\n this._dp.setUpdateMode(dp_mode);\n\n this._dp.setGanttMode(\"task\");\n\n this._dp.sendData();\n\n this._dp.setGanttMode(\"link\");\n\n this._dp.sendData();\n }\n };\n}\n\nmodule.exports = function (gantt) {\n gantt.batchUpdate = createMethod(gantt);\n};","module.exports = function (gantt) {\n if (!gantt.ext) {\n gantt.ext = {};\n }\n\n var modules = [require(\"./batch_update\"), require(\"./wbs\"), require(\"./resources\"), require(\"./resource_assignments\"), require(\"./new_task_placeholder\"), require(\"./auto_task_types\"), require(\"./formatters\"), require(\"./empty_state_screen\")[\"default\"]];\n\n for (var i = 0; i < modules.length; i++) {\n if (modules[i]) modules[i](gantt);\n }\n};","import * as utils from \"../../utils/utils\";\r\n\r\nexport default class SimpleStorage {\r\n\tpublic static create = () : SimpleStorage => {\r\n\t\treturn new SimpleStorage();\r\n\t}\r\n\r\n\tprotected _storage: { [id: string]: any; };\r\n\r\n\tprotected constructor() {\r\n\t\tthis._storage = {};\r\n\t}\r\n\r\n\tpublic clear = (): void => {\r\n\t\tthis._storage = {};\r\n\t}\r\n\r\n\tpublic storeItem = (item: any): void => {\r\n\t\tthis._storage[item.id] = utils.copy(item);\r\n\t}\r\n\r\n\tpublic getStoredItem = (id: string): any => {\r\n\t\treturn this._storage[id] || null;\r\n\t}\r\n}","\r\nexport default function extendGantt(gantt: any, dp: any) {\r\n\tgantt.getUserData = function(id, name, store) {\r\n\t\tif (!this.userdata) {\r\n\t\t\tthis.userdata = {};\r\n\t\t}\r\n\t\tthis.userdata[store] = this.userdata[store] || {};\r\n\t\tif (this.userdata[store][id] && this.userdata[store][id][name]) {\r\n\t\t\treturn this.userdata[store][id][name];\r\n\t\t}\r\n\t\treturn \"\";\r\n\t};\r\n\tgantt.setUserData = function(id, name, value, store) {\r\n\t\tif (!this.userdata) {\r\n\t\t\tthis.userdata = {};\r\n\t\t}\r\n\t\tthis.userdata[store] = this.userdata[store] || {};\r\n\t\tthis.userdata[store][id] = this.userdata[store][id] || {};\r\n\t\tthis.userdata[store][id][name] = value;\r\n\t};\r\n\r\n\tgantt._change_id = function(oldId, newId) {\r\n\t\tswitch (this._dp._ganttMode) {\r\n\t\t\tcase \"task\":\r\n\t\t\t\tthis.changeTaskId(oldId, newId);\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"link\":\r\n\t\t\t\tthis.changeLinkId(oldId, newId);\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"assignment\":\r\n\t\t\t\tthis.$data.assignmentsStore.changeId(oldId, newId);\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"resource\":\r\n\t\t\t\tthis.$data.resourcesStore.changeId(oldId, newId);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Invalid mode of the dataProcessor after database id is received: ${this._dp._ganttMode}, new id: ${newId}`);\r\n\t\t}\r\n\t};\r\n\r\n\tgantt._row_style = function(rowId, classname){\r\n\t\tif (this._dp._ganttMode !== \"task\") {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!gantt.isTaskExists(rowId)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst task = gantt.getTask(rowId);\r\n\t\ttask.$dataprocessor_class = classname;\r\n\t\tgantt.refreshTask(rowId);\r\n\t};\r\n\r\n\t// fake method for dataprocessor\r\n\tgantt._delete_task = function(rowId, node) {}; // tslint:disable-line\r\n\r\n\tgantt._sendTaskOrder = function(id, item){\r\n\t\tif (item.$drop_target) {\r\n\t\t\tthis._dp.setGanttMode(\"task\");\r\n\t\t\tthis.getTask(id).target = item.$drop_target;\r\n\t\t\tthis._dp.setUpdated(id, true,\"order\");\r\n\t\t\tdelete this.getTask(id).$drop_target;\r\n\t\t}\r\n\t};\r\n\r\n\tgantt.setDp = function() {\r\n\t\tthis._dp = dp;\r\n\t};\r\n\r\n\tgantt.setDp();\r\n}","import * as helpers from \"../../utils/helpers\";\r\n\r\nexport default class DataProcessorEvents {\r\n\tprotected _dataProcessorHandlers: any[];\r\n\tprotected $gantt: any;\r\n\tprotected $dp: any;\r\n\r\n\tconstructor(gantt: any, dp: any) {\r\n\t\tthis.$gantt = gantt;\r\n\t\tthis.$dp = dp;\r\n\t\tthis._dataProcessorHandlers = [];\r\n\t}\r\n\r\n\tattach() {\r\n\t\tconst dp = this.$dp;\r\n\t\tconst gantt = this.$gantt;\r\n\t\tconst treeHelper = require(\"../../utils/task_tree_helpers\");\r\n\t\tconst cascadeDelete = {};\r\n\r\n\t\tconst clientSideDelete = (id) => {\r\n\t\t\treturn this.clientSideDelete(id, dp, gantt);\r\n\t\t};\r\n\r\n\t\tfunction getTaskLinks(task) {\r\n\t\t\tlet _links = [];\r\n\r\n\t\t\tif (task.$source) {\r\n\t\t\t\t_links = _links.concat(task.$source);\r\n\t\t\t}\r\n\t\t\tif (task.$target) {\r\n\t\t\t\t_links = _links.concat(task.$target);\r\n\t\t\t}\r\n\r\n\t\t\treturn _links;\r\n\t\t}\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onAfterTaskAdd\", function(id, item) { // tslint:disable-line\r\n\t\t\tif (gantt.isTaskExists(id)) {\r\n\t\t\t\tdp.setGanttMode(\"tasks\");\r\n\t\t\t\tdp.setUpdated(id, true, \"inserted\");\r\n\t\t\t}\r\n\t\t}));\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onAfterTaskUpdate\", function(id, item) { // tslint:disable-line\r\n\t\t\tif (gantt.isTaskExists(id)) {\r\n\t\t\t\tdp.setGanttMode(\"tasks\");\r\n\t\t\t\tdp.setUpdated(id, true);\r\n\r\n\t\t\t\t// gantt can be destroyed/reinitialized after dp.setUpdated\r\n\t\t\t\tif(gantt._sendTaskOrder){\r\n\t\t\t\t\tgantt._sendTaskOrder(id, item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}));\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onBeforeTaskDelete\", function(id, item) { // tslint:disable-line\r\n\t\t\tif (gantt.config.cascade_delete) {\r\n\t\t\t\tcascadeDelete[id] = {\r\n\t\t\t\t\ttasks: treeHelper.getSubtreeTasks(gantt, id),\r\n\t\t\t\t\tlinks: treeHelper.getSubtreeLinks(gantt, id)\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\t// GS-631. Keep the deleted item in Gantt until we receive the successful response from the server\r\n\t\t\tif (dp.deleteAfterConfirmation) {\r\n\t\t\t\tdp.setGanttMode(\"tasks\");\r\n\t\t\t\tdp.setUpdated(id, true, \"deleted\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}));\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onAfterTaskDelete\", function(id, item) { // tslint:disable-line\r\n\t\t\tdp.setGanttMode(\"tasks\");\r\n\r\n\t\t\t// not send delete request if item is not inserted into the db - just remove it from the client\r\n\t\t\tconst needDbDelete = !clientSideDelete(id);\r\n\t\t\tconst needCascadeDelete = gantt.config.cascade_delete && cascadeDelete[id];\r\n\t\t\tif (!needDbDelete && !needCascadeDelete) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (needCascadeDelete) {\r\n\t\t\t\tconst dpMode = dp.updateMode;\r\n\t\t\t\tdp.setUpdateMode(\"off\");\r\n\r\n\t\t\t\tconst cascade = cascadeDelete[id];\r\n\t\t\t\tfor (const i in cascade.tasks) {\r\n\t\t\t\t\tif (!clientSideDelete(i)) {\r\n\t\t\t\t\t\tdp.storeItem(cascade.tasks[i]);\r\n\t\t\t\t\t\tdp.setUpdated(i, true, \"deleted\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdp.setGanttMode(\"links\");\r\n\t\t\t\tfor (const i in cascade.links) {\r\n\t\t\t\t\tif (!clientSideDelete(i)) {\r\n\t\t\t\t\t\tdp.storeItem(cascade.links[i]);\r\n\t\t\t\t\t\tdp.setUpdated(i, true, \"deleted\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcascadeDelete[id] = null;\r\n\r\n\t\t\t\tif (dpMode !== \"off\") {\r\n\t\t\t\t\tdp.sendAllData();\r\n\t\t\t\t}\r\n\t\t\t\tdp.setGanttMode(\"tasks\");\r\n\t\t\t\tdp.setUpdateMode(dpMode);\r\n\t\t\t}\r\n\r\n\t\t\tif (needDbDelete){\r\n\t\t\t\tdp.storeItem(item);\r\n\t\t\t\tif (!dp.deleteAfterConfirmation){\r\n\t\t\t\t\tdp.setUpdated(id, true, \"deleted\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\tif (dp.updateMode !== \"off\" && !dp._tSend) {\r\n\t\t\t\tdp.sendAllData();\r\n\t\t\t}\r\n\t\t}));\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onAfterLinkUpdate\", function(id, item) { // tslint:disable-line\r\n\t\t\tif (gantt.isLinkExists(id)) {\r\n\t\t\t\tdp.setGanttMode(\"links\");\r\n\t\t\t\tdp.setUpdated(id, true);\r\n\t\t\t}\r\n\t\t}));\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onAfterLinkAdd\", function(id, item) { // tslint:disable-line\r\n\t\t\tif (gantt.isLinkExists(id)) {\r\n\t\t\t\tdp.setGanttMode(\"links\");\r\n\t\t\t\tdp.setUpdated(id, true,\"inserted\");\r\n\t\t\t}\r\n\t\t}));\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onAfterLinkDelete\", function(id, item) { // tslint:disable-line\r\n\t\t\tdp.setGanttMode(\"links\");\r\n\r\n\t\t\tconst needDbDelete = !clientSideDelete(id);\r\n\t\t\tif (!needDbDelete) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdp.storeItem(item);\r\n\t\t\tdp.setUpdated(id, true,\"deleted\");\r\n\t\t}));\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onRowDragEnd\", function(id, target) { // tslint:disable-line\r\n\t\t\tgantt._sendTaskOrder(id, gantt.getTask(id));\r\n\t\t}));\r\n\r\n\t\tlet tasks = null;\r\n\t\tlet links = null;\r\n\r\n\t\tthis._dataProcessorHandlers.push(gantt.attachEvent(\"onTaskIdChange\", function(oldId, newId) { // tslint:disable-line\r\n\t\t\tif (!dp._waitMode) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst children = gantt.getChildren(newId);\r\n\t\t\tif (children.length) {\r\n\t\t\t\ttasks = tasks || {};\r\n\r\n\t\t\t\tfor (let i = 0; i < children.length; i++) {\r\n\t\t\t\t\tconst ch = this.getTask(children[i]);\r\n\t\t\t\t\ttasks[ch.id] = ch;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst item = this.getTask(newId);\r\n\t\t\tconst itemLinks = getTaskLinks(item);\r\n\r\n\t\t\tif (itemLinks.length) {\r\n\t\t\t\tlinks = links || {};\r\n\r\n\t\t\t\tfor (let i = 0; i < itemLinks.length; i++) {\r\n\t\t\t\t\tconst link = this.getLink(itemLinks[i]);\r\n\t\t\t\t\tlinks[link.id] = link;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}));\r\n\r\n\t\tdp.attachEvent(\"onAfterUpdateFinish\", function() {\r\n\t\t\tif (tasks || links) {\r\n\t\t\t\tgantt.batchUpdate(function() {\r\n\t\t\t\t\tfor (const id in tasks) {\r\n\t\t\t\t\t\tgantt.updateTask(tasks[id].id);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfor (const id in links) {\r\n\t\t\t\t\t\tgantt.updateLink(links[id].id);\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttasks = null;\r\n\t\t\t\t\tlinks = null;\r\n\t\t\t\t});\r\n\t\t\t\tif (tasks) {\r\n\t\t\t\t\tgantt._dp.setGanttMode(\"tasks\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tgantt._dp.setGanttMode(\"links\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdp.attachEvent(\"onBeforeDataSending\", function() {\r\n\t\t\tif (this._tMode === \"CUSTOM\") {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tlet url = this._serverProcessor;\r\n\t\t\tif (this._tMode === \"REST-JSON\" || this._tMode === \"REST\") {\r\n\t\t\t\tconst mode = this._ganttMode;\r\n\r\n\t\t\t\turl = url.substring(0, url.indexOf(\"?\") > -1 ? url.indexOf(\"?\") : url.length);\r\n\t\t\t\t// editing=true&\r\n\t\t\t\tthis.serverProcessor = url + (url.slice(-1) === \"/\" ? \"\" : \"/\") + mode;\r\n\t\t\t} else {\r\n\t\t\t\tconst pluralizedMode = this._ganttMode + \"s\";\r\n\t\t\t\tthis.serverProcessor = url + gantt.ajax.urlSeparator(url) + \"gantt_mode=\" + pluralizedMode;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tdp.attachEvent(\"insertCallback\", function insertCallback(upd, id, parent, mode) { // tslint:disable-line\r\n\t\t\tconst data = upd.data || gantt.xml._xmlNodeToJSON(upd.firstChild);\r\n\t\t\tconst methods = {\r\n\t\t\t\tadd: gantt.addTask,\r\n\t\t\t\tisExist: gantt.isTaskExists\r\n\t\t\t};\r\n\t\t\tif (mode === \"links\") {\r\n\t\t\t\tmethods.add = gantt.addLink;\r\n\t\t\t\tmethods.isExist = gantt.isLinkExists;\r\n\t\t\t}\r\n\t\t\tif (methods.isExist.call(gantt, id)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdata.id = id;\r\n\t\t\tmethods.add.call(gantt, data);\r\n\t\t});\r\n\r\n\t\tdp.attachEvent(\"updateCallback\", function updateCallback(upd, id) {\r\n\t\t\tconst data = upd.data || gantt.xml._xmlNodeToJSON(upd.firstChild);\r\n\t\t\tif (!gantt.isTaskExists(id)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst objData = gantt.getTask(id);\r\n\t\t\tfor (const key in data) {\r\n\t\t\t\tlet property = data[key];\r\n\t\t\t\tswitch (key) {\r\n\t\t\t\t\tcase \"id\":\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tcase \"start_date\":\r\n\t\t\t\t\tcase \"end_date\":\r\n\t\t\t\t\t\tproperty = gantt.defined(gantt.templates.xml_date) ? gantt.templates.xml_date(property) : gantt.templates.parse_date(property);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"duration\":\r\n\t\t\t\t\t\tobjData.end_date = gantt.calculateEndDate({start_date: objData.start_date, duration: property, task:objData});\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tobjData[key] = property;\r\n\t\t\t}\r\n\t\t\tgantt.updateTask(id);\r\n\t\t\tgantt.refreshData();\r\n\t\t});\r\n\t\tdp.attachEvent(\"deleteCallback\", function deleteCallback(upd, id, parent, mode) { // tslint:disable-line\r\n\t\t\tconst methods = {\r\n\t\t\t\tdelete: gantt.deleteTask,\r\n\t\t\t\tisExist: gantt.isTaskExists\r\n\t\t\t};\r\n\t\t\tif (mode === \"links\") {\r\n\t\t\t\tmethods.delete = gantt.deleteLink;\r\n\t\t\t\tmethods.isExist = gantt.isLinkExists;\r\n\t\t\t} else if(mode === \"assignment\") {\r\n\t\t\t\tmethods.delete = function(val) {\r\n\t\t\t\t\tgantt.$data.assignmentsStore.remove(val);\r\n\t\t\t\t};\r\n\t\t\t\tmethods.isExist = function(val){\r\n\t\t\t\t\treturn gantt.$data.assignmentsStore.exists(val);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tif (methods.isExist.call(gantt, id)) {\r\n\t\t\t\tmethods.delete.call(gantt, id);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.handleResourceCRUD(dp, gantt);\r\n\t\tthis.handleResourceAssignmentCRUD(dp, gantt);\r\n\t}\r\n\r\n\tclientSideDelete(id, dp, gantt){\r\n\t\tconst updated = dp.updatedRows.slice();\r\n\t\tlet clientOnly = false;\r\n\r\n\t\tif(gantt.getUserData(id, \"!nativeeditor_status\", dp._ganttMode) === \"true_deleted\"){\r\n\t\t\tclientOnly = true;\r\n\t\t\tdp.setUpdated(id,false);\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < updated.length && !dp._in_progress[id]; i++) {\r\n\t\t\tif (updated[i] === id) {\r\n\t\t\t\tif (gantt.getUserData(id, \"!nativeeditor_status\", dp._ganttMode) === \"inserted\") {\r\n\t\t\t\t\tclientOnly = true;\r\n\t\t\t\t}\r\n\t\t\t\tdp.setUpdated(id,false);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn clientOnly;\r\n\t}\r\n\r\n\thandleResourceAssignmentCRUD(dp, gantt){\r\n\t\tif(!gantt.config.resources || gantt.config.resources.dataprocessor_assignments !== true){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst assignmentsStore = gantt.getDatastore(gantt.config.resource_assignment_store);\r\n\t\tconst insertedTasks = {};\r\n\t\tconst pendingAssignments = {};\r\n\r\n\t\tgantt.attachEvent(\"onBeforeTaskAdd\", function(id, task){\r\n\t\t\tinsertedTasks[id] = true;\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tfunction putAssignmentToQueue(item){\r\n\t\t\tpendingAssignments[item.id] = item;\r\n\t\t\tinsertedTasks[item.task_id] = true;\r\n\t\t}\r\n\r\n\t\tfunction insertResourceAssignment(assignment){\r\n\t\t\tconst id = assignment.id;\r\n\t\t\tif (assignmentsStore.exists(id)) {\r\n\t\t\t\tdp.setGanttMode(\"assignment\");\r\n\t\t\t\tdp.setUpdated(id, true,\"inserted\");\r\n\t\t\t}\r\n\t\t\tdelete pendingAssignments[id];\r\n\t\t}\r\n\r\n\t\tgantt.attachEvent(\"onTaskIdChange\", function(id, newId){\r\n\t\t\tdelete insertedTasks[id];\r\n\t\t});\r\n\r\n\t\tassignmentsStore.attachEvent(\"onAfterAdd\", (id, item) => {\r\n\t\t\tif(insertedTasks[item.task_id]){\r\n\t\t\t\t// inserting assignment of new task\r\n\t\t\t\t// task is not saved yet, need to wait till it gets permanent id and save assigmnents after that\r\n\t\t\t\tputAssignmentToQueue(item);\r\n\t\t\t}else{\r\n\t\t\t\tinsertResourceAssignment(item);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tassignmentsStore.attachEvent(\"onAfterUpdate\", (id, item) => {\r\n\t\t\tif (assignmentsStore.exists(id)) {\r\n\t\t\t\tif(pendingAssignments[id]){\r\n\t\t\t\t\tinsertResourceAssignment(item);\r\n\t\t\t\t}else{\r\n\t\t\t\t\tdp.setGanttMode(\"assignment\");\r\n\t\t\t\t\tdp.setUpdated(id, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tassignmentsStore.attachEvent(\"onAfterDelete\", (id, item) => {\r\n\t\t\tdp.setGanttMode(\"assignment\");\r\n\r\n\t\t\tconst needDbDelete = !this.clientSideDelete(id, dp, gantt);\r\n\t\t\tif (!needDbDelete) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdp.storeItem(item);\r\n\t\t\tdp.setUpdated(id, true,\"deleted\");\r\n\t\t});\r\n\r\n\t}\r\n\r\n\thandleResourceCRUD(dp, gantt){\r\n\t\tif(!gantt.config.resources || gantt.config.resources.dataprocessor_resources !== true){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst resourcesStore = gantt.getDatastore(gantt.config.resource_store);\r\n\r\n\t\tfunction insertResource(resource){\r\n\t\t\tconst id = resource.id;\r\n\t\t\tif (resourcesStore.exists(id)) {\r\n\t\t\t\tdp.setGanttMode(\"resource\");\r\n\t\t\t\tdp.setUpdated(id, true,\"inserted\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tresourcesStore.attachEvent(\"onAfterAdd\", (id, item) => {\r\n\t\t\tinsertResource(item);\r\n\t\t});\r\n\r\n\t\tresourcesStore.attachEvent(\"onAfterUpdate\", (id, item) => {\r\n\t\t\tif (resourcesStore.exists(id)) {\r\n\t\t\t\tdp.setGanttMode(\"resource\");\r\n\t\t\t\tdp.setUpdated(id, true);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tresourcesStore.attachEvent(\"onAfterDelete\", (id, item) => {\r\n\t\t\tdp.setGanttMode(\"resource\");\r\n\r\n\t\t\tconst needDbDelete = !this.clientSideDelete(id, dp, gantt);\r\n\t\t\tif (!needDbDelete) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdp.storeItem(item);\r\n\t\t\tdp.setUpdated(id, true,\"deleted\");\r\n\t\t});\r\n\r\n\t}\r\n\r\n\r\n\tdetach() {\r\n\t\thelpers.forEach(this._dataProcessorHandlers, (e) => {\r\n\t\t\tthis.$gantt.detachEvent(e);\r\n\t\t});\r\n\t\tthis._dataProcessorHandlers = [];\r\n\t}\r\n}\r\n","import * as eventable from \"../../utils/eventable\";\r\nimport * as helpers from \"../../utils/helpers\";\r\nimport * as utils from \"../../utils/utils\";\r\nimport DataProcessorEvents from \"./data_processor_events\";\r\nimport extendGantt from \"./extend_gantt\";\r\nimport SimpleStorage from \"./simple_storage\";\r\n\r\nexport interface DataProcessor { // tslint:disable-line\r\n\t$gantt: any;\r\n\tdetachAllEvents: any;\r\n\tattachEvent: any;\r\n\tcallEvent: any;\r\n\r\n\tserverProcessor: string;\r\n\taction_param: string;\r\n\tupdatedRows: any[];\r\n\tautoUpdate: boolean;\r\n\tupdateMode: string;\r\n\tmessages: any[];\r\n\tstyles: object;\r\n\tdnd: any;\r\n\tdeleteAfterConfirmation?: any;\r\n}\r\n\r\nexport function createDataProcessor(config: any) {\r\n\tlet router;\r\n\tlet tMode;\r\n\tif (config instanceof Function) {\r\n\t\trouter = config;\r\n\t} else if (config.hasOwnProperty(\"router\")) {\r\n\t\trouter = config.router;\r\n\t} else if (config.hasOwnProperty(\"assignment\") || config.hasOwnProperty(\"link\") || config.hasOwnProperty(\"task\")) {\r\n\t\trouter = config;\r\n\t}\r\n\tif (router) {\r\n\t\ttMode = \"CUSTOM\";\r\n\t} else {\r\n\t\ttMode = config.mode || \"REST-JSON\";\r\n\t}\r\n\tconst gantt = this; // tslint:disable-line\r\n\tconst dp = new DataProcessor(config.url);\r\n\r\n\r\n\tdp.init(gantt);\r\n\tdp.setTransactionMode({\r\n\t\tmode: tMode,\r\n\t\trouter\r\n\t}, config.batchUpdate);\r\n\tif(config.deleteAfterConfirmation){\r\n\t\tdp.deleteAfterConfirmation = config.deleteAfterConfirmation;\r\n\t}\r\n\treturn dp;\r\n}\r\n\r\nexport class DataProcessor {\r\n\tpublic modes: object;\r\n\tpublic serverProcessor: string;\r\n\tpublic action_param: string; // tslint:disable-line\r\n\tpublic updatedRows: any[];\r\n\tpublic autoUpdate: boolean;\r\n\tpublic updateMode: string;\r\n\tpublic messages: any[];\r\n\tpublic styles: object;\r\n\tpublic dnd: any;\r\n\r\n\tprotected _tMode: string;\r\n\tprotected _headers: any;\r\n\tprotected _payload: any;\r\n\tprotected _postDelim: string;\r\n\tprotected _waitMode: number;\r\n\tprotected _in_progress: object; // tslint:disable-line\r\n\tprotected _invalid: object;\r\n\tprotected _storage: SimpleStorage;\r\n\tprotected _tSend: boolean;\r\n\tprotected _serializeAsJson: boolean;\r\n\tprotected _router: any;\r\n\tprotected _utf: boolean;\r\n\tprotected _methods: any[];\r\n\tprotected _user: any;\r\n\tprotected _uActions: object;\r\n\tprotected _needUpdate: boolean;\r\n\tprotected _ganttMode: \"task\"|\"link\";\r\n\tprotected _routerParametersFormat: \"parameters\"|\"object\";\r\n\r\n\tprotected _silent_mode: any; // tslint:disable-line\r\n\tprotected _updateBusy: any;\r\n\tprotected _serverProcessor: any;\r\n\tprotected _initialized: boolean;\r\n\r\n\tconstructor(serverProcessorURL?) {\r\n\t\tthis.serverProcessor = serverProcessorURL;\r\n\t\tthis.action_param = \"!nativeeditor_status\";\r\n\r\n\t\tthis.updatedRows = []; // ids of updated rows\r\n\r\n\t\tthis.autoUpdate = true;\r\n\t\tthis.updateMode = \"cell\";\r\n\t\tthis._headers = null;\r\n\t\tthis._payload = null;\r\n\t\tthis._postDelim = \"_\";\r\n\t\tthis._routerParametersFormat = \"parameters\";\r\n\r\n\t\tthis._waitMode = 0;\r\n\t\tthis._in_progress = {}; // ?\r\n\t\tthis._storage = SimpleStorage.create();\r\n\t\tthis._invalid = {};\r\n\t\tthis.messages = [];\r\n\r\n\t\tthis.styles = {\r\n\t\t\tupdated: \"font-weight:bold;\",\r\n\t\t\tinserted: \"font-weight:bold;\",\r\n\t\t\tdeleted: \"text-decoration : line-through;\",\r\n\t\t\tinvalid: \"background-color:FFE0E0;\",\r\n\t\t\tinvalid_cell: \"border-bottom:2px solid red;\",\r\n\t\t\terror: \"color:red;\",\r\n\t\t\tclear: \"font-weight:normal;text-decoration:none;\"\r\n\t\t};\r\n\t\tthis.enableUTFencoding(true);\r\n\t\teventable(this);\r\n\t}\r\n\r\n\tsetTransactionMode(mode:any, total?:any) {\r\n\t\tif (typeof mode === \"object\") {\r\n\t\t\tthis._tMode = mode.mode || this._tMode;\r\n\r\n\t\t\tif (utils.defined(mode.headers)) {\r\n\t\t\t\tthis._headers = mode.headers;\r\n\t\t\t}\r\n\r\n\t\t\tif (utils.defined(mode.payload)) {\r\n\t\t\t\tthis._payload = mode.payload;\r\n\t\t\t}\r\n\t\t\tthis._tSend = !!total;\r\n\t\t} else {\r\n\t\t\tthis._tMode = mode;\r\n\t\t\tthis._tSend = total;\r\n\t\t}\r\n\r\n\t\tif (this._tMode === \"REST\") {\r\n\t\t\tthis._tSend = false;\r\n\t\t}\r\n\r\n\t\tif (this._tMode === \"JSON\" || this._tMode === \"REST-JSON\") {\r\n\t\t\tthis._tSend = false;\r\n\t\t\tthis._serializeAsJson = true;\r\n\t\t\tthis._headers = this._headers || {};\r\n\t\t\tthis._headers[\"Content-Type\"] = \"application/json\";\r\n\t\t}else{\r\n\t\t\tif(this._headers && !this._headers[\"Content-Type\"]){\r\n\t\t\t\tthis._headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this._tMode === \"CUSTOM\") {\r\n\t\t\tthis._tSend = false;\r\n\t\t\tthis._router = mode.router;\r\n\t\t}\r\n\t}\r\n\r\n\tescape(data:any) {\r\n\t\tif (this._utf) {\r\n\t\t\treturn encodeURIComponent(data);\r\n\t\t} else {\r\n\t\t\treturn escape(data);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: allows to set escaping mode\r\n\t * @param: true - utf based escaping, simple - use current page encoding\r\n\t * @type: public\r\n\t */\r\n\tenableUTFencoding(mode:boolean) {\r\n\t\tthis._utf = !!mode;\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: get state of updating\r\n\t * @returns: true - all in sync with server, false - some items not updated yet.\r\n\t * @type: public\r\n\t */\r\n\tgetSyncState() {\r\n\t\treturn !this.updatedRows.length;\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: set if rows should be send to server automatically\r\n\t * @param: mode - \"row\" - based on row selection changed, \"cell\" - based on cell editing finished, \"off\" - manual data sending\r\n\t * @type: public\r\n\t */\r\n\tsetUpdateMode(mode: string, dnd: any) {\r\n\t\tthis.autoUpdate = (mode === \"cell\");\r\n\t\tthis.updateMode = mode;\r\n\t\tthis.dnd = dnd;\r\n\t}\r\n\r\n\tignore(code: any, master: any) {\r\n\t\tthis._silent_mode = true;\r\n\t\tcode.call(master || window);\r\n\t\tthis._silent_mode = false;\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: mark row as updated/normal. check mandatory fields, initiate autoupdate (if turned on)\r\n\t * @param: rowId - id of row to set update-status for\r\n\t * @param: state - true for \"updated\", false for \"not updated\"\r\n\t * @param: mode - update mode name\r\n\t * @type: public\r\n\t */\r\n\tsetUpdated(rowId:number|string, state: boolean, mode?: string) {\r\n\t\tif (this._silent_mode) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst ind = this.findRow(rowId);\r\n\r\n\t\tmode = mode || \"updated\";\r\n\t\tconst existing = this.$gantt.getUserData(rowId, this.action_param, this._ganttMode);\r\n\t\tif (existing && mode === \"updated\") {\r\n\t\t\tmode = existing;\r\n\t\t}\r\n\t\tif (state) {\r\n\t\t\tthis.set_invalid(rowId, false); // clear previous error flag\r\n\t\t\tthis.updatedRows[ind] = rowId;\r\n\t\t\tthis.$gantt.setUserData(rowId, this.action_param, mode, this._ganttMode);\r\n\t\t\tif (this._in_progress[rowId]) {\r\n\t\t\t\tthis._in_progress[rowId] = \"wait\";\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (!this.is_invalid(rowId)) {\r\n\t\t\t\tthis.updatedRows.splice(ind, 1);\r\n\t\t\t\tthis.$gantt.setUserData(rowId, this.action_param, \"\", this._ganttMode);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.markRow(rowId, state, mode);\r\n\t\tif (state && this.autoUpdate) {\r\n\t\t\tthis.sendData(rowId);\r\n\t\t}\r\n\t}\r\n\r\n\tmarkRow(id: number | string, state: boolean, mode: string) {\r\n\t\tlet str = \"\";\r\n\t\tconst invalid = this.is_invalid(id);\r\n\t\tif (invalid) {\r\n\t\t\tstr = this.styles[invalid];\r\n\t\t\tstate = true;\r\n\t\t}\r\n\t\tif (this.callEvent(\"onRowMark\", [id, state, mode, invalid])) {\r\n\t\t\t// default logic\r\n\t\t\tstr = this.styles[state ? mode : \"clear\"] + \" \" + str;\r\n\r\n\t\t\tthis.$gantt[this._methods[0]](id, str);\r\n\r\n\t\t\tif (invalid && invalid.details) {\r\n\t\t\t\tstr += this.styles[invalid + \"_cell\"];\r\n\t\t\t\tfor (let i = 0; i < invalid.details.length; i++) {\r\n\t\t\t\t\tif (invalid.details[i]) {\r\n\t\t\t\t\t\tthis.$gantt[this._methods[1]](id, i, str);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetActionByState(state: string):string {\r\n\t\tif (state === \"inserted\") {\r\n\t\t\treturn \"create\";\r\n\t\t}\r\n\r\n\t\tif (state === \"updated\") {\r\n\t\t\treturn \"update\";\r\n\t\t}\r\n\r\n\t\tif (state === \"deleted\") {\r\n\t\t\treturn \"delete\";\r\n\t\t}\r\n\r\n\t\t// reorder\r\n\t\treturn \"update\";\r\n\t}\r\n\r\n\tgetState(id: number | string) {\r\n\t\treturn this.$gantt.getUserData(id, this.action_param, this._ganttMode);\r\n\t}\r\n\r\n\tis_invalid(id: number | string) {\r\n\t\treturn this._invalid[id];\r\n\t}\r\n\r\n\tset_invalid(id: number | string, mode: any, details?) {\r\n\t\tif (details) {\r\n\t\t\tmode = {\r\n\t\t\t\tvalue: mode,\r\n\t\t\t\tdetails,\r\n\t\t\t\ttoString: function() { // tslint:disable-line\r\n\t\t\t\t\treturn this.value.toString();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t\tthis._invalid[id] = mode;\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: check mandatory fields and verify values of cells, initiate update (if specified). Can be redefined in order to provide custom validation\r\n\t * @param: rowId - id of row to set update-status for\r\n\t * @type: public\r\n\t */\r\n\t// tslint:disable-next-line\r\n\tcheckBeforeUpdate(rowId: number | string) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: send row(s) values to server\r\n\t * @param: rowId - id of row which data to send. If not specified, then all \"updated\" rows will be send\r\n\t * @type: public\r\n\t */\r\n\tsendData(rowId?: any) {\r\n\t\tif (this.$gantt.editStop) {\r\n\t\t\tthis.$gantt.editStop();\r\n\t\t}\r\n\r\n\t\tif (typeof rowId === \"undefined\" || this._tSend) {\r\n\r\n\t\t\tconst pendingUpdateModes = [];\r\n\t\t\tif(this.modes){\r\n\t\t\t\tconst knownModes = [\"task\", \"link\", \"assignment\"];\r\n\t\t\t\tknownModes.forEach((mode) => {\r\n\t\t\t\t\tif(this.modes[mode] && this.modes[mode].updatedRows.length){\r\n\t\t\t\t\t\tpendingUpdateModes.push(mode);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (pendingUpdateModes.length){\r\n\t\t\t\tfor(let i = 0; i < pendingUpdateModes.length; i++){\r\n\t\t\t\t\tthis.setGanttMode(pendingUpdateModes[i]);\r\n\t\t\t\t\tthis.sendAllData();\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t} else {\r\n\t\t\t\treturn this.sendAllData();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (this._in_progress[rowId]) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.messages = [];\r\n\t\tif (!this.checkBeforeUpdate(rowId) && this.callEvent(\"onValidationError\", [rowId, this.messages])) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tthis._beforeSendData(this._getRowData(rowId), rowId);\r\n\t}\r\n\r\n\tserialize(data: any, id: any) {\r\n\t\tif (this._serializeAsJson) {\r\n\t\t\treturn this._serializeAsJSON(data);\r\n\t\t}\r\n\r\n\t\tif (typeof data === \"string\") {\r\n\t\t\treturn data;\r\n\t\t}\r\n\t\tif (typeof id !== \"undefined\") {\r\n\t\t\treturn this.serialize_one(data, \"\");\r\n\t\t} else {\r\n\t\t\tconst stack = [];\r\n\t\t\tconst keys = [];\r\n\t\t\tfor (const key in data) {\r\n\t\t\t\tif (data.hasOwnProperty(key)) {\r\n\t\t\t\t\tstack.push(this.serialize_one(data[key], key + this._postDelim));\r\n\t\t\t\t\tkeys.push(key);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstack.push(\"ids=\" + this.escape(keys.join(\",\")));\r\n\t\t\tif (this.$gantt.security_key) {\r\n\t\t\t\tstack.push(\"dhx_security=\" + this.$gantt.security_key);\r\n\t\t\t}\r\n\t\t\treturn stack.join(\"&\");\r\n\t\t}\r\n\t}\r\n\r\n\tserialize_one(data: any, pref: string) {\r\n\t\tif (typeof data === \"string\") {\r\n\t\t\treturn data;\r\n\t\t}\r\n\t\tconst stack = [];\r\n\t\tlet serialized = \"\";\r\n\t\tfor (const key in data)\r\n\t\t\tif (data.hasOwnProperty(key)) {\r\n\t\t\t\tif ((key === \"id\" ||\r\n\t\t\t\t\tkey == this.action_param) && // tslint:disable-line\r\n\t\t\t\t\tthis._tMode === \"REST\") {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof data[key] === \"string\" || typeof data[key] === \"number\") {\r\n\t\t\t\t\tserialized = data[key];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tserialized = JSON.stringify(data[key]);\r\n\t\t\t\t}\r\n\t\t\t\tstack.push(this.escape((pref || \"\") + key) + \"=\" + this.escape(serialized));\r\n\t\t\t}\r\n\t\treturn stack.join(\"&\");\r\n\t}\r\n\r\n\tsendAllData() {\r\n\t\tif (!this.updatedRows.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.messages = [];\r\n\t\tlet valid: any = true;\r\n\r\n\t\tthis._forEachUpdatedRow(function(rowId) {\r\n\t\t\tvalid = valid && this.checkBeforeUpdate(rowId);\r\n\t\t});\r\n\r\n\t\tif (!valid && !this.callEvent(\"onValidationError\", [\"\", this.messages])) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this._tSend) {\r\n\t\t\tthis._sendData(this._getAllData());\r\n\t\t} else {\r\n\t\t\t// this.updatedRows can be spliced from onBeforeUpdate via dp.setUpdated false\r\n\t\t\t// use an iterator instead of for(var i = 0; i < this.updatedRows; i++) then\r\n\t\t\tthis._forEachUpdatedRow(function(rowId) {\r\n\t\t\t\tif (!this._in_progress[rowId]) {\r\n\t\t\t\t\tif (this.is_invalid(rowId)) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._beforeSendData(this._getRowData(rowId), rowId);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfindRow(pattern: any) {\r\n\t\tlet i = 0;\r\n\t\tfor (i = 0; i < this.updatedRows.length; i++) {\r\n\t\t\tif (pattern == this.updatedRows[i]) { // tslint:disable-line\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn i;\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: define custom actions\r\n\t * @param: name - name of action, same as value of action attribute\r\n\t * @param: handler - custom function, which receives a XMl response content for action\r\n\t * @type: private\r\n\t */\r\n\tdefineAction(name: string, handler: any) {\r\n\t\tif (!this._uActions) {\r\n\t\t\tthis._uActions = {};\r\n\t\t}\r\n\t\tthis._uActions[name] = handler;\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: used in combination with setOnBeforeUpdateHandler to create custom client-server transport system\r\n\t * @param: sid - id of item before update\r\n\t * @param: tid - id of item after up0ate\r\n\t * @param: action - action name\r\n\t * @type: public\r\n\t * @topic: 0\r\n\t */\r\n\tafterUpdateCallback(sid: number | string, tid: number | string, action: string, btag: any, ganttMode: string) {\r\n\t\tif(!this.$gantt){\r\n\t\t\t// destructor has been called before the callback\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setGanttMode(ganttMode);\r\n\r\n\t\tconst marker = sid;\r\n\t\tconst correct = (action !== \"error\" && action !== \"invalid\");\r\n\t\tif (!correct) {\r\n\t\t\tthis.set_invalid(sid, action);\r\n\t\t}\r\n\t\tif ((this._uActions) && (this._uActions[action]) && (!this._uActions[action](btag))) {\r\n\t\t\treturn (delete this._in_progress[marker]);\r\n\t\t}\r\n\r\n\t\tif (this._in_progress[marker] !== \"wait\") {\r\n\t\t\tthis.setUpdated(sid, false);\r\n\t\t}\r\n\r\n\t\tconst originalSid = sid;\r\n\r\n\t\tswitch (action) {\r\n\t\t\tcase \"inserted\":\r\n\t\t\tcase \"insert\":\r\n\t\t\t\tif (tid != sid) { // tslint:disable-line\r\n\t\t\t\t\tthis.setUpdated(sid, false);\r\n\t\t\t\t\tthis.$gantt[this._methods[2]](sid, tid);\r\n\t\t\t\t\tsid = tid;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"delete\":\r\n\t\t\tcase \"deleted\":\r\n\t\t\t\tif(!this.deleteAfterConfirmation || this._ganttMode !== \"task\"){\r\n\t\t\t\t\tthis.$gantt.setUserData(sid, this.action_param, \"true_deleted\", this._ganttMode);\r\n\t\t\t\t\tthis.$gantt[this._methods[3]](sid);\r\n\t\t\t\t\tdelete this._in_progress[marker];\r\n\t\t\t\t\treturn this.callEvent(\"onAfterUpdate\", [sid, action, tid, btag]);\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif (this._ganttMode === \"task\" && this.$gantt.isTaskExists(sid)) {\r\n\t\t\t\t\t\tthis.$gantt.setUserData(sid, this.action_param, \"true_deleted\", this._ganttMode);\r\n\t\t\t\t\t\tconst task = this.$gantt.getTask(sid);\r\n\t\t\t\t\t\tthis.$gantt.silent(() => {\r\n\t\t\t\t\t\t\tthis.$gantt.deleteTask(sid);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tthis.$gantt.callEvent(\"onAfterTaskDelete\", [sid, task]);\r\n\t\t\t\t\t\tthis.$gantt.render();\r\n\t\t\t\t\t\tdelete this._in_progress[marker];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this.callEvent(\"onAfterUpdate\", [sid, action, tid, btag]);\r\n\t\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif (this._in_progress[marker] !== \"wait\") {\r\n\t\t\tif (correct) {\r\n\t\t\t\tthis.$gantt.setUserData(sid, this.action_param, \"\", this._ganttMode);\r\n\t\t\t}\r\n\t\t\tdelete this._in_progress[marker];\r\n\t\t} else {\r\n\t\t\tdelete this._in_progress[marker];\r\n\t\t\tthis.setUpdated(tid, true, this.$gantt.getUserData(sid, this.action_param, this._ganttMode));\r\n\t\t}\r\n\r\n\t\tthis.callEvent(\"onAfterUpdate\", [originalSid, action, tid, btag]);\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: response from server\r\n\t * @param: xml - XMLLoader object with response XML\r\n\t * @type: private\r\n\t */\r\n\tafterUpdate(that: any, xml: any, id?:any) {\r\n\t\tlet _xml;\r\n\t\tif (arguments.length === 3) {\r\n\t\t\t_xml = arguments[1];\r\n\t\t} else {\r\n\t\t\t// old dataprocessor\r\n\t\t\t_xml = arguments[4];\r\n\t\t}\r\n\t\tlet mode = this.getGanttMode();\r\n\t\tconst reqUrl = _xml.filePath || _xml.url;\r\n\r\n\t\tif (this._tMode !== \"REST\" && this._tMode !== \"REST-JSON\") {\r\n\t\t\tif (reqUrl.indexOf(\"gantt_mode=links\") !== -1) {\r\n\t\t\t\tmode = \"link\";\r\n\t\t\t} else if (reqUrl.indexOf(\"gantt_mode=assignments\") !== -1) {\r\n\t\t\t\tmode = \"assignment\";\r\n\t\t\t} else {\r\n\t\t\t\tmode = \"task\";\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (reqUrl.indexOf(\"/link\") >= 0) {\r\n\t\t\t\tmode = \"link\";\r\n\t\t\t} else if(reqUrl.indexOf(\"/assignment\") >= 0){\r\n\t\t\t\tmode = \"assignment\";\r\n\t\t\t} else {\r\n\t\t\t\tmode = \"task\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.setGanttMode(mode);\r\n\r\n\t\tconst ajax = this.$gantt.ajax;\r\n\t\t// try to use json first\r\n\t\tlet tag;\r\n\r\n\t\ttry {\r\n\t\t\ttag = JSON.parse(xml.xmlDoc.responseText);\r\n\t\t} catch (e) {\r\n\r\n\t\t\t// empty response also can be processed by json handler\r\n\t\t\tif (!xml.xmlDoc.responseText.length) {\r\n\t\t\t\ttag = {};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst processCallback = (itemId: any) => {\r\n\t\t\tconst action = tag.action || this.getState(itemId) || \"updated\";\r\n\t\t\tconst sid = tag.sid || itemId[0];\r\n\t\t\tconst tid = tag.tid || itemId[0];\r\n\t\t\tthat.afterUpdateCallback(sid, tid, action, tag, mode);\r\n\t\t};\r\n\t\tif (tag) {\r\n\t\t\t// GS-753. When multiple tasks are updated, unhighlight all of them\r\n\t\t\tif (Array.isArray(id) && id.length > 1) {\r\n\t\t\t\tid.forEach((taskId) => processCallback(taskId));\r\n\t\t\t} else {\r\n\t\t\t\tprocessCallback(id);\r\n\t\t\t}\r\n\t\t\tthat.finalizeUpdate();\r\n\t\t\tthis.setGanttMode(mode);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// xml response\r\n\t\tconst top = ajax.xmltop(\"data\", xml.xmlDoc); // fix incorrect content type in IE\r\n\t\tif (!top) {\r\n\t\t\treturn this.cleanUpdate(id);\r\n\t\t}\r\n\t\tconst atag = ajax.xpath(\"//data/action\", top);\r\n\t\tif (!atag.length) {\r\n\t\t\treturn this.cleanUpdate(id);\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < atag.length; i++) {\r\n\t\t\tconst btag = atag[i];\r\n\t\t\tconst action = btag.getAttribute(\"type\");\r\n\t\t\tconst sid = btag.getAttribute(\"sid\");\r\n\t\t\tconst tid = btag.getAttribute(\"tid\");\r\n\r\n\t\t\tthat.afterUpdateCallback(sid, tid, action, btag, mode);\r\n\t\t}\r\n\t\tthat.finalizeUpdate();\r\n\t}\r\n\r\n\tcleanUpdate(id: any[]) {\r\n\t\tif (id) {\r\n\t\t\tfor (let i = 0; i < id.length; i++) {\r\n\t\t\t\tdelete this._in_progress[id[i]];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfinalizeUpdate() {\r\n\t\tif (this._waitMode) {\r\n\t\t\tthis._waitMode--;\r\n\t\t}\r\n\r\n\t\tthis.callEvent(\"onAfterUpdateFinish\", []);\r\n\t\tif (!this.updatedRows.length) {\r\n\t\t\tthis.callEvent(\"onFullSync\", []);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @desc: initializes data-processor\r\n\t * @param: gantt - dhtmlxGantt object to attach this data-processor to\r\n\t * @type: public\r\n\t */\r\n\tinit(gantt: any) {\r\n\t\tif (this._initialized) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.$gantt = gantt;\r\n\t\tif (this.$gantt._dp_init) {\r\n\t\t\tthis.$gantt._dp_init(this);\r\n\t\t}\r\n\r\n\t\tthis._setDefaultTransactionMode();\r\n\r\n\t\tthis.styles = {\r\n\t\t\tupdated:\"gantt_updated\",\r\n\t\t\torder:\"gantt_updated\",\r\n\t\t\tinserted:\"gantt_inserted\",\r\n\t\t\tdeleted:\"gantt_deleted\",\r\n\t\t\tdelete_confirmation:\"gantt_deleted\",\r\n\t\t\tinvalid:\"gantt_invalid\",\r\n\t\t\terror:\"gantt_error\",\r\n\t\t\tclear:\"\"\r\n\t\t};\r\n\r\n\t\tthis._methods=[\"_row_style\",\"setCellTextStyle\",\"_change_id\",\"_delete_task\"];\r\n\t\textendGantt(this.$gantt, this);\r\n\t\tconst dataProcessorEvents = new DataProcessorEvents(this.$gantt, this);\r\n\t\tdataProcessorEvents.attach();\r\n\t\tthis.attachEvent(\"onDestroy\", function() {\r\n\t\t\tdelete this.setGanttMode;\r\n\t\t\tdelete this._getRowData;\r\n\r\n\t\t\tdelete this.$gantt._dp;\r\n\t\t\tdelete this.$gantt._change_id;\r\n\t\t\tdelete this.$gantt._row_style;\r\n\t\t\tdelete this.$gantt._delete_task;\r\n\t\t\tdelete this.$gantt._sendTaskOrder;\r\n\t\t\tdelete this.$gantt;\r\n\r\n\t\t\tdataProcessorEvents.detach();\r\n\t\t});\r\n\t\tthis.$gantt.callEvent(\"onDataProcessorReady\", [this]);\r\n\t\tthis._initialized = true;\r\n\t}\r\n\r\n\tsetOnAfterUpdate(handler) {\r\n\t\tthis.attachEvent(\"onAfterUpdate\", handler);\r\n\t}\r\n\r\n\tsetOnBeforeUpdateHandler(handler) {\r\n\t\tthis.attachEvent(\"onBeforeDataSending\", handler);\r\n\t}\r\n\r\n\t/* starts autoupdate mode\r\n\t\t@param interval time interval for sending update requests\r\n\t*/\r\n\tsetAutoUpdate(interval, user) {\r\n\t\tinterval = interval || 2000;\r\n\r\n\t\tthis._user = user || (new Date()).valueOf();\r\n\t\tthis._needUpdate = false;\r\n\r\n\t\tthis._updateBusy = false;\r\n\r\n\t\tthis.attachEvent(\"onAfterUpdate\", this.afterAutoUpdate); // arguments sid, action, tid, xml_node;\r\n\r\n\t\tthis.attachEvent(\"onFullSync\", this.fullSync);\r\n\r\n\t\tsetInterval(() => {\r\n\t\t\tthis.loadUpdate();\r\n\t\t}, interval);\r\n\t}\r\n\r\n\t/* process updating request response\r\n\t\tif status == collision version is deprecated\r\n\t\tset flag for autoupdating immediately\r\n\t*/\r\n\tafterAutoUpdate(sid, action, tid, xml_node) { // tslint:disable-line\r\n\t\tif (action === \"collision\") {\r\n\t\t\tthis._needUpdate = true;\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\t/* callback function for onFillSync event\r\n\t\tcall update function if it's need\r\n\t*/\r\n\tfullSync() {\r\n\t\tif (this._needUpdate) {\r\n\t\t\tthis._needUpdate = false;\r\n\t\t\tthis.loadUpdate();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/* sends query to the server and call callback function\r\n\t*/\r\n\tgetUpdates(url, callback) {\r\n\t\tconst ajax = this.$gantt.ajax;\r\n\t\tif (this._updateBusy) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\tthis._updateBusy = true;\r\n\t\t}\r\n\r\n\t\tajax.get(url, callback);\r\n\r\n\t}\r\n\r\n\t/* loads updates and processes them\r\n\t*/\r\n\tloadUpdate() {\r\n\t\tconst ajax = this.$gantt.ajax;\r\n\t\tconst version = this.$gantt.getUserData(0, \"version\", this._ganttMode);\r\n\t\tlet url = this.serverProcessor + ajax.urlSeparator(this.serverProcessor) + [\"dhx_user=\" + this._user, \"dhx_version=\" + version].join(\"&\");\r\n\t\turl = url.replace(\"editing=true&\", \"\");\r\n\t\tthis.getUpdates(url, (xml) => {\r\n\t\t\tconst vers = ajax.xpath(\"//userdata\", xml);\r\n\t\t\tthis.$gantt.setUserData(0, \"version\", this._getXmlNodeValue(vers[0]), this._ganttMode);\r\n\r\n\t\t\tconst updates = ajax.xpath(\"//update\", xml);\r\n\t\t\tif (updates.length) {\r\n\t\t\t\tthis._silent_mode = true;\r\n\r\n\t\t\t\tfor (let i = 0; i < updates.length; i++) {\r\n\t\t\t\t\tconst status = updates[i].getAttribute(\"status\");\r\n\t\t\t\t\tconst id = updates[i].getAttribute(\"id\");\r\n\t\t\t\t\tconst parent = updates[i].getAttribute(\"parent\");\r\n\t\t\t\t\tswitch (status) {\r\n\t\t\t\t\t\tcase \"inserted\":\r\n\t\t\t\t\t\t\tthis.callEvent(\"insertCallback\", [updates[i], id, parent]);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"updated\":\r\n\t\t\t\t\t\t\tthis.callEvent(\"updateCallback\", [updates[i], id, parent]);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"deleted\":\r\n\t\t\t\t\t\t\tthis.callEvent(\"deleteCallback\", [updates[i], id, parent]);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._silent_mode = false;\r\n\t\t\t}\r\n\r\n\t\t\tthis._updateBusy = false;\r\n\t\t});\r\n\t}\r\n\r\n\tdestructor() {\r\n\t\tthis.callEvent(\"onDestroy\", []);\r\n\t\tthis.detachAllEvents();\r\n\r\n\t\tthis.updatedRows = [];\r\n\t\tthis._in_progress = {}; // ?\r\n\t\tthis._invalid = {};\r\n\t\tthis._storage.clear();\r\n\t\tthis._storage = null;\r\n\t\tthis._headers = null;\r\n\t\tthis._payload = null;\r\n\t\tdelete this._initialized;\r\n\t}\r\n\r\n\tsetGanttMode(mode) {\r\n\t\tif (mode === \"tasks\") {\r\n\t\t\tmode = \"task\";\r\n\t\t} else if (mode === \"links\") {\r\n\t\t\tmode = \"link\";\r\n\t\t}\r\n\r\n\t\tconst modes = this.modes || {};\r\n\t\tconst ganttMode = this.getGanttMode();\r\n\t\tif (ganttMode) {\r\n\t\t\tmodes[ganttMode] = {\r\n\t\t\t\t_in_progress : this._in_progress,\r\n\t\t\t\t_invalid: this._invalid,\r\n\t\t\t\t_storage: this._storage,\r\n\t\t\t\tupdatedRows : this.updatedRows\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tlet newState = modes[mode];\r\n\t\tif (!newState) {\r\n\t\t\tnewState = modes[mode] = {\r\n\t\t\t\t_in_progress : {},\r\n\t\t\t\t_invalid : {},\r\n\t\t\t\t_storage : SimpleStorage.create(),\r\n\t\t\t\tupdatedRows : []\r\n\t\t\t};\r\n\t\t}\r\n\t\tthis._in_progress = newState._in_progress;\r\n\t\tthis._invalid = newState._invalid;\r\n\t\tthis._storage = newState._storage;\r\n\t\tthis.updatedRows = newState.updatedRows;\r\n\t\tthis.modes = modes;\r\n\t\tthis._ganttMode = mode;\r\n\t}\r\n\tgetGanttMode():string {\r\n\t\treturn this._ganttMode;\r\n\t}\r\n\r\n\tstoreItem(item) {\r\n\t\tthis._storage.storeItem(item);\r\n\t}\r\n\r\n\turl(url: string) {\r\n\t\tthis.serverProcessor = this._serverProcessor = url;\r\n\t}\r\n\r\n\tprotected _beforeSendData(data: any, rowId: any) {\r\n\t\tif (!this.callEvent(\"onBeforeUpdate\", [rowId, this.getState(rowId), data])) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tthis._sendData(data, rowId);\r\n\t}\r\n\r\n\tprotected _serializeAsJSON(data: any) {\r\n\t\tif (typeof data === \"string\") {\r\n\t\t\treturn data;\r\n\t\t}\r\n\r\n\t\tconst copy = utils.copy(data);\r\n\t\tif (this._tMode === \"REST-JSON\") {\r\n\t\t\tdelete copy.id;\r\n\t\t\tdelete copy[this.action_param];\r\n\t\t}\r\n\r\n\t\treturn JSON.stringify(copy);\r\n\t}\r\n\r\n\tprotected _applyPayload(url: string) {\r\n\t\tconst ajax = this.$gantt.ajax;\r\n\t\tif (this._payload) {\r\n\t\t\tfor (const key in this._payload) {\r\n\t\t\t\turl = url + ajax.urlSeparator(url) + this.escape(key) + \"=\" + this.escape(this._payload[key]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn url;\r\n\t}\r\n\r\n\t// GET/POST/JSON modes of the dataProcessor didn't send the whole data items in 'delete' requests\r\n\t// clear extra info from the data in order not to change the request format\r\n\tprotected _cleanupArgumentsBeforeSend(dataToSend: any) {\r\n\t\tlet processedData;\r\n\t\tif(dataToSend[this.action_param] === undefined){// hash of updated items, and not an individual item\r\n\t\t\tprocessedData = {};\r\n\t\t\tfor(const i in dataToSend) {\r\n\t\t\t\tprocessedData[i] = this._cleanupArgumentsBeforeSend(dataToSend[i]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tprocessedData = this._cleanupItemBeforeSend(dataToSend);\r\n\t\t}\r\n\t\treturn processedData;\r\n\t}\r\n\tprotected _cleanupItemBeforeSend(updatedItem: any) {\r\n\t\tlet output = null;\r\n\t\tif(updatedItem){\r\n\t\t\tif(updatedItem[this.action_param] === \"deleted\"){\r\n\t\t\t\toutput = {};\r\n\t\t\t\toutput.id = updatedItem.id;\r\n\t\t\t\toutput[this.action_param] = updatedItem[this.action_param];\r\n\t\t\t}else{\r\n\t\t\t\toutput = updatedItem;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn output;\r\n\t}\r\n\r\n\tprotected _sendData(dataToSend: any, rowId?: any) {\r\n\t\tif (!dataToSend) {\r\n\t\t\treturn; // nothing to send\r\n\t\t}\r\n\t\tif (!this.callEvent(\"onBeforeDataSending\", rowId ? [rowId, this.getState(rowId), dataToSend] : [null, null, dataToSend])) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (rowId) {\r\n\t\t\tthis._in_progress[rowId] = (new Date()).valueOf();\r\n\t\t}\r\n\r\n\t\tconst ajax = this.$gantt.ajax;\r\n\r\n\t\tif (this._tMode === \"CUSTOM\") {\r\n\t\t\tconst taskState = this.getState(rowId);\r\n\t\t\tconst taskAction = this.getActionByState(taskState);\r\n\t\t\tconst ganttMode = this.getGanttMode();\r\n\t\t\tconst _onResolvedCreateUpdate = (tag) => {\r\n\t\t\t\tlet action = taskState || \"updated\";\r\n\t\t\t\tlet sid = rowId;\r\n\t\t\t\tlet tid = rowId;\r\n\r\n\t\t\t\tif (tag) {\r\n\t\t\t\t\taction = tag.action || taskState;\r\n\t\t\t\t\tsid = tag.sid || sid;\r\n\t\t\t\t\ttid = tag.id || tag.tid || tid;\r\n\t\t\t\t}\r\n\t\t\t\tthis.afterUpdateCallback(sid, tid, action, tag, ganttMode);\r\n\t\t\t};\r\n\r\n\t\t\tlet actionPromise;\r\n\t\t\tif (this._router instanceof Function) {\r\n\t\t\t\tif(this._routerParametersFormat === \"object\"){\r\n\t\t\t\t\tconst obj = {\r\n\t\t\t\t\t\tentity: ganttMode,\r\n\t\t\t\t\t\taction: taskAction,\r\n\t\t\t\t\t\tdata: dataToSend,\r\n\t\t\t\t\t\tid: rowId\r\n\t\t\t\t\t};\r\n\t\t\t\t\tactionPromise = this._router(obj);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tactionPromise = this._router(ganttMode, taskAction, dataToSend, rowId);\r\n\t\t\t\t}\r\n\t\t\t} else if (this._router[ganttMode] instanceof Function) {\r\n\t\t\t\tactionPromise = this._router[ganttMode](taskAction, dataToSend, rowId);\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconst errorMsgStart = \"Incorrect configuration of gantt.createDataProcessor\";\r\n\t\t\t\tconst errorMsgEnd = `\r\nYou need to either add missing properties to the dataProcessor router object or to use a router function.\r\nSee https://docs.dhtmlx.com/gantt/desktop__server_side.html#customrouting and https://docs.dhtmlx.com/gantt/api__gantt_createdataprocessor.html for details.`;\r\n\r\n\t\t\t\tif(!this._router[ganttMode]){\r\n\t\t\t\t\tthrow new Error(`${errorMsgStart}: router for the **${ganttMode}** entity is not defined. ${errorMsgEnd}`);\r\n\t\t\t\t}\r\n\t\t\t\tswitch (taskState) {\r\n\t\t\t\t\tcase \"inserted\":\r\n\t\t\t\t\t\tif(!this._router[ganttMode].create){\r\n\t\t\t\t\t\t\tthrow new Error(`${errorMsgStart}: **create** action for the **${ganttMode}** entity is not defined. ${errorMsgEnd}`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tactionPromise = this._router[ganttMode].create(dataToSend);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"deleted\":\r\n\t\t\t\t\t\tif(!this._router[ganttMode].delete){\r\n\t\t\t\t\t\t\tthrow new Error(`${errorMsgStart}: **delete** action for the **${ganttMode}** entity is not defined. ${errorMsgEnd}`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tactionPromise = this._router[ganttMode].delete(rowId);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tif(!this._router[ganttMode].update){\r\n\t\t\t\t\t\t\tthrow new Error(`${errorMsgStart}: **update**\" action for the **${ganttMode}** entity is not defined. ${errorMsgEnd}`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tactionPromise = this._router[ganttMode].update(dataToSend, rowId);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(actionPromise){\r\n\t\t\t\t// neither promise nor {tid: newId} response object\r\n\t\t\t\tif(!actionPromise.then &&\r\n\t\t\t\t\t(actionPromise.id === undefined && actionPromise.tid === undefined && actionPromise.action === undefined)){\r\n\t\t\t\t\tthrow new Error(\"Incorrect router return value. A Promise or a response object is expected\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(actionPromise.then){\r\n\t\t\t\t\tactionPromise.then(_onResolvedCreateUpdate).catch((error) => {\r\n\t\t\t\t\t\tif(error && error.action){\r\n\t\t\t\t\t\t\t_onResolvedCreateUpdate(error);\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t_onResolvedCreateUpdate({ action: \"error\", value: error});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}else{\r\n\t\t\t\t\t// custom method may return a response object in case of sync action\r\n\t\t\t\t\t_onResolvedCreateUpdate(actionPromise);\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\t_onResolvedCreateUpdate(null);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet queryParams: any;\r\n\t\tqueryParams = {\r\n\t\t\tcallback: (xml) => {\r\n\t\t\t\tconst ids = [];\r\n\r\n\t\t\t\tif (rowId) {\r\n\t\t\t\t\tids.push(rowId);\r\n\t\t\t\t} else if (dataToSend) {\r\n\t\t\t\t\tfor (const key in dataToSend) {\r\n\t\t\t\t\t\tids.push(key);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn this.afterUpdate(this, xml, ids);\r\n\t\t\t},\r\n\t\t\theaders: this._headers\r\n\t\t};\r\n\r\n\t\tconst dhxVersion = \"dhx_version=\" + this.$gantt.getUserData(0, \"version\", this._ganttMode);\r\n\t\tconst urlParams = this.serverProcessor + (this._user ? (ajax.urlSeparator(this.serverProcessor) + [\"dhx_user=\" + this._user, dhxVersion].join(\"&\")) : \"\");\r\n\t\tlet url: any = this._applyPayload(urlParams);\r\n\t\tlet data;\r\n\r\n\t\tswitch (this._tMode) {\r\n\t\t\tcase \"GET\":\r\n\t\t\t\tdata = this._cleanupArgumentsBeforeSend(dataToSend);\r\n\t\t\t\tqueryParams.url = url + ajax.urlSeparator(url) + this.serialize(data, rowId);\r\n\t\t\t\tqueryParams.method = \"GET\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"POST\":\r\n\t\t\t\tdata = this._cleanupArgumentsBeforeSend(dataToSend);\r\n\t\t\t\tqueryParams.url = url;\r\n\t\t\t\tqueryParams.method = \"POST\";\r\n\t\t\t\tqueryParams.data = this.serialize(data, rowId);\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"JSON\":\r\n\t\t\t\tdata = {};\r\n\t\t\t\tconst preprocessedData = this._cleanupItemBeforeSend(dataToSend);\r\n\t\t\t\tfor (const key in preprocessedData) {\r\n\t\t\t\t\tif (key === this.action_param || key === \"id\" || key === \"gr_id\") {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdata[key] = preprocessedData[key];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tqueryParams.url = url;\r\n\t\t\t\tqueryParams.method = \"POST\";\r\n\t\t\t\tqueryParams.data = JSON.stringify({\r\n\t\t\t\t\tid: rowId,\r\n\t\t\t\t\taction: dataToSend[this.action_param],\r\n\t\t\t\t\tdata\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"REST\":\r\n\t\t\tcase \"REST-JSON\":\r\n\t\t\t\turl = urlParams.replace(/(&|\\?)editing=true/, \"\");\r\n\t\t\t\tdata = \"\";\r\n\r\n\t\t\t\tswitch (this.getState(rowId)) {\r\n\t\t\t\t\tcase \"inserted\":\r\n\t\t\t\t\t\tqueryParams.method = \"POST\";\r\n\t\t\t\t\t\tqueryParams.data = this.serialize(dataToSend, rowId);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"deleted\":\r\n\t\t\t\t\t\tqueryParams.method = \"DELETE\";\r\n\t\t\t\t\t\turl = url + (url.slice(-1) === \"/\" ? \"\" : \"/\") + rowId;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tqueryParams.method = \"PUT\";\r\n\t\t\t\t\t\tqueryParams.data = this.serialize(dataToSend, rowId);\r\n\t\t\t\t\t\turl = url + (url.slice(-1) === \"/\" ? \"\" : \"/\") + rowId;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tqueryParams.url = this._applyPayload(url);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tthis._waitMode++;\r\n\t\treturn ajax.query(queryParams);\r\n\t}\r\n\r\n\tprotected _forEachUpdatedRow(code: any) {\r\n\t\tconst updatedRows = this.updatedRows.slice();\r\n\t\tfor (let i = 0; i < updatedRows.length; i++) {\r\n\t\t\tconst rowId = updatedRows[i];\r\n\t\t\tif (this.$gantt.getUserData(rowId, this.action_param, this._ganttMode)) {\r\n\t\t\t\tcode.call(this, rowId);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprotected _setDefaultTransactionMode() {\r\n\t\tif (this.serverProcessor) {\r\n\t\t\tthis.setTransactionMode(\"POST\", true);\r\n\t\t\tthis.serverProcessor += (this.serverProcessor.indexOf(\"?\") !== -1 ? \"&\" : \"?\") + \"editing=true\";\r\n\t\t\tthis._serverProcessor = this.serverProcessor;\r\n\t\t}\r\n\t}\r\n\r\n\t/* returns xml node value\r\n\t\t@param node\r\n\t\t\txml node\r\n\t*/\r\n\tprotected _getXmlNodeValue(node) {\r\n\t\tif (node.firstChild) {\r\n\t\t\treturn node.firstChild.nodeValue;\r\n\t\t}\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tprotected _getAllData() {\r\n\t\tconst out = {};\r\n\t\tlet hasOne = false;\r\n\r\n\t\tthis._forEachUpdatedRow(function(id) {\r\n\t\t\tif (this._in_progress[id] || this.is_invalid(id)){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst row = this._getRowData(id);\r\n\t\t\tif (!this.callEvent(\"onBeforeUpdate\", [id, this.getState(id), row])) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tout[id] = row;\r\n\t\t\thasOne = true;\r\n\t\t\tthis._in_progress[id] = (new Date()).valueOf();\r\n\t\t});\r\n\r\n\t\treturn hasOne ? out : null;\r\n\t}\r\n\r\n\tprotected _prepareDate(value: Date) : string {\r\n\t\treturn this.$gantt.defined(this.$gantt.templates.xml_format) ? this.$gantt.templates.xml_format(value) : this.$gantt.templates.format_date(value);\r\n\t}\r\n\r\n\tprotected _prepareArray(value: any[], traversedObjects: object[]) : any[] {\r\n\t\ttraversedObjects.push(value);\r\n\r\n\t\treturn value.map((item) => {\r\n\t\t\tif(helpers.isDate(item)){\r\n\t\t\t\treturn this._prepareDate(item);\r\n\t\t\t} else if (Array.isArray(item) && !helpers.arrayIncludes(traversedObjects, item)){\r\n\t\t\t\treturn this._prepareArray(item, traversedObjects);\r\n\t\t\t} else if (item && typeof item === \"object\" && !helpers.arrayIncludes(traversedObjects, item)) {\r\n\t\t\t\treturn this._prepareObject(item, traversedObjects);\r\n\t\t\t} else {\r\n\t\t\t\treturn item;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprotected _prepareObject(rawItem: any, traversedObjects: object[]) : any {\r\n\t\tconst processedItem = {};\r\n\t\ttraversedObjects.push(rawItem);\r\n\r\n\t\tfor (const key in rawItem) {\r\n\t\t\tif (key.substr(0, 1) === \"$\") {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst value = rawItem[key];\r\n\t\t\tif (helpers.isDate(value)) {\r\n\t\t\t\tprocessedItem[key] = this._prepareDate(value);\r\n\t\t\t} else if(value === null) {\r\n\t\t\t\tprocessedItem[key] = \"\";\r\n\t\t\t} else if (Array.isArray(value) && !helpers.arrayIncludes(traversedObjects, value)){\r\n\t\t\t\tprocessedItem[key] = this._prepareArray(value, traversedObjects);\r\n\t\t\t} else if (value && typeof value === \"object\" && !helpers.arrayIncludes(traversedObjects, value)) {\r\n\t\t\t\tprocessedItem[key] = this._prepareObject(value, traversedObjects);\r\n\t\t\t} else {\r\n\t\t\t\tprocessedItem[key] = value;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn processedItem;\r\n\t}\r\n\r\n\tprotected _prepareDataItem(rawItem: any): any {\r\n\t\tconst processedItem = this._prepareObject(rawItem, []);\r\n\r\n\t\tprocessedItem[this.action_param] = this.$gantt.getUserData(rawItem.id, this.action_param, this._ganttMode);\r\n\t\treturn processedItem;\r\n\t}\r\n\r\n\tprotected getStoredItem(id){\r\n\t\treturn this._storage.getStoredItem(id);\r\n\t}\r\n\r\n\tprotected _getRowData(id) {\r\n\t\tlet dataItem;\r\n\t\tconst gantt = this.$gantt;\r\n\t\tif (this.getGanttMode() === \"task\") {\r\n\t\t\tif(gantt.isTaskExists(id)){\r\n\t\t\t\tdataItem =this.$gantt.getTask(id);\r\n\t\t\t}\r\n\t\t} else if (this.getGanttMode() === \"assignment\") {\r\n\t\t\tif(this.$gantt.$data.assignmentsStore.exists(id)){\r\n\t\t\t\tdataItem =this.$gantt.$data.assignmentsStore.getItem(id);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif(gantt.isLinkExists(id)){\r\n\t\t\t\tdataItem =this.$gantt.getLink(id);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!dataItem) {\r\n\t\t\tdataItem = this.getStoredItem(id);\r\n\t\t}\r\n\r\n\t\tif (!dataItem) {\r\n\t\t\tdataItem = { id };\r\n\t\t}\r\n\r\n\t\treturn this._prepareDataItem(dataItem);\r\n\t}\r\n}","var DataProcessor = require(\"./data_processor\");\n\nmodule.exports = {\n DEPRECATED_api: function DEPRECATED_api(server) {\n return new DataProcessor.DataProcessor(server);\n },\n createDataProcessor: DataProcessor.createDataProcessor,\n getDataProcessorModes: DataProcessor.getAvailableModes\n};","var isHeadless = require(\"../../utils/is_headless\");\n\nvar storeRenderCreator = function storeRenderCreator(name, gantt) {\n var store = gantt.getDatastore(name);\n var itemRepainter = {\n renderItem: function renderItem(id, renderer) {\n var renders = renderer.getLayers();\n var item = store.getItem(id);\n\n if (item && store.isVisible(id)) {\n for (var i = 0; i < renders.length; i++) {\n renders[i].render_item(item);\n }\n }\n },\n renderItems: function renderItems(renderer) {\n var renderers = renderer.getLayers();\n\n for (var i = 0; i < renderers.length; i++) {\n renderers[i].clear();\n }\n\n var allData = null;\n var loadedRanges = {};\n\n for (var _i = 0; _i < renderers.length; _i++) {\n var layer = renderers[_i];\n var layerData = void 0;\n\n if (layer.get_visible_range) {\n var range = layer.get_visible_range(store);\n\n if (range.start !== undefined && range.end !== undefined) {\n var key = range.start + \" - \" + range.end;\n\n if (loadedRanges[key]) {\n layerData = loadedRanges[key];\n } else {\n layerData = store.getIndexRange(range.start, range.end);\n loadedRanges[key] = layerData;\n }\n } else if (range.ids !== undefined) {\n layerData = range.ids.map(function (id) {\n return store.getItem(id);\n });\n } else {\n throw new Error(\"Invalid range returned from 'getVisibleRange' of the layer\");\n }\n } else {\n if (!allData) {\n allData = store.getVisibleItems();\n }\n\n layerData = allData;\n }\n\n if (layer.prepare_data) {\n // GS-1605. Highlight timeline cells below tasks and in an empty chart\n layer.prepare_data(layerData);\n }\n\n renderers[_i].render_items(layerData);\n }\n },\n updateItems: function updateItems(layer) {\n if (layer.update_items) {\n var data;\n\n if (layer.get_visible_range) {\n var range = layer.get_visible_range(store);\n\n if (range.start !== undefined && range.end !== undefined) {\n data = store.getIndexRange(range.start, range.end);\n } else if (range.ids !== undefined) {\n data = range.ids.map(function (id) {\n return store.getItem(id);\n });\n } else {\n throw new Error(\"Invalid range returned from 'getVisibleRange' of the layer\");\n }\n } else {\n data = store.getVisibleItems();\n }\n\n if (layer.prepare_data) {\n // GS-1605. Highlight timeline cells below tasks and in an empty chart\n layer.prepare_data(data, layer);\n }\n\n layer.update_items(data);\n }\n }\n };\n store.attachEvent(\"onStoreUpdated\", function (id, item, action) {\n if (isHeadless(gantt)) {\n return true;\n }\n\n var renderer = gantt.$services.getService(\"layers\").getDataRender(name);\n\n if (renderer) {\n renderer.onUpdateRequest = function (layer) {\n itemRepainter.updateItems(layer);\n };\n }\n });\n\n function skipRepaint(gantt) {\n var state = gantt.$services.getService(\"state\");\n\n if (state.getState(\"batchUpdate\").batch_update) {\n return true;\n } else {\n return false;\n }\n }\n\n store.attachEvent(\"onStoreUpdated\", function (id, item, action) {\n if (skipRepaint(gantt)) {\n return;\n }\n\n if (!id || action == \"move\" || action == \"delete\") {\n store.callEvent(\"onBeforeRefreshAll\", []);\n store.callEvent(\"onAfterRefreshAll\", []);\n } else {\n store.callEvent(\"onBeforeRefreshItem\", [item.id]);\n store.callEvent(\"onAfterRefreshItem\", [item.id]);\n }\n });\n store.attachEvent(\"onAfterRefreshAll\", function () {\n if (isHeadless(gantt)) {\n return true;\n }\n\n var renderer = gantt.$services.getService(\"layers\").getDataRender(name);\n\n if (renderer && !skipRepaint(gantt)) {\n itemRepainter.renderItems(renderer);\n }\n });\n store.attachEvent(\"onAfterRefreshItem\", function (id) {\n if (isHeadless(gantt)) {\n return true;\n }\n\n var renderer = gantt.$services.getService(\"layers\").getDataRender(name);\n\n if (renderer) {\n itemRepainter.renderItem(id, renderer);\n }\n }); // TODO: probably can be done more in a more efficient way\n\n store.attachEvent(\"onItemOpen\", function () {\n if (isHeadless(gantt)) {\n return true;\n }\n\n gantt.render();\n });\n store.attachEvent(\"onItemClose\", function () {\n if (isHeadless(gantt)) {\n return true;\n }\n\n gantt.render();\n });\n\n function refreshId(renders, oldId, newId, item) {\n for (var i = 0; i < renders.length; i++) {\n renders[i].change_id(oldId, newId);\n }\n }\n\n store.attachEvent(\"onIdChange\", function (oldId, newId) {\n if (isHeadless(gantt)) {\n return true;\n } // in case of linked datastores (tasks <-> links), id change should recalculate something in linked datastore before any repaint\n // use onBeforeIdChange for this hook.\n // TODO: use something more reasonable instead\n\n\n store.callEvent(\"onBeforeIdChange\", [oldId, newId]);\n\n if (skipRepaint(gantt)) {\n return;\n }\n\n if (!store.isSilent()) {\n var renderer = gantt.$services.getService(\"layers\").getDataRender(name);\n\n if (renderer) {\n // missing check for renderer GS-1814\n refreshId(renderer.getLayers(), oldId, newId, store.getItem(newId));\n itemRepainter.renderItem(newId, renderer);\n } else {\n // GS-1814 repaint ui to apply new id when the datastore don't have own renderer\n gantt.render();\n }\n }\n });\n};\n\nmodule.exports = {\n bindDataStore: storeRenderCreator\n};","function createDataStoreSelectMixin(store) {\n var selectedId = null;\n var deleteItem = store._removeItemInner;\n\n function _unselect(id) {\n selectedId = null;\n this.callEvent(\"onAfterUnselect\", [id]);\n }\n\n store._removeItemInner = function (id) {\n if (selectedId == id) {\n _unselect.call(this, id);\n }\n\n if (selectedId && this.eachItem) {\n this.eachItem(function (subItem) {\n if (subItem.id == selectedId) {\n _unselect.call(this, subItem.id);\n }\n }, id);\n }\n\n return deleteItem.apply(this, arguments);\n };\n\n store.attachEvent(\"onIdChange\", function (oldId, newId) {\n if (store.getSelectedId() == oldId) {\n store.silent(function () {\n store.unselect(oldId);\n store.select(newId);\n });\n }\n });\n return {\n select: function select(id) {\n if (id) {\n if (selectedId == id) return selectedId;\n\n if (!this._skip_refresh) {\n if (!this.callEvent(\"onBeforeSelect\", [id])) {\n return false;\n }\n }\n\n this.unselect();\n selectedId = id;\n\n if (!this._skip_refresh) {\n this.refresh(id);\n this.callEvent(\"onAfterSelect\", [id]);\n }\n }\n\n return selectedId;\n },\n getSelectedId: function getSelectedId() {\n return selectedId;\n },\n isSelected: function isSelected(id) {\n return id == selectedId;\n },\n unselect: function unselect(id) {\n var id = id || selectedId;\n if (!id) return;\n selectedId = null;\n\n if (!this._skip_refresh) {\n this.refresh(id);\n\n _unselect.call(this, id);\n }\n }\n };\n}\n\nmodule.exports = createDataStoreSelectMixin;","var utils = require(\"../../utils/utils\");\n\nvar createLinksStoreFacade = function createLinksStoreFacade() {\n return {\n getLinkCount: function getLinkCount() {\n return this.$data.linksStore.count();\n },\n getLink: function getLink(id) {\n return this.$data.linksStore.getItem(id);\n },\n getLinks: function getLinks() {\n return this.$data.linksStore.getItems();\n },\n isLinkExists: function isLinkExists(id) {\n return this.$data.linksStore.exists(id);\n },\n addLink: function addLink(link) {\n var newLink = this.$data.linksStore.addItem(link); // GS-1222. Update fullOrder otherwise the link won't appear after render\n\n if (this.$data.linksStore.isSilent()) {\n this.$data.linksStore.fullOrder.push(newLink);\n }\n\n return newLink;\n },\n updateLink: function updateLink(id, data) {\n if (!utils.defined(data)) data = this.getLink(id);\n this.$data.linksStore.updateItem(id, data);\n },\n deleteLink: function deleteLink(id) {\n return this.$data.linksStore.removeItem(id);\n },\n changeLinkId: function changeLinkId(oldid, newid) {\n return this.$data.linksStore.changeId(oldid, newid);\n }\n };\n};\n\nmodule.exports = createLinksStoreFacade;","var utils = require(\"../../utils/utils\");\n\nvar _require = require(\"../../utils/helpers\"),\n replaceValidZeroId = _require.replaceValidZeroId;\n\nvar createTasksDatastoreFacade = function createTasksDatastoreFacade() {\n return {\n getTask: function getTask(id) {\n id = replaceValidZeroId(id, this.config.root_id);\n this.assert(id, \"Invalid argument for gantt.getTask\");\n var task = this.$data.tasksStore.getItem(id);\n this.assert(task, \"Task not found id=\" + id);\n return task;\n },\n getTaskByTime: function getTaskByTime(from, to) {\n var p = this.$data.tasksStore.getItems();\n var res = [];\n\n if (!(from || to)) {\n res = p;\n } else {\n from = +from || -Infinity;\n to = +to || Infinity;\n\n for (var t = 0; t < p.length; t++) {\n var task = p[t];\n if (+task.start_date < to && +task.end_date > from) res.push(task);\n }\n }\n\n return res;\n },\n isTaskExists: function isTaskExists(id) {\n if (!this.$data || !this.$data.tasksStore) {\n return false;\n }\n\n return this.$data.tasksStore.exists(id);\n },\n updateTask: function updateTask(id, item) {\n if (!utils.defined(item)) item = this.getTask(id);\n this.$data.tasksStore.updateItem(id, item);\n if (this.isTaskExists(id)) this.refreshTask(id);\n },\n addTask: function addTask(item, parent, index) {\n if (!utils.defined(item.id)) item.id = utils.uid(); //GS-761: assert unique ID\n\n if (this.isTaskExists(item.id)) {\n var task = this.getTask(item.id);\n\n if (task.$index != item.$index) {\n // Someone may try to mistakenly add a task with the same ID, and most likely\n // use the string format for the dates. Gantt shouldn't break in this scenario\n if (item.start_date && typeof item.start_date === \"string\") {\n item.start_date = this.date.parseDate(item.start_date, \"parse_date\");\n }\n\n if (item.end_date && typeof item.end_date === \"string\") {\n item.end_date = this.date.parseDate(item.end_date, \"parse_date\");\n }\n\n return this.$data.tasksStore.updateItem(item.id, item);\n }\n }\n\n if (!utils.defined(parent)) parent = this.getParent(item) || 0;\n if (!this.isTaskExists(parent)) parent = this.config.root_id;\n this.setParent(item, parent);\n return this.$data.tasksStore.addItem(item, index, parent);\n },\n deleteTask: function deleteTask(id) {\n id = replaceValidZeroId(id, this.config.root_id);\n return this.$data.tasksStore.removeItem(id);\n },\n getTaskCount: function getTaskCount() {\n return this.$data.tasksStore.count();\n },\n getVisibleTaskCount: function getVisibleTaskCount() {\n return this.$data.tasksStore.countVisible();\n },\n getTaskIndex: function getTaskIndex(id) {\n return this.$data.tasksStore.getBranchIndex(id);\n },\n getGlobalTaskIndex: function getGlobalTaskIndex(id) {\n id = replaceValidZeroId(id, this.config.root_id);\n this.assert(id, \"Invalid argument\");\n return this.$data.tasksStore.getIndexById(id);\n },\n eachTask: function eachTask(code, parent, master) {\n return this.$data.tasksStore.eachItem(utils.bind(code, master || this), parent);\n },\n eachParent: function eachParent(callback, startTask, master) {\n return this.$data.tasksStore.eachParent(utils.bind(callback, master || this), startTask);\n },\n changeTaskId: function changeTaskId(oldid, newid) {\n this.$data.tasksStore.changeId(oldid, newid);\n var task = this.$data.tasksStore.getItem(newid);\n var links = [];\n\n if (task.$source) {\n links = links.concat(task.$source);\n }\n\n if (task.$target) {\n links = links.concat(task.$target);\n }\n\n for (var i = 0; i < links.length; i++) {\n var link = this.getLink(links[i]);\n\n if (link.source == oldid) {\n link.source = newid;\n }\n\n if (link.target == oldid) {\n link.target = newid;\n }\n }\n },\n calculateTaskLevel: function calculateTaskLevel(item) {\n return this.$data.tasksStore.calculateItemLevel(item);\n },\n getNext: function getNext(id) {\n return this.$data.tasksStore.getNext(id);\n },\n getPrev: function getPrev(id) {\n return this.$data.tasksStore.getPrev(id);\n },\n getParent: function getParent(id) {\n return this.$data.tasksStore.getParent(id);\n },\n setParent: function setParent(task, new_pid, silent) {\n return this.$data.tasksStore.setParent(task, new_pid, silent);\n },\n getSiblings: function getSiblings(id) {\n return this.$data.tasksStore.getSiblings(id).slice();\n },\n getNextSibling: function getNextSibling(id) {\n return this.$data.tasksStore.getNextSibling(id);\n },\n getPrevSibling: function getPrevSibling(id) {\n return this.$data.tasksStore.getPrevSibling(id);\n },\n getTaskByIndex: function getTaskByIndex(index) {\n var id = this.$data.tasksStore.getIdByIndex(index);\n\n if (this.isTaskExists(id)) {\n return this.getTask(id);\n } else {\n return null;\n }\n },\n getChildren: function getChildren(id) {\n if (!this.hasChild(id)) {\n return [];\n } else {\n return this.$data.tasksStore.getChildren(id).slice();\n }\n },\n hasChild: function hasChild(id) {\n return this.$data.tasksStore.hasChild(id);\n },\n open: function open(id) {\n this.$data.tasksStore.open(id);\n },\n close: function close(id) {\n this.$data.tasksStore.close(id);\n },\n moveTask: function moveTask(sid, tindex, parent) {\n parent = replaceValidZeroId(parent, this.config.root_id);\n return this.$data.tasksStore.move.apply(this.$data.tasksStore, arguments);\n },\n sort: function sort(field, desc, parent, silent) {\n var render = !silent; //4th argument to cancel redraw after sorting\n\n this.$data.tasksStore.sort(field, desc, parent);\n this.callEvent(\"onAfterSort\", [field, desc, parent]);\n\n if (render) {\n this.render();\n }\n }\n };\n};\n\nmodule.exports = createTasksDatastoreFacade;","var utils = require(\"../../utils/utils\");\n\nvar createTasksFacade = require(\"./datastore_tasks\"),\n createLinksFacade = require(\"./datastore_links\"),\n DataStore = require(\"../datastore/datastore\"),\n TreeDataStore = require(\"../datastore/treedatastore\"),\n createDatastoreSelect = require(\"../datastore/select\");\n\nvar datastoreRender = require(\"../datastore/datastore_render\");\n\nvar isHeadless = require(\"../../utils/is_headless\");\n\nvar _require = require(\"../../utils/helpers\"),\n replaceValidZeroId = _require.replaceValidZeroId; // TODO: remove workaround for mixup with es5 and ts imports\n\n\nif (DataStore[\"default\"]) {\n DataStore = DataStore[\"default\"];\n}\n\nfunction getDatastores() {\n var storeNames = this.$services.getService(\"datastores\");\n var res = [];\n\n for (var i = 0; i < storeNames.length; i++) {\n var store = this.getDatastore(storeNames[i]);\n\n if (!store.$destroyed) {\n res.push(store);\n }\n }\n\n return res;\n}\n\nvar createDatastoreFacade = function createDatastoreFacade() {\n return {\n createDatastore: function createDatastore(config) {\n var $StoreType = (config.type || \"\").toLowerCase() == \"treedatastore\" ? TreeDataStore : DataStore;\n\n if (config) {\n var self = this;\n\n config.openInitially = function () {\n return self.config.open_tree_initially;\n };\n\n config.copyOnParse = function () {\n return self.config.deepcopy_on_parse;\n };\n }\n\n var store = new $StoreType(config);\n this.mixin(store, createDatastoreSelect(store));\n\n if (config.name) {\n var servicePrefix = \"datastore:\";\n var storeAccessName = servicePrefix + config.name;\n store.attachEvent(\"onDestroy\", function () {\n this.$services.dropService(storeAccessName);\n var storeList = this.$services.getService(\"datastores\");\n\n for (var i = 0; i < storeList.length; i++) {\n if (storeList[i] === config.name) {\n storeList.splice(i, 1);\n break;\n }\n }\n }.bind(this));\n this.$services.dropService(storeAccessName);\n this.$services.setService(storeAccessName, function () {\n return store;\n });\n var storeList = this.$services.getService(\"datastores\");\n\n if (!storeList) {\n storeList = [];\n this.$services.setService(\"datastores\", function () {\n return storeList;\n });\n storeList.push(config.name);\n } else if (storeList.indexOf(config.name) < 0) {\n storeList.push(config.name);\n }\n\n datastoreRender.bindDataStore(config.name, this);\n }\n\n return store;\n },\n getDatastore: function getDatastore(name) {\n return this.$services.getService(\"datastore:\" + name);\n },\n _getDatastores: getDatastores,\n refreshData: function refreshData() {\n var scrollState;\n\n if (!isHeadless(this)) {\n scrollState = this.getScrollState();\n }\n\n this.callEvent(\"onBeforeDataRender\", []);\n var stores = getDatastores.call(this);\n\n for (var i = 0; i < stores.length; i++) {\n stores[i].refresh();\n }\n\n if (this.config.preserve_scroll && !isHeadless(this) && (scrollState.x || scrollState.y)) {\n this.scrollTo(scrollState.x, scrollState.y);\n }\n\n this.callEvent(\"onDataRender\", []);\n },\n isChildOf: function isChildOf(childId, parentId) {\n return this.$data.tasksStore.isChildOf(childId, parentId);\n },\n refreshTask: function refreshTask(taskId, refresh_links) {\n var task = this.getTask(taskId);\n var self = this;\n\n function refreshLinks() {\n if (refresh_links !== undefined && !refresh_links) return;\n\n for (var i = 0; i < task.$source.length; i++) {\n self.refreshLink(task.$source[i]);\n }\n\n for (var i = 0; i < task.$target.length; i++) {\n self.refreshLink(task.$target[i]);\n }\n }\n\n if (task && this.isTaskVisible(taskId)) {\n this.$data.tasksStore.refresh(taskId, !!this.getState(\"tasksDnd\").drag_id || refresh_links === false); // do quick refresh during drag and drop\n\n refreshLinks();\n } else if (this.isTaskExists(taskId) && this.isTaskExists(this.getParent(taskId)) && !this._bulk_dnd) {\n this.refreshTask(this.getParent(taskId));\n var hasSplitParent = false;\n this.eachParent(function (parent) {\n if (hasSplitParent || this.isSplitTask(parent)) {\n hasSplitParent = true;\n }\n }, taskId);\n\n if (hasSplitParent) {\n refreshLinks();\n }\n }\n },\n refreshLink: function refreshLink(linkId) {\n this.$data.linksStore.refresh(linkId, !!this.getState(\"tasksDnd\").drag_id); // do quick refresh during drag and drop\n },\n silent: function silent(code) {\n var gantt = this;\n gantt.$data.tasksStore.silent(function () {\n gantt.$data.linksStore.silent(function () {\n code();\n });\n });\n },\n clearAll: function clearAll() {\n var stores = getDatastores.call(this); // clear all stores without invoking clearAll event\n // in order to prevent calling handlers when only some stores are cleared\n\n for (var i = 0; i < stores.length; i++) {\n stores[i].silent(function () {\n stores[i].clearAll();\n });\n } // run clearAll again to invoke events\n\n\n for (var i = 0; i < stores.length; i++) {\n stores[i].clearAll();\n }\n\n this._update_flags();\n\n this.userdata = {};\n this.callEvent(\"onClear\", []);\n this.render();\n },\n _clear_data: function _clear_data() {\n this.$data.tasksStore.clearAll();\n this.$data.linksStore.clearAll();\n\n this._update_flags();\n\n this.userdata = {};\n },\n selectTask: function selectTask(id) {\n var store = this.$data.tasksStore;\n if (!this.config.select_task) return false;\n id = replaceValidZeroId(id, this.config.root_id);\n\n if (id) {\n var oldSelectId = this.getSelectedId(); // Don't repaint the resource panel as the data didn't change\n\n store._skipResourceRepaint = true;\n store.select(id);\n store._skipResourceRepaint = false; // GS-730. Split task is not included in the tree, \n // so the datastore renderer will think that the task is not visible\n\n if (oldSelectId && store.pull[oldSelectId].$split_subtask && oldSelectId != id) {\n this.refreshTask(oldSelectId);\n }\n\n if (store.pull[id].$split_subtask && oldSelectId != id) {\n // GS-1850. Do not repaint split task after double click\n this.refreshTask(id);\n }\n }\n\n return store.getSelectedId();\n },\n unselectTask: function unselectTask(id) {\n var store = this.$data.tasksStore;\n store.unselect(id); // GS-730. Split task is not included in the tree, \n // so the datastore renderer will think that the task is not visible\n\n if (id && store.pull[id].$split_subtask) {\n this.refreshTask(id);\n }\n },\n isSelectedTask: function isSelectedTask(id) {\n return this.$data.tasksStore.isSelected(id);\n },\n getSelectedId: function getSelectedId() {\n return this.$data.tasksStore.getSelectedId();\n }\n };\n};\n\nfunction createFacade() {\n var res = utils.mixin({}, createDatastoreFacade());\n utils.mixin(res, createTasksFacade());\n utils.mixin(res, createLinksFacade());\n return res;\n}\n\nmodule.exports = {\n create: createFacade\n};","var utils = require(\"../../utils/utils\");\n\nvar facadeFactory = require(\"./../facades/datastore\");\n\nvar calculateScaleRange = require(\"../gantt_data_range\");\n\nvar isPlaceholderTask = require(\"../../utils/placeholder_task\");\n\nfunction initDataStores(gantt) {\n var facade = facadeFactory.create();\n utils.mixin(gantt, facade);\n var tasksStore = gantt.createDatastore({\n name: \"task\",\n type: \"treeDatastore\",\n rootId: function rootId() {\n return gantt.config.root_id;\n },\n initItem: utils.bind(_init_task, gantt),\n getConfig: function getConfig() {\n return gantt.config;\n }\n });\n var linksStore = gantt.createDatastore({\n name: \"link\",\n initItem: utils.bind(_init_link, gantt)\n });\n gantt.attachEvent(\"onDestroy\", function () {\n tasksStore.destructor();\n linksStore.destructor();\n });\n gantt.attachEvent(\"onLinkValidation\", function (link) {\n if (gantt.isLinkExists(link.id) || link.id === \"predecessor_generated\") {\n // link was already added into gantt\n return true;\n }\n\n var source = gantt.getTask(link.source);\n var taskLinks = source.$source;\n\n for (var i = 0; i < taskLinks.length; i++) {\n var existingLink = gantt.getLink(taskLinks[i]);\n var sourceMatch = link.source == existingLink.source;\n var targetMatch = link.target == existingLink.target;\n var typeMatch = link.type == existingLink.type; // prevent creating duplicated links from the UI\n\n if (sourceMatch && targetMatch && typeMatch) {\n return false;\n }\n }\n\n return true;\n });\n tasksStore.attachEvent(\"onBeforeRefreshAll\", function () {\n // GS-2170 do not recalculate indexes and dates as the event will be called later in the onStoreUpdate event\n if (tasksStore._skipTaskRecalculation) {\n return;\n }\n\n var order = tasksStore.getVisibleItems();\n\n for (var i = 0; i < order.length; i++) {\n var item = order[i];\n item.$index = i;\n item.$local_index = gantt.getTaskIndex(item.id);\n gantt.resetProjectDates(item);\n }\n });\n tasksStore.attachEvent(\"onFilterItem\", function (id, task) {\n if (gantt.config.show_tasks_outside_timescale) {\n return true;\n }\n\n var min = null,\n max = null;\n\n if (gantt.config.start_date && gantt.config.end_date) {\n if (gantt._isAllowedUnscheduledTask(task)) return true;\n min = gantt.config.start_date.valueOf();\n max = gantt.config.end_date.valueOf();\n if (+task.start_date > max || +task.end_date < +min) return false;\n }\n\n return true;\n });\n tasksStore.attachEvent(\"onIdChange\", function (oldId, newId) {\n gantt._update_flags(oldId, newId);\n\n var changedTask = gantt.getTask(newId);\n\n if (!tasksStore.isSilent()) {\n if (changedTask.$split_subtask || changedTask.rollup) {\n gantt.eachParent(function (parent) {\n gantt.refreshTask(parent.id);\n }, newId);\n }\n }\n });\n tasksStore.attachEvent(\"onAfterUpdate\", function (id) {\n gantt._update_parents(id);\n\n if (gantt.getState(\"batchUpdate\").batch_update) {\n return true;\n }\n\n var task = tasksStore.getItem(id);\n if (!task.$source) task.$source = [];\n\n for (var i = 0; i < task.$source.length; i++) {\n linksStore.refresh(task.$source[i]);\n }\n\n if (!task.$target) task.$target = [];\n\n for (var i = 0; i < task.$target.length; i++) {\n linksStore.refresh(task.$target[i]);\n }\n });\n tasksStore.attachEvent(\"onBeforeItemMove\", function (sid, parent, tindex) {\n // GS-125. Don't allow users to move the placeholder task\n if (isPlaceholderTask(sid, gantt, tasksStore)) {\n //eslint-disable-next-line\n console.log(\"The placeholder task cannot be moved to another position.\");\n return false;\n }\n\n return true;\n });\n tasksStore.attachEvent(\"onAfterItemMove\", function (sid, parent, tindex) {\n var source = gantt.getTask(sid);\n\n if (this.getNextSibling(sid) !== null) {\n source.$drop_target = this.getNextSibling(sid);\n } else if (this.getPrevSibling(sid) !== null) {\n source.$drop_target = \"next:\" + this.getPrevSibling(sid);\n } else {\n source.$drop_target = \"next:null\";\n }\n });\n tasksStore.attachEvent(\"onStoreUpdated\", function (id, item, action) {\n if (action == \"delete\") {\n gantt._update_flags(id, null);\n }\n\n var state = gantt.$services.getService(\"state\");\n\n if (state.getState(\"batchUpdate\").batch_update) {\n return;\n }\n\n if (gantt.config.fit_tasks && action !== \"paint\") {\n var oldState = gantt.getState();\n calculateScaleRange(gantt);\n var newState = gantt.getState(); //this._init_tasks_range();\n\n if (+oldState.min_date != +newState.min_date || +oldState.max_date != +newState.max_date) {\n gantt.render();\n gantt.callEvent(\"onScaleAdjusted\", []);\n return true;\n }\n }\n\n if (action == \"add\" || action == \"move\" || action == \"delete\") {\n if (gantt.$layout) {\n // GS-2170. Do not recalculate the indexes and dates of other tasks in the\n // onBeforeResize layout event, but do it later. If lightbox is opened, it will\n // trigger the refreshData, so the indexes and dates will be recalculated there\n if (this.$config.name == \"task\" && (action == \"add\" || action == \"delete\")) {\n if (this._skipTaskRecalculation != \"lightbox\") {\n this._skipTaskRecalculation = true;\n }\n }\n\n gantt.$layout.resize();\n }\n } else if (!id) {\n linksStore.refresh();\n }\n });\n linksStore.attachEvent(\"onAfterAdd\", function (id, link) {\n sync_link(link);\n });\n linksStore.attachEvent(\"onAfterUpdate\", function (id, link) {\n sync_links();\n });\n linksStore.attachEvent(\"onAfterDelete\", function (id, link) {\n sync_link_delete(link);\n });\n linksStore.attachEvent(\"onBeforeIdChange\", function (oldId, newId) {\n sync_link_delete(gantt.mixin({\n id: oldId\n }, gantt.$data.linksStore.getItem(newId)));\n sync_link(gantt.$data.linksStore.getItem(newId));\n });\n\n function checkLinkedTaskVisibility(taskId) {\n var isVisible = gantt.isTaskVisible(taskId);\n\n if (!isVisible && gantt.isTaskExists(taskId)) {\n var parent = gantt.getParent(taskId);\n\n if (gantt.isTaskExists(parent) && gantt.isTaskVisible(parent)) {\n parent = gantt.getTask(parent);\n\n if (gantt.isSplitTask(parent)) {\n isVisible = true;\n }\n }\n }\n\n return isVisible;\n }\n\n linksStore.attachEvent(\"onFilterItem\", function (id, link) {\n if (!gantt.config.show_links) {\n return false;\n }\n\n var sourceVisible = checkLinkedTaskVisibility(link.source);\n var targetVisible = checkLinkedTaskVisibility(link.target);\n if (!(sourceVisible && targetVisible) || gantt._isAllowedUnscheduledTask(gantt.getTask(link.source)) || gantt._isAllowedUnscheduledTask(gantt.getTask(link.target))) return false;\n return gantt.callEvent(\"onBeforeLinkDisplay\", [id, link]);\n });\n\n (function () {\n // delete all connected links after task is deleted\n var treeHelper = require(\"../../utils/task_tree_helpers\");\n\n var deletedLinks = {};\n gantt.attachEvent(\"onBeforeTaskDelete\", function (id, item) {\n deletedLinks[id] = treeHelper.getSubtreeLinks(gantt, id);\n return true;\n });\n gantt.attachEvent(\"onAfterTaskDelete\", function (id, item) {\n if (deletedLinks[id]) {\n gantt.$data.linksStore.silent(function () {\n for (var i in deletedLinks[id]) {\n if (gantt.isLinkExists(i)) {\n gantt.$data.linksStore.removeItem(i);\n }\n\n sync_link_delete(deletedLinks[id][i]);\n }\n\n deletedLinks[id] = null;\n });\n }\n });\n })();\n\n gantt.attachEvent(\"onAfterLinkDelete\", function (id, link) {\n gantt.refreshTask(link.source);\n gantt.refreshTask(link.target);\n });\n gantt.attachEvent(\"onParse\", sync_links);\n mapEvents({\n source: linksStore,\n target: gantt,\n events: {\n \"onItemLoading\": \"onLinkLoading\",\n \"onBeforeAdd\": \"onBeforeLinkAdd\",\n \"onAfterAdd\": \"onAfterLinkAdd\",\n \"onBeforeUpdate\": \"onBeforeLinkUpdate\",\n \"onAfterUpdate\": \"onAfterLinkUpdate\",\n \"onBeforeDelete\": \"onBeforeLinkDelete\",\n \"onAfterDelete\": \"onAfterLinkDelete\",\n \"onIdChange\": \"onLinkIdChange\"\n }\n });\n mapEvents({\n source: tasksStore,\n target: gantt,\n events: {\n \"onItemLoading\": \"onTaskLoading\",\n \"onBeforeAdd\": \"onBeforeTaskAdd\",\n \"onAfterAdd\": \"onAfterTaskAdd\",\n \"onBeforeUpdate\": \"onBeforeTaskUpdate\",\n \"onAfterUpdate\": \"onAfterTaskUpdate\",\n \"onBeforeDelete\": \"onBeforeTaskDelete\",\n \"onAfterDelete\": \"onAfterTaskDelete\",\n \"onIdChange\": \"onTaskIdChange\",\n \"onBeforeItemMove\": \"onBeforeTaskMove\",\n \"onAfterItemMove\": \"onAfterTaskMove\",\n \"onFilterItem\": \"onBeforeTaskDisplay\",\n \"onItemOpen\": \"onTaskOpened\",\n \"onItemClose\": \"onTaskClosed\",\n \"onBeforeSelect\": \"onBeforeTaskSelected\",\n \"onAfterSelect\": \"onTaskSelected\",\n \"onAfterUnselect\": \"onTaskUnselected\"\n }\n });\n gantt.$data = {\n tasksStore: tasksStore,\n linksStore: linksStore\n };\n\n function sync_link(link) {\n if (gantt.isTaskExists(link.source)) {\n var sourceTask = gantt.getTask(link.source);\n sourceTask.$source = sourceTask.$source || [];\n sourceTask.$source.push(link.id);\n }\n\n if (gantt.isTaskExists(link.target)) {\n var targetTask = gantt.getTask(link.target);\n targetTask.$target = targetTask.$target || [];\n targetTask.$target.push(link.id);\n }\n }\n\n function sync_link_delete(link) {\n if (gantt.isTaskExists(link.source)) {\n var sourceTask = gantt.getTask(link.source);\n\n for (var i = 0; i < sourceTask.$source.length; i++) {\n if (sourceTask.$source[i] == link.id) {\n sourceTask.$source.splice(i, 1);\n break;\n }\n }\n }\n\n if (gantt.isTaskExists(link.target)) {\n var targetTask = gantt.getTask(link.target);\n\n for (var i = 0; i < targetTask.$target.length; i++) {\n if (targetTask.$target[i] == link.id) {\n targetTask.$target.splice(i, 1);\n break;\n }\n }\n }\n }\n\n function sync_links() {\n var task = null;\n var tasks = gantt.$data.tasksStore.getItems();\n\n for (var i = 0, len = tasks.length; i < len; i++) {\n task = tasks[i];\n task.$source = [];\n task.$target = [];\n }\n\n var links = gantt.$data.linksStore.getItems();\n\n for (var i = 0, len = links.length; i < len; i++) {\n var link = links[i];\n sync_link(link);\n }\n }\n\n function mapEvents(conf) {\n var mapFrom = conf.source;\n var mapTo = conf.target;\n\n for (var i in conf.events) {\n (function (sourceEvent, targetEvent) {\n mapFrom.attachEvent(sourceEvent, function () {\n return mapTo.callEvent(targetEvent, Array.prototype.slice.call(arguments));\n }, targetEvent);\n })(i, conf.events[i]);\n }\n }\n\n function _init_task(task) {\n if (!this.defined(task.id)) task.id = this.uid();\n if (task.start_date) task.start_date = gantt.date.parseDate(task.start_date, \"parse_date\");\n if (task.end_date) task.end_date = gantt.date.parseDate(task.end_date, \"parse_date\");\n var duration = null;\n\n if (task.duration || task.duration === 0) {\n task.duration = duration = task.duration * 1;\n }\n\n if (duration) {\n if (task.start_date && !task.end_date) {\n task.end_date = this.calculateEndDate(task);\n } else if (!task.start_date && task.end_date) {\n task.start_date = this.calculateEndDate({\n start_date: task.end_date,\n duration: -task.duration,\n task: task\n });\n } //task.$calculate_duration = false;\n\n }\n\n task.progress = Number(task.progress) || 0;\n\n if (this._isAllowedUnscheduledTask(task)) {\n this._set_default_task_timing(task);\n }\n\n this._init_task_timing(task);\n\n if (task.start_date && task.end_date) this.correctTaskWorkTime(task);\n task.$source = [];\n task.$target = [];\n var originalTask = this.$data.tasksStore.getItem(task.id);\n\n if (originalTask && !utils.defined(task.open)) {\n // if a task with the same id is already in the gantt and the new object doesn't specify the `open` state -\n // restore the `open` state we already have in the chart\n task.$open = originalTask.$open;\n }\n\n if (task.parent === undefined) {\n task.parent = this.config.root_id;\n }\n\n return task;\n }\n\n function _init_link(link) {\n if (!this.defined(link.id)) link.id = this.uid();\n return link;\n }\n}\n\nmodule.exports = initDataStores;","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/* @preserve\n * The MIT License (MIT)\n * \n * Copyright (c) 2013-2018 Petka Antonov\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n * \n */\n\n/**\n * bluebird build version 3.5.4\n * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each\n*/\n!function (e) {\n if (\"object\" == (typeof exports === \"undefined\" ? \"undefined\" : _typeof(exports)) && \"undefined\" != typeof module) module.exports = e();else if (\"function\" == typeof define && define.amd) define([], e);else {\n var f;\n \"undefined\" != typeof window ? f = window : \"undefined\" != typeof global ? f = global : \"undefined\" != typeof self && (f = self), f.Promise = e();\n }\n}(function () {\n var define, module, exports;\n return function e(t, n, r) {\n function s(o, u) {\n if (!n[o]) {\n if (!t[o]) {\n var a = typeof _dereq_ == \"function\" && _dereq_;\n if (!u && a) return a(o, !0);\n if (i) return i(o, !0);\n var f = new Error(\"Cannot find module '\" + o + \"'\");\n throw f.code = \"MODULE_NOT_FOUND\", f;\n }\n\n var l = n[o] = {\n exports: {}\n };\n t[o][0].call(l.exports, function (e) {\n var n = t[o][1][e];\n return s(n ? n : e);\n }, l, l.exports, e, t, n, r);\n }\n\n return n[o].exports;\n }\n\n var i = typeof _dereq_ == \"function\" && _dereq_;\n\n for (var o = 0; o < r.length; o++) {\n s(r[o]);\n }\n\n return s;\n }({\n 1: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise) {\n var SomePromiseArray = Promise._SomePromiseArray;\n\n function any(promises) {\n var ret = new SomePromiseArray(promises);\n var promise = ret.promise();\n ret.setHowMany(1);\n ret.setUnwrap();\n ret.init();\n return promise;\n }\n\n Promise.any = function (promises) {\n return any(promises);\n };\n\n Promise.prototype.any = function () {\n return any(this);\n };\n };\n }, {}],\n 2: [function (_dereq_, module, exports) {\n \"use strict\";\n\n var firstLineError;\n\n try {\n throw new Error();\n } catch (e) {\n firstLineError = e;\n }\n\n var schedule = _dereq_(\"./schedule\");\n\n var Queue = _dereq_(\"./queue\");\n\n var util = _dereq_(\"./util\");\n\n function Async() {\n this._customScheduler = false;\n this._isTickUsed = false;\n this._lateQueue = new Queue(16);\n this._normalQueue = new Queue(16);\n this._haveDrainedQueues = false;\n this._trampolineEnabled = true;\n var self = this;\n\n this.drainQueues = function () {\n self._drainQueues();\n };\n\n this._schedule = schedule;\n }\n\n Async.prototype.setScheduler = function (fn) {\n var prev = this._schedule;\n this._schedule = fn;\n this._customScheduler = true;\n return prev;\n };\n\n Async.prototype.hasCustomScheduler = function () {\n return this._customScheduler;\n };\n\n Async.prototype.enableTrampoline = function () {\n this._trampolineEnabled = true;\n };\n\n Async.prototype.disableTrampolineIfNecessary = function () {\n if (util.hasDevTools) {\n this._trampolineEnabled = false;\n }\n };\n\n Async.prototype.haveItemsQueued = function () {\n return this._isTickUsed || this._haveDrainedQueues;\n };\n\n Async.prototype.fatalError = function (e, isNode) {\n if (isNode) {\n process.stderr.write(\"Fatal \" + (e instanceof Error ? e.stack : e) + \"\\n\");\n process.exit(2);\n } else {\n this.throwLater(e);\n }\n };\n\n Async.prototype.throwLater = function (fn, arg) {\n if (arguments.length === 1) {\n arg = fn;\n\n fn = function fn() {\n throw arg;\n };\n }\n\n if (typeof setTimeout !== \"undefined\") {\n setTimeout(function () {\n fn(arg);\n }, 0);\n } else try {\n this._schedule(function () {\n fn(arg);\n });\n } catch (e) {\n throw new Error(\"No async scheduler available\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n };\n\n function AsyncInvokeLater(fn, receiver, arg) {\n this._lateQueue.push(fn, receiver, arg);\n\n this._queueTick();\n }\n\n function AsyncInvoke(fn, receiver, arg) {\n this._normalQueue.push(fn, receiver, arg);\n\n this._queueTick();\n }\n\n function AsyncSettlePromises(promise) {\n this._normalQueue._pushOne(promise);\n\n this._queueTick();\n }\n\n if (!util.hasDevTools) {\n Async.prototype.invokeLater = AsyncInvokeLater;\n Async.prototype.invoke = AsyncInvoke;\n Async.prototype.settlePromises = AsyncSettlePromises;\n } else {\n Async.prototype.invokeLater = function (fn, receiver, arg) {\n if (this._trampolineEnabled) {\n AsyncInvokeLater.call(this, fn, receiver, arg);\n } else {\n this._schedule(function () {\n setTimeout(function () {\n fn.call(receiver, arg);\n }, 100);\n });\n }\n };\n\n Async.prototype.invoke = function (fn, receiver, arg) {\n if (this._trampolineEnabled) {\n AsyncInvoke.call(this, fn, receiver, arg);\n } else {\n this._schedule(function () {\n fn.call(receiver, arg);\n });\n }\n };\n\n Async.prototype.settlePromises = function (promise) {\n if (this._trampolineEnabled) {\n AsyncSettlePromises.call(this, promise);\n } else {\n this._schedule(function () {\n promise._settlePromises();\n });\n }\n };\n }\n\n function _drainQueue(queue) {\n while (queue.length() > 0) {\n _drainQueueStep(queue);\n }\n }\n\n function _drainQueueStep(queue) {\n var fn = queue.shift();\n\n if (typeof fn !== \"function\") {\n fn._settlePromises();\n } else {\n var receiver = queue.shift();\n var arg = queue.shift();\n fn.call(receiver, arg);\n }\n }\n\n Async.prototype._drainQueues = function () {\n _drainQueue(this._normalQueue);\n\n this._reset();\n\n this._haveDrainedQueues = true;\n\n _drainQueue(this._lateQueue);\n };\n\n Async.prototype._queueTick = function () {\n if (!this._isTickUsed) {\n this._isTickUsed = true;\n\n this._schedule(this.drainQueues);\n }\n };\n\n Async.prototype._reset = function () {\n this._isTickUsed = false;\n };\n\n module.exports = Async;\n module.exports.firstLineError = firstLineError;\n }, {\n \"./queue\": 26,\n \"./schedule\": 29,\n \"./util\": 36\n }],\n 3: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL, tryConvertToPromise, debug) {\n var calledBind = false;\n\n var rejectThis = function rejectThis(_, e) {\n this._reject(e);\n };\n\n var targetRejected = function targetRejected(e, context) {\n context.promiseRejectionQueued = true;\n\n context.bindingPromise._then(rejectThis, rejectThis, null, this, e);\n };\n\n var bindingResolved = function bindingResolved(thisArg, context) {\n if ((this._bitField & 50397184) === 0) {\n this._resolveCallback(context.target);\n }\n };\n\n var bindingRejected = function bindingRejected(e, context) {\n if (!context.promiseRejectionQueued) this._reject(e);\n };\n\n Promise.prototype.bind = function (thisArg) {\n if (!calledBind) {\n calledBind = true;\n Promise.prototype._propagateFrom = debug.propagateFromFunction();\n Promise.prototype._boundValue = debug.boundValueFunction();\n }\n\n var maybePromise = tryConvertToPromise(thisArg);\n var ret = new Promise(INTERNAL);\n\n ret._propagateFrom(this, 1);\n\n var target = this._target();\n\n ret._setBoundTo(maybePromise);\n\n if (maybePromise instanceof Promise) {\n var context = {\n promiseRejectionQueued: false,\n promise: ret,\n target: target,\n bindingPromise: maybePromise\n };\n\n target._then(INTERNAL, targetRejected, undefined, ret, context);\n\n maybePromise._then(bindingResolved, bindingRejected, undefined, ret, context);\n\n ret._setOnCancel(maybePromise);\n } else {\n ret._resolveCallback(target);\n }\n\n return ret;\n };\n\n Promise.prototype._setBoundTo = function (obj) {\n if (obj !== undefined) {\n this._bitField = this._bitField | 2097152;\n this._boundTo = obj;\n } else {\n this._bitField = this._bitField & ~2097152;\n }\n };\n\n Promise.prototype._isBound = function () {\n return (this._bitField & 2097152) === 2097152;\n };\n\n Promise.bind = function (thisArg, value) {\n return Promise.resolve(value).bind(thisArg);\n };\n };\n }, {}],\n 4: [function (_dereq_, module, exports) {\n \"use strict\";\n\n var old;\n if (typeof Promise !== \"undefined\") old = Promise;\n\n function noConflict() {\n try {\n if (Promise === bluebird) Promise = old;\n } catch (e) {}\n\n return bluebird;\n }\n\n var bluebird = _dereq_(\"./promise\")();\n\n bluebird.noConflict = noConflict;\n module.exports = bluebird;\n }, {\n \"./promise\": 22\n }],\n 5: [function (_dereq_, module, exports) {\n \"use strict\";\n\n var cr = Object.create;\n\n if (cr) {\n var callerCache = cr(null);\n var getterCache = cr(null);\n callerCache[\" size\"] = getterCache[\" size\"] = 0;\n }\n\n module.exports = function (Promise) {\n var util = _dereq_(\"./util\");\n\n var canEvaluate = util.canEvaluate;\n var isIdentifier = util.isIdentifier;\n var getMethodCaller;\n var getGetter;\n\n if (!true) {\n var makeMethodCaller = function makeMethodCaller(methodName) {\n return new Function(\"ensureMethod\", \" \\n\\\n return function(obj) { \\n\\\n 'use strict' \\n\\\n var len = this.length; \\n\\\n ensureMethod(obj, 'methodName'); \\n\\\n switch(len) { \\n\\\n case 1: return obj.methodName(this[0]); \\n\\\n case 2: return obj.methodName(this[0], this[1]); \\n\\\n case 3: return obj.methodName(this[0], this[1], this[2]); \\n\\\n case 0: return obj.methodName(); \\n\\\n default: \\n\\\n return obj.methodName.apply(obj, this); \\n\\\n } \\n\\\n }; \\n\\\n \".replace(/methodName/g, methodName))(ensureMethod);\n };\n\n var makeGetter = function makeGetter(propertyName) {\n return new Function(\"obj\", \" \\n\\\n 'use strict'; \\n\\\n return obj.propertyName; \\n\\\n \".replace(\"propertyName\", propertyName));\n };\n\n var getCompiled = function getCompiled(name, compiler, cache) {\n var ret = cache[name];\n\n if (typeof ret !== \"function\") {\n if (!isIdentifier(name)) {\n return null;\n }\n\n ret = compiler(name);\n cache[name] = ret;\n cache[\" size\"]++;\n\n if (cache[\" size\"] > 512) {\n var keys = Object.keys(cache);\n\n for (var i = 0; i < 256; ++i) {\n delete cache[keys[i]];\n }\n\n cache[\" size\"] = keys.length - 256;\n }\n }\n\n return ret;\n };\n\n getMethodCaller = function getMethodCaller(name) {\n return getCompiled(name, makeMethodCaller, callerCache);\n };\n\n getGetter = function getGetter(name) {\n return getCompiled(name, makeGetter, getterCache);\n };\n }\n\n function ensureMethod(obj, methodName) {\n var fn;\n if (obj != null) fn = obj[methodName];\n\n if (typeof fn !== \"function\") {\n var message = \"Object \" + util.classString(obj) + \" has no method '\" + util.toString(methodName) + \"'\";\n throw new Promise.TypeError(message);\n }\n\n return fn;\n }\n\n function caller(obj) {\n var methodName = this.pop();\n var fn = ensureMethod(obj, methodName);\n return fn.apply(obj, this);\n }\n\n Promise.prototype.call = function (methodName) {\n var args = [].slice.call(arguments, 1);\n ;\n\n if (!true) {\n if (canEvaluate) {\n var maybeCaller = getMethodCaller(methodName);\n\n if (maybeCaller !== null) {\n return this._then(maybeCaller, undefined, undefined, args, undefined);\n }\n }\n }\n\n args.push(methodName);\n return this._then(caller, undefined, undefined, args, undefined);\n };\n\n function namedGetter(obj) {\n return obj[this];\n }\n\n function indexedGetter(obj) {\n var index = +this;\n if (index < 0) index = Math.max(0, index + obj.length);\n return obj[index];\n }\n\n Promise.prototype.get = function (propertyName) {\n var isIndex = typeof propertyName === \"number\";\n var getter;\n\n if (!isIndex) {\n if (canEvaluate) {\n var maybeGetter = getGetter(propertyName);\n getter = maybeGetter !== null ? maybeGetter : namedGetter;\n } else {\n getter = namedGetter;\n }\n } else {\n getter = indexedGetter;\n }\n\n return this._then(getter, undefined, undefined, propertyName, undefined);\n };\n };\n }, {\n \"./util\": 36\n }],\n 6: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, PromiseArray, apiRejection, debug) {\n var util = _dereq_(\"./util\");\n\n var tryCatch = util.tryCatch;\n var errorObj = util.errorObj;\n var async = Promise._async;\n\n Promise.prototype[\"break\"] = Promise.prototype.cancel = function () {\n if (!debug.cancellation()) return this._warn(\"cancellation is disabled\");\n var promise = this;\n var child = promise;\n\n while (promise._isCancellable()) {\n if (!promise._cancelBy(child)) {\n if (child._isFollowing()) {\n child._followee().cancel();\n } else {\n child._cancelBranched();\n }\n\n break;\n }\n\n var parent = promise._cancellationParent;\n\n if (parent == null || !parent._isCancellable()) {\n if (promise._isFollowing()) {\n promise._followee().cancel();\n } else {\n promise._cancelBranched();\n }\n\n break;\n } else {\n if (promise._isFollowing()) promise._followee().cancel();\n\n promise._setWillBeCancelled();\n\n child = promise;\n promise = parent;\n }\n }\n };\n\n Promise.prototype._branchHasCancelled = function () {\n this._branchesRemainingToCancel--;\n };\n\n Promise.prototype._enoughBranchesHaveCancelled = function () {\n return this._branchesRemainingToCancel === undefined || this._branchesRemainingToCancel <= 0;\n };\n\n Promise.prototype._cancelBy = function (canceller) {\n if (canceller === this) {\n this._branchesRemainingToCancel = 0;\n\n this._invokeOnCancel();\n\n return true;\n } else {\n this._branchHasCancelled();\n\n if (this._enoughBranchesHaveCancelled()) {\n this._invokeOnCancel();\n\n return true;\n }\n }\n\n return false;\n };\n\n Promise.prototype._cancelBranched = function () {\n if (this._enoughBranchesHaveCancelled()) {\n this._cancel();\n }\n };\n\n Promise.prototype._cancel = function () {\n if (!this._isCancellable()) return;\n\n this._setCancelled();\n\n async.invoke(this._cancelPromises, this, undefined);\n };\n\n Promise.prototype._cancelPromises = function () {\n if (this._length() > 0) this._settlePromises();\n };\n\n Promise.prototype._unsetOnCancel = function () {\n this._onCancelField = undefined;\n };\n\n Promise.prototype._isCancellable = function () {\n return this.isPending() && !this._isCancelled();\n };\n\n Promise.prototype.isCancellable = function () {\n return this.isPending() && !this.isCancelled();\n };\n\n Promise.prototype._doInvokeOnCancel = function (onCancelCallback, internalOnly) {\n if (util.isArray(onCancelCallback)) {\n for (var i = 0; i < onCancelCallback.length; ++i) {\n this._doInvokeOnCancel(onCancelCallback[i], internalOnly);\n }\n } else if (onCancelCallback !== undefined) {\n if (typeof onCancelCallback === \"function\") {\n if (!internalOnly) {\n var e = tryCatch(onCancelCallback).call(this._boundValue());\n\n if (e === errorObj) {\n this._attachExtraTrace(e.e);\n\n async.throwLater(e.e);\n }\n }\n } else {\n onCancelCallback._resultCancelled(this);\n }\n }\n };\n\n Promise.prototype._invokeOnCancel = function () {\n var onCancelCallback = this._onCancel();\n\n this._unsetOnCancel();\n\n async.invoke(this._doInvokeOnCancel, this, onCancelCallback);\n };\n\n Promise.prototype._invokeInternalOnCancel = function () {\n if (this._isCancellable()) {\n this._doInvokeOnCancel(this._onCancel(), true);\n\n this._unsetOnCancel();\n }\n };\n\n Promise.prototype._resultCancelled = function () {\n this.cancel();\n };\n };\n }, {\n \"./util\": 36\n }],\n 7: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (NEXT_FILTER) {\n var util = _dereq_(\"./util\");\n\n var getKeys = _dereq_(\"./es5\").keys;\n\n var tryCatch = util.tryCatch;\n var errorObj = util.errorObj;\n\n function catchFilter(instances, cb, promise) {\n return function (e) {\n var boundTo = promise._boundValue();\n\n predicateLoop: for (var i = 0; i < instances.length; ++i) {\n var item = instances[i];\n\n if (item === Error || item != null && item.prototype instanceof Error) {\n if (e instanceof item) {\n return tryCatch(cb).call(boundTo, e);\n }\n } else if (typeof item === \"function\") {\n var matchesPredicate = tryCatch(item).call(boundTo, e);\n\n if (matchesPredicate === errorObj) {\n return matchesPredicate;\n } else if (matchesPredicate) {\n return tryCatch(cb).call(boundTo, e);\n }\n } else if (util.isObject(e)) {\n var keys = getKeys(item);\n\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n\n if (item[key] != e[key]) {\n continue predicateLoop;\n }\n }\n\n return tryCatch(cb).call(boundTo, e);\n }\n }\n\n return NEXT_FILTER;\n };\n }\n\n return catchFilter;\n };\n }, {\n \"./es5\": 13,\n \"./util\": 36\n }],\n 8: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise) {\n var longStackTraces = false;\n var contextStack = [];\n\n Promise.prototype._promiseCreated = function () {};\n\n Promise.prototype._pushContext = function () {};\n\n Promise.prototype._popContext = function () {\n return null;\n };\n\n Promise._peekContext = Promise.prototype._peekContext = function () {};\n\n function Context() {\n this._trace = new Context.CapturedTrace(peekContext());\n }\n\n Context.prototype._pushContext = function () {\n if (this._trace !== undefined) {\n this._trace._promiseCreated = null;\n contextStack.push(this._trace);\n }\n };\n\n Context.prototype._popContext = function () {\n if (this._trace !== undefined) {\n var trace = contextStack.pop();\n var ret = trace._promiseCreated;\n trace._promiseCreated = null;\n return ret;\n }\n\n return null;\n };\n\n function createContext() {\n if (longStackTraces) return new Context();\n }\n\n function peekContext() {\n var lastIndex = contextStack.length - 1;\n\n if (lastIndex >= 0) {\n return contextStack[lastIndex];\n }\n\n return undefined;\n }\n\n Context.CapturedTrace = null;\n Context.create = createContext;\n\n Context.deactivateLongStackTraces = function () {};\n\n Context.activateLongStackTraces = function () {\n var Promise_pushContext = Promise.prototype._pushContext;\n var Promise_popContext = Promise.prototype._popContext;\n var Promise_PeekContext = Promise._peekContext;\n var Promise_peekContext = Promise.prototype._peekContext;\n var Promise_promiseCreated = Promise.prototype._promiseCreated;\n\n Context.deactivateLongStackTraces = function () {\n Promise.prototype._pushContext = Promise_pushContext;\n Promise.prototype._popContext = Promise_popContext;\n Promise._peekContext = Promise_PeekContext;\n Promise.prototype._peekContext = Promise_peekContext;\n Promise.prototype._promiseCreated = Promise_promiseCreated;\n longStackTraces = false;\n };\n\n longStackTraces = true;\n Promise.prototype._pushContext = Context.prototype._pushContext;\n Promise.prototype._popContext = Context.prototype._popContext;\n Promise._peekContext = Promise.prototype._peekContext = peekContext;\n\n Promise.prototype._promiseCreated = function () {\n var ctx = this._peekContext();\n\n if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;\n };\n };\n\n return Context;\n };\n }, {}],\n 9: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, Context) {\n var getDomain = Promise._getDomain;\n var async = Promise._async;\n\n var Warning = _dereq_(\"./errors\").Warning;\n\n var util = _dereq_(\"./util\");\n\n var es5 = _dereq_(\"./es5\");\n\n var canAttachTrace = util.canAttachTrace;\n var unhandledRejectionHandled;\n var possiblyUnhandledRejection;\n var bluebirdFramePattern = /[\\\\\\/]bluebird[\\\\\\/]js[\\\\\\/](release|debug|instrumented)/;\n var nodeFramePattern = /\\((?:timers\\.js):\\d+:\\d+\\)/;\n var parseLinePattern = /[\\/<\\(](.+?):(\\d+):(\\d+)\\)?\\s*$/;\n var stackFramePattern = null;\n var formatStack = null;\n var indentStackFrames = false;\n var printWarning;\n var debugging = !!(util.env(\"BLUEBIRD_DEBUG\") != 0 && (true || util.env(\"BLUEBIRD_DEBUG\") || util.env(\"NODE_ENV\") === \"development\"));\n var warnings = !!(util.env(\"BLUEBIRD_WARNINGS\") != 0 && (debugging || util.env(\"BLUEBIRD_WARNINGS\")));\n var longStackTraces = !!(util.env(\"BLUEBIRD_LONG_STACK_TRACES\") != 0 && (debugging || util.env(\"BLUEBIRD_LONG_STACK_TRACES\")));\n var wForgottenReturn = util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\") != 0 && (warnings || !!util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\"));\n\n Promise.prototype.suppressUnhandledRejections = function () {\n var target = this._target();\n\n target._bitField = target._bitField & ~1048576 | 524288;\n };\n\n Promise.prototype._ensurePossibleRejectionHandled = function () {\n if ((this._bitField & 524288) !== 0) return;\n\n this._setRejectionIsUnhandled();\n\n var self = this;\n setTimeout(function () {\n self._notifyUnhandledRejection();\n }, 1);\n };\n\n Promise.prototype._notifyUnhandledRejectionIsHandled = function () {\n fireRejectionEvent(\"rejectionHandled\", unhandledRejectionHandled, undefined, this);\n };\n\n Promise.prototype._setReturnedNonUndefined = function () {\n this._bitField = this._bitField | 268435456;\n };\n\n Promise.prototype._returnedNonUndefined = function () {\n return (this._bitField & 268435456) !== 0;\n };\n\n Promise.prototype._notifyUnhandledRejection = function () {\n if (this._isRejectionUnhandled()) {\n var reason = this._settledValue();\n\n this._setUnhandledRejectionIsNotified();\n\n fireRejectionEvent(\"unhandledRejection\", possiblyUnhandledRejection, reason, this);\n }\n };\n\n Promise.prototype._setUnhandledRejectionIsNotified = function () {\n this._bitField = this._bitField | 262144;\n };\n\n Promise.prototype._unsetUnhandledRejectionIsNotified = function () {\n this._bitField = this._bitField & ~262144;\n };\n\n Promise.prototype._isUnhandledRejectionNotified = function () {\n return (this._bitField & 262144) > 0;\n };\n\n Promise.prototype._setRejectionIsUnhandled = function () {\n this._bitField = this._bitField | 1048576;\n };\n\n Promise.prototype._unsetRejectionIsUnhandled = function () {\n this._bitField = this._bitField & ~1048576;\n\n if (this._isUnhandledRejectionNotified()) {\n this._unsetUnhandledRejectionIsNotified();\n\n this._notifyUnhandledRejectionIsHandled();\n }\n };\n\n Promise.prototype._isRejectionUnhandled = function () {\n return (this._bitField & 1048576) > 0;\n };\n\n Promise.prototype._warn = function (message, shouldUseOwnTrace, promise) {\n return warn(message, shouldUseOwnTrace, promise || this);\n };\n\n Promise.onPossiblyUnhandledRejection = function (fn) {\n var domain = getDomain();\n possiblyUnhandledRejection = typeof fn === \"function\" ? domain === null ? fn : util.domainBind(domain, fn) : undefined;\n };\n\n Promise.onUnhandledRejectionHandled = function (fn) {\n var domain = getDomain();\n unhandledRejectionHandled = typeof fn === \"function\" ? domain === null ? fn : util.domainBind(domain, fn) : undefined;\n };\n\n var disableLongStackTraces = function disableLongStackTraces() {};\n\n Promise.longStackTraces = function () {\n if (async.haveItemsQueued() && !config.longStackTraces) {\n throw new Error(\"cannot enable long stack traces after promises have been created\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n if (!config.longStackTraces && longStackTracesIsSupported()) {\n var Promise_captureStackTrace = Promise.prototype._captureStackTrace;\n var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;\n var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;\n config.longStackTraces = true;\n\n disableLongStackTraces = function disableLongStackTraces() {\n if (async.haveItemsQueued() && !config.longStackTraces) {\n throw new Error(\"cannot enable long stack traces after promises have been created\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n Promise.prototype._captureStackTrace = Promise_captureStackTrace;\n Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;\n Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;\n Context.deactivateLongStackTraces();\n async.enableTrampoline();\n config.longStackTraces = false;\n };\n\n Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;\n Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;\n Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;\n Context.activateLongStackTraces();\n async.disableTrampolineIfNecessary();\n }\n };\n\n Promise.hasLongStackTraces = function () {\n return config.longStackTraces && longStackTracesIsSupported();\n };\n\n var fireDomEvent = function () {\n try {\n if (typeof CustomEvent === \"function\") {\n var event = new CustomEvent(\"CustomEvent\");\n util.global.dispatchEvent(event);\n return function (name, event) {\n var eventData = {\n detail: event,\n cancelable: true\n };\n es5.defineProperty(eventData, \"promise\", {\n value: event.promise\n });\n es5.defineProperty(eventData, \"reason\", {\n value: event.reason\n });\n var domEvent = new CustomEvent(name.toLowerCase(), eventData);\n return !util.global.dispatchEvent(domEvent);\n };\n } else if (typeof Event === \"function\") {\n var event = new Event(\"CustomEvent\");\n util.global.dispatchEvent(event);\n return function (name, event) {\n var domEvent = new Event(name.toLowerCase(), {\n cancelable: true\n });\n domEvent.detail = event;\n es5.defineProperty(domEvent, \"promise\", {\n value: event.promise\n });\n es5.defineProperty(domEvent, \"reason\", {\n value: event.reason\n });\n return !util.global.dispatchEvent(domEvent);\n };\n } else {\n var event = document.createEvent(\"CustomEvent\");\n event.initCustomEvent(\"testingtheevent\", false, true, {});\n util.global.dispatchEvent(event);\n return function (name, event) {\n var domEvent = document.createEvent(\"CustomEvent\");\n domEvent.initCustomEvent(name.toLowerCase(), false, true, event);\n return !util.global.dispatchEvent(domEvent);\n };\n }\n } catch (e) {}\n\n return function () {\n return false;\n };\n }();\n\n var fireGlobalEvent = function () {\n if (util.isNode) {\n return function () {\n return process.emit.apply(process, arguments);\n };\n } else {\n if (!util.global) {\n return function () {\n return false;\n };\n }\n\n return function (name) {\n var methodName = \"on\" + name.toLowerCase();\n var method = util.global[methodName];\n if (!method) return false;\n method.apply(util.global, [].slice.call(arguments, 1));\n return true;\n };\n }\n }();\n\n function generatePromiseLifecycleEventObject(name, promise) {\n return {\n promise: promise\n };\n }\n\n var eventToObjectGenerator = {\n promiseCreated: generatePromiseLifecycleEventObject,\n promiseFulfilled: generatePromiseLifecycleEventObject,\n promiseRejected: generatePromiseLifecycleEventObject,\n promiseResolved: generatePromiseLifecycleEventObject,\n promiseCancelled: generatePromiseLifecycleEventObject,\n promiseChained: function promiseChained(name, promise, child) {\n return {\n promise: promise,\n child: child\n };\n },\n warning: function warning(name, _warning) {\n return {\n warning: _warning\n };\n },\n unhandledRejection: function unhandledRejection(name, reason, promise) {\n return {\n reason: reason,\n promise: promise\n };\n },\n rejectionHandled: generatePromiseLifecycleEventObject\n };\n\n var activeFireEvent = function activeFireEvent(name) {\n var globalEventFired = false;\n\n try {\n globalEventFired = fireGlobalEvent.apply(null, arguments);\n } catch (e) {\n async.throwLater(e);\n globalEventFired = true;\n }\n\n var domEventFired = false;\n\n try {\n domEventFired = fireDomEvent(name, eventToObjectGenerator[name].apply(null, arguments));\n } catch (e) {\n async.throwLater(e);\n domEventFired = true;\n }\n\n return domEventFired || globalEventFired;\n };\n\n Promise.config = function (opts) {\n opts = Object(opts);\n\n if (\"longStackTraces\" in opts) {\n if (opts.longStackTraces) {\n Promise.longStackTraces();\n } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {\n disableLongStackTraces();\n }\n }\n\n if (\"warnings\" in opts) {\n var warningsOption = opts.warnings;\n config.warnings = !!warningsOption;\n wForgottenReturn = config.warnings;\n\n if (util.isObject(warningsOption)) {\n if (\"wForgottenReturn\" in warningsOption) {\n wForgottenReturn = !!warningsOption.wForgottenReturn;\n }\n }\n }\n\n if (\"cancellation\" in opts && opts.cancellation && !config.cancellation) {\n if (async.haveItemsQueued()) {\n throw new Error(\"cannot enable cancellation after promises are in use\");\n }\n\n Promise.prototype._clearCancellationData = cancellationClearCancellationData;\n Promise.prototype._propagateFrom = cancellationPropagateFrom;\n Promise.prototype._onCancel = cancellationOnCancel;\n Promise.prototype._setOnCancel = cancellationSetOnCancel;\n Promise.prototype._attachCancellationCallback = cancellationAttachCancellationCallback;\n Promise.prototype._execute = cancellationExecute;\n _propagateFromFunction = cancellationPropagateFrom;\n config.cancellation = true;\n }\n\n if (\"monitoring\" in opts) {\n if (opts.monitoring && !config.monitoring) {\n config.monitoring = true;\n Promise.prototype._fireEvent = activeFireEvent;\n } else if (!opts.monitoring && config.monitoring) {\n config.monitoring = false;\n Promise.prototype._fireEvent = defaultFireEvent;\n }\n }\n\n return Promise;\n };\n\n function defaultFireEvent() {\n return false;\n }\n\n Promise.prototype._fireEvent = defaultFireEvent;\n\n Promise.prototype._execute = function (executor, resolve, reject) {\n try {\n executor(resolve, reject);\n } catch (e) {\n return e;\n }\n };\n\n Promise.prototype._onCancel = function () {};\n\n Promise.prototype._setOnCancel = function (handler) {\n ;\n };\n\n Promise.prototype._attachCancellationCallback = function (onCancel) {\n ;\n };\n\n Promise.prototype._captureStackTrace = function () {};\n\n Promise.prototype._attachExtraTrace = function () {};\n\n Promise.prototype._dereferenceTrace = function () {};\n\n Promise.prototype._clearCancellationData = function () {};\n\n Promise.prototype._propagateFrom = function (parent, flags) {\n ;\n ;\n };\n\n function cancellationExecute(executor, resolve, reject) {\n var promise = this;\n\n try {\n executor(resolve, reject, function (onCancel) {\n if (typeof onCancel !== \"function\") {\n throw new TypeError(\"onCancel must be a function, got: \" + util.toString(onCancel));\n }\n\n promise._attachCancellationCallback(onCancel);\n });\n } catch (e) {\n return e;\n }\n }\n\n function cancellationAttachCancellationCallback(onCancel) {\n if (!this._isCancellable()) return this;\n\n var previousOnCancel = this._onCancel();\n\n if (previousOnCancel !== undefined) {\n if (util.isArray(previousOnCancel)) {\n previousOnCancel.push(onCancel);\n } else {\n this._setOnCancel([previousOnCancel, onCancel]);\n }\n } else {\n this._setOnCancel(onCancel);\n }\n }\n\n function cancellationOnCancel() {\n return this._onCancelField;\n }\n\n function cancellationSetOnCancel(onCancel) {\n this._onCancelField = onCancel;\n }\n\n function cancellationClearCancellationData() {\n this._cancellationParent = undefined;\n this._onCancelField = undefined;\n }\n\n function cancellationPropagateFrom(parent, flags) {\n if ((flags & 1) !== 0) {\n this._cancellationParent = parent;\n var branchesRemainingToCancel = parent._branchesRemainingToCancel;\n\n if (branchesRemainingToCancel === undefined) {\n branchesRemainingToCancel = 0;\n }\n\n parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;\n }\n\n if ((flags & 2) !== 0 && parent._isBound()) {\n this._setBoundTo(parent._boundTo);\n }\n }\n\n function bindingPropagateFrom(parent, flags) {\n if ((flags & 2) !== 0 && parent._isBound()) {\n this._setBoundTo(parent._boundTo);\n }\n }\n\n var _propagateFromFunction = bindingPropagateFrom;\n\n function _boundValueFunction() {\n var ret = this._boundTo;\n\n if (ret !== undefined) {\n if (ret instanceof Promise) {\n if (ret.isFulfilled()) {\n return ret.value();\n } else {\n return undefined;\n }\n }\n }\n\n return ret;\n }\n\n function longStackTracesCaptureStackTrace() {\n this._trace = new CapturedTrace(this._peekContext());\n }\n\n function longStackTracesAttachExtraTrace(error, ignoreSelf) {\n if (canAttachTrace(error)) {\n var trace = this._trace;\n\n if (trace !== undefined) {\n if (ignoreSelf) trace = trace._parent;\n }\n\n if (trace !== undefined) {\n trace.attachExtraTrace(error);\n } else if (!error.__stackCleaned__) {\n var parsed = parseStackAndMessage(error);\n util.notEnumerableProp(error, \"stack\", parsed.message + \"\\n\" + parsed.stack.join(\"\\n\"));\n util.notEnumerableProp(error, \"__stackCleaned__\", true);\n }\n }\n }\n\n function longStackTracesDereferenceTrace() {\n this._trace = undefined;\n }\n\n function checkForgottenReturns(returnValue, promiseCreated, name, promise, parent) {\n if (returnValue === undefined && promiseCreated !== null && wForgottenReturn) {\n if (parent !== undefined && parent._returnedNonUndefined()) return;\n if ((promise._bitField & 65535) === 0) return;\n if (name) name = name + \" \";\n var handlerLine = \"\";\n var creatorLine = \"\";\n\n if (promiseCreated._trace) {\n var traceLines = promiseCreated._trace.stack.split(\"\\n\");\n\n var stack = cleanStack(traceLines);\n\n for (var i = stack.length - 1; i >= 0; --i) {\n var line = stack[i];\n\n if (!nodeFramePattern.test(line)) {\n var lineMatches = line.match(parseLinePattern);\n\n if (lineMatches) {\n handlerLine = \"at \" + lineMatches[1] + \":\" + lineMatches[2] + \":\" + lineMatches[3] + \" \";\n }\n\n break;\n }\n }\n\n if (stack.length > 0) {\n var firstUserLine = stack[0];\n\n for (var i = 0; i < traceLines.length; ++i) {\n if (traceLines[i] === firstUserLine) {\n if (i > 0) {\n creatorLine = \"\\n\" + traceLines[i - 1];\n }\n\n break;\n }\n }\n }\n }\n\n var msg = \"a promise was created in a \" + name + \"handler \" + handlerLine + \"but was not returned from it, \" + \"see http://goo.gl/rRqMUw\" + creatorLine;\n\n promise._warn(msg, true, promiseCreated);\n }\n }\n\n function deprecated(name, replacement) {\n var message = name + \" is deprecated and will be removed in a future version.\";\n if (replacement) message += \" Use \" + replacement + \" instead.\";\n return warn(message);\n }\n\n function warn(message, shouldUseOwnTrace, promise) {\n if (!config.warnings) return;\n var warning = new Warning(message);\n var ctx;\n\n if (shouldUseOwnTrace) {\n promise._attachExtraTrace(warning);\n } else if (config.longStackTraces && (ctx = Promise._peekContext())) {\n ctx.attachExtraTrace(warning);\n } else {\n var parsed = parseStackAndMessage(warning);\n warning.stack = parsed.message + \"\\n\" + parsed.stack.join(\"\\n\");\n }\n\n if (!activeFireEvent(\"warning\", warning)) {\n formatAndLogError(warning, \"\", true);\n }\n }\n\n function reconstructStack(message, stacks) {\n for (var i = 0; i < stacks.length - 1; ++i) {\n stacks[i].push(\"From previous event:\");\n stacks[i] = stacks[i].join(\"\\n\");\n }\n\n if (i < stacks.length) {\n stacks[i] = stacks[i].join(\"\\n\");\n }\n\n return message + \"\\n\" + stacks.join(\"\\n\");\n }\n\n function removeDuplicateOrEmptyJumps(stacks) {\n for (var i = 0; i < stacks.length; ++i) {\n if (stacks[i].length === 0 || i + 1 < stacks.length && stacks[i][0] === stacks[i + 1][0]) {\n stacks.splice(i, 1);\n i--;\n }\n }\n }\n\n function removeCommonRoots(stacks) {\n var current = stacks[0];\n\n for (var i = 1; i < stacks.length; ++i) {\n var prev = stacks[i];\n var currentLastIndex = current.length - 1;\n var currentLastLine = current[currentLastIndex];\n var commonRootMeetPoint = -1;\n\n for (var j = prev.length - 1; j >= 0; --j) {\n if (prev[j] === currentLastLine) {\n commonRootMeetPoint = j;\n break;\n }\n }\n\n for (var j = commonRootMeetPoint; j >= 0; --j) {\n var line = prev[j];\n\n if (current[currentLastIndex] === line) {\n current.pop();\n currentLastIndex--;\n } else {\n break;\n }\n }\n\n current = prev;\n }\n }\n\n function cleanStack(stack) {\n var ret = [];\n\n for (var i = 0; i < stack.length; ++i) {\n var line = stack[i];\n var isTraceLine = \" (No stack trace)\" === line || stackFramePattern.test(line);\n var isInternalFrame = isTraceLine && shouldIgnore(line);\n\n if (isTraceLine && !isInternalFrame) {\n if (indentStackFrames && line.charAt(0) !== \" \") {\n line = \" \" + line;\n }\n\n ret.push(line);\n }\n }\n\n return ret;\n }\n\n function stackFramesAsArray(error) {\n var stack = error.stack.replace(/\\s+$/g, \"\").split(\"\\n\");\n\n for (var i = 0; i < stack.length; ++i) {\n var line = stack[i];\n\n if (\" (No stack trace)\" === line || stackFramePattern.test(line)) {\n break;\n }\n }\n\n if (i > 0 && error.name != \"SyntaxError\") {\n stack = stack.slice(i);\n }\n\n return stack;\n }\n\n function parseStackAndMessage(error) {\n var stack = error.stack;\n var message = error.toString();\n stack = typeof stack === \"string\" && stack.length > 0 ? stackFramesAsArray(error) : [\" (No stack trace)\"];\n return {\n message: message,\n stack: error.name == \"SyntaxError\" ? stack : cleanStack(stack)\n };\n }\n\n function formatAndLogError(error, title, isSoft) {\n if (typeof console !== \"undefined\") {\n var message;\n\n if (util.isObject(error)) {\n var stack = error.stack;\n message = title + formatStack(stack, error);\n } else {\n message = title + String(error);\n }\n\n if (typeof printWarning === \"function\") {\n printWarning(message, isSoft);\n } else if (typeof console.log === \"function\" || _typeof(console.log) === \"object\") {\n console.log(message);\n }\n }\n }\n\n function fireRejectionEvent(name, localHandler, reason, promise) {\n var localEventFired = false;\n\n try {\n if (typeof localHandler === \"function\") {\n localEventFired = true;\n\n if (name === \"rejectionHandled\") {\n localHandler(promise);\n } else {\n localHandler(reason, promise);\n }\n }\n } catch (e) {\n async.throwLater(e);\n }\n\n if (name === \"unhandledRejection\") {\n if (!activeFireEvent(name, reason, promise) && !localEventFired) {\n formatAndLogError(reason, \"Unhandled rejection \");\n }\n } else {\n activeFireEvent(name, promise);\n }\n }\n\n function formatNonError(obj) {\n var str;\n\n if (typeof obj === \"function\") {\n str = \"[function \" + (obj.name || \"anonymous\") + \"]\";\n } else {\n str = obj && typeof obj.toString === \"function\" ? obj.toString() : util.toString(obj);\n var ruselessToString = /\\[object [a-zA-Z0-9$_]+\\]/;\n\n if (ruselessToString.test(str)) {\n try {\n var newStr = JSON.stringify(obj);\n str = newStr;\n } catch (e) {}\n }\n\n if (str.length === 0) {\n str = \"(empty array)\";\n }\n }\n\n return \"(<\" + snip(str) + \">, no stack trace)\";\n }\n\n function snip(str) {\n var maxChars = 41;\n\n if (str.length < maxChars) {\n return str;\n }\n\n return str.substr(0, maxChars - 3) + \"...\";\n }\n\n function longStackTracesIsSupported() {\n return typeof captureStackTrace === \"function\";\n }\n\n var shouldIgnore = function shouldIgnore() {\n return false;\n };\n\n var parseLineInfoRegex = /[\\/<\\(]([^:\\/]+):(\\d+):(?:\\d+)\\)?\\s*$/;\n\n function parseLineInfo(line) {\n var matches = line.match(parseLineInfoRegex);\n\n if (matches) {\n return {\n fileName: matches[1],\n line: parseInt(matches[2], 10)\n };\n }\n }\n\n function setBounds(firstLineError, lastLineError) {\n if (!longStackTracesIsSupported()) return;\n var firstStackLines = firstLineError.stack.split(\"\\n\");\n var lastStackLines = lastLineError.stack.split(\"\\n\");\n var firstIndex = -1;\n var lastIndex = -1;\n var firstFileName;\n var lastFileName;\n\n for (var i = 0; i < firstStackLines.length; ++i) {\n var result = parseLineInfo(firstStackLines[i]);\n\n if (result) {\n firstFileName = result.fileName;\n firstIndex = result.line;\n break;\n }\n }\n\n for (var i = 0; i < lastStackLines.length; ++i) {\n var result = parseLineInfo(lastStackLines[i]);\n\n if (result) {\n lastFileName = result.fileName;\n lastIndex = result.line;\n break;\n }\n }\n\n if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || firstFileName !== lastFileName || firstIndex >= lastIndex) {\n return;\n }\n\n shouldIgnore = function shouldIgnore(line) {\n if (bluebirdFramePattern.test(line)) return true;\n var info = parseLineInfo(line);\n\n if (info) {\n if (info.fileName === firstFileName && firstIndex <= info.line && info.line <= lastIndex) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n function CapturedTrace(parent) {\n this._parent = parent;\n this._promisesCreated = 0;\n var length = this._length = 1 + (parent === undefined ? 0 : parent._length);\n captureStackTrace(this, CapturedTrace);\n if (length > 32) this.uncycle();\n }\n\n util.inherits(CapturedTrace, Error);\n Context.CapturedTrace = CapturedTrace;\n\n CapturedTrace.prototype.uncycle = function () {\n var length = this._length;\n if (length < 2) return;\n var nodes = [];\n var stackToIndex = {};\n\n for (var i = 0, node = this; node !== undefined; ++i) {\n nodes.push(node);\n node = node._parent;\n }\n\n length = this._length = i;\n\n for (var i = length - 1; i >= 0; --i) {\n var stack = nodes[i].stack;\n\n if (stackToIndex[stack] === undefined) {\n stackToIndex[stack] = i;\n }\n }\n\n for (var i = 0; i < length; ++i) {\n var currentStack = nodes[i].stack;\n var index = stackToIndex[currentStack];\n\n if (index !== undefined && index !== i) {\n if (index > 0) {\n nodes[index - 1]._parent = undefined;\n nodes[index - 1]._length = 1;\n }\n\n nodes[i]._parent = undefined;\n nodes[i]._length = 1;\n var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;\n\n if (index < length - 1) {\n cycleEdgeNode._parent = nodes[index + 1];\n\n cycleEdgeNode._parent.uncycle();\n\n cycleEdgeNode._length = cycleEdgeNode._parent._length + 1;\n } else {\n cycleEdgeNode._parent = undefined;\n cycleEdgeNode._length = 1;\n }\n\n var currentChildLength = cycleEdgeNode._length + 1;\n\n for (var j = i - 2; j >= 0; --j) {\n nodes[j]._length = currentChildLength;\n currentChildLength++;\n }\n\n return;\n }\n }\n };\n\n CapturedTrace.prototype.attachExtraTrace = function (error) {\n if (error.__stackCleaned__) return;\n this.uncycle();\n var parsed = parseStackAndMessage(error);\n var message = parsed.message;\n var stacks = [parsed.stack];\n var trace = this;\n\n while (trace !== undefined) {\n stacks.push(cleanStack(trace.stack.split(\"\\n\")));\n trace = trace._parent;\n }\n\n removeCommonRoots(stacks);\n removeDuplicateOrEmptyJumps(stacks);\n util.notEnumerableProp(error, \"stack\", reconstructStack(message, stacks));\n util.notEnumerableProp(error, \"__stackCleaned__\", true);\n };\n\n var captureStackTrace = function stackDetection() {\n var v8stackFramePattern = /^\\s*at\\s*/;\n\n var v8stackFormatter = function v8stackFormatter(stack, error) {\n if (typeof stack === \"string\") return stack;\n\n if (error.name !== undefined && error.message !== undefined) {\n return error.toString();\n }\n\n return formatNonError(error);\n };\n\n if (typeof Error.stackTraceLimit === \"number\" && typeof Error.captureStackTrace === \"function\") {\n Error.stackTraceLimit += 6;\n stackFramePattern = v8stackFramePattern;\n formatStack = v8stackFormatter;\n var captureStackTrace = Error.captureStackTrace;\n\n shouldIgnore = function shouldIgnore(line) {\n return bluebirdFramePattern.test(line);\n };\n\n return function (receiver, ignoreUntil) {\n Error.stackTraceLimit += 6;\n captureStackTrace(receiver, ignoreUntil);\n Error.stackTraceLimit -= 6;\n };\n }\n\n var err = new Error();\n\n if (typeof err.stack === \"string\" && err.stack.split(\"\\n\")[0].indexOf(\"stackDetection@\") >= 0) {\n stackFramePattern = /@/;\n formatStack = v8stackFormatter;\n indentStackFrames = true;\n return function captureStackTrace(o) {\n o.stack = new Error().stack;\n };\n }\n\n var hasStackAfterThrow;\n\n try {\n throw new Error();\n } catch (e) {\n hasStackAfterThrow = \"stack\" in e;\n }\n\n if (!(\"stack\" in err) && hasStackAfterThrow && typeof Error.stackTraceLimit === \"number\") {\n stackFramePattern = v8stackFramePattern;\n formatStack = v8stackFormatter;\n return function captureStackTrace(o) {\n Error.stackTraceLimit += 6;\n\n try {\n throw new Error();\n } catch (e) {\n o.stack = e.stack;\n }\n\n Error.stackTraceLimit -= 6;\n };\n }\n\n formatStack = function formatStack(stack, error) {\n if (typeof stack === \"string\") return stack;\n\n if ((_typeof(error) === \"object\" || typeof error === \"function\") && error.name !== undefined && error.message !== undefined) {\n return error.toString();\n }\n\n return formatNonError(error);\n };\n\n return null;\n }([]);\n\n if (typeof console !== \"undefined\" && typeof console.warn !== \"undefined\") {\n printWarning = function printWarning(message) {\n console.warn(message);\n };\n\n if (util.isNode && process.stderr.isTTY) {\n printWarning = function printWarning(message, isSoft) {\n var color = isSoft ? \"\\x1B[33m\" : \"\\x1B[31m\";\n console.warn(color + message + \"\\x1B[0m\\n\");\n };\n } else if (!util.isNode && typeof new Error().stack === \"string\") {\n printWarning = function printWarning(message, isSoft) {\n console.warn(\"%c\" + message, isSoft ? \"color: darkorange\" : \"color: red\");\n };\n }\n }\n\n var config = {\n warnings: warnings,\n longStackTraces: false,\n cancellation: false,\n monitoring: false\n };\n if (longStackTraces) Promise.longStackTraces();\n return {\n longStackTraces: function longStackTraces() {\n return config.longStackTraces;\n },\n warnings: function warnings() {\n return config.warnings;\n },\n cancellation: function cancellation() {\n return config.cancellation;\n },\n monitoring: function monitoring() {\n return config.monitoring;\n },\n propagateFromFunction: function propagateFromFunction() {\n return _propagateFromFunction;\n },\n boundValueFunction: function boundValueFunction() {\n return _boundValueFunction;\n },\n checkForgottenReturns: checkForgottenReturns,\n setBounds: setBounds,\n warn: warn,\n deprecated: deprecated,\n CapturedTrace: CapturedTrace,\n fireDomEvent: fireDomEvent,\n fireGlobalEvent: fireGlobalEvent\n };\n };\n }, {\n \"./errors\": 12,\n \"./es5\": 13,\n \"./util\": 36\n }],\n 10: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise) {\n function returner() {\n return this.value;\n }\n\n function thrower() {\n throw this.reason;\n }\n\n Promise.prototype[\"return\"] = Promise.prototype.thenReturn = function (value) {\n if (value instanceof Promise) value.suppressUnhandledRejections();\n return this._then(returner, undefined, undefined, {\n value: value\n }, undefined);\n };\n\n Promise.prototype[\"throw\"] = Promise.prototype.thenThrow = function (reason) {\n return this._then(thrower, undefined, undefined, {\n reason: reason\n }, undefined);\n };\n\n Promise.prototype.catchThrow = function (reason) {\n if (arguments.length <= 1) {\n return this._then(undefined, thrower, undefined, {\n reason: reason\n }, undefined);\n } else {\n var _reason = arguments[1];\n\n var handler = function handler() {\n throw _reason;\n };\n\n return this.caught(reason, handler);\n }\n };\n\n Promise.prototype.catchReturn = function (value) {\n if (arguments.length <= 1) {\n if (value instanceof Promise) value.suppressUnhandledRejections();\n return this._then(undefined, returner, undefined, {\n value: value\n }, undefined);\n } else {\n var _value = arguments[1];\n if (_value instanceof Promise) _value.suppressUnhandledRejections();\n\n var handler = function handler() {\n return _value;\n };\n\n return this.caught(value, handler);\n }\n };\n };\n }, {}],\n 11: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL) {\n var PromiseReduce = Promise.reduce;\n var PromiseAll = Promise.all;\n\n function promiseAllThis() {\n return PromiseAll(this);\n }\n\n function PromiseMapSeries(promises, fn) {\n return PromiseReduce(promises, fn, INTERNAL, INTERNAL);\n }\n\n Promise.prototype.each = function (fn) {\n return PromiseReduce(this, fn, INTERNAL, 0)._then(promiseAllThis, undefined, undefined, this, undefined);\n };\n\n Promise.prototype.mapSeries = function (fn) {\n return PromiseReduce(this, fn, INTERNAL, INTERNAL);\n };\n\n Promise.each = function (promises, fn) {\n return PromiseReduce(promises, fn, INTERNAL, 0)._then(promiseAllThis, undefined, undefined, promises, undefined);\n };\n\n Promise.mapSeries = PromiseMapSeries;\n };\n }, {}],\n 12: [function (_dereq_, module, exports) {\n \"use strict\";\n\n var es5 = _dereq_(\"./es5\");\n\n var Objectfreeze = es5.freeze;\n\n var util = _dereq_(\"./util\");\n\n var inherits = util.inherits;\n var notEnumerableProp = util.notEnumerableProp;\n\n function subError(nameProperty, defaultMessage) {\n function SubError(message) {\n if (!(this instanceof SubError)) return new SubError(message);\n notEnumerableProp(this, \"message\", typeof message === \"string\" ? message : defaultMessage);\n notEnumerableProp(this, \"name\", nameProperty);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n Error.call(this);\n }\n }\n\n inherits(SubError, Error);\n return SubError;\n }\n\n var _TypeError, _RangeError;\n\n var Warning = subError(\"Warning\", \"warning\");\n var CancellationError = subError(\"CancellationError\", \"cancellation error\");\n var TimeoutError = subError(\"TimeoutError\", \"timeout error\");\n var AggregateError = subError(\"AggregateError\", \"aggregate error\");\n\n try {\n _TypeError = TypeError;\n _RangeError = RangeError;\n } catch (e) {\n _TypeError = subError(\"TypeError\", \"type error\");\n _RangeError = subError(\"RangeError\", \"range error\");\n }\n\n var methods = (\"join pop push shift unshift slice filter forEach some \" + \"every map indexOf lastIndexOf reduce reduceRight sort reverse\").split(\" \");\n\n for (var i = 0; i < methods.length; ++i) {\n if (typeof Array.prototype[methods[i]] === \"function\") {\n AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];\n }\n }\n\n es5.defineProperty(AggregateError.prototype, \"length\", {\n value: 0,\n configurable: false,\n writable: true,\n enumerable: true\n });\n AggregateError.prototype[\"isOperational\"] = true;\n var level = 0;\n\n AggregateError.prototype.toString = function () {\n var indent = Array(level * 4 + 1).join(\" \");\n var ret = \"\\n\" + indent + \"AggregateError of:\" + \"\\n\";\n level++;\n indent = Array(level * 4 + 1).join(\" \");\n\n for (var i = 0; i < this.length; ++i) {\n var str = this[i] === this ? \"[Circular AggregateError]\" : this[i] + \"\";\n var lines = str.split(\"\\n\");\n\n for (var j = 0; j < lines.length; ++j) {\n lines[j] = indent + lines[j];\n }\n\n str = lines.join(\"\\n\");\n ret += str + \"\\n\";\n }\n\n level--;\n return ret;\n };\n\n function OperationalError(message) {\n if (!(this instanceof OperationalError)) return new OperationalError(message);\n notEnumerableProp(this, \"name\", \"OperationalError\");\n notEnumerableProp(this, \"message\", message);\n this.cause = message;\n this[\"isOperational\"] = true;\n\n if (message instanceof Error) {\n notEnumerableProp(this, \"message\", message.message);\n notEnumerableProp(this, \"stack\", message.stack);\n } else if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n inherits(OperationalError, Error);\n var errorTypes = Error[\"__BluebirdErrorTypes__\"];\n\n if (!errorTypes) {\n errorTypes = Objectfreeze({\n CancellationError: CancellationError,\n TimeoutError: TimeoutError,\n OperationalError: OperationalError,\n RejectionError: OperationalError,\n AggregateError: AggregateError\n });\n es5.defineProperty(Error, \"__BluebirdErrorTypes__\", {\n value: errorTypes,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n module.exports = {\n Error: Error,\n TypeError: _TypeError,\n RangeError: _RangeError,\n CancellationError: errorTypes.CancellationError,\n OperationalError: errorTypes.OperationalError,\n TimeoutError: errorTypes.TimeoutError,\n AggregateError: errorTypes.AggregateError,\n Warning: Warning\n };\n }, {\n \"./es5\": 13,\n \"./util\": 36\n }],\n 13: [function (_dereq_, module, exports) {\n var isES5 = function () {\n \"use strict\";\n\n return this === undefined;\n }();\n\n if (isES5) {\n module.exports = {\n freeze: Object.freeze,\n defineProperty: Object.defineProperty,\n getDescriptor: Object.getOwnPropertyDescriptor,\n keys: Object.keys,\n names: Object.getOwnPropertyNames,\n getPrototypeOf: Object.getPrototypeOf,\n isArray: Array.isArray,\n isES5: isES5,\n propertyIsWritable: function propertyIsWritable(obj, prop) {\n var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n return !!(!descriptor || descriptor.writable || descriptor.set);\n }\n };\n } else {\n var has = {}.hasOwnProperty;\n var str = {}.toString;\n var proto = {}.constructor.prototype;\n\n var ObjectKeys = function ObjectKeys(o) {\n var ret = [];\n\n for (var key in o) {\n if (has.call(o, key)) {\n ret.push(key);\n }\n }\n\n return ret;\n };\n\n var ObjectGetDescriptor = function ObjectGetDescriptor(o, key) {\n return {\n value: o[key]\n };\n };\n\n var ObjectDefineProperty = function ObjectDefineProperty(o, key, desc) {\n o[key] = desc.value;\n return o;\n };\n\n var ObjectFreeze = function ObjectFreeze(obj) {\n return obj;\n };\n\n var ObjectGetPrototypeOf = function ObjectGetPrototypeOf(obj) {\n try {\n return Object(obj).constructor.prototype;\n } catch (e) {\n return proto;\n }\n };\n\n var ArrayIsArray = function ArrayIsArray(obj) {\n try {\n return str.call(obj) === \"[object Array]\";\n } catch (e) {\n return false;\n }\n };\n\n module.exports = {\n isArray: ArrayIsArray,\n keys: ObjectKeys,\n names: ObjectKeys,\n defineProperty: ObjectDefineProperty,\n getDescriptor: ObjectGetDescriptor,\n freeze: ObjectFreeze,\n getPrototypeOf: ObjectGetPrototypeOf,\n isES5: isES5,\n propertyIsWritable: function propertyIsWritable() {\n return true;\n }\n };\n }\n }, {}],\n 14: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL) {\n var PromiseMap = Promise.map;\n\n Promise.prototype.filter = function (fn, options) {\n return PromiseMap(this, fn, options, INTERNAL);\n };\n\n Promise.filter = function (promises, fn, options) {\n return PromiseMap(promises, fn, options, INTERNAL);\n };\n };\n }, {}],\n 15: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, tryConvertToPromise, NEXT_FILTER) {\n var util = _dereq_(\"./util\");\n\n var CancellationError = Promise.CancellationError;\n var errorObj = util.errorObj;\n\n var catchFilter = _dereq_(\"./catch_filter\")(NEXT_FILTER);\n\n function PassThroughHandlerContext(promise, type, handler) {\n this.promise = promise;\n this.type = type;\n this.handler = handler;\n this.called = false;\n this.cancelPromise = null;\n }\n\n PassThroughHandlerContext.prototype.isFinallyHandler = function () {\n return this.type === 0;\n };\n\n function FinallyHandlerCancelReaction(finallyHandler) {\n this.finallyHandler = finallyHandler;\n }\n\n FinallyHandlerCancelReaction.prototype._resultCancelled = function () {\n checkCancel(this.finallyHandler);\n };\n\n function checkCancel(ctx, reason) {\n if (ctx.cancelPromise != null) {\n if (arguments.length > 1) {\n ctx.cancelPromise._reject(reason);\n } else {\n ctx.cancelPromise._cancel();\n }\n\n ctx.cancelPromise = null;\n return true;\n }\n\n return false;\n }\n\n function succeed() {\n return finallyHandler.call(this, this.promise._target()._settledValue());\n }\n\n function fail(reason) {\n if (checkCancel(this, reason)) return;\n errorObj.e = reason;\n return errorObj;\n }\n\n function finallyHandler(reasonOrValue) {\n var promise = this.promise;\n var handler = this.handler;\n\n if (!this.called) {\n this.called = true;\n var ret = this.isFinallyHandler() ? handler.call(promise._boundValue()) : handler.call(promise._boundValue(), reasonOrValue);\n\n if (ret === NEXT_FILTER) {\n return ret;\n } else if (ret !== undefined) {\n promise._setReturnedNonUndefined();\n\n var maybePromise = tryConvertToPromise(ret, promise);\n\n if (maybePromise instanceof Promise) {\n if (this.cancelPromise != null) {\n if (maybePromise._isCancelled()) {\n var reason = new CancellationError(\"late cancellation observer\");\n\n promise._attachExtraTrace(reason);\n\n errorObj.e = reason;\n return errorObj;\n } else if (maybePromise.isPending()) {\n maybePromise._attachCancellationCallback(new FinallyHandlerCancelReaction(this));\n }\n }\n\n return maybePromise._then(succeed, fail, undefined, this, undefined);\n }\n }\n }\n\n if (promise.isRejected()) {\n checkCancel(this);\n errorObj.e = reasonOrValue;\n return errorObj;\n } else {\n checkCancel(this);\n return reasonOrValue;\n }\n }\n\n Promise.prototype._passThrough = function (handler, type, success, fail) {\n if (typeof handler !== \"function\") return this.then();\n return this._then(success, fail, undefined, new PassThroughHandlerContext(this, type, handler), undefined);\n };\n\n Promise.prototype.lastly = Promise.prototype[\"finally\"] = function (handler) {\n return this._passThrough(handler, 0, finallyHandler, finallyHandler);\n };\n\n Promise.prototype.tap = function (handler) {\n return this._passThrough(handler, 1, finallyHandler);\n };\n\n Promise.prototype.tapCatch = function (handlerOrPredicate) {\n var len = arguments.length;\n\n if (len === 1) {\n return this._passThrough(handlerOrPredicate, 1, undefined, finallyHandler);\n } else {\n var catchInstances = new Array(len - 1),\n j = 0,\n i;\n\n for (i = 0; i < len - 1; ++i) {\n var item = arguments[i];\n\n if (util.isObject(item)) {\n catchInstances[j++] = item;\n } else {\n return Promise.reject(new TypeError(\"tapCatch statement predicate: \" + \"expecting an object but got \" + util.classString(item)));\n }\n }\n\n catchInstances.length = j;\n var handler = arguments[i];\n return this._passThrough(catchFilter(catchInstances, handler, this), 1, undefined, finallyHandler);\n }\n };\n\n return PassThroughHandlerContext;\n };\n }, {\n \"./catch_filter\": 7,\n \"./util\": 36\n }],\n 16: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug) {\n var errors = _dereq_(\"./errors\");\n\n var TypeError = errors.TypeError;\n\n var util = _dereq_(\"./util\");\n\n var errorObj = util.errorObj;\n var tryCatch = util.tryCatch;\n var yieldHandlers = [];\n\n function promiseFromYieldHandler(value, yieldHandlers, traceParent) {\n for (var i = 0; i < yieldHandlers.length; ++i) {\n traceParent._pushContext();\n\n var result = tryCatch(yieldHandlers[i])(value);\n\n traceParent._popContext();\n\n if (result === errorObj) {\n traceParent._pushContext();\n\n var ret = Promise.reject(errorObj.e);\n\n traceParent._popContext();\n\n return ret;\n }\n\n var maybePromise = tryConvertToPromise(result, traceParent);\n if (maybePromise instanceof Promise) return maybePromise;\n }\n\n return null;\n }\n\n function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {\n if (debug.cancellation()) {\n var internal = new Promise(INTERNAL);\n\n var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);\n\n this._promise = internal.lastly(function () {\n return _finallyPromise;\n });\n\n internal._captureStackTrace();\n\n internal._setOnCancel(this);\n } else {\n var promise = this._promise = new Promise(INTERNAL);\n\n promise._captureStackTrace();\n }\n\n this._stack = stack;\n this._generatorFunction = generatorFunction;\n this._receiver = receiver;\n this._generator = undefined;\n this._yieldHandlers = typeof yieldHandler === \"function\" ? [yieldHandler].concat(yieldHandlers) : yieldHandlers;\n this._yieldedPromise = null;\n this._cancellationPhase = false;\n }\n\n util.inherits(PromiseSpawn, Proxyable);\n\n PromiseSpawn.prototype._isResolved = function () {\n return this._promise === null;\n };\n\n PromiseSpawn.prototype._cleanup = function () {\n this._promise = this._generator = null;\n\n if (debug.cancellation() && this._finallyPromise !== null) {\n this._finallyPromise._fulfill();\n\n this._finallyPromise = null;\n }\n };\n\n PromiseSpawn.prototype._promiseCancelled = function () {\n if (this._isResolved()) return;\n var implementsReturn = typeof this._generator[\"return\"] !== \"undefined\";\n var result;\n\n if (!implementsReturn) {\n var reason = new Promise.CancellationError(\"generator .return() sentinel\");\n Promise.coroutine.returnSentinel = reason;\n\n this._promise._attachExtraTrace(reason);\n\n this._promise._pushContext();\n\n result = tryCatch(this._generator[\"throw\"]).call(this._generator, reason);\n\n this._promise._popContext();\n } else {\n this._promise._pushContext();\n\n result = tryCatch(this._generator[\"return\"]).call(this._generator, undefined);\n\n this._promise._popContext();\n }\n\n this._cancellationPhase = true;\n this._yieldedPromise = null;\n\n this._continue(result);\n };\n\n PromiseSpawn.prototype._promiseFulfilled = function (value) {\n this._yieldedPromise = null;\n\n this._promise._pushContext();\n\n var result = tryCatch(this._generator.next).call(this._generator, value);\n\n this._promise._popContext();\n\n this._continue(result);\n };\n\n PromiseSpawn.prototype._promiseRejected = function (reason) {\n this._yieldedPromise = null;\n\n this._promise._attachExtraTrace(reason);\n\n this._promise._pushContext();\n\n var result = tryCatch(this._generator[\"throw\"]).call(this._generator, reason);\n\n this._promise._popContext();\n\n this._continue(result);\n };\n\n PromiseSpawn.prototype._resultCancelled = function () {\n if (this._yieldedPromise instanceof Promise) {\n var promise = this._yieldedPromise;\n this._yieldedPromise = null;\n promise.cancel();\n }\n };\n\n PromiseSpawn.prototype.promise = function () {\n return this._promise;\n };\n\n PromiseSpawn.prototype._run = function () {\n this._generator = this._generatorFunction.call(this._receiver);\n this._receiver = this._generatorFunction = undefined;\n\n this._promiseFulfilled(undefined);\n };\n\n PromiseSpawn.prototype._continue = function (result) {\n var promise = this._promise;\n\n if (result === errorObj) {\n this._cleanup();\n\n if (this._cancellationPhase) {\n return promise.cancel();\n } else {\n return promise._rejectCallback(result.e, false);\n }\n }\n\n var value = result.value;\n\n if (result.done === true) {\n this._cleanup();\n\n if (this._cancellationPhase) {\n return promise.cancel();\n } else {\n return promise._resolveCallback(value);\n }\n } else {\n var maybePromise = tryConvertToPromise(value, this._promise);\n\n if (!(maybePromise instanceof Promise)) {\n maybePromise = promiseFromYieldHandler(maybePromise, this._yieldHandlers, this._promise);\n\n if (maybePromise === null) {\n this._promiseRejected(new TypeError(\"A value %s was yielded that could not be treated as a promise\\n\\n See http://goo.gl/MqrFmX\\n\\n\".replace(\"%s\", String(value)) + \"From coroutine:\\n\" + this._stack.split(\"\\n\").slice(1, -7).join(\"\\n\")));\n\n return;\n }\n }\n\n maybePromise = maybePromise._target();\n var bitField = maybePromise._bitField;\n ;\n\n if ((bitField & 50397184) === 0) {\n this._yieldedPromise = maybePromise;\n\n maybePromise._proxy(this, null);\n } else if ((bitField & 33554432) !== 0) {\n Promise._async.invoke(this._promiseFulfilled, this, maybePromise._value());\n } else if ((bitField & 16777216) !== 0) {\n Promise._async.invoke(this._promiseRejected, this, maybePromise._reason());\n } else {\n this._promiseCancelled();\n }\n }\n };\n\n Promise.coroutine = function (generatorFunction, options) {\n if (typeof generatorFunction !== \"function\") {\n throw new TypeError(\"generatorFunction must be a function\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n var yieldHandler = Object(options).yieldHandler;\n var PromiseSpawn$ = PromiseSpawn;\n var stack = new Error().stack;\n return function () {\n var generator = generatorFunction.apply(this, arguments);\n var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, stack);\n var ret = spawn.promise();\n spawn._generator = generator;\n\n spawn._promiseFulfilled(undefined);\n\n return ret;\n };\n };\n\n Promise.coroutine.addYieldHandler = function (fn) {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n }\n\n yieldHandlers.push(fn);\n };\n\n Promise.spawn = function (generatorFunction) {\n debug.deprecated(\"Promise.spawn()\", \"Promise.coroutine()\");\n\n if (typeof generatorFunction !== \"function\") {\n return apiRejection(\"generatorFunction must be a function\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n var spawn = new PromiseSpawn(generatorFunction, this);\n var ret = spawn.promise();\n\n spawn._run(Promise.spawn);\n\n return ret;\n };\n };\n }, {\n \"./errors\": 12,\n \"./util\": 36\n }],\n 17: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain) {\n var util = _dereq_(\"./util\");\n\n var canEvaluate = util.canEvaluate;\n var tryCatch = util.tryCatch;\n var errorObj = util.errorObj;\n var reject;\n\n if (!true) {\n if (canEvaluate) {\n var thenCallback = function thenCallback(i) {\n return new Function(\"value\", \"holder\", \" \\n\\\n 'use strict'; \\n\\\n holder.pIndex = value; \\n\\\n holder.checkFulfillment(this); \\n\\\n \".replace(/Index/g, i));\n };\n\n var promiseSetter = function promiseSetter(i) {\n return new Function(\"promise\", \"holder\", \" \\n\\\n 'use strict'; \\n\\\n holder.pIndex = promise; \\n\\\n \".replace(/Index/g, i));\n };\n\n var generateHolderClass = function generateHolderClass(total) {\n var props = new Array(total);\n\n for (var i = 0; i < props.length; ++i) {\n props[i] = \"this.p\" + (i + 1);\n }\n\n var assignment = props.join(\" = \") + \" = null;\";\n var cancellationCode = \"var promise;\\n\" + props.map(function (prop) {\n return \" \\n\\\n promise = \" + prop + \"; \\n\\\n if (promise instanceof Promise) { \\n\\\n promise.cancel(); \\n\\\n } \\n\\\n \";\n }).join(\"\\n\");\n var passedArguments = props.join(\", \");\n var name = \"Holder$\" + total;\n var code = \"return function(tryCatch, errorObj, Promise, async) { \\n\\\n 'use strict'; \\n\\\n function [TheName](fn) { \\n\\\n [TheProperties] \\n\\\n this.fn = fn; \\n\\\n this.asyncNeeded = true; \\n\\\n this.now = 0; \\n\\\n } \\n\\\n \\n\\\n [TheName].prototype._callFunction = function(promise) { \\n\\\n promise._pushContext(); \\n\\\n var ret = tryCatch(this.fn)([ThePassedArguments]); \\n\\\n promise._popContext(); \\n\\\n if (ret === errorObj) { \\n\\\n promise._rejectCallback(ret.e, false); \\n\\\n } else { \\n\\\n promise._resolveCallback(ret); \\n\\\n } \\n\\\n }; \\n\\\n \\n\\\n [TheName].prototype.checkFulfillment = function(promise) { \\n\\\n var now = ++this.now; \\n\\\n if (now === [TheTotal]) { \\n\\\n if (this.asyncNeeded) { \\n\\\n async.invoke(this._callFunction, this, promise); \\n\\\n } else { \\n\\\n this._callFunction(promise); \\n\\\n } \\n\\\n \\n\\\n } \\n\\\n }; \\n\\\n \\n\\\n [TheName].prototype._resultCancelled = function() { \\n\\\n [CancellationCode] \\n\\\n }; \\n\\\n \\n\\\n return [TheName]; \\n\\\n }(tryCatch, errorObj, Promise, async); \\n\\\n \";\n code = code.replace(/\\[TheName\\]/g, name).replace(/\\[TheTotal\\]/g, total).replace(/\\[ThePassedArguments\\]/g, passedArguments).replace(/\\[TheProperties\\]/g, assignment).replace(/\\[CancellationCode\\]/g, cancellationCode);\n return new Function(\"tryCatch\", \"errorObj\", \"Promise\", \"async\", code)(tryCatch, errorObj, Promise, async);\n };\n\n var holderClasses = [];\n var thenCallbacks = [];\n var promiseSetters = [];\n\n for (var i = 0; i < 8; ++i) {\n holderClasses.push(generateHolderClass(i + 1));\n thenCallbacks.push(thenCallback(i + 1));\n promiseSetters.push(promiseSetter(i + 1));\n }\n\n reject = function reject(reason) {\n this._reject(reason);\n };\n }\n }\n\n Promise.join = function () {\n var last = arguments.length - 1;\n var fn;\n\n if (last > 0 && typeof arguments[last] === \"function\") {\n fn = arguments[last];\n\n if (!true) {\n if (last <= 8 && canEvaluate) {\n var ret = new Promise(INTERNAL);\n\n ret._captureStackTrace();\n\n var HolderClass = holderClasses[last - 1];\n var holder = new HolderClass(fn);\n var callbacks = thenCallbacks;\n\n for (var i = 0; i < last; ++i) {\n var maybePromise = tryConvertToPromise(arguments[i], ret);\n\n if (maybePromise instanceof Promise) {\n maybePromise = maybePromise._target();\n var bitField = maybePromise._bitField;\n ;\n\n if ((bitField & 50397184) === 0) {\n maybePromise._then(callbacks[i], reject, undefined, ret, holder);\n\n promiseSetters[i](maybePromise, holder);\n holder.asyncNeeded = false;\n } else if ((bitField & 33554432) !== 0) {\n callbacks[i].call(ret, maybePromise._value(), holder);\n } else if ((bitField & 16777216) !== 0) {\n ret._reject(maybePromise._reason());\n } else {\n ret._cancel();\n }\n } else {\n callbacks[i].call(ret, maybePromise, holder);\n }\n }\n\n if (!ret._isFateSealed()) {\n if (holder.asyncNeeded) {\n var domain = getDomain();\n\n if (domain !== null) {\n holder.fn = util.domainBind(domain, holder.fn);\n }\n }\n\n ret._setAsyncGuaranteed();\n\n ret._setOnCancel(holder);\n }\n\n return ret;\n }\n }\n }\n\n var args = [].slice.call(arguments);\n ;\n if (fn) args.pop();\n var ret = new PromiseArray(args).promise();\n return fn !== undefined ? ret.spread(fn) : ret;\n };\n };\n }, {\n \"./util\": 36\n }],\n 18: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug) {\n var getDomain = Promise._getDomain;\n\n var util = _dereq_(\"./util\");\n\n var tryCatch = util.tryCatch;\n var errorObj = util.errorObj;\n var async = Promise._async;\n\n function MappingPromiseArray(promises, fn, limit, _filter) {\n this.constructor$(promises);\n\n this._promise._captureStackTrace();\n\n var domain = getDomain();\n this._callback = domain === null ? fn : util.domainBind(domain, fn);\n this._preservedValues = _filter === INTERNAL ? new Array(this.length()) : null;\n this._limit = limit;\n this._inFlight = 0;\n this._queue = [];\n async.invoke(this._asyncInit, this, undefined);\n }\n\n util.inherits(MappingPromiseArray, PromiseArray);\n\n MappingPromiseArray.prototype._asyncInit = function () {\n this._init$(undefined, -2);\n };\n\n MappingPromiseArray.prototype._init = function () {};\n\n MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {\n var values = this._values;\n var length = this.length();\n var preservedValues = this._preservedValues;\n var limit = this._limit;\n\n if (index < 0) {\n index = index * -1 - 1;\n values[index] = value;\n\n if (limit >= 1) {\n this._inFlight--;\n\n this._drainQueue();\n\n if (this._isResolved()) return true;\n }\n } else {\n if (limit >= 1 && this._inFlight >= limit) {\n values[index] = value;\n\n this._queue.push(index);\n\n return false;\n }\n\n if (preservedValues !== null) preservedValues[index] = value;\n var promise = this._promise;\n var callback = this._callback;\n\n var receiver = promise._boundValue();\n\n promise._pushContext();\n\n var ret = tryCatch(callback).call(receiver, value, index, length);\n\n var promiseCreated = promise._popContext();\n\n debug.checkForgottenReturns(ret, promiseCreated, preservedValues !== null ? \"Promise.filter\" : \"Promise.map\", promise);\n\n if (ret === errorObj) {\n this._reject(ret.e);\n\n return true;\n }\n\n var maybePromise = tryConvertToPromise(ret, this._promise);\n\n if (maybePromise instanceof Promise) {\n maybePromise = maybePromise._target();\n var bitField = maybePromise._bitField;\n ;\n\n if ((bitField & 50397184) === 0) {\n if (limit >= 1) this._inFlight++;\n values[index] = maybePromise;\n\n maybePromise._proxy(this, (index + 1) * -1);\n\n return false;\n } else if ((bitField & 33554432) !== 0) {\n ret = maybePromise._value();\n } else if ((bitField & 16777216) !== 0) {\n this._reject(maybePromise._reason());\n\n return true;\n } else {\n this._cancel();\n\n return true;\n }\n }\n\n values[index] = ret;\n }\n\n var totalResolved = ++this._totalResolved;\n\n if (totalResolved >= length) {\n if (preservedValues !== null) {\n this._filter(values, preservedValues);\n } else {\n this._resolve(values);\n }\n\n return true;\n }\n\n return false;\n };\n\n MappingPromiseArray.prototype._drainQueue = function () {\n var queue = this._queue;\n var limit = this._limit;\n var values = this._values;\n\n while (queue.length > 0 && this._inFlight < limit) {\n if (this._isResolved()) return;\n var index = queue.pop();\n\n this._promiseFulfilled(values[index], index);\n }\n };\n\n MappingPromiseArray.prototype._filter = function (booleans, values) {\n var len = values.length;\n var ret = new Array(len);\n var j = 0;\n\n for (var i = 0; i < len; ++i) {\n if (booleans[i]) ret[j++] = values[i];\n }\n\n ret.length = j;\n\n this._resolve(ret);\n };\n\n MappingPromiseArray.prototype.preservedValues = function () {\n return this._preservedValues;\n };\n\n function map(promises, fn, options, _filter) {\n if (typeof fn !== \"function\") {\n return apiRejection(\"expecting a function but got \" + util.classString(fn));\n }\n\n var limit = 0;\n\n if (options !== undefined) {\n if (_typeof(options) === \"object\" && options !== null) {\n if (typeof options.concurrency !== \"number\") {\n return Promise.reject(new TypeError(\"'concurrency' must be a number but it is \" + util.classString(options.concurrency)));\n }\n\n limit = options.concurrency;\n } else {\n return Promise.reject(new TypeError(\"options argument must be an object but it is \" + util.classString(options)));\n }\n }\n\n limit = typeof limit === \"number\" && isFinite(limit) && limit >= 1 ? limit : 0;\n return new MappingPromiseArray(promises, fn, limit, _filter).promise();\n }\n\n Promise.prototype.map = function (fn, options) {\n return map(this, fn, options, null);\n };\n\n Promise.map = function (promises, fn, options, _filter) {\n return map(promises, fn, options, _filter);\n };\n };\n }, {\n \"./util\": 36\n }],\n 19: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {\n var util = _dereq_(\"./util\");\n\n var tryCatch = util.tryCatch;\n\n Promise.method = function (fn) {\n if (typeof fn !== \"function\") {\n throw new Promise.TypeError(\"expecting a function but got \" + util.classString(fn));\n }\n\n return function () {\n var ret = new Promise(INTERNAL);\n\n ret._captureStackTrace();\n\n ret._pushContext();\n\n var value = tryCatch(fn).apply(this, arguments);\n\n var promiseCreated = ret._popContext();\n\n debug.checkForgottenReturns(value, promiseCreated, \"Promise.method\", ret);\n\n ret._resolveFromSyncValue(value);\n\n return ret;\n };\n };\n\n Promise.attempt = Promise[\"try\"] = function (fn) {\n if (typeof fn !== \"function\") {\n return apiRejection(\"expecting a function but got \" + util.classString(fn));\n }\n\n var ret = new Promise(INTERNAL);\n\n ret._captureStackTrace();\n\n ret._pushContext();\n\n var value;\n\n if (arguments.length > 1) {\n debug.deprecated(\"calling Promise.try with more than 1 argument\");\n var arg = arguments[1];\n var ctx = arguments[2];\n value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) : tryCatch(fn).call(ctx, arg);\n } else {\n value = tryCatch(fn)();\n }\n\n var promiseCreated = ret._popContext();\n\n debug.checkForgottenReturns(value, promiseCreated, \"Promise.try\", ret);\n\n ret._resolveFromSyncValue(value);\n\n return ret;\n };\n\n Promise.prototype._resolveFromSyncValue = function (value) {\n if (value === util.errorObj) {\n this._rejectCallback(value.e, false);\n } else {\n this._resolveCallback(value, true);\n }\n };\n };\n }, {\n \"./util\": 36\n }],\n 20: [function (_dereq_, module, exports) {\n \"use strict\";\n\n var util = _dereq_(\"./util\");\n\n var maybeWrapAsError = util.maybeWrapAsError;\n\n var errors = _dereq_(\"./errors\");\n\n var OperationalError = errors.OperationalError;\n\n var es5 = _dereq_(\"./es5\");\n\n function isUntypedError(obj) {\n return obj instanceof Error && es5.getPrototypeOf(obj) === Error.prototype;\n }\n\n var rErrorKey = /^(?:name|message|stack|cause)$/;\n\n function wrapAsOperationalError(obj) {\n var ret;\n\n if (isUntypedError(obj)) {\n ret = new OperationalError(obj);\n ret.name = obj.name;\n ret.message = obj.message;\n ret.stack = obj.stack;\n var keys = es5.keys(obj);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!rErrorKey.test(key)) {\n ret[key] = obj[key];\n }\n }\n\n return ret;\n }\n\n util.markAsOriginatingFromRejection(obj);\n return obj;\n }\n\n function nodebackForPromise(promise, multiArgs) {\n return function (err, value) {\n if (promise === null) return;\n\n if (err) {\n var wrapped = wrapAsOperationalError(maybeWrapAsError(err));\n\n promise._attachExtraTrace(wrapped);\n\n promise._reject(wrapped);\n } else if (!multiArgs) {\n promise._fulfill(value);\n } else {\n var args = [].slice.call(arguments, 1);\n ;\n\n promise._fulfill(args);\n }\n\n promise = null;\n };\n }\n\n module.exports = nodebackForPromise;\n }, {\n \"./errors\": 12,\n \"./es5\": 13,\n \"./util\": 36\n }],\n 21: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise) {\n var util = _dereq_(\"./util\");\n\n var async = Promise._async;\n var tryCatch = util.tryCatch;\n var errorObj = util.errorObj;\n\n function spreadAdapter(val, nodeback) {\n var promise = this;\n if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);\n var ret = tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));\n\n if (ret === errorObj) {\n async.throwLater(ret.e);\n }\n }\n\n function successAdapter(val, nodeback) {\n var promise = this;\n\n var receiver = promise._boundValue();\n\n var ret = val === undefined ? tryCatch(nodeback).call(receiver, null) : tryCatch(nodeback).call(receiver, null, val);\n\n if (ret === errorObj) {\n async.throwLater(ret.e);\n }\n }\n\n function errorAdapter(reason, nodeback) {\n var promise = this;\n\n if (!reason) {\n var newReason = new Error(reason + \"\");\n newReason.cause = reason;\n reason = newReason;\n }\n\n var ret = tryCatch(nodeback).call(promise._boundValue(), reason);\n\n if (ret === errorObj) {\n async.throwLater(ret.e);\n }\n }\n\n Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, options) {\n if (typeof nodeback == \"function\") {\n var adapter = successAdapter;\n\n if (options !== undefined && Object(options).spread) {\n adapter = spreadAdapter;\n }\n\n this._then(adapter, errorAdapter, undefined, this, nodeback);\n }\n\n return this;\n };\n };\n }, {\n \"./util\": 36\n }],\n 22: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function () {\n var makeSelfResolutionError = function makeSelfResolutionError() {\n return new TypeError(\"circular promise resolution chain\\n\\n See http://goo.gl/MqrFmX\\n\");\n };\n\n var reflectHandler = function reflectHandler() {\n return new Promise.PromiseInspection(this._target());\n };\n\n var apiRejection = function apiRejection(msg) {\n return Promise.reject(new TypeError(msg));\n };\n\n function Proxyable() {}\n\n var UNDEFINED_BINDING = {};\n\n var util = _dereq_(\"./util\");\n\n var getDomain;\n\n if (util.isNode) {\n getDomain = function getDomain() {\n var ret = process.domain;\n if (ret === undefined) ret = null;\n return ret;\n };\n } else {\n getDomain = function getDomain() {\n return null;\n };\n }\n\n util.notEnumerableProp(Promise, \"_getDomain\", getDomain);\n\n var es5 = _dereq_(\"./es5\");\n\n var Async = _dereq_(\"./async\");\n\n var async = new Async();\n es5.defineProperty(Promise, \"_async\", {\n value: async\n });\n\n var errors = _dereq_(\"./errors\");\n\n var TypeError = Promise.TypeError = errors.TypeError;\n Promise.RangeError = errors.RangeError;\n var CancellationError = Promise.CancellationError = errors.CancellationError;\n Promise.TimeoutError = errors.TimeoutError;\n Promise.OperationalError = errors.OperationalError;\n Promise.RejectionError = errors.OperationalError;\n Promise.AggregateError = errors.AggregateError;\n\n var INTERNAL = function INTERNAL() {};\n\n var APPLY = {};\n var NEXT_FILTER = {};\n\n var tryConvertToPromise = _dereq_(\"./thenables\")(Promise, INTERNAL);\n\n var PromiseArray = _dereq_(\"./promise_array\")(Promise, INTERNAL, tryConvertToPromise, apiRejection, Proxyable);\n\n var Context = _dereq_(\"./context\")(Promise);\n /*jshint unused:false*/\n\n\n var createContext = Context.create;\n\n var debug = _dereq_(\"./debuggability\")(Promise, Context);\n\n var CapturedTrace = debug.CapturedTrace;\n\n var PassThroughHandlerContext = _dereq_(\"./finally\")(Promise, tryConvertToPromise, NEXT_FILTER);\n\n var catchFilter = _dereq_(\"./catch_filter\")(NEXT_FILTER);\n\n var nodebackForPromise = _dereq_(\"./nodeback\");\n\n var errorObj = util.errorObj;\n var tryCatch = util.tryCatch;\n\n function check(self, executor) {\n if (self == null || self.constructor !== Promise) {\n throw new TypeError(\"the promise constructor cannot be invoked directly\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n if (typeof executor !== \"function\") {\n throw new TypeError(\"expecting a function but got \" + util.classString(executor));\n }\n }\n\n function Promise(executor) {\n if (executor !== INTERNAL) {\n check(this, executor);\n }\n\n this._bitField = 0;\n this._fulfillmentHandler0 = undefined;\n this._rejectionHandler0 = undefined;\n this._promise0 = undefined;\n this._receiver0 = undefined;\n\n this._resolveFromExecutor(executor);\n\n this._promiseCreated();\n\n this._fireEvent(\"promiseCreated\", this);\n }\n\n Promise.prototype.toString = function () {\n return \"[object Promise]\";\n };\n\n Promise.prototype.caught = Promise.prototype[\"catch\"] = function (fn) {\n var len = arguments.length;\n\n if (len > 1) {\n var catchInstances = new Array(len - 1),\n j = 0,\n i;\n\n for (i = 0; i < len - 1; ++i) {\n var item = arguments[i];\n\n if (util.isObject(item)) {\n catchInstances[j++] = item;\n } else {\n return apiRejection(\"Catch statement predicate: \" + \"expecting an object but got \" + util.classString(item));\n }\n }\n\n catchInstances.length = j;\n fn = arguments[i];\n return this.then(undefined, catchFilter(catchInstances, fn, this));\n }\n\n return this.then(undefined, fn);\n };\n\n Promise.prototype.reflect = function () {\n return this._then(reflectHandler, reflectHandler, undefined, this, undefined);\n };\n\n Promise.prototype.then = function (didFulfill, didReject) {\n if (debug.warnings() && arguments.length > 0 && typeof didFulfill !== \"function\" && typeof didReject !== \"function\") {\n var msg = \".then() only accepts functions but was passed: \" + util.classString(didFulfill);\n\n if (arguments.length > 1) {\n msg += \", \" + util.classString(didReject);\n }\n\n this._warn(msg);\n }\n\n return this._then(didFulfill, didReject, undefined, undefined, undefined);\n };\n\n Promise.prototype.done = function (didFulfill, didReject) {\n var promise = this._then(didFulfill, didReject, undefined, undefined, undefined);\n\n promise._setIsFinal();\n };\n\n Promise.prototype.spread = function (fn) {\n if (typeof fn !== \"function\") {\n return apiRejection(\"expecting a function but got \" + util.classString(fn));\n }\n\n return this.all()._then(fn, undefined, undefined, APPLY, undefined);\n };\n\n Promise.prototype.toJSON = function () {\n var ret = {\n isFulfilled: false,\n isRejected: false,\n fulfillmentValue: undefined,\n rejectionReason: undefined\n };\n\n if (this.isFulfilled()) {\n ret.fulfillmentValue = this.value();\n ret.isFulfilled = true;\n } else if (this.isRejected()) {\n ret.rejectionReason = this.reason();\n ret.isRejected = true;\n }\n\n return ret;\n };\n\n Promise.prototype.all = function () {\n if (arguments.length > 0) {\n this._warn(\".all() was passed arguments but it does not take any\");\n }\n\n return new PromiseArray(this).promise();\n };\n\n Promise.prototype.error = function (fn) {\n return this.caught(util.originatesFromRejection, fn);\n };\n\n Promise.getNewLibraryCopy = module.exports;\n\n Promise.is = function (val) {\n return val instanceof Promise;\n };\n\n Promise.fromNode = Promise.fromCallback = function (fn) {\n var ret = new Promise(INTERNAL);\n\n ret._captureStackTrace();\n\n var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs : false;\n var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));\n\n if (result === errorObj) {\n ret._rejectCallback(result.e, true);\n }\n\n if (!ret._isFateSealed()) ret._setAsyncGuaranteed();\n return ret;\n };\n\n Promise.all = function (promises) {\n return new PromiseArray(promises).promise();\n };\n\n Promise.cast = function (obj) {\n var ret = tryConvertToPromise(obj);\n\n if (!(ret instanceof Promise)) {\n ret = new Promise(INTERNAL);\n\n ret._captureStackTrace();\n\n ret._setFulfilled();\n\n ret._rejectionHandler0 = obj;\n }\n\n return ret;\n };\n\n Promise.resolve = Promise.fulfilled = Promise.cast;\n\n Promise.reject = Promise.rejected = function (reason) {\n var ret = new Promise(INTERNAL);\n\n ret._captureStackTrace();\n\n ret._rejectCallback(reason, true);\n\n return ret;\n };\n\n Promise.setScheduler = function (fn) {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n }\n\n return async.setScheduler(fn);\n };\n\n Promise.prototype._then = function (didFulfill, didReject, _, receiver, internalData) {\n var haveInternalData = internalData !== undefined;\n var promise = haveInternalData ? internalData : new Promise(INTERNAL);\n\n var target = this._target();\n\n var bitField = target._bitField;\n\n if (!haveInternalData) {\n promise._propagateFrom(this, 3);\n\n promise._captureStackTrace();\n\n if (receiver === undefined && (this._bitField & 2097152) !== 0) {\n if (!((bitField & 50397184) === 0)) {\n receiver = this._boundValue();\n } else {\n receiver = target === this ? undefined : this._boundTo;\n }\n }\n\n this._fireEvent(\"promiseChained\", this, promise);\n }\n\n var domain = getDomain();\n\n if (!((bitField & 50397184) === 0)) {\n var handler,\n value,\n settler = target._settlePromiseCtx;\n\n if ((bitField & 33554432) !== 0) {\n value = target._rejectionHandler0;\n handler = didFulfill;\n } else if ((bitField & 16777216) !== 0) {\n value = target._fulfillmentHandler0;\n handler = didReject;\n\n target._unsetRejectionIsUnhandled();\n } else {\n settler = target._settlePromiseLateCancellationObserver;\n value = new CancellationError(\"late cancellation observer\");\n\n target._attachExtraTrace(value);\n\n handler = didReject;\n }\n\n async.invoke(settler, target, {\n handler: domain === null ? handler : typeof handler === \"function\" && util.domainBind(domain, handler),\n promise: promise,\n receiver: receiver,\n value: value\n });\n } else {\n target._addCallbacks(didFulfill, didReject, promise, receiver, domain);\n }\n\n return promise;\n };\n\n Promise.prototype._length = function () {\n return this._bitField & 65535;\n };\n\n Promise.prototype._isFateSealed = function () {\n return (this._bitField & 117506048) !== 0;\n };\n\n Promise.prototype._isFollowing = function () {\n return (this._bitField & 67108864) === 67108864;\n };\n\n Promise.prototype._setLength = function (len) {\n this._bitField = this._bitField & -65536 | len & 65535;\n };\n\n Promise.prototype._setFulfilled = function () {\n this._bitField = this._bitField | 33554432;\n\n this._fireEvent(\"promiseFulfilled\", this);\n };\n\n Promise.prototype._setRejected = function () {\n this._bitField = this._bitField | 16777216;\n\n this._fireEvent(\"promiseRejected\", this);\n };\n\n Promise.prototype._setFollowing = function () {\n this._bitField = this._bitField | 67108864;\n\n this._fireEvent(\"promiseResolved\", this);\n };\n\n Promise.prototype._setIsFinal = function () {\n this._bitField = this._bitField | 4194304;\n };\n\n Promise.prototype._isFinal = function () {\n return (this._bitField & 4194304) > 0;\n };\n\n Promise.prototype._unsetCancelled = function () {\n this._bitField = this._bitField & ~65536;\n };\n\n Promise.prototype._setCancelled = function () {\n this._bitField = this._bitField | 65536;\n\n this._fireEvent(\"promiseCancelled\", this);\n };\n\n Promise.prototype._setWillBeCancelled = function () {\n this._bitField = this._bitField | 8388608;\n };\n\n Promise.prototype._setAsyncGuaranteed = function () {\n if (async.hasCustomScheduler()) return;\n this._bitField = this._bitField | 134217728;\n };\n\n Promise.prototype._receiverAt = function (index) {\n var ret = index === 0 ? this._receiver0 : this[index * 4 - 4 + 3];\n\n if (ret === UNDEFINED_BINDING) {\n return undefined;\n } else if (ret === undefined && this._isBound()) {\n return this._boundValue();\n }\n\n return ret;\n };\n\n Promise.prototype._promiseAt = function (index) {\n return this[index * 4 - 4 + 2];\n };\n\n Promise.prototype._fulfillmentHandlerAt = function (index) {\n return this[index * 4 - 4 + 0];\n };\n\n Promise.prototype._rejectionHandlerAt = function (index) {\n return this[index * 4 - 4 + 1];\n };\n\n Promise.prototype._boundValue = function () {};\n\n Promise.prototype._migrateCallback0 = function (follower) {\n var bitField = follower._bitField;\n var fulfill = follower._fulfillmentHandler0;\n var reject = follower._rejectionHandler0;\n var promise = follower._promise0;\n\n var receiver = follower._receiverAt(0);\n\n if (receiver === undefined) receiver = UNDEFINED_BINDING;\n\n this._addCallbacks(fulfill, reject, promise, receiver, null);\n };\n\n Promise.prototype._migrateCallbackAt = function (follower, index) {\n var fulfill = follower._fulfillmentHandlerAt(index);\n\n var reject = follower._rejectionHandlerAt(index);\n\n var promise = follower._promiseAt(index);\n\n var receiver = follower._receiverAt(index);\n\n if (receiver === undefined) receiver = UNDEFINED_BINDING;\n\n this._addCallbacks(fulfill, reject, promise, receiver, null);\n };\n\n Promise.prototype._addCallbacks = function (fulfill, reject, promise, receiver, domain) {\n var index = this._length();\n\n if (index >= 65535 - 4) {\n index = 0;\n\n this._setLength(0);\n }\n\n if (index === 0) {\n this._promise0 = promise;\n this._receiver0 = receiver;\n\n if (typeof fulfill === \"function\") {\n this._fulfillmentHandler0 = domain === null ? fulfill : util.domainBind(domain, fulfill);\n }\n\n if (typeof reject === \"function\") {\n this._rejectionHandler0 = domain === null ? reject : util.domainBind(domain, reject);\n }\n } else {\n var base = index * 4 - 4;\n this[base + 2] = promise;\n this[base + 3] = receiver;\n\n if (typeof fulfill === \"function\") {\n this[base + 0] = domain === null ? fulfill : util.domainBind(domain, fulfill);\n }\n\n if (typeof reject === \"function\") {\n this[base + 1] = domain === null ? reject : util.domainBind(domain, reject);\n }\n }\n\n this._setLength(index + 1);\n\n return index;\n };\n\n Promise.prototype._proxy = function (proxyable, arg) {\n this._addCallbacks(undefined, undefined, arg, proxyable, null);\n };\n\n Promise.prototype._resolveCallback = function (value, shouldBind) {\n if ((this._bitField & 117506048) !== 0) return;\n if (value === this) return this._rejectCallback(makeSelfResolutionError(), false);\n var maybePromise = tryConvertToPromise(value, this);\n if (!(maybePromise instanceof Promise)) return this._fulfill(value);\n if (shouldBind) this._propagateFrom(maybePromise, 2);\n\n var promise = maybePromise._target();\n\n if (promise === this) {\n this._reject(makeSelfResolutionError());\n\n return;\n }\n\n var bitField = promise._bitField;\n\n if ((bitField & 50397184) === 0) {\n var len = this._length();\n\n if (len > 0) promise._migrateCallback0(this);\n\n for (var i = 1; i < len; ++i) {\n promise._migrateCallbackAt(this, i);\n }\n\n this._setFollowing();\n\n this._setLength(0);\n\n this._setFollowee(promise);\n } else if ((bitField & 33554432) !== 0) {\n this._fulfill(promise._value());\n } else if ((bitField & 16777216) !== 0) {\n this._reject(promise._reason());\n } else {\n var reason = new CancellationError(\"late cancellation observer\");\n\n promise._attachExtraTrace(reason);\n\n this._reject(reason);\n }\n };\n\n Promise.prototype._rejectCallback = function (reason, synchronous, ignoreNonErrorWarnings) {\n var trace = util.ensureErrorObject(reason);\n var hasStack = trace === reason;\n\n if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {\n var message = \"a promise was rejected with a non-error: \" + util.classString(reason);\n\n this._warn(message, true);\n }\n\n this._attachExtraTrace(trace, synchronous ? hasStack : false);\n\n this._reject(reason);\n };\n\n Promise.prototype._resolveFromExecutor = function (executor) {\n if (executor === INTERNAL) return;\n var promise = this;\n\n this._captureStackTrace();\n\n this._pushContext();\n\n var synchronous = true;\n\n var r = this._execute(executor, function (value) {\n promise._resolveCallback(value);\n }, function (reason) {\n promise._rejectCallback(reason, synchronous);\n });\n\n synchronous = false;\n\n this._popContext();\n\n if (r !== undefined) {\n promise._rejectCallback(r, true);\n }\n };\n\n Promise.prototype._settlePromiseFromHandler = function (handler, receiver, value, promise) {\n var bitField = promise._bitField;\n if ((bitField & 65536) !== 0) return;\n\n promise._pushContext();\n\n var x;\n\n if (receiver === APPLY) {\n if (!value || typeof value.length !== \"number\") {\n x = errorObj;\n x.e = new TypeError(\"cannot .spread() a non-array: \" + util.classString(value));\n } else {\n x = tryCatch(handler).apply(this._boundValue(), value);\n }\n } else {\n x = tryCatch(handler).call(receiver, value);\n }\n\n var promiseCreated = promise._popContext();\n\n bitField = promise._bitField;\n if ((bitField & 65536) !== 0) return;\n\n if (x === NEXT_FILTER) {\n promise._reject(value);\n } else if (x === errorObj) {\n promise._rejectCallback(x.e, false);\n } else {\n debug.checkForgottenReturns(x, promiseCreated, \"\", promise, this);\n\n promise._resolveCallback(x);\n }\n };\n\n Promise.prototype._target = function () {\n var ret = this;\n\n while (ret._isFollowing()) {\n ret = ret._followee();\n }\n\n return ret;\n };\n\n Promise.prototype._followee = function () {\n return this._rejectionHandler0;\n };\n\n Promise.prototype._setFollowee = function (promise) {\n this._rejectionHandler0 = promise;\n };\n\n Promise.prototype._settlePromise = function (promise, handler, receiver, value) {\n var isPromise = promise instanceof Promise;\n var bitField = this._bitField;\n var asyncGuaranteed = (bitField & 134217728) !== 0;\n\n if ((bitField & 65536) !== 0) {\n if (isPromise) promise._invokeInternalOnCancel();\n\n if (receiver instanceof PassThroughHandlerContext && receiver.isFinallyHandler()) {\n receiver.cancelPromise = promise;\n\n if (tryCatch(handler).call(receiver, value) === errorObj) {\n promise._reject(errorObj.e);\n }\n } else if (handler === reflectHandler) {\n promise._fulfill(reflectHandler.call(receiver));\n } else if (receiver instanceof Proxyable) {\n receiver._promiseCancelled(promise);\n } else if (isPromise || promise instanceof PromiseArray) {\n promise._cancel();\n } else {\n receiver.cancel();\n }\n } else if (typeof handler === \"function\") {\n if (!isPromise) {\n handler.call(receiver, value, promise);\n } else {\n if (asyncGuaranteed) promise._setAsyncGuaranteed();\n\n this._settlePromiseFromHandler(handler, receiver, value, promise);\n }\n } else if (receiver instanceof Proxyable) {\n if (!receiver._isResolved()) {\n if ((bitField & 33554432) !== 0) {\n receiver._promiseFulfilled(value, promise);\n } else {\n receiver._promiseRejected(value, promise);\n }\n }\n } else if (isPromise) {\n if (asyncGuaranteed) promise._setAsyncGuaranteed();\n\n if ((bitField & 33554432) !== 0) {\n promise._fulfill(value);\n } else {\n promise._reject(value);\n }\n }\n };\n\n Promise.prototype._settlePromiseLateCancellationObserver = function (ctx) {\n var handler = ctx.handler;\n var promise = ctx.promise;\n var receiver = ctx.receiver;\n var value = ctx.value;\n\n if (typeof handler === \"function\") {\n if (!(promise instanceof Promise)) {\n handler.call(receiver, value, promise);\n } else {\n this._settlePromiseFromHandler(handler, receiver, value, promise);\n }\n } else if (promise instanceof Promise) {\n promise._reject(value);\n }\n };\n\n Promise.prototype._settlePromiseCtx = function (ctx) {\n this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);\n };\n\n Promise.prototype._settlePromise0 = function (handler, value, bitField) {\n var promise = this._promise0;\n\n var receiver = this._receiverAt(0);\n\n this._promise0 = undefined;\n this._receiver0 = undefined;\n\n this._settlePromise(promise, handler, receiver, value);\n };\n\n Promise.prototype._clearCallbackDataAtIndex = function (index) {\n var base = index * 4 - 4;\n this[base + 2] = this[base + 3] = this[base + 0] = this[base + 1] = undefined;\n };\n\n Promise.prototype._fulfill = function (value) {\n var bitField = this._bitField;\n if ((bitField & 117506048) >>> 16) return;\n\n if (value === this) {\n var err = makeSelfResolutionError();\n\n this._attachExtraTrace(err);\n\n return this._reject(err);\n }\n\n this._setFulfilled();\n\n this._rejectionHandler0 = value;\n\n if ((bitField & 65535) > 0) {\n if ((bitField & 134217728) !== 0) {\n this._settlePromises();\n } else {\n async.settlePromises(this);\n }\n\n this._dereferenceTrace();\n }\n };\n\n Promise.prototype._reject = function (reason) {\n var bitField = this._bitField;\n if ((bitField & 117506048) >>> 16) return;\n\n this._setRejected();\n\n this._fulfillmentHandler0 = reason;\n\n if (this._isFinal()) {\n return async.fatalError(reason, util.isNode);\n }\n\n if ((bitField & 65535) > 0) {\n async.settlePromises(this);\n } else {\n this._ensurePossibleRejectionHandled();\n }\n };\n\n Promise.prototype._fulfillPromises = function (len, value) {\n for (var i = 1; i < len; i++) {\n var handler = this._fulfillmentHandlerAt(i);\n\n var promise = this._promiseAt(i);\n\n var receiver = this._receiverAt(i);\n\n this._clearCallbackDataAtIndex(i);\n\n this._settlePromise(promise, handler, receiver, value);\n }\n };\n\n Promise.prototype._rejectPromises = function (len, reason) {\n for (var i = 1; i < len; i++) {\n var handler = this._rejectionHandlerAt(i);\n\n var promise = this._promiseAt(i);\n\n var receiver = this._receiverAt(i);\n\n this._clearCallbackDataAtIndex(i);\n\n this._settlePromise(promise, handler, receiver, reason);\n }\n };\n\n Promise.prototype._settlePromises = function () {\n var bitField = this._bitField;\n var len = bitField & 65535;\n\n if (len > 0) {\n if ((bitField & 16842752) !== 0) {\n var reason = this._fulfillmentHandler0;\n\n this._settlePromise0(this._rejectionHandler0, reason, bitField);\n\n this._rejectPromises(len, reason);\n } else {\n var value = this._rejectionHandler0;\n\n this._settlePromise0(this._fulfillmentHandler0, value, bitField);\n\n this._fulfillPromises(len, value);\n }\n\n this._setLength(0);\n }\n\n this._clearCancellationData();\n };\n\n Promise.prototype._settledValue = function () {\n var bitField = this._bitField;\n\n if ((bitField & 33554432) !== 0) {\n return this._rejectionHandler0;\n } else if ((bitField & 16777216) !== 0) {\n return this._fulfillmentHandler0;\n }\n };\n\n function deferResolve(v) {\n this.promise._resolveCallback(v);\n }\n\n function deferReject(v) {\n this.promise._rejectCallback(v, false);\n }\n\n Promise.defer = Promise.pending = function () {\n debug.deprecated(\"Promise.defer\", \"new Promise\");\n var promise = new Promise(INTERNAL);\n return {\n promise: promise,\n resolve: deferResolve,\n reject: deferReject\n };\n };\n\n util.notEnumerableProp(Promise, \"_makeSelfResolutionError\", makeSelfResolutionError);\n\n _dereq_(\"./method\")(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug);\n\n _dereq_(\"./bind\")(Promise, INTERNAL, tryConvertToPromise, debug);\n\n _dereq_(\"./cancel\")(Promise, PromiseArray, apiRejection, debug);\n\n _dereq_(\"./direct_resolve\")(Promise);\n\n _dereq_(\"./synchronous_inspection\")(Promise);\n\n _dereq_(\"./join\")(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain);\n\n Promise.Promise = Promise;\n Promise.version = \"3.5.4\";\n\n _dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\n\n _dereq_('./call_get.js')(Promise);\n\n _dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);\n\n _dereq_('./timers.js')(Promise, INTERNAL, debug);\n\n _dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);\n\n _dereq_('./nodeify.js')(Promise);\n\n _dereq_('./promisify.js')(Promise, INTERNAL);\n\n _dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);\n\n _dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);\n\n _dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\n\n _dereq_('./settle.js')(Promise, PromiseArray, debug);\n\n _dereq_('./some.js')(Promise, PromiseArray, apiRejection);\n\n _dereq_('./filter.js')(Promise, INTERNAL);\n\n _dereq_('./each.js')(Promise, INTERNAL);\n\n _dereq_('./any.js')(Promise);\n\n util.toFastProperties(Promise);\n util.toFastProperties(Promise.prototype);\n\n function fillTypes(value) {\n var p = new Promise(INTERNAL);\n p._fulfillmentHandler0 = value;\n p._rejectionHandler0 = value;\n p._promise0 = value;\n p._receiver0 = value;\n } // Complete slack tracking, opt out of field-type tracking and \n // stabilize map \n\n\n fillTypes({\n a: 1\n });\n fillTypes({\n b: 2\n });\n fillTypes({\n c: 3\n });\n fillTypes(1);\n fillTypes(function () {});\n fillTypes(undefined);\n fillTypes(false);\n fillTypes(new Promise(INTERNAL));\n debug.setBounds(Async.firstLineError, util.lastLineError);\n return Promise;\n };\n }, {\n \"./any.js\": 1,\n \"./async\": 2,\n \"./bind\": 3,\n \"./call_get.js\": 5,\n \"./cancel\": 6,\n \"./catch_filter\": 7,\n \"./context\": 8,\n \"./debuggability\": 9,\n \"./direct_resolve\": 10,\n \"./each.js\": 11,\n \"./errors\": 12,\n \"./es5\": 13,\n \"./filter.js\": 14,\n \"./finally\": 15,\n \"./generators.js\": 16,\n \"./join\": 17,\n \"./map.js\": 18,\n \"./method\": 19,\n \"./nodeback\": 20,\n \"./nodeify.js\": 21,\n \"./promise_array\": 23,\n \"./promisify.js\": 24,\n \"./props.js\": 25,\n \"./race.js\": 27,\n \"./reduce.js\": 28,\n \"./settle.js\": 30,\n \"./some.js\": 31,\n \"./synchronous_inspection\": 32,\n \"./thenables\": 33,\n \"./timers.js\": 34,\n \"./using.js\": 35,\n \"./util\": 36\n }],\n 23: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL, tryConvertToPromise, apiRejection, Proxyable) {\n var util = _dereq_(\"./util\");\n\n var isArray = util.isArray;\n\n function toResolutionValue(val) {\n switch (val) {\n case -2:\n return [];\n\n case -3:\n return {};\n\n case -6:\n return new Map();\n }\n }\n\n function PromiseArray(values) {\n var promise = this._promise = new Promise(INTERNAL);\n\n if (values instanceof Promise) {\n promise._propagateFrom(values, 3);\n }\n\n promise._setOnCancel(this);\n\n this._values = values;\n this._length = 0;\n this._totalResolved = 0;\n\n this._init(undefined, -2);\n }\n\n util.inherits(PromiseArray, Proxyable);\n\n PromiseArray.prototype.length = function () {\n return this._length;\n };\n\n PromiseArray.prototype.promise = function () {\n return this._promise;\n };\n\n PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {\n var values = tryConvertToPromise(this._values, this._promise);\n\n if (values instanceof Promise) {\n values = values._target();\n var bitField = values._bitField;\n ;\n this._values = values;\n\n if ((bitField & 50397184) === 0) {\n this._promise._setAsyncGuaranteed();\n\n return values._then(init, this._reject, undefined, this, resolveValueIfEmpty);\n } else if ((bitField & 33554432) !== 0) {\n values = values._value();\n } else if ((bitField & 16777216) !== 0) {\n return this._reject(values._reason());\n } else {\n return this._cancel();\n }\n }\n\n values = util.asArray(values);\n\n if (values === null) {\n var err = apiRejection(\"expecting an array or an iterable object but got \" + util.classString(values)).reason();\n\n this._promise._rejectCallback(err, false);\n\n return;\n }\n\n if (values.length === 0) {\n if (resolveValueIfEmpty === -5) {\n this._resolveEmptyArray();\n } else {\n this._resolve(toResolutionValue(resolveValueIfEmpty));\n }\n\n return;\n }\n\n this._iterate(values);\n };\n\n PromiseArray.prototype._iterate = function (values) {\n var len = this.getActualLength(values.length);\n this._length = len;\n this._values = this.shouldCopyValues() ? new Array(len) : this._values;\n var result = this._promise;\n var isResolved = false;\n var bitField = null;\n\n for (var i = 0; i < len; ++i) {\n var maybePromise = tryConvertToPromise(values[i], result);\n\n if (maybePromise instanceof Promise) {\n maybePromise = maybePromise._target();\n bitField = maybePromise._bitField;\n } else {\n bitField = null;\n }\n\n if (isResolved) {\n if (bitField !== null) {\n maybePromise.suppressUnhandledRejections();\n }\n } else if (bitField !== null) {\n if ((bitField & 50397184) === 0) {\n maybePromise._proxy(this, i);\n\n this._values[i] = maybePromise;\n } else if ((bitField & 33554432) !== 0) {\n isResolved = this._promiseFulfilled(maybePromise._value(), i);\n } else if ((bitField & 16777216) !== 0) {\n isResolved = this._promiseRejected(maybePromise._reason(), i);\n } else {\n isResolved = this._promiseCancelled(i);\n }\n } else {\n isResolved = this._promiseFulfilled(maybePromise, i);\n }\n }\n\n if (!isResolved) result._setAsyncGuaranteed();\n };\n\n PromiseArray.prototype._isResolved = function () {\n return this._values === null;\n };\n\n PromiseArray.prototype._resolve = function (value) {\n this._values = null;\n\n this._promise._fulfill(value);\n };\n\n PromiseArray.prototype._cancel = function () {\n if (this._isResolved() || !this._promise._isCancellable()) return;\n this._values = null;\n\n this._promise._cancel();\n };\n\n PromiseArray.prototype._reject = function (reason) {\n this._values = null;\n\n this._promise._rejectCallback(reason, false);\n };\n\n PromiseArray.prototype._promiseFulfilled = function (value, index) {\n this._values[index] = value;\n var totalResolved = ++this._totalResolved;\n\n if (totalResolved >= this._length) {\n this._resolve(this._values);\n\n return true;\n }\n\n return false;\n };\n\n PromiseArray.prototype._promiseCancelled = function () {\n this._cancel();\n\n return true;\n };\n\n PromiseArray.prototype._promiseRejected = function (reason) {\n this._totalResolved++;\n\n this._reject(reason);\n\n return true;\n };\n\n PromiseArray.prototype._resultCancelled = function () {\n if (this._isResolved()) return;\n var values = this._values;\n\n this._cancel();\n\n if (values instanceof Promise) {\n values.cancel();\n } else {\n for (var i = 0; i < values.length; ++i) {\n if (values[i] instanceof Promise) {\n values[i].cancel();\n }\n }\n }\n };\n\n PromiseArray.prototype.shouldCopyValues = function () {\n return true;\n };\n\n PromiseArray.prototype.getActualLength = function (len) {\n return len;\n };\n\n return PromiseArray;\n };\n }, {\n \"./util\": 36\n }],\n 24: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL) {\n var THIS = {};\n\n var util = _dereq_(\"./util\");\n\n var nodebackForPromise = _dereq_(\"./nodeback\");\n\n var withAppended = util.withAppended;\n var maybeWrapAsError = util.maybeWrapAsError;\n var canEvaluate = util.canEvaluate;\n\n var TypeError = _dereq_(\"./errors\").TypeError;\n\n var defaultSuffix = \"Async\";\n var defaultPromisified = {\n __isPromisified__: true\n };\n var noCopyProps = [\"arity\", \"length\", \"name\", \"arguments\", \"caller\", \"callee\", \"prototype\", \"__isPromisified__\"];\n var noCopyPropsPattern = new RegExp(\"^(?:\" + noCopyProps.join(\"|\") + \")$\");\n\n var defaultFilter = function defaultFilter(name) {\n return util.isIdentifier(name) && name.charAt(0) !== \"_\" && name !== \"constructor\";\n };\n\n function propsFilter(key) {\n return !noCopyPropsPattern.test(key);\n }\n\n function isPromisified(fn) {\n try {\n return fn.__isPromisified__ === true;\n } catch (e) {\n return false;\n }\n }\n\n function hasPromisified(obj, key, suffix) {\n var val = util.getDataPropertyOrDefault(obj, key + suffix, defaultPromisified);\n return val ? isPromisified(val) : false;\n }\n\n function checkValid(ret, suffix, suffixRegexp) {\n for (var i = 0; i < ret.length; i += 2) {\n var key = ret[i];\n\n if (suffixRegexp.test(key)) {\n var keyWithoutAsyncSuffix = key.replace(suffixRegexp, \"\");\n\n for (var j = 0; j < ret.length; j += 2) {\n if (ret[j] === keyWithoutAsyncSuffix) {\n throw new TypeError(\"Cannot promisify an API that has normal methods with '%s'-suffix\\n\\n See http://goo.gl/MqrFmX\\n\".replace(\"%s\", suffix));\n }\n }\n }\n }\n }\n\n function promisifiableMethods(obj, suffix, suffixRegexp, filter) {\n var keys = util.inheritedDataKeys(obj);\n var ret = [];\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var value = obj[key];\n var passesDefaultFilter = filter === defaultFilter ? true : defaultFilter(key, value, obj);\n\n if (typeof value === \"function\" && !isPromisified(value) && !hasPromisified(obj, key, suffix) && filter(key, value, obj, passesDefaultFilter)) {\n ret.push(key, value);\n }\n }\n\n checkValid(ret, suffix, suffixRegexp);\n return ret;\n }\n\n var escapeIdentRegex = function escapeIdentRegex(str) {\n return str.replace(/([$])/, \"\\\\$\");\n };\n\n var makeNodePromisifiedEval;\n\n if (!true) {\n var switchCaseArgumentOrder = function switchCaseArgumentOrder(likelyArgumentCount) {\n var ret = [likelyArgumentCount];\n var min = Math.max(0, likelyArgumentCount - 1 - 3);\n\n for (var i = likelyArgumentCount - 1; i >= min; --i) {\n ret.push(i);\n }\n\n for (var i = likelyArgumentCount + 1; i <= 3; ++i) {\n ret.push(i);\n }\n\n return ret;\n };\n\n var argumentSequence = function argumentSequence(argumentCount) {\n return util.filledRange(argumentCount, \"_arg\", \"\");\n };\n\n var parameterDeclaration = function parameterDeclaration(parameterCount) {\n return util.filledRange(Math.max(parameterCount, 3), \"_arg\", \"\");\n };\n\n var parameterCount = function parameterCount(fn) {\n if (typeof fn.length === \"number\") {\n return Math.max(Math.min(fn.length, 1023 + 1), 0);\n }\n\n return 0;\n };\n\n makeNodePromisifiedEval = function makeNodePromisifiedEval(callback, receiver, originalName, fn, _, multiArgs) {\n var newParameterCount = Math.max(0, parameterCount(fn) - 1);\n var argumentOrder = switchCaseArgumentOrder(newParameterCount);\n var shouldProxyThis = typeof callback === \"string\" || receiver === THIS;\n\n function generateCallForArgumentCount(count) {\n var args = argumentSequence(count).join(\", \");\n var comma = count > 0 ? \", \" : \"\";\n var ret;\n\n if (shouldProxyThis) {\n ret = \"ret = callback.call(this, {{args}}, nodeback); break;\\n\";\n } else {\n ret = receiver === undefined ? \"ret = callback({{args}}, nodeback); break;\\n\" : \"ret = callback.call(receiver, {{args}}, nodeback); break;\\n\";\n }\n\n return ret.replace(\"{{args}}\", args).replace(\", \", comma);\n }\n\n function generateArgumentSwitchCase() {\n var ret = \"\";\n\n for (var i = 0; i < argumentOrder.length; ++i) {\n ret += \"case \" + argumentOrder[i] + \":\" + generateCallForArgumentCount(argumentOrder[i]);\n }\n\n ret += \" \\n\\\n default: \\n\\\n var args = new Array(len + 1); \\n\\\n var i = 0; \\n\\\n for (var i = 0; i < len; ++i) { \\n\\\n args[i] = arguments[i]; \\n\\\n } \\n\\\n args[i] = nodeback; \\n\\\n [CodeForCall] \\n\\\n break; \\n\\\n \".replace(\"[CodeForCall]\", shouldProxyThis ? \"ret = callback.apply(this, args);\\n\" : \"ret = callback.apply(receiver, args);\\n\");\n return ret;\n }\n\n var getFunctionCode = typeof callback === \"string\" ? \"this != null ? this['\" + callback + \"'] : fn\" : \"fn\";\n var body = \"'use strict'; \\n\\\n var ret = function (Parameters) { \\n\\\n 'use strict'; \\n\\\n var len = arguments.length; \\n\\\n var promise = new Promise(INTERNAL); \\n\\\n promise._captureStackTrace(); \\n\\\n var nodeback = nodebackForPromise(promise, \" + multiArgs + \"); \\n\\\n var ret; \\n\\\n var callback = tryCatch([GetFunctionCode]); \\n\\\n switch(len) { \\n\\\n [CodeForSwitchCase] \\n\\\n } \\n\\\n if (ret === errorObj) { \\n\\\n promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\\n\\\n } \\n\\\n if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \\n\\\n return promise; \\n\\\n }; \\n\\\n notEnumerableProp(ret, '__isPromisified__', true); \\n\\\n return ret; \\n\\\n \".replace(\"[CodeForSwitchCase]\", generateArgumentSwitchCase()).replace(\"[GetFunctionCode]\", getFunctionCode);\n body = body.replace(\"Parameters\", parameterDeclaration(newParameterCount));\n return new Function(\"Promise\", \"fn\", \"receiver\", \"withAppended\", \"maybeWrapAsError\", \"nodebackForPromise\", \"tryCatch\", \"errorObj\", \"notEnumerableProp\", \"INTERNAL\", body)(Promise, fn, receiver, withAppended, maybeWrapAsError, nodebackForPromise, util.tryCatch, util.errorObj, util.notEnumerableProp, INTERNAL);\n };\n }\n\n function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {\n var defaultThis = function () {\n return this;\n }();\n\n var method = callback;\n\n if (typeof method === \"string\") {\n callback = fn;\n }\n\n function promisified() {\n var _receiver = receiver;\n if (receiver === THIS) _receiver = this;\n var promise = new Promise(INTERNAL);\n\n promise._captureStackTrace();\n\n var cb = typeof method === \"string\" && this !== defaultThis ? this[method] : callback;\n var fn = nodebackForPromise(promise, multiArgs);\n\n try {\n cb.apply(_receiver, withAppended(arguments, fn));\n } catch (e) {\n promise._rejectCallback(maybeWrapAsError(e), true, true);\n }\n\n if (!promise._isFateSealed()) promise._setAsyncGuaranteed();\n return promise;\n }\n\n util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n return promisified;\n }\n\n var makeNodePromisified = canEvaluate ? makeNodePromisifiedEval : makeNodePromisifiedClosure;\n\n function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {\n var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + \"$\");\n var methods = promisifiableMethods(obj, suffix, suffixRegexp, filter);\n\n for (var i = 0, len = methods.length; i < len; i += 2) {\n var key = methods[i];\n var fn = methods[i + 1];\n var promisifiedKey = key + suffix;\n\n if (promisifier === makeNodePromisified) {\n obj[promisifiedKey] = makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);\n } else {\n var promisified = promisifier(fn, function () {\n return makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);\n });\n util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n obj[promisifiedKey] = promisified;\n }\n }\n\n util.toFastProperties(obj);\n return obj;\n }\n\n function promisify(callback, receiver, multiArgs) {\n return makeNodePromisified(callback, receiver, undefined, callback, null, multiArgs);\n }\n\n Promise.promisify = function (fn, options) {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n }\n\n if (isPromisified(fn)) {\n return fn;\n }\n\n options = Object(options);\n var receiver = options.context === undefined ? THIS : options.context;\n var multiArgs = !!options.multiArgs;\n var ret = promisify(fn, receiver, multiArgs);\n util.copyDescriptors(fn, ret, propsFilter);\n return ret;\n };\n\n Promise.promisifyAll = function (target, options) {\n if (typeof target !== \"function\" && _typeof(target) !== \"object\") {\n throw new TypeError(\"the target of promisifyAll must be an object or a function\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n options = Object(options);\n var multiArgs = !!options.multiArgs;\n var suffix = options.suffix;\n if (typeof suffix !== \"string\") suffix = defaultSuffix;\n var filter = options.filter;\n if (typeof filter !== \"function\") filter = defaultFilter;\n var promisifier = options.promisifier;\n if (typeof promisifier !== \"function\") promisifier = makeNodePromisified;\n\n if (!util.isIdentifier(suffix)) {\n throw new RangeError(\"suffix must be a valid identifier\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n var keys = util.inheritedDataKeys(target);\n\n for (var i = 0; i < keys.length; ++i) {\n var value = target[keys[i]];\n\n if (keys[i] !== \"constructor\" && util.isClass(value)) {\n promisifyAll(value.prototype, suffix, filter, promisifier, multiArgs);\n promisifyAll(value, suffix, filter, promisifier, multiArgs);\n }\n }\n\n return promisifyAll(target, suffix, filter, promisifier, multiArgs);\n };\n };\n }, {\n \"./errors\": 12,\n \"./nodeback\": 20,\n \"./util\": 36\n }],\n 25: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, PromiseArray, tryConvertToPromise, apiRejection) {\n var util = _dereq_(\"./util\");\n\n var isObject = util.isObject;\n\n var es5 = _dereq_(\"./es5\");\n\n var Es6Map;\n if (typeof Map === \"function\") Es6Map = Map;\n\n var mapToEntries = function () {\n var index = 0;\n var size = 0;\n\n function extractEntry(value, key) {\n this[index] = value;\n this[index + size] = key;\n index++;\n }\n\n return function mapToEntries(map) {\n size = map.size;\n index = 0;\n var ret = new Array(map.size * 2);\n map.forEach(extractEntry, ret);\n return ret;\n };\n }();\n\n var entriesToMap = function entriesToMap(entries) {\n var ret = new Es6Map();\n var length = entries.length / 2 | 0;\n\n for (var i = 0; i < length; ++i) {\n var key = entries[length + i];\n var value = entries[i];\n ret.set(key, value);\n }\n\n return ret;\n };\n\n function PropertiesPromiseArray(obj) {\n var isMap = false;\n var entries;\n\n if (Es6Map !== undefined && obj instanceof Es6Map) {\n entries = mapToEntries(obj);\n isMap = true;\n } else {\n var keys = es5.keys(obj);\n var len = keys.length;\n entries = new Array(len * 2);\n\n for (var i = 0; i < len; ++i) {\n var key = keys[i];\n entries[i] = obj[key];\n entries[i + len] = key;\n }\n }\n\n this.constructor$(entries);\n this._isMap = isMap;\n\n this._init$(undefined, isMap ? -6 : -3);\n }\n\n util.inherits(PropertiesPromiseArray, PromiseArray);\n\n PropertiesPromiseArray.prototype._init = function () {};\n\n PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {\n this._values[index] = value;\n var totalResolved = ++this._totalResolved;\n\n if (totalResolved >= this._length) {\n var val;\n\n if (this._isMap) {\n val = entriesToMap(this._values);\n } else {\n val = {};\n var keyOffset = this.length();\n\n for (var i = 0, len = this.length(); i < len; ++i) {\n val[this._values[i + keyOffset]] = this._values[i];\n }\n }\n\n this._resolve(val);\n\n return true;\n }\n\n return false;\n };\n\n PropertiesPromiseArray.prototype.shouldCopyValues = function () {\n return false;\n };\n\n PropertiesPromiseArray.prototype.getActualLength = function (len) {\n return len >> 1;\n };\n\n function props(promises) {\n var ret;\n var castValue = tryConvertToPromise(promises);\n\n if (!isObject(castValue)) {\n return apiRejection(\"cannot await properties of a non-object\\n\\n See http://goo.gl/MqrFmX\\n\");\n } else if (castValue instanceof Promise) {\n ret = castValue._then(Promise.props, undefined, undefined, undefined, undefined);\n } else {\n ret = new PropertiesPromiseArray(castValue).promise();\n }\n\n if (castValue instanceof Promise) {\n ret._propagateFrom(castValue, 2);\n }\n\n return ret;\n }\n\n Promise.prototype.props = function () {\n return props(this);\n };\n\n Promise.props = function (promises) {\n return props(promises);\n };\n };\n }, {\n \"./es5\": 13,\n \"./util\": 36\n }],\n 26: [function (_dereq_, module, exports) {\n \"use strict\";\n\n function arrayMove(src, srcIndex, dst, dstIndex, len) {\n for (var j = 0; j < len; ++j) {\n dst[j + dstIndex] = src[j + srcIndex];\n src[j + srcIndex] = void 0;\n }\n }\n\n function Queue(capacity) {\n this._capacity = capacity;\n this._length = 0;\n this._front = 0;\n }\n\n Queue.prototype._willBeOverCapacity = function (size) {\n return this._capacity < size;\n };\n\n Queue.prototype._pushOne = function (arg) {\n var length = this.length();\n\n this._checkCapacity(length + 1);\n\n var i = this._front + length & this._capacity - 1;\n this[i] = arg;\n this._length = length + 1;\n };\n\n Queue.prototype.push = function (fn, receiver, arg) {\n var length = this.length() + 3;\n\n if (this._willBeOverCapacity(length)) {\n this._pushOne(fn);\n\n this._pushOne(receiver);\n\n this._pushOne(arg);\n\n return;\n }\n\n var j = this._front + length - 3;\n\n this._checkCapacity(length);\n\n var wrapMask = this._capacity - 1;\n this[j + 0 & wrapMask] = fn;\n this[j + 1 & wrapMask] = receiver;\n this[j + 2 & wrapMask] = arg;\n this._length = length;\n };\n\n Queue.prototype.shift = function () {\n var front = this._front,\n ret = this[front];\n this[front] = undefined;\n this._front = front + 1 & this._capacity - 1;\n this._length--;\n return ret;\n };\n\n Queue.prototype.length = function () {\n return this._length;\n };\n\n Queue.prototype._checkCapacity = function (size) {\n if (this._capacity < size) {\n this._resizeTo(this._capacity << 1);\n }\n };\n\n Queue.prototype._resizeTo = function (capacity) {\n var oldCapacity = this._capacity;\n this._capacity = capacity;\n var front = this._front;\n var length = this._length;\n var moveItemsCount = front + length & oldCapacity - 1;\n arrayMove(this, 0, this, oldCapacity, moveItemsCount);\n };\n\n module.exports = Queue;\n }, {}],\n 27: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL, tryConvertToPromise, apiRejection) {\n var util = _dereq_(\"./util\");\n\n var raceLater = function raceLater(promise) {\n return promise.then(function (array) {\n return race(array, promise);\n });\n };\n\n function race(promises, parent) {\n var maybePromise = tryConvertToPromise(promises);\n\n if (maybePromise instanceof Promise) {\n return raceLater(maybePromise);\n } else {\n promises = util.asArray(promises);\n if (promises === null) return apiRejection(\"expecting an array or an iterable object but got \" + util.classString(promises));\n }\n\n var ret = new Promise(INTERNAL);\n\n if (parent !== undefined) {\n ret._propagateFrom(parent, 3);\n }\n\n var fulfill = ret._fulfill;\n var reject = ret._reject;\n\n for (var i = 0, len = promises.length; i < len; ++i) {\n var val = promises[i];\n\n if (val === undefined && !(i in promises)) {\n continue;\n }\n\n Promise.cast(val)._then(fulfill, reject, undefined, ret, null);\n }\n\n return ret;\n }\n\n Promise.race = function (promises) {\n return race(promises, undefined);\n };\n\n Promise.prototype.race = function () {\n return race(this, undefined);\n };\n };\n }, {\n \"./util\": 36\n }],\n 28: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug) {\n var getDomain = Promise._getDomain;\n\n var util = _dereq_(\"./util\");\n\n var tryCatch = util.tryCatch;\n\n function ReductionPromiseArray(promises, fn, initialValue, _each) {\n this.constructor$(promises);\n var domain = getDomain();\n this._fn = domain === null ? fn : util.domainBind(domain, fn);\n\n if (initialValue !== undefined) {\n initialValue = Promise.resolve(initialValue);\n\n initialValue._attachCancellationCallback(this);\n }\n\n this._initialValue = initialValue;\n this._currentCancellable = null;\n\n if (_each === INTERNAL) {\n this._eachValues = Array(this._length);\n } else if (_each === 0) {\n this._eachValues = null;\n } else {\n this._eachValues = undefined;\n }\n\n this._promise._captureStackTrace();\n\n this._init$(undefined, -5);\n }\n\n util.inherits(ReductionPromiseArray, PromiseArray);\n\n ReductionPromiseArray.prototype._gotAccum = function (accum) {\n if (this._eachValues !== undefined && this._eachValues !== null && accum !== INTERNAL) {\n this._eachValues.push(accum);\n }\n };\n\n ReductionPromiseArray.prototype._eachComplete = function (value) {\n if (this._eachValues !== null) {\n this._eachValues.push(value);\n }\n\n return this._eachValues;\n };\n\n ReductionPromiseArray.prototype._init = function () {};\n\n ReductionPromiseArray.prototype._resolveEmptyArray = function () {\n this._resolve(this._eachValues !== undefined ? this._eachValues : this._initialValue);\n };\n\n ReductionPromiseArray.prototype.shouldCopyValues = function () {\n return false;\n };\n\n ReductionPromiseArray.prototype._resolve = function (value) {\n this._promise._resolveCallback(value);\n\n this._values = null;\n };\n\n ReductionPromiseArray.prototype._resultCancelled = function (sender) {\n if (sender === this._initialValue) return this._cancel();\n if (this._isResolved()) return;\n\n this._resultCancelled$();\n\n if (this._currentCancellable instanceof Promise) {\n this._currentCancellable.cancel();\n }\n\n if (this._initialValue instanceof Promise) {\n this._initialValue.cancel();\n }\n };\n\n ReductionPromiseArray.prototype._iterate = function (values) {\n this._values = values;\n var value;\n var i;\n var length = values.length;\n\n if (this._initialValue !== undefined) {\n value = this._initialValue;\n i = 0;\n } else {\n value = Promise.resolve(values[0]);\n i = 1;\n }\n\n this._currentCancellable = value;\n\n if (!value.isRejected()) {\n for (; i < length; ++i) {\n var ctx = {\n accum: null,\n value: values[i],\n index: i,\n length: length,\n array: this\n };\n value = value._then(gotAccum, undefined, undefined, ctx, undefined);\n }\n }\n\n if (this._eachValues !== undefined) {\n value = value._then(this._eachComplete, undefined, undefined, this, undefined);\n }\n\n value._then(completed, completed, undefined, value, this);\n };\n\n Promise.prototype.reduce = function (fn, initialValue) {\n return reduce(this, fn, initialValue, null);\n };\n\n Promise.reduce = function (promises, fn, initialValue, _each) {\n return reduce(promises, fn, initialValue, _each);\n };\n\n function completed(valueOrReason, array) {\n if (this.isFulfilled()) {\n array._resolve(valueOrReason);\n } else {\n array._reject(valueOrReason);\n }\n }\n\n function reduce(promises, fn, initialValue, _each) {\n if (typeof fn !== \"function\") {\n return apiRejection(\"expecting a function but got \" + util.classString(fn));\n }\n\n var array = new ReductionPromiseArray(promises, fn, initialValue, _each);\n return array.promise();\n }\n\n function gotAccum(accum) {\n this.accum = accum;\n\n this.array._gotAccum(accum);\n\n var value = tryConvertToPromise(this.value, this.array._promise);\n\n if (value instanceof Promise) {\n this.array._currentCancellable = value;\n return value._then(gotValue, undefined, undefined, this, undefined);\n } else {\n return gotValue.call(this, value);\n }\n }\n\n function gotValue(value) {\n var array = this.array;\n var promise = array._promise;\n var fn = tryCatch(array._fn);\n\n promise._pushContext();\n\n var ret;\n\n if (array._eachValues !== undefined) {\n ret = fn.call(promise._boundValue(), value, this.index, this.length);\n } else {\n ret = fn.call(promise._boundValue(), this.accum, value, this.index, this.length);\n }\n\n if (ret instanceof Promise) {\n array._currentCancellable = ret;\n }\n\n var promiseCreated = promise._popContext();\n\n debug.checkForgottenReturns(ret, promiseCreated, array._eachValues !== undefined ? \"Promise.each\" : \"Promise.reduce\", promise);\n return ret;\n }\n };\n }, {\n \"./util\": 36\n }],\n 29: [function (_dereq_, module, exports) {\n \"use strict\";\n\n var util = _dereq_(\"./util\");\n\n var schedule;\n\n var noAsyncScheduler = function noAsyncScheduler() {\n throw new Error(\"No async scheduler available\\n\\n See http://goo.gl/MqrFmX\\n\");\n };\n\n var NativePromise = util.getNativePromise();\n\n if (util.isNode && typeof MutationObserver === \"undefined\") {\n var GlobalSetImmediate = global.setImmediate;\n var ProcessNextTick = process.nextTick;\n schedule = util.isRecentNode ? function (fn) {\n GlobalSetImmediate.call(global, fn);\n } : function (fn) {\n ProcessNextTick.call(process, fn);\n };\n } else if (typeof NativePromise === \"function\" && typeof NativePromise.resolve === \"function\") {\n var nativePromise = NativePromise.resolve();\n\n schedule = function schedule(fn) {\n nativePromise.then(fn);\n };\n } else if (typeof MutationObserver !== \"undefined\" && !(typeof window !== \"undefined\" && window.navigator && (window.navigator.standalone || window.cordova))) {\n schedule = function () {\n var div = document.createElement(\"div\");\n var opts = {\n attributes: true\n };\n var toggleScheduled = false;\n var div2 = document.createElement(\"div\");\n var o2 = new MutationObserver(function () {\n div.classList.toggle(\"foo\");\n toggleScheduled = false;\n });\n o2.observe(div2, opts);\n\n var scheduleToggle = function scheduleToggle() {\n if (toggleScheduled) return;\n toggleScheduled = true;\n div2.classList.toggle(\"foo\");\n };\n\n return function schedule(fn) {\n var o = new MutationObserver(function () {\n o.disconnect();\n fn();\n });\n o.observe(div, opts);\n scheduleToggle();\n };\n }();\n } else if (typeof setImmediate !== \"undefined\") {\n schedule = function schedule(fn) {\n setImmediate(fn);\n };\n } else if (typeof setTimeout !== \"undefined\") {\n schedule = function schedule(fn) {\n setTimeout(fn, 0);\n };\n } else {\n schedule = noAsyncScheduler;\n }\n\n module.exports = schedule;\n }, {\n \"./util\": 36\n }],\n 30: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, PromiseArray, debug) {\n var PromiseInspection = Promise.PromiseInspection;\n\n var util = _dereq_(\"./util\");\n\n function SettledPromiseArray(values) {\n this.constructor$(values);\n }\n\n util.inherits(SettledPromiseArray, PromiseArray);\n\n SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {\n this._values[index] = inspection;\n var totalResolved = ++this._totalResolved;\n\n if (totalResolved >= this._length) {\n this._resolve(this._values);\n\n return true;\n }\n\n return false;\n };\n\n SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {\n var ret = new PromiseInspection();\n ret._bitField = 33554432;\n ret._settledValueField = value;\n return this._promiseResolved(index, ret);\n };\n\n SettledPromiseArray.prototype._promiseRejected = function (reason, index) {\n var ret = new PromiseInspection();\n ret._bitField = 16777216;\n ret._settledValueField = reason;\n return this._promiseResolved(index, ret);\n };\n\n Promise.settle = function (promises) {\n debug.deprecated(\".settle()\", \".reflect()\");\n return new SettledPromiseArray(promises).promise();\n };\n\n Promise.prototype.settle = function () {\n return Promise.settle(this);\n };\n };\n }, {\n \"./util\": 36\n }],\n 31: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, PromiseArray, apiRejection) {\n var util = _dereq_(\"./util\");\n\n var RangeError = _dereq_(\"./errors\").RangeError;\n\n var AggregateError = _dereq_(\"./errors\").AggregateError;\n\n var isArray = util.isArray;\n var CANCELLATION = {};\n\n function SomePromiseArray(values) {\n this.constructor$(values);\n this._howMany = 0;\n this._unwrap = false;\n this._initialized = false;\n }\n\n util.inherits(SomePromiseArray, PromiseArray);\n\n SomePromiseArray.prototype._init = function () {\n if (!this._initialized) {\n return;\n }\n\n if (this._howMany === 0) {\n this._resolve([]);\n\n return;\n }\n\n this._init$(undefined, -5);\n\n var isArrayResolved = isArray(this._values);\n\n if (!this._isResolved() && isArrayResolved && this._howMany > this._canPossiblyFulfill()) {\n this._reject(this._getRangeError(this.length()));\n }\n };\n\n SomePromiseArray.prototype.init = function () {\n this._initialized = true;\n\n this._init();\n };\n\n SomePromiseArray.prototype.setUnwrap = function () {\n this._unwrap = true;\n };\n\n SomePromiseArray.prototype.howMany = function () {\n return this._howMany;\n };\n\n SomePromiseArray.prototype.setHowMany = function (count) {\n this._howMany = count;\n };\n\n SomePromiseArray.prototype._promiseFulfilled = function (value) {\n this._addFulfilled(value);\n\n if (this._fulfilled() === this.howMany()) {\n this._values.length = this.howMany();\n\n if (this.howMany() === 1 && this._unwrap) {\n this._resolve(this._values[0]);\n } else {\n this._resolve(this._values);\n }\n\n return true;\n }\n\n return false;\n };\n\n SomePromiseArray.prototype._promiseRejected = function (reason) {\n this._addRejected(reason);\n\n return this._checkOutcome();\n };\n\n SomePromiseArray.prototype._promiseCancelled = function () {\n if (this._values instanceof Promise || this._values == null) {\n return this._cancel();\n }\n\n this._addRejected(CANCELLATION);\n\n return this._checkOutcome();\n };\n\n SomePromiseArray.prototype._checkOutcome = function () {\n if (this.howMany() > this._canPossiblyFulfill()) {\n var e = new AggregateError();\n\n for (var i = this.length(); i < this._values.length; ++i) {\n if (this._values[i] !== CANCELLATION) {\n e.push(this._values[i]);\n }\n }\n\n if (e.length > 0) {\n this._reject(e);\n } else {\n this._cancel();\n }\n\n return true;\n }\n\n return false;\n };\n\n SomePromiseArray.prototype._fulfilled = function () {\n return this._totalResolved;\n };\n\n SomePromiseArray.prototype._rejected = function () {\n return this._values.length - this.length();\n };\n\n SomePromiseArray.prototype._addRejected = function (reason) {\n this._values.push(reason);\n };\n\n SomePromiseArray.prototype._addFulfilled = function (value) {\n this._values[this._totalResolved++] = value;\n };\n\n SomePromiseArray.prototype._canPossiblyFulfill = function () {\n return this.length() - this._rejected();\n };\n\n SomePromiseArray.prototype._getRangeError = function (count) {\n var message = \"Input array must contain at least \" + this._howMany + \" items but contains only \" + count + \" items\";\n return new RangeError(message);\n };\n\n SomePromiseArray.prototype._resolveEmptyArray = function () {\n this._reject(this._getRangeError(0));\n };\n\n function some(promises, howMany) {\n if ((howMany | 0) !== howMany || howMany < 0) {\n return apiRejection(\"expecting a positive integer\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n var ret = new SomePromiseArray(promises);\n var promise = ret.promise();\n ret.setHowMany(howMany);\n ret.init();\n return promise;\n }\n\n Promise.some = function (promises, howMany) {\n return some(promises, howMany);\n };\n\n Promise.prototype.some = function (howMany) {\n return some(this, howMany);\n };\n\n Promise._SomePromiseArray = SomePromiseArray;\n };\n }, {\n \"./errors\": 12,\n \"./util\": 36\n }],\n 32: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise) {\n function PromiseInspection(promise) {\n if (promise !== undefined) {\n promise = promise._target();\n this._bitField = promise._bitField;\n this._settledValueField = promise._isFateSealed() ? promise._settledValue() : undefined;\n } else {\n this._bitField = 0;\n this._settledValueField = undefined;\n }\n }\n\n PromiseInspection.prototype._settledValue = function () {\n return this._settledValueField;\n };\n\n var value = PromiseInspection.prototype.value = function () {\n if (!this.isFulfilled()) {\n throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n return this._settledValue();\n };\n\n var reason = PromiseInspection.prototype.error = PromiseInspection.prototype.reason = function () {\n if (!this.isRejected()) {\n throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\n\\n See http://goo.gl/MqrFmX\\n\");\n }\n\n return this._settledValue();\n };\n\n var isFulfilled = PromiseInspection.prototype.isFulfilled = function () {\n return (this._bitField & 33554432) !== 0;\n };\n\n var isRejected = PromiseInspection.prototype.isRejected = function () {\n return (this._bitField & 16777216) !== 0;\n };\n\n var isPending = PromiseInspection.prototype.isPending = function () {\n return (this._bitField & 50397184) === 0;\n };\n\n var isResolved = PromiseInspection.prototype.isResolved = function () {\n return (this._bitField & 50331648) !== 0;\n };\n\n PromiseInspection.prototype.isCancelled = function () {\n return (this._bitField & 8454144) !== 0;\n };\n\n Promise.prototype.__isCancelled = function () {\n return (this._bitField & 65536) === 65536;\n };\n\n Promise.prototype._isCancelled = function () {\n return this._target().__isCancelled();\n };\n\n Promise.prototype.isCancelled = function () {\n return (this._target()._bitField & 8454144) !== 0;\n };\n\n Promise.prototype.isPending = function () {\n return isPending.call(this._target());\n };\n\n Promise.prototype.isRejected = function () {\n return isRejected.call(this._target());\n };\n\n Promise.prototype.isFulfilled = function () {\n return isFulfilled.call(this._target());\n };\n\n Promise.prototype.isResolved = function () {\n return isResolved.call(this._target());\n };\n\n Promise.prototype.value = function () {\n return value.call(this._target());\n };\n\n Promise.prototype.reason = function () {\n var target = this._target();\n\n target._unsetRejectionIsUnhandled();\n\n return reason.call(target);\n };\n\n Promise.prototype._value = function () {\n return this._settledValue();\n };\n\n Promise.prototype._reason = function () {\n this._unsetRejectionIsUnhandled();\n\n return this._settledValue();\n };\n\n Promise.PromiseInspection = PromiseInspection;\n };\n }, {}],\n 33: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL) {\n var util = _dereq_(\"./util\");\n\n var errorObj = util.errorObj;\n var isObject = util.isObject;\n\n function tryConvertToPromise(obj, context) {\n if (isObject(obj)) {\n if (obj instanceof Promise) return obj;\n var then = getThen(obj);\n\n if (then === errorObj) {\n if (context) context._pushContext();\n var ret = Promise.reject(then.e);\n if (context) context._popContext();\n return ret;\n } else if (typeof then === \"function\") {\n if (isAnyBluebirdPromise(obj)) {\n var ret = new Promise(INTERNAL);\n\n obj._then(ret._fulfill, ret._reject, undefined, ret, null);\n\n return ret;\n }\n\n return doThenable(obj, then, context);\n }\n }\n\n return obj;\n }\n\n function doGetThen(obj) {\n return obj.then;\n }\n\n function getThen(obj) {\n try {\n return doGetThen(obj);\n } catch (e) {\n errorObj.e = e;\n return errorObj;\n }\n }\n\n var hasProp = {}.hasOwnProperty;\n\n function isAnyBluebirdPromise(obj) {\n try {\n return hasProp.call(obj, \"_promise0\");\n } catch (e) {\n return false;\n }\n }\n\n function doThenable(x, then, context) {\n var promise = new Promise(INTERNAL);\n var ret = promise;\n if (context) context._pushContext();\n\n promise._captureStackTrace();\n\n if (context) context._popContext();\n var synchronous = true;\n var result = util.tryCatch(then).call(x, resolve, reject);\n synchronous = false;\n\n if (promise && result === errorObj) {\n promise._rejectCallback(result.e, true, true);\n\n promise = null;\n }\n\n function resolve(value) {\n if (!promise) return;\n\n promise._resolveCallback(value);\n\n promise = null;\n }\n\n function reject(reason) {\n if (!promise) return;\n\n promise._rejectCallback(reason, synchronous, true);\n\n promise = null;\n }\n\n return ret;\n }\n\n return tryConvertToPromise;\n };\n }, {\n \"./util\": 36\n }],\n 34: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, INTERNAL, debug) {\n var util = _dereq_(\"./util\");\n\n var TimeoutError = Promise.TimeoutError;\n\n function HandleWrapper(handle) {\n this.handle = handle;\n }\n\n HandleWrapper.prototype._resultCancelled = function () {\n clearTimeout(this.handle);\n };\n\n var afterValue = function afterValue(value) {\n return delay(+this).thenReturn(value);\n };\n\n var delay = Promise.delay = function (ms, value) {\n var ret;\n var handle;\n\n if (value !== undefined) {\n ret = Promise.resolve(value)._then(afterValue, null, null, ms, undefined);\n\n if (debug.cancellation() && value instanceof Promise) {\n ret._setOnCancel(value);\n }\n } else {\n ret = new Promise(INTERNAL);\n handle = setTimeout(function () {\n ret._fulfill();\n }, +ms);\n\n if (debug.cancellation()) {\n ret._setOnCancel(new HandleWrapper(handle));\n }\n\n ret._captureStackTrace();\n }\n\n ret._setAsyncGuaranteed();\n\n return ret;\n };\n\n Promise.prototype.delay = function (ms) {\n return delay(ms, this);\n };\n\n var afterTimeout = function afterTimeout(promise, message, parent) {\n var err;\n\n if (typeof message !== \"string\") {\n if (message instanceof Error) {\n err = message;\n } else {\n err = new TimeoutError(\"operation timed out\");\n }\n } else {\n err = new TimeoutError(message);\n }\n\n util.markAsOriginatingFromRejection(err);\n\n promise._attachExtraTrace(err);\n\n promise._reject(err);\n\n if (parent != null) {\n parent.cancel();\n }\n };\n\n function successClear(value) {\n clearTimeout(this.handle);\n return value;\n }\n\n function failureClear(reason) {\n clearTimeout(this.handle);\n throw reason;\n }\n\n Promise.prototype.timeout = function (ms, message) {\n ms = +ms;\n var ret, parent;\n var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {\n if (ret.isPending()) {\n afterTimeout(ret, message, parent);\n }\n }, ms));\n\n if (debug.cancellation()) {\n parent = this.then();\n ret = parent._then(successClear, failureClear, undefined, handleWrapper, undefined);\n\n ret._setOnCancel(handleWrapper);\n } else {\n ret = this._then(successClear, failureClear, undefined, handleWrapper, undefined);\n }\n\n return ret;\n };\n };\n }, {\n \"./util\": 36\n }],\n 35: [function (_dereq_, module, exports) {\n \"use strict\";\n\n module.exports = function (Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug) {\n var util = _dereq_(\"./util\");\n\n var TypeError = _dereq_(\"./errors\").TypeError;\n\n var inherits = _dereq_(\"./util\").inherits;\n\n var errorObj = util.errorObj;\n var tryCatch = util.tryCatch;\n var NULL = {};\n\n function thrower(e) {\n setTimeout(function () {\n throw e;\n }, 0);\n }\n\n function castPreservingDisposable(thenable) {\n var maybePromise = tryConvertToPromise(thenable);\n\n if (maybePromise !== thenable && typeof thenable._isDisposable === \"function\" && typeof thenable._getDisposer === \"function\" && thenable._isDisposable()) {\n maybePromise._setDisposable(thenable._getDisposer());\n }\n\n return maybePromise;\n }\n\n function dispose(resources, inspection) {\n var i = 0;\n var len = resources.length;\n var ret = new Promise(INTERNAL);\n\n function iterator() {\n if (i >= len) return ret._fulfill();\n var maybePromise = castPreservingDisposable(resources[i++]);\n\n if (maybePromise instanceof Promise && maybePromise._isDisposable()) {\n try {\n maybePromise = tryConvertToPromise(maybePromise._getDisposer().tryDispose(inspection), resources.promise);\n } catch (e) {\n return thrower(e);\n }\n\n if (maybePromise instanceof Promise) {\n return maybePromise._then(iterator, thrower, null, null, null);\n }\n }\n\n iterator();\n }\n\n iterator();\n return ret;\n }\n\n function Disposer(data, promise, context) {\n this._data = data;\n this._promise = promise;\n this._context = context;\n }\n\n Disposer.prototype.data = function () {\n return this._data;\n };\n\n Disposer.prototype.promise = function () {\n return this._promise;\n };\n\n Disposer.prototype.resource = function () {\n if (this.promise().isFulfilled()) {\n return this.promise().value();\n }\n\n return NULL;\n };\n\n Disposer.prototype.tryDispose = function (inspection) {\n var resource = this.resource();\n var context = this._context;\n if (context !== undefined) context._pushContext();\n var ret = resource !== NULL ? this.doDispose(resource, inspection) : null;\n if (context !== undefined) context._popContext();\n\n this._promise._unsetDisposable();\n\n this._data = null;\n return ret;\n };\n\n Disposer.isDisposer = function (d) {\n return d != null && typeof d.resource === \"function\" && typeof d.tryDispose === \"function\";\n };\n\n function FunctionDisposer(fn, promise, context) {\n this.constructor$(fn, promise, context);\n }\n\n inherits(FunctionDisposer, Disposer);\n\n FunctionDisposer.prototype.doDispose = function (resource, inspection) {\n var fn = this.data();\n return fn.call(resource, resource, inspection);\n };\n\n function maybeUnwrapDisposer(value) {\n if (Disposer.isDisposer(value)) {\n this.resources[this.index]._setDisposable(value);\n\n return value.promise();\n }\n\n return value;\n }\n\n function ResourceList(length) {\n this.length = length;\n this.promise = null;\n this[length - 1] = null;\n }\n\n ResourceList.prototype._resultCancelled = function () {\n var len = this.length;\n\n for (var i = 0; i < len; ++i) {\n var item = this[i];\n\n if (item instanceof Promise) {\n item.cancel();\n }\n }\n };\n\n Promise.using = function () {\n var len = arguments.length;\n if (len < 2) return apiRejection(\"you must pass at least 2 arguments to Promise.using\");\n var fn = arguments[len - 1];\n\n if (typeof fn !== \"function\") {\n return apiRejection(\"expecting a function but got \" + util.classString(fn));\n }\n\n var input;\n var spreadArgs = true;\n\n if (len === 2 && Array.isArray(arguments[0])) {\n input = arguments[0];\n len = input.length;\n spreadArgs = false;\n } else {\n input = arguments;\n len--;\n }\n\n var resources = new ResourceList(len);\n\n for (var i = 0; i < len; ++i) {\n var resource = input[i];\n\n if (Disposer.isDisposer(resource)) {\n var disposer = resource;\n resource = resource.promise();\n\n resource._setDisposable(disposer);\n } else {\n var maybePromise = tryConvertToPromise(resource);\n\n if (maybePromise instanceof Promise) {\n resource = maybePromise._then(maybeUnwrapDisposer, null, null, {\n resources: resources,\n index: i\n }, undefined);\n }\n }\n\n resources[i] = resource;\n }\n\n var reflectedResources = new Array(resources.length);\n\n for (var i = 0; i < reflectedResources.length; ++i) {\n reflectedResources[i] = Promise.resolve(resources[i]).reflect();\n }\n\n var resultPromise = Promise.all(reflectedResources).then(function (inspections) {\n for (var i = 0; i < inspections.length; ++i) {\n var inspection = inspections[i];\n\n if (inspection.isRejected()) {\n errorObj.e = inspection.error();\n return errorObj;\n } else if (!inspection.isFulfilled()) {\n resultPromise.cancel();\n return;\n }\n\n inspections[i] = inspection.value();\n }\n\n promise._pushContext();\n\n fn = tryCatch(fn);\n var ret = spreadArgs ? fn.apply(undefined, inspections) : fn(inspections);\n\n var promiseCreated = promise._popContext();\n\n debug.checkForgottenReturns(ret, promiseCreated, \"Promise.using\", promise);\n return ret;\n });\n var promise = resultPromise.lastly(function () {\n var inspection = new Promise.PromiseInspection(resultPromise);\n return dispose(resources, inspection);\n });\n resources.promise = promise;\n\n promise._setOnCancel(resources);\n\n return promise;\n };\n\n Promise.prototype._setDisposable = function (disposer) {\n this._bitField = this._bitField | 131072;\n this._disposer = disposer;\n };\n\n Promise.prototype._isDisposable = function () {\n return (this._bitField & 131072) > 0;\n };\n\n Promise.prototype._getDisposer = function () {\n return this._disposer;\n };\n\n Promise.prototype._unsetDisposable = function () {\n this._bitField = this._bitField & ~131072;\n this._disposer = undefined;\n };\n\n Promise.prototype.disposer = function (fn) {\n if (typeof fn === \"function\") {\n return new FunctionDisposer(fn, this, createContext());\n }\n\n throw new TypeError();\n };\n };\n }, {\n \"./errors\": 12,\n \"./util\": 36\n }],\n 36: [function (_dereq_, module, exports) {\n \"use strict\";\n\n var es5 = _dereq_(\"./es5\");\n\n var canEvaluate = typeof navigator == \"undefined\";\n var errorObj = {\n e: {}\n };\n var tryCatchTarget;\n var globalObject = typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : this !== undefined ? this : null;\n\n function tryCatcher() {\n try {\n var target = tryCatchTarget;\n tryCatchTarget = null;\n return target.apply(this, arguments);\n } catch (e) {\n errorObj.e = e;\n return errorObj;\n }\n }\n\n function tryCatch(fn) {\n tryCatchTarget = fn;\n return tryCatcher;\n }\n\n var inherits = function inherits(Child, Parent) {\n var hasProp = {}.hasOwnProperty;\n\n function T() {\n this.constructor = Child;\n this.constructor$ = Parent;\n\n for (var propertyName in Parent.prototype) {\n if (hasProp.call(Parent.prototype, propertyName) && propertyName.charAt(propertyName.length - 1) !== \"$\") {\n this[propertyName + \"$\"] = Parent.prototype[propertyName];\n }\n }\n }\n\n T.prototype = Parent.prototype;\n Child.prototype = new T();\n return Child.prototype;\n };\n\n function isPrimitive(val) {\n return val == null || val === true || val === false || typeof val === \"string\" || typeof val === \"number\";\n }\n\n function isObject(value) {\n return typeof value === \"function\" || _typeof(value) === \"object\" && value !== null;\n }\n\n function maybeWrapAsError(maybeError) {\n if (!isPrimitive(maybeError)) return maybeError;\n return new Error(safeToString(maybeError));\n }\n\n function withAppended(target, appendee) {\n var len = target.length;\n var ret = new Array(len + 1);\n var i;\n\n for (i = 0; i < len; ++i) {\n ret[i] = target[i];\n }\n\n ret[i] = appendee;\n return ret;\n }\n\n function getDataPropertyOrDefault(obj, key, defaultValue) {\n if (es5.isES5) {\n var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n if (desc != null) {\n return desc.get == null && desc.set == null ? desc.value : defaultValue;\n }\n } else {\n return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;\n }\n }\n\n function notEnumerableProp(obj, name, value) {\n if (isPrimitive(obj)) return obj;\n var descriptor = {\n value: value,\n configurable: true,\n enumerable: false,\n writable: true\n };\n es5.defineProperty(obj, name, descriptor);\n return obj;\n }\n\n function thrower(r) {\n throw r;\n }\n\n var inheritedDataKeys = function () {\n var excludedPrototypes = [Array.prototype, Object.prototype, Function.prototype];\n\n var isExcludedProto = function isExcludedProto(val) {\n for (var i = 0; i < excludedPrototypes.length; ++i) {\n if (excludedPrototypes[i] === val) {\n return true;\n }\n }\n\n return false;\n };\n\n if (es5.isES5) {\n var getKeys = Object.getOwnPropertyNames;\n return function (obj) {\n var ret = [];\n var visitedKeys = Object.create(null);\n\n while (obj != null && !isExcludedProto(obj)) {\n var keys;\n\n try {\n keys = getKeys(obj);\n } catch (e) {\n return ret;\n }\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n if (visitedKeys[key]) continue;\n visitedKeys[key] = true;\n var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n if (desc != null && desc.get == null && desc.set == null) {\n ret.push(key);\n }\n }\n\n obj = es5.getPrototypeOf(obj);\n }\n\n return ret;\n };\n } else {\n var hasProp = {}.hasOwnProperty;\n return function (obj) {\n if (isExcludedProto(obj)) return [];\n var ret = [];\n /*jshint forin:false */\n\n enumeration: for (var key in obj) {\n if (hasProp.call(obj, key)) {\n ret.push(key);\n } else {\n for (var i = 0; i < excludedPrototypes.length; ++i) {\n if (hasProp.call(excludedPrototypes[i], key)) {\n continue enumeration;\n }\n }\n\n ret.push(key);\n }\n }\n\n return ret;\n };\n }\n }();\n\n var thisAssignmentPattern = /this\\s*\\.\\s*\\S+\\s*=/;\n\n function isClass(fn) {\n try {\n if (typeof fn === \"function\") {\n var keys = es5.names(fn.prototype);\n var hasMethods = es5.isES5 && keys.length > 1;\n var hasMethodsOtherThanConstructor = keys.length > 0 && !(keys.length === 1 && keys[0] === \"constructor\");\n var hasThisAssignmentAndStaticMethods = thisAssignmentPattern.test(fn + \"\") && es5.names(fn).length > 0;\n\n if (hasMethods || hasMethodsOtherThanConstructor || hasThisAssignmentAndStaticMethods) {\n return true;\n }\n }\n\n return false;\n } catch (e) {\n return false;\n }\n }\n\n function toFastProperties(obj) {\n /*jshint -W027,-W055,-W031*/\n function FakeConstructor() {}\n\n FakeConstructor.prototype = obj;\n var receiver = new FakeConstructor();\n\n function ic() {\n return _typeof(receiver.foo);\n }\n\n ic();\n ic();\n return obj;\n eval(obj);\n }\n\n var rident = /^[a-z$_][a-z$_0-9]*$/i;\n\n function isIdentifier(str) {\n return rident.test(str);\n }\n\n function filledRange(count, prefix, suffix) {\n var ret = new Array(count);\n\n for (var i = 0; i < count; ++i) {\n ret[i] = prefix + i + suffix;\n }\n\n return ret;\n }\n\n function safeToString(obj) {\n try {\n return obj + \"\";\n } catch (e) {\n return \"[no string representation]\";\n }\n }\n\n function isError(obj) {\n return obj instanceof Error || obj !== null && _typeof(obj) === \"object\" && typeof obj.message === \"string\" && typeof obj.name === \"string\";\n }\n\n function markAsOriginatingFromRejection(e) {\n try {\n notEnumerableProp(e, \"isOperational\", true);\n } catch (ignore) {}\n }\n\n function originatesFromRejection(e) {\n if (e == null) return false;\n return e instanceof Error[\"__BluebirdErrorTypes__\"].OperationalError || e[\"isOperational\"] === true;\n }\n\n function canAttachTrace(obj) {\n return isError(obj) && es5.propertyIsWritable(obj, \"stack\");\n }\n\n var ensureErrorObject = function () {\n if (!(\"stack\" in new Error())) {\n return function (value) {\n if (canAttachTrace(value)) return value;\n\n try {\n throw new Error(safeToString(value));\n } catch (err) {\n return err;\n }\n };\n } else {\n return function (value) {\n if (canAttachTrace(value)) return value;\n return new Error(safeToString(value));\n };\n }\n }();\n\n function classString(obj) {\n return {}.toString.call(obj);\n }\n\n function copyDescriptors(from, to, filter) {\n var keys = es5.names(from);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (filter(key)) {\n try {\n es5.defineProperty(to, key, es5.getDescriptor(from, key));\n } catch (ignore) {}\n }\n }\n }\n\n var asArray = function asArray(v) {\n if (es5.isArray(v)) {\n return v;\n }\n\n return null;\n };\n\n if (typeof Symbol !== \"undefined\" && Symbol.iterator) {\n var ArrayFrom = typeof Array.from === \"function\" ? function (v) {\n return Array.from(v);\n } : function (v) {\n var ret = [];\n var it = v[Symbol.iterator]();\n var itResult;\n\n while (!(itResult = it.next()).done) {\n ret.push(itResult.value);\n }\n\n return ret;\n };\n\n asArray = function asArray(v) {\n if (es5.isArray(v)) {\n return v;\n } else if (v != null && typeof v[Symbol.iterator] === \"function\") {\n return ArrayFrom(v);\n }\n\n return null;\n };\n }\n\n var isNode = typeof process !== \"undefined\" && classString(process).toLowerCase() === \"[object process]\";\n var hasEnvVariables = typeof process !== \"undefined\" && typeof process.env !== \"undefined\";\n\n function env(key) {\n return hasEnvVariables ? process.env[key] : undefined;\n }\n\n function getNativePromise() {\n if (typeof Promise === \"function\") {\n try {\n var promise = new Promise(function () {});\n\n if ({}.toString.call(promise) === \"[object Promise]\") {\n return Promise;\n }\n } catch (e) {}\n }\n }\n\n function domainBind(self, cb) {\n return self.bind(cb);\n }\n\n var ret = {\n isClass: isClass,\n isIdentifier: isIdentifier,\n inheritedDataKeys: inheritedDataKeys,\n getDataPropertyOrDefault: getDataPropertyOrDefault,\n thrower: thrower,\n isArray: es5.isArray,\n asArray: asArray,\n notEnumerableProp: notEnumerableProp,\n isPrimitive: isPrimitive,\n isObject: isObject,\n isError: isError,\n canEvaluate: canEvaluate,\n errorObj: errorObj,\n tryCatch: tryCatch,\n inherits: inherits,\n withAppended: withAppended,\n maybeWrapAsError: maybeWrapAsError,\n toFastProperties: toFastProperties,\n filledRange: filledRange,\n toString: safeToString,\n canAttachTrace: canAttachTrace,\n ensureErrorObject: ensureErrorObject,\n originatesFromRejection: originatesFromRejection,\n markAsOriginatingFromRejection: markAsOriginatingFromRejection,\n classString: classString,\n copyDescriptors: copyDescriptors,\n hasDevTools: typeof chrome !== \"undefined\" && chrome && typeof chrome.loadTimes === \"function\",\n isNode: isNode,\n hasEnvVariables: hasEnvVariables,\n env: env,\n global: globalObject,\n getNativePromise: getNativePromise,\n domainBind: domainBind\n };\n\n ret.isRecentNode = ret.isNode && function () {\n var version;\n\n if (process.versions && process.versions.node) {\n version = process.versions.node.split(\".\").map(Number);\n } else if (process.version) {\n version = process.version.split(\".\").map(Number);\n }\n\n return version[0] === 0 && version[1] > 10 || version[0] > 0;\n }();\n\n if (ret.isNode) ret.toFastProperties(process);\n\n try {\n throw new Error();\n } catch (e) {\n ret.lastLineError = e;\n }\n\n module.exports = ret;\n }, {\n \"./es5\": 13\n }]\n }, {}, [4])(4);\n});\n;\n\nif (typeof window !== 'undefined' && window !== null) {\n window.P = window.Promise;\n} else if (typeof self !== 'undefined' && self !== null) {\n self.P = self.Promise;\n}","module.exports = require(\"bluebird\");","var utils = require(\"../../utils/utils\");\n\nvar StateService = function StateService() {\n var stateProviders = {};\n\n function getState(name) {\n var provider = stateProviders[name];\n\n if (provider) {\n return stateProviders[name].method();\n } else {\n var res = {};\n\n for (var i in stateProviders) {\n if (!stateProviders[i].internal) utils.mixin(res, stateProviders[i].method(), true);\n }\n\n return res;\n }\n }\n\n function registerProvider(name, provider, internal) {\n stateProviders[name] = {\n method: provider,\n internal: internal\n };\n }\n\n function unregisterProvider(name) {\n delete stateProviders[name];\n }\n\n return {\n getState: getState,\n registerProvider: registerProvider,\n unregisterProvider: unregisterProvider\n };\n};\n\nmodule.exports = StateService;","module.exports = function (gantt) {\n var regTemplates = {};\n\n function initTemplate(name, initial, template_name) {\n template_name = template_name || name;\n var config = gantt.config,\n templates = gantt.templates;\n\n if (gantt.config[name] && regTemplates[template_name] != config[name]) {\n if (!(initial && templates[template_name])) {\n templates[template_name] = gantt.date.date_to_str(config[name]);\n regTemplates[template_name] = config[name];\n }\n }\n }\n\n function initTemplates() {\n var labels = gantt.locale.labels;\n labels.gantt_save_btn = labels.icon_save;\n labels.gantt_cancel_btn = labels.icon_cancel;\n labels.gantt_delete_btn = labels.icon_delete;\n var date = gantt.date; //build configuration based templates\n\n var d = date.date_to_str;\n var c = gantt.config;\n var format_date = d(c.xml_date || c.date_format, c.server_utc);\n var parse_date = date.str_to_date(c.xml_date || c.date_format, c.server_utc);\n initTemplate(\"date_scale\", true, undefined, gantt.config, gantt.templates);\n initTemplate(\"date_grid\", true, \"grid_date_format\", gantt.config, gantt.templates);\n initTemplate(\"task_date\", true, undefined, gantt.config, gantt.templates);\n gantt.mixin(gantt.templates, {\n xml_format: undefined,\n // deprecated\n format_date: format_date,\n xml_date: undefined,\n // deprecated\n parse_date: parse_date,\n progress_text: function progress_text(start, end, task) {\n return \"\";\n },\n grid_header_class: function grid_header_class(column, config) {\n return \"\";\n },\n task_text: function task_text(start, end, task) {\n return task.text;\n },\n task_class: function task_class(start, end, task) {\n return \"\";\n },\n task_end_date: function task_end_date(date) {\n return gantt.templates.task_date(date);\n },\n grid_row_class: function grid_row_class(start, end, task) {\n return \"\";\n },\n task_row_class: function task_row_class(start, end, task) {\n return \"\";\n },\n timeline_cell_class: function timeline_cell_class(item, date) {\n return \"\";\n },\n timeline_cell_content: function timeline_cell_content(item, date) {\n return \"\";\n },\n scale_cell_class: function scale_cell_class(date) {\n return \"\";\n },\n scale_row_class: function scale_row_class(date) {\n return \"\";\n },\n grid_indent: function grid_indent(item) {\n return \"<div class='gantt_tree_indent'></div>\";\n },\n grid_folder: function grid_folder(item) {\n return \"<div class='gantt_tree_icon gantt_folder_\" + (item.$open ? \"open\" : \"closed\") + \"'></div>\";\n },\n grid_file: function grid_file(item) {\n return \"<div class='gantt_tree_icon gantt_file'></div>\";\n },\n grid_open: function grid_open(item) {\n return \"<div class='gantt_tree_icon gantt_\" + (item.$open ? \"close\" : \"open\") + \"'></div>\";\n },\n grid_blank: function grid_blank(item) {\n return \"<div class='gantt_tree_icon gantt_blank'></div>\";\n },\n date_grid: function date_grid(date, item, column) {\n if (item && gantt.isUnscheduledTask(item) && gantt.config.show_unscheduled) {\n return gantt.templates.task_unscheduled_time(item);\n } else {\n return gantt.templates.grid_date_format(date, column);\n }\n },\n task_time: function task_time(start, end, ev) {\n if (gantt.isUnscheduledTask(ev) && gantt.config.show_unscheduled) {\n return gantt.templates.task_unscheduled_time(ev);\n } else {\n return gantt.templates.task_date(start) + \" - \" + gantt.templates.task_end_date(end);\n }\n },\n task_unscheduled_time: function task_unscheduled_time(task) {\n return \"\";\n },\n time_picker: d(c.time_picker),\n link_class: function link_class(link) {\n return \"\";\n },\n link_description: function link_description(link) {\n var from = gantt.getTask(link.source),\n to = gantt.getTask(link.target);\n return \"<b>\" + from.text + \"</b> – <b>\" + to.text + \"</b>\";\n },\n drag_link: function drag_link(from, from_start, to, to_start) {\n from = gantt.getTask(from);\n var labels = gantt.locale.labels;\n var text = \"<b>\" + from.text + \"</b> \" + (from_start ? labels.link_start : labels.link_end) + \"<br/>\";\n\n if (to) {\n to = gantt.getTask(to);\n text += \"<b> \" + to.text + \"</b> \" + (to_start ? labels.link_start : labels.link_end) + \"<br/>\";\n }\n\n return text;\n },\n drag_link_class: function drag_link_class(from, from_start, to, to_start) {\n var add = \"\";\n\n if (from && to) {\n var allowed = gantt.isLinkAllowed(from, to, from_start, to_start);\n add = \" \" + (allowed ? \"gantt_link_allow\" : \"gantt_link_deny\");\n }\n\n return \"gantt_link_tooltip\" + add;\n },\n\n /* used for aria-labels of bar elements and for tooltip.js */\n tooltip_date_format: date.date_to_str(\"%Y-%m-%d\"),\n tooltip_text: function tooltip_text(start, end, event) {\n return \"<b>Task:</b> \" + event.text + \"<br/><b>Start date:</b> \" + gantt.templates.tooltip_date_format(start) + \"<br/><b>End date:</b> \" + gantt.templates.tooltip_date_format(end);\n }\n });\n }\n\n return {\n initTemplates: initTemplates,\n initTemplate: initTemplate\n };\n};","var eventable = require(\"../../utils/eventable\");\n\nvar utils = require(\"../../utils/utils\");\n\nvar timeout = require(\"../../utils/timeout\");\n\nvar global = require(\"../../utils/global\");\n\nvar domHelpers = require(\"../ui/utils/dom_helpers\");\n\nmodule.exports = function (gantt) {\n function copyDomEvent(e) {\n return {\n target: e.target || e.srcElement,\n pageX: e.pageX,\n pageY: e.pageY,\n clientX: e.clientX,\n clientY: e.clientY,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n altKey: e.altKey\n };\n }\n\n function DnD(obj, config) {\n this._obj = obj;\n this._settings = config || {};\n eventable(this);\n var inputMethods = this.getInputMethods();\n this._drag_start_timer = null;\n gantt.attachEvent(\"onGanttScroll\", utils.bind(function (left, top) {\n this.clearDragTimer();\n }, this));\n var lastDown = 0;\n var eventParams = {\n passive: false\n };\n\n for (var i = 0; i < inputMethods.length; i++) {\n utils.bind(function (input) {\n gantt.event(obj, input.down, utils.bind(function (e) {\n if (!input.accessor(e)) {\n return;\n }\n\n if (config.preventDefault && config.selector && domHelpers.closest(e.target, config.selector)) {\n e.preventDefault();\n }\n\n if (gantt.config.touch && e.timeStamp && e.timeStamp - lastDown < 300) {\n return;\n }\n\n this._settings.original_target = copyDomEvent(e);\n\n if (gantt.config.touch) {\n this.clearDragTimer();\n this._drag_start_timer = setTimeout(utils.bind(function () {\n if (gantt.getState().lightbox) {\n return;\n }\n\n this.dragStart(obj, e, input);\n }, this), gantt.config.touch_drag);\n } else {\n this.dragStart(obj, e, input);\n }\n }, this), eventParams);\n var eventElement = document.body;\n gantt.event(eventElement, input.up, utils.bind(function (e) {\n if (!input.accessor(e)) {\n return;\n }\n\n this.clearDragTimer();\n }, this), eventParams);\n }, this)(inputMethods[i]);\n }\n }\n\n DnD.prototype = {\n traceDragEvents: function traceDragEvents(domElement, inputMethod) {\n var mousemove = utils.bind(function (e) {\n return this.dragMove(domElement, e, inputMethod.accessor);\n }, this);\n utils.bind(function (e) {\n return this.dragScroll(domElement, e);\n }, this);\n var limited_mousemove = utils.bind(function (e) {\n if (this.config.started && utils.defined(this.config.updates_per_second)) {\n if (!timeout(this, this.config.updates_per_second)) return;\n }\n\n var dndActive = mousemove(e);\n\n if (dndActive) {\n try {\n if (e && e.preventDefault && e.cancelable) {\n //e.cancelable condition - because navigator.vibrate is blocked by Chrome\n e.preventDefault(); //Cancel default action on DND\n } //Cancel default action on DND\n\n } catch (e) {// just suppress the exception, nothing needed to be done here\n } //e.cancelBubble = true;\n\n }\n\n return dndActive;\n }, this);\n var eventElement = domHelpers.getRootNode(gantt.$root);\n var mousemoveContainer = this.config.mousemoveContainer || domHelpers.getRootNode(gantt.$root);\n var eventParams = {\n passive: false\n };\n var mouseup = utils.bind(function (e) {\n gantt.eventRemove(mousemoveContainer, inputMethod.move, limited_mousemove);\n gantt.eventRemove(eventElement, inputMethod.up, mouseup, eventParams);\n return this.dragEnd(domElement);\n }, this);\n gantt.event(mousemoveContainer, inputMethod.move, limited_mousemove, eventParams);\n gantt.event(eventElement, inputMethod.up, mouseup, eventParams);\n },\n checkPositionChange: function checkPositionChange(pos) {\n var diff_x = pos.x - this.config.pos.x;\n var diff_y = pos.y - this.config.pos.y;\n var distance = Math.sqrt(Math.pow(Math.abs(diff_x), 2) + Math.pow(Math.abs(diff_y), 2));\n\n if (distance > this.config.sensitivity) {\n return true;\n } else {\n return false;\n }\n },\n initDnDMarker: function initDnDMarker() {\n // create dnd placeholder and put it in dom\n var marker = this.config.marker = document.createElement(\"div\");\n marker.className = \"gantt_drag_marker\"; // GS-1333: don't show any message when we resize grid columns\n\n marker.innerHTML = \"\";\n document.body.appendChild(marker);\n },\n backupEventTarget: function backupEventTarget(domEvent, getEvent) {\n if (!gantt.config.touch) {\n return;\n } // keep original event target in DOM in order to keep dnd on touchmove event\n\n\n var e = getEvent(domEvent);\n var el = e.target || e.srcElement;\n var copy = el.cloneNode(true); //this.config.target.target = copy;\n\n this.config.original_target = copyDomEvent(e);\n this.config.original_target.target = copy;\n this.config.backup_element = el;\n el.parentNode.appendChild(copy);\n el.style.display = \"none\";\n var mousemoveContainer = this.config.mousemoveContainer || document.body;\n mousemoveContainer.appendChild(el);\n },\n getInputMethods: function getInputMethods() {\n // bind actions to browser events\n var inputMethods = [];\n inputMethods.push({\n \"move\": \"mousemove\",\n \"down\": \"mousedown\",\n \"up\": \"mouseup\",\n \"accessor\": function accessor(e) {\n return e;\n }\n });\n\n if (gantt.config.touch) {\n var touchEventsSupported = true;\n\n try {\n document.createEvent(\"TouchEvent\");\n } catch (e) {\n touchEventsSupported = false;\n }\n\n if (touchEventsSupported) {\n inputMethods.push({\n \"move\": \"touchmove\",\n \"down\": \"touchstart\",\n \"up\": \"touchend\",\n \"accessor\": function accessor(ev) {\n if (ev.touches && ev.touches.length > 1) return null;\n if (ev.touches[0]) return {\n target: document.elementFromPoint(ev.touches[0].clientX, ev.touches[0].clientY),\n pageX: ev.touches[0].pageX,\n pageY: ev.touches[0].pageY,\n clientX: ev.touches[0].clientX,\n clientY: ev.touches[0].clientY\n };else return ev;\n }\n });\n } else if (global.navigator.pointerEnabled) {\n inputMethods.push({\n \"move\": \"pointermove\",\n \"down\": \"pointerdown\",\n \"up\": \"pointerup\",\n \"accessor\": function accessor(ev) {\n if (ev.pointerType == \"mouse\") return null;\n return ev;\n }\n });\n } else if (global.navigator.msPointerEnabled) {\n inputMethods.push({\n \"move\": \"MSPointerMove\",\n \"down\": \"MSPointerDown\",\n \"up\": \"MSPointerUp\",\n \"accessor\": function accessor(ev) {\n if (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE) return null;\n return ev;\n }\n });\n }\n }\n\n return inputMethods;\n },\n clearDragTimer: function clearDragTimer() {\n if (this._drag_start_timer) {\n clearTimeout(this._drag_start_timer);\n this._drag_start_timer = null;\n }\n },\n dragStart: function dragStart(obj, e, inputMethod) {\n if (this.config && this.config.started) {\n return;\n }\n\n this.config = {\n obj: obj,\n marker: null,\n started: false,\n pos: this.getPosition(e),\n sensitivity: 4\n };\n if (this._settings) utils.mixin(this.config, this._settings, true);\n this.traceDragEvents(obj, inputMethod);\n gantt._prevent_touch_scroll = true;\n document.body.className += \" gantt_noselect\";\n\n if (gantt.config.touch) {\n this.dragMove(obj, e, inputMethod.accessor);\n }\n },\n dragMove: function dragMove(obj, e, getEvent) {\n var source = getEvent(e);\n if (!source) return false;\n\n if (!this.config.marker && !this.config.started) {\n var pos = this.getPosition(source);\n\n if (gantt.config.touch || this.checkPositionChange(pos)) {\n // real drag starts here,\n // when user moves mouse at first time after onmousedown\n this.config.started = true;\n this.config.ignore = false;\n\n if (this.callEvent(\"onBeforeDragStart\", [obj, this.config.original_target]) === false) {\n this.config.ignore = true;\n return false;\n }\n\n this.backupEventTarget(e, getEvent);\n this.initDnDMarker();\n\n gantt._touch_feedback();\n\n this.callEvent(\"onAfterDragStart\", [obj, this.config.original_target]);\n } else {\n this.config.ignore = true;\n }\n }\n\n if (!this.config.ignore) {\n // GS-1279 Gantt crashes on Mobile Firefox after starting to create a link and moving finger outisde the page.\n if (e.targetTouches && !source.target) return;\n source.pos = this.getPosition(source);\n this.config.marker.style.left = source.pos.x + \"px\";\n this.config.marker.style.top = source.pos.y + \"px\";\n this.callEvent(\"onDragMove\", [obj, source]);\n return true;\n }\n\n return false;\n },\n dragEnd: function dragEnd(obj) {\n var target = this.config.backup_element;\n\n if (target && target.parentNode) {\n target.parentNode.removeChild(target);\n }\n\n gantt._prevent_touch_scroll = false;\n\n if (this.config.marker) {\n this.config.marker.parentNode.removeChild(this.config.marker);\n this.config.marker = null;\n this.callEvent(\"onDragEnd\", []);\n }\n\n this.config.started = false;\n document.body.className = document.body.className.replace(\" gantt_noselect\", \"\");\n },\n getPosition: function getPosition(e) {\n var x = 0,\n y = 0;\n\n if (e.pageX || e.pageY) {\n x = e.pageX;\n y = e.pageY;\n } else if (e.clientX || e.clientY) {\n x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\n y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;\n }\n\n return {\n x: x,\n y: y\n };\n }\n };\n return DnD;\n};","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar t = /*#__PURE__*/function () {\n function t(_t) {\n _classCallCheck(this, t);\n\n var e = _t.url,\n s = _t.token;\n this._url = e, this._token = s, this._mode = 1, this._seed = 1, this._queue = [], this.data = {}, this.api = {}, this._events = {};\n }\n\n _createClass(t, [{\n key: \"headers\",\n value: function headers() {\n return {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"Remote-Token\": this._token\n };\n }\n }, {\n key: \"fetch\",\n value: function (_fetch) {\n function fetch(_x, _x2) {\n return _fetch.apply(this, arguments);\n }\n\n fetch.toString = function () {\n return _fetch.toString();\n };\n\n return fetch;\n }(function (_t2, e) {\n var s = {\n credentials: \"include\",\n headers: this.headers()\n };\n return e && (s.method = \"POST\", s.body = e), fetch(_t2, s).then(function (_t3) {\n return _t3.json();\n });\n })\n }, {\n key: \"load\",\n value: function load(_t4) {\n var _this = this;\n\n return _t4 && (this._url = _t4), this.fetch(this._url).then(function (_t5) {\n return _this.parse(_t5);\n });\n }\n }, {\n key: \"parse\",\n value: function parse(_t6) {\n var e = _t6.key,\n s = _t6.websocket;\n e && (this._token = _t6.key);\n\n for (var _e in _t6.data) {\n this.data[_e] = _t6.data[_e];\n }\n\n for (var _e2 in _t6.api) {\n var _s = this.api[_e2] = {},\n i = _t6.api[_e2];\n\n for (var _t29 in i) {\n _s[_t29] = this._wrapper(_e2 + \".\" + _t29);\n }\n }\n\n return s && this.connect(), this;\n }\n }, {\n key: \"connect\",\n value: function connect() {\n var _this2 = this;\n\n var _t8 = this._socket;\n _t8 && (this._socket = null, _t8.onclose = function () {}, _t8.close()), this._mode = 2, this._socket = function (t, e, s, i) {\n var n = e;\n \"/\" === n[0] && (n = document.location.protocol + \"//\" + document.location.host + e);\n n = n.replace(/^http(s|):/, \"ws$1:\");\n var o = -1 != n.indexOf(\"?\") ? \"&\" : \"?\";\n n = \"\".concat(n).concat(o, \"token=\").concat(s, \"&ws=1\");\n var r = new WebSocket(n);\n return r.onclose = function () {\n return setTimeout(function () {\n return t.connect();\n }, 2e3);\n }, r.onmessage = function (e) {\n var s = JSON.parse(e.data);\n\n switch (s.action) {\n case \"result\":\n t.result(s.body, []);\n break;\n\n case \"event\":\n t.fire(s.body.name, s.body.value);\n break;\n\n case \"start\":\n i();\n break;\n\n default:\n t.onError(s.data);\n }\n }, r;\n }(this, this._url, this._token, function () {\n return _this2._mode = 3, _this2._send(), _this2._resubscribe(), _this2;\n });\n }\n }, {\n key: \"_wrapper\",\n value: function _wrapper(_t9) {\n return function () {\n var _this3 = this;\n\n var e = [].slice.call(arguments);\n var s = null;\n var i = new Promise(function (i, n) {\n s = {\n data: {\n id: _this3._uid(),\n name: _t9,\n args: e\n },\n status: 1,\n resolve: i,\n reject: n\n }, _this3._queue.push(s);\n });\n return this.onCall(s, i), 3 === this._mode ? this._send(s) : setTimeout(function () {\n return _this3._send();\n }, 1), i;\n }.bind(this);\n }\n }, {\n key: \"_uid\",\n value: function _uid() {\n return (this._seed++).toString();\n }\n }, {\n key: \"_send\",\n value: function _send(_t10) {\n var _this4 = this;\n\n if (2 == this._mode) return void setTimeout(function () {\n return _this4._send();\n }, 100);\n var e = _t10 ? [_t10] : this._queue.filter(function (_t11) {\n return 1 === _t11.status;\n });\n if (!e.length) return;\n var s = e.map(function (_t12) {\n return _t12.status = 2, _t12.data;\n });\n 3 !== this._mode ? this.fetch(this._url, JSON.stringify(s))[\"catch\"](function (_t13) {\n return _this4.onError(_t13);\n }).then(function (_t14) {\n return _this4.result(_t14, s);\n }) : this._socket.send(JSON.stringify({\n action: \"call\",\n body: s\n }));\n }\n }, {\n key: \"result\",\n value: function result(_t15, e) {\n var s = {};\n if (_t15) for (var _e3 = 0; _e3 < _t15.length; _e3++) {\n s[_t15[_e3].id] = _t15[_e3];\n } else for (var _t30 = 0; _t30 < e.length; _t30++) {\n s[e[_t30].id] = {\n id: e[_t30].id,\n error: \"Network Error\",\n data: null\n };\n }\n\n for (var _t31 = this._queue.length - 1; _t31 >= 0; _t31--) {\n var _e4 = this._queue[_t31],\n i = s[_e4.data.id];\n i && (this.onResponse(_e4, i), i.error ? _e4.reject(i.error) : _e4.resolve(i.data), this._queue.splice(_t31, 1));\n }\n }\n }, {\n key: \"on\",\n value: function on(_t18, e) {\n var s = this._uid();\n\n var i = this._events[_t18];\n var n = !!i;\n return n || (i = this._events[_t18] = []), i.push({\n id: s,\n handler: e\n }), n || 3 != this._mode || this._socket.send(JSON.stringify({\n action: \"subscribe\",\n name: _t18\n })), {\n name: _t18,\n id: s\n };\n }\n }, {\n key: \"_resubscribe\",\n value: function _resubscribe() {\n if (3 == this._mode) for (var _t32 in this._events) {\n this._socket.send(JSON.stringify({\n action: \"subscribe\",\n name: _t32\n }));\n }\n }\n }, {\n key: \"detach\",\n value: function detach(_t20) {\n if (!_t20) {\n if (3 == this._mode) for (var _t33 in this._events) {\n this._socket.send(JSON.stringify({\n action: \"unsubscribe\",\n key: _t33\n }));\n }\n return void (this._events = {});\n }\n\n var e = _t20.id,\n s = _t20.name,\n i = this._events[s];\n\n if (i) {\n var _t34 = i.filter(function (_t23) {\n return _t23.id != e;\n });\n\n _t34.length ? this._events[s] = _t34 : (delete this._events[s], 3 == this._mode && this._socket.send(JSON.stringify({\n action: \"unsubscribe\",\n name: s\n })));\n }\n }\n }, {\n key: \"fire\",\n value: function fire(_t24, e) {\n var s = this._events[_t24];\n if (s) for (var _t35 = 0; _t35 < s.length; _t35++) {\n s[_t35].handler(e);\n }\n }\n }, {\n key: \"onError\",\n value: function onError(_t26) {\n return null;\n }\n }, {\n key: \"onCall\",\n value: function onCall(_t27, e) {}\n }, {\n key: \"onResponse\",\n value: function onResponse(_t28, e) {}\n }]);\n\n return t;\n}();\n\nexport { t as Client };","var remote_client = require(\"remote-client\");\n\nmodule.exports = {\n remoteEvents: function remoteEvents(url, token) {\n var _this = this;\n\n var remote = new remote_client.Client({\n url: url,\n token: token\n }); // temporary patch, as we do not want credentials\n\n remote.fetch = function (url, body) {\n var req = {\n headers: this.headers()\n };\n\n if (body) {\n req.method = \"POST\";\n req.body = body;\n }\n\n return fetch(url, req).then(function (res) {\n return res.json();\n });\n };\n\n this._ready = remote.load().then(function (back) {\n return _this._remote = back;\n });\n\n function ready() {\n return this._ready;\n }\n\n function on(name, handler) {\n this.ready().then(function (back) {\n if (typeof name === \"string\") back.on(name, handler);else {\n for (var key in name) {\n back.on(key, name[key]);\n }\n }\n });\n }\n\n this.ready = ready;\n this.on = on;\n }\n};","const dateToStr = (format: string, utc: boolean, gantt) => {\r\n\treturn (date) => {\r\n\t\treturn format.replace(/%[a-zA-Z]/g, (a) => {\r\n\t\t\tswitch (a) {\r\n\t\t\t\tcase \"%d\": return utc ? gantt.date.to_fixed(date.getUTCDate()) : gantt.date.to_fixed(date.getDate());\r\n\t\t\t\tcase \"%m\": return utc ? gantt.date.to_fixed((date.getUTCMonth() + 1)) : gantt.date.to_fixed((date.getMonth() + 1));\r\n\t\t\t\tcase \"%j\": return utc ? date.getUTCDate() : date.getDate();\r\n\t\t\t\tcase \"%n\": return utc ? (date.getUTCMonth() + 1) : (date.getMonth() + 1);\r\n\t\t\t\tcase \"%y\": return utc ? gantt.date.to_fixed(date.getUTCFullYear() % 100) : gantt.date.to_fixed(date.getFullYear() % 100);\r\n\t\t\t\tcase \"%Y\": return utc ? date.getUTCFullYear() : date.getFullYear();\r\n\t\t\t\tcase \"%D\": return utc ? gantt.locale.date.day_short[date.getUTCDay()] : gantt.locale.date.day_short[date.getDay()];\r\n\t\t\t\tcase \"%l\": return utc ? gantt.locale.date.day_full[date.getUTCDay()] : gantt.locale.date.day_full[date.getDay()];\r\n\t\t\t\tcase \"%M\": return utc ? gantt.locale.date.month_short[date.getUTCMonth()] : gantt.locale.date.month_short[date.getMonth()];\r\n\t\t\t\tcase \"%F\": return utc ? gantt.locale.date.month_full[date.getUTCMonth()] : gantt.locale.date.month_full[date.getMonth()];\r\n\t\t\t\tcase \"%h\": return utc ? gantt.date.to_fixed((date.getUTCHours() + 11) % 12 + 1) : gantt.date.to_fixed((date.getHours() + 11) % 12 + 1);\r\n\t\t\t\tcase \"%g\": return utc ? ((date.getUTCHours() + 11) % 12 + 1) : ((date.getHours() + 11) % 12 + 1);\r\n\t\t\t\tcase \"%G\": return utc ? date.getUTCHours() : date.getHours();\r\n\t\t\t\tcase \"%H\": return utc ? gantt.date.to_fixed(date.getUTCHours()) : gantt.date.to_fixed(date.getHours());\r\n\t\t\t\tcase \"%i\": return utc ? gantt.date.to_fixed(date.getUTCMinutes()) : gantt.date.to_fixed(date.getMinutes());\r\n\t\t\t\tcase \"%a\": return utc ? (date.getUTCHours() > 11 ? \"pm\" : \"am\") : (date.getHours() > 11 ? \"pm\" : \"am\");\r\n\t\t\t\tcase \"%A\": return utc ? (date.getUTCHours() > 11 ? \"PM\" : \"AM\") : (date.getHours() > 11 ? \"PM\" : \"AM\");\r\n\t\t\t\tcase \"%s\": return utc ? gantt.date.to_fixed(date.getUTCSeconds()) : gantt.date.to_fixed(date.getSeconds());\r\n\t\t\t\tcase \"%W\": return utc ? gantt.date.to_fixed(gantt.date.getUTCISOWeek(date)) : gantt.date.to_fixed(gantt.date.getISOWeek(date));\r\n\t\t\t\tdefault: return a;\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n};\r\nconst strToDate = (format: string, utc: boolean, gantt:any) => {\r\n\treturn (date: string) => {\r\n\t\tconst set: Array<string|number> = [0, 0, 1, 0, 0, 0];\r\n\t\tconst temp = date.match(/[a-zA-Z]+|[0-9]+/g);\r\n\t\tconst mask = format.match(/%[a-zA-Z]/g);\r\n\r\n\t\tfor (let i = 0; i < mask.length; i++) {\r\n\t\t\tswitch (mask[i]) {\r\n\t\t\t\tcase \"%j\":\r\n\t\t\t\tcase \"%d\":\r\n\t\t\t\t\tset[2] = temp[i] as unknown as number || 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%n\":\r\n\t\t\t\tcase \"%m\":\r\n\t\t\t\t\tset[1] = (temp[i] as unknown as number || 1) - 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%y\":\r\n\t\t\t\t\tset[0] = temp[i] as unknown as number * 1 + ((temp[i] as unknown as number) > 50 ? 1900 : 2000);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%g\":\r\n\t\t\t\tcase \"%G\":\r\n\t\t\t\tcase \"%h\":\r\n\t\t\t\tcase \"%H\":\r\n\t\t\t\t\tset[3] = temp[i] as unknown as number || 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%i\":\r\n\t\t\t\t\tset[4] = temp[i] as unknown as number || 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%Y\":\r\n\t\t\t\t\tset[0] = temp[i] as unknown as number || 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%a\":\r\n\t\t\t\tcase \"%A\":\r\n\t\t\t\t\tset[3] = set[3] as number % 12 + ((temp[i] || \"\").toLowerCase() === \"am\" ? 0 : 12);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%s\":\r\n\t\t\t\t\tset[5] = temp[i] || 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%M\":\r\n\t\t\t\t\tset[1] = gantt.locale.date.month_short_hash[temp[i]] || 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"%F\":\r\n\t\t\t\t\tset[1] = gantt.locale.date.month_full_hash[temp[i]] || 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (utc) {\r\n\t\t\treturn new Date(Date.UTC(\r\n\t\t\t\tset[0] as number,\r\n\t\t\t\tset[1] as number,\r\n\t\t\t\tset[2] as number,\r\n\t\t\t\tset[3] as number,\r\n\t\t\t\tset[4] as number,\r\n\t\t\t\tset[5] as number\r\n\t\t\t));\r\n\t\t}\r\n\t\treturn new Date(\r\n\t\t\tset[0] as number,\r\n\t\t\tset[1] as number,\r\n\t\t\tset[2] as number,\r\n\t\t\tset[3] as number,\r\n\t\t\tset[4] as number,\r\n\t\t\tset[5] as number\r\n\t\t);\r\n\t};\r\n\r\n};\r\n\r\n\r\nconst cspVersion = {\r\n\tdate_to_str: dateToStr,\r\n\tstr_to_date: strToDate\r\n};\r\n\r\nexport default cspVersion;","const dateToStr = (format: string, utc: boolean, gantt) => {\r\n\tformat = format.replace(/%[a-zA-Z]/g, (a) => {\r\n\t\tswitch (a) {\r\n\t\t\tcase \"%d\":\r\n\t\t\t\treturn `\"+to_fixed(date.get${utc?\"UTC\":\"\"}Date())+\"`;\r\n\t\t\tcase \"%m\":\r\n\t\t\t\treturn `\"+to_fixed((date.get${utc?\"UTC\":\"\"}Month()+1))+\"`;\r\n\t\t\tcase \"%j\":\r\n\t\t\t\treturn `\"+date.get${utc?\"UTC\":\"\"}Date()+\"`;\r\n\t\t\tcase \"%n\":\r\n\t\t\t\treturn `\"+(date.get${utc?\"UTC\":\"\"}Month()+1)+\"`;\r\n\t\t\tcase \"%y\":\r\n\t\t\t\treturn `\"+to_fixed(date.get${utc?\"UTC\":\"\"}FullYear()%100)+\"`;\r\n\t\t\tcase \"%Y\":\r\n\t\t\t\treturn `\"+date.get${utc?\"UTC\":\"\"}FullYear()+\"`;\r\n\t\t\tcase \"%D\":\r\n\t\t\t\treturn `\"+locale.date.day_short[date.get${utc?\"UTC\":\"\"}Day()]+\"`;\r\n\t\t\tcase \"%l\":\r\n\t\t\t\treturn `\"+locale.date.day_full[date.get${utc?\"UTC\":\"\"}Day()]+\"`;\r\n\t\t\tcase \"%M\":\r\n\t\t\t\treturn `\"+locale.date.month_short[date.get${utc?\"UTC\":\"\"}Month()]+\"`;\r\n\t\t\tcase \"%F\":\r\n\t\t\t\treturn `\"+locale.date.month_full[date.get${utc?\"UTC\":\"\"}Month()]+\"`;\r\n\t\t\tcase \"%h\":\r\n\t\t\t\treturn `\"+to_fixed((date.get${utc?\"UTC\":\"\"}Hours()+11)%12+1)+\"`;\r\n\t\t\tcase \"%g\":\r\n\t\t\t\treturn `\"+((date.get${utc?\"UTC\":\"\"}Hours()+11)%12+1)+\"`;\r\n\t\t\tcase \"%G\":\r\n\t\t\t\treturn `\"+date.get${utc?\"UTC\":\"\"}Hours()+\"`;\r\n\t\t\tcase \"%H\":\r\n\t\t\t\treturn `\"+to_fixed(date.get${utc?\"UTC\":\"\"}Hours())+\"`;\r\n\t\t\tcase \"%i\":\r\n\t\t\t\treturn `\"+to_fixed(date.get${utc?\"UTC\":\"\"}Minutes())+\"`;\r\n\t\t\tcase \"%a\":\r\n\t\t\t\treturn `\"+(date.get${utc?\"UTC\":\"\"}Hours()>11?\"pm\":\"am\")+\"`;\r\n\t\t\tcase \"%A\":\r\n\t\t\t\treturn `\"+(date.get${utc?\"UTC\":\"\"}Hours()>11?\"PM\":\"AM\")+\"`;\r\n\t\t\tcase \"%s\":\r\n\t\t\t\treturn `\"+to_fixed(date.get${utc?\"UTC\":\"\"}Seconds())+\"`;\r\n\t\t\tcase \"%W\":\r\n\t\t\t\treturn `\"+to_fixed(getISOWeek(date))+\"`;\r\n\t\t\tcase \"%w\":\r\n\t\t\t\treturn `\"+to_fixed(getWeek(date))+\"`;\r\n\t\t\tdefault:\r\n\t\t\t\treturn a;\r\n\t\t}\r\n\t});\r\n\r\n\t// tslint:disable-next-line: function-constructor\r\n\tconst dateToStrFn = new Function(\"date\", \"to_fixed\", \"locale\", \"getISOWeek\", \"getWeek\", `return \"${format}\";`);\r\n\r\n\treturn (date: Date) => {\r\n\t\treturn dateToStrFn(date, gantt.date.to_fixed, gantt.locale, gantt.date.getISOWeek, gantt.date.getWeek);\r\n\t};\r\n};\r\n\r\n\r\nconst strToDate = (format: string, utc: boolean, gantt:any) => {\r\n\tlet splt = \"var temp=date.match(/[a-zA-Z]+|[0-9]+/g);\";\r\n\tconst mask = format.match(/%[a-zA-Z]/g);\r\n\tfor (let i = 0; i < mask.length; i++) {\r\n\t\tswitch (mask[i]) {\r\n\t\t\tcase \"%j\":\r\n\t\t\tcase \"%d\":\r\n\t\t\t\tsplt += `set[2]=temp[${i}]||1;`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%n\":\r\n\t\t\tcase \"%m\":\r\n\t\t\t\tsplt += `set[1]=(temp[${i}]||1)-1;`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%y\":\r\n\t\t\t\tsplt += `set[0]=temp[${i}]*1+(temp[${i}]>50?1900:2000);`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%g\":\r\n\t\t\tcase \"%G\":\r\n\t\t\tcase \"%h\":\r\n\t\t\tcase \"%H\":\r\n\t\t\t\tsplt += `set[3]=temp[${i}]||0;`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%i\":\r\n\t\t\t\tsplt += `set[4]=temp[${i}]||0;`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%Y\":\r\n\t\t\t\tsplt += `set[0]=temp[${i}]||0;`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%a\":\r\n\t\t\tcase \"%A\":\r\n\t\t\t\tsplt += `set[3]=set[3]%12+((temp[${i}]||'').toLowerCase()=='am'?0:12);`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%s\":\r\n\t\t\t\tsplt += `set[5]=temp[${i}]||0;`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%M\":\r\n\t\t\t\tsplt += `set[1]=locale.date.month_short_hash[temp[${i}]]||0;`;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"%F\":\r\n\t\t\t\tsplt += `set[1]=locale.date.month_full_hash[temp[${i}]]||0;`;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tlet code = \"set[0],set[1],set[2],set[3],set[4],set[5]\";\r\n\tif (utc) { code = ` Date.UTC(${code})`; }\r\n\t// tslint:disable-next-line: function-constructor\r\n\tconst strToDateFn = new Function(\"date\", \"locale\", `var set=[0,0,1,0,0,0]; ${splt} return new Date(${code});`);\r\n\r\n\treturn (dateString) => {\r\n\t\treturn strToDateFn(dateString, gantt.locale);\r\n\t};\r\n};\r\n\r\nconst fastVersion = {\r\n\tdate_to_str: dateToStr,\r\n\tstr_to_date: strToDate\r\n};\r\n\r\nexport default fastVersion;","/*\r\n %d - the day as a number with a leading zero ( 01 to 31 );\r\n %j - the day as a number without a leading zero ( 1 to 31 );\r\n %D - the day as an abbreviation ( Sun to Sat );\r\n %l - the day as a full name ( Sunday to Saturday );\r\n %W - the ISO-8601 week number of the year. Weeks start on Monday; 1)\r\n %m - the month as a number without a leading zero ( 1 to 12 );\r\n %n - the month as a number with a leading zero ( 01 to 12);\r\n %M - the month as an abbreviation ( Jan to Dec );\r\n %F - the month as a full name ( January to December );\r\n %y - the year as a two-digit number ( 00 to 99 );\r\n %Y - the year as a four-digit number ( 1900鈥�9999 );\r\n %h - the hour based on the 12-hour clock ( 00 to 11 );\r\n %H - the hour based on the 24-hour clock ( 00 to 23 );\r\n %i - the minute as a number with a leading zero ( 00 to 59 );\r\n %s - the second as a number without a leading zero ( 00 to 59 ); 2)\r\n %a - displays am (for times from midnight until noon) and pm (for times from noon until midnight);\r\n %A - displays AM (for times from midnight until noon) and PM (for times from noon until midnight).\r\n*/\nvar fastVersion = require(\"./date_parsers/fast_version\")[\"default\"];\n\nvar cspCompliantVersion = require(\"./date_parsers/csp_compliant_version\")[\"default\"];\n\nmodule.exports = function (gantt) {\n var canUseCsp = null;\n\n function cspAutoCheck() {\n try {\n new Function(\"canUseCsp = false;\");\n } catch (e) {\n canUseCsp = true;\n }\n }\n\n function useCsp() {\n var result = false;\n\n if (gantt.config.csp === \"auto\") {\n if (canUseCsp === null) {\n cspAutoCheck();\n }\n\n result = canUseCsp;\n } else {\n result = gantt.config.csp;\n }\n\n return result;\n }\n\n var dateHelper = {\n init: function init() {\n var locale = gantt.locale;\n var s = locale.date.month_short;\n var t = locale.date.month_short_hash = {};\n\n for (var i = 0; i < s.length; i++) {\n t[s[i]] = i;\n }\n\n var s = locale.date.month_full;\n var t = locale.date.month_full_hash = {};\n\n for (var i = 0; i < s.length; i++) {\n t[s[i]] = i;\n }\n },\n date_part: function date_part(date) {\n var old = new Date(date);\n date.setHours(0);\n this.hour_start(date);\n if (date.getHours() && ( //shift to yesterday on dst\n date.getDate() < old.getDate() || date.getMonth() < old.getMonth() || date.getFullYear() < old.getFullYear())) date.setTime(date.getTime() + 60 * 60 * 1000 * (24 - date.getHours()));\n return date;\n },\n time_part: function time_part(date) {\n return (date.valueOf() / 1000 - date.getTimezoneOffset() * 60) % 86400;\n },\n week_start: function week_start(date) {\n var shift = date.getDay();\n\n if (gantt.config.start_on_monday) {\n if (shift === 0) shift = 6;else shift--;\n }\n\n return this.date_part(this.add(date, -1 * shift, \"day\"));\n },\n month_start: function month_start(date) {\n date.setDate(1);\n return this.date_part(date);\n },\n quarter_start: function quarter_start(date) {\n this.month_start(date);\n var m = date.getMonth(),\n res_month;\n\n if (m >= 9) {\n res_month = 9;\n } else if (m >= 6) {\n res_month = 6;\n } else if (m >= 3) {\n res_month = 3;\n } else {\n res_month = 0;\n }\n\n date.setMonth(res_month);\n return date;\n },\n year_start: function year_start(date) {\n date.setMonth(0);\n return this.month_start(date);\n },\n day_start: function day_start(date) {\n return this.date_part(date);\n },\n hour_start: function hour_start(date) {\n if (date.getMinutes()) date.setMinutes(0);\n this.minute_start(date);\n return date;\n },\n minute_start: function minute_start(date) {\n if (date.getSeconds()) date.setSeconds(0);\n if (date.getMilliseconds()) date.setMilliseconds(0);\n return date;\n },\n _add_days: function _add_days(modifiedDate, inc, originalDate) {\n modifiedDate.setDate(modifiedDate.getDate() + inc);\n var incCondition = inc >= 0;\n var getHoursCondition = !originalDate.getHours() && modifiedDate.getHours(); //shift to yesterday on dst\n\n var getDateCondition = modifiedDate.getDate() <= originalDate.getDate() || modifiedDate.getMonth() < originalDate.getMonth() || modifiedDate.getFullYear() < originalDate.getFullYear();\n\n if (incCondition && getHoursCondition && getDateCondition) {\n modifiedDate.setTime(modifiedDate.getTime() + 60 * 60 * 1000 * (24 - modifiedDate.getHours()));\n }\n\n var worktimeCalculation = inc > 1;\n\n if (worktimeCalculation && getHoursCondition) {\n // try to shift the modified Date to 00:00\n modifiedDate.setHours(0);\n }\n\n return modifiedDate;\n },\n add: function add(date, inc, mode) {\n /*jsl:ignore*/\n var ndate = new Date(date.valueOf());\n\n switch (mode) {\n case \"day\":\n ndate = this._add_days(ndate, inc, date);\n break;\n\n case \"week\":\n ndate = this._add_days(ndate, inc * 7, date);\n break;\n\n case \"month\":\n ndate.setMonth(ndate.getMonth() + inc);\n break;\n\n case \"year\":\n ndate.setYear(ndate.getFullYear() + inc);\n break;\n\n case \"hour\":\n /*\r\n \tadding hours/minutes via setHour(getHour() + inc) gives weird result when\r\n \tadding one hour to the time before switch to a Daylight Saving time\r\n \t\t\texample: //Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time)\r\n \tnew Date(2014, 02, 30, 1).setHours(2)\r\n \t>>Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time)\r\n \t\t\tsetTime seems working as expected\r\n */\n ndate.setTime(ndate.getTime() + inc * 60 * 60 * 1000);\n break;\n\n case \"minute\":\n ndate.setTime(ndate.getTime() + inc * 60 * 1000);\n break;\n\n default:\n return this[\"add_\" + mode](date, inc, mode);\n }\n\n return ndate;\n /*jsl:end*/\n },\n add_quarter: function add_quarter(date, inc) {\n return this.add(date, inc * 3, \"month\");\n },\n to_fixed: function to_fixed(num) {\n if (num < 10) return \"0\" + num;\n return num;\n },\n copy: function copy(date) {\n return new Date(date.valueOf());\n },\n date_to_str: function date_to_str(format, utc) {\n var result = fastVersion;\n\n if (useCsp()) {\n result = cspCompliantVersion;\n }\n\n return result.date_to_str(format, utc, gantt);\n },\n str_to_date: function str_to_date(format, utc) {\n var result = fastVersion;\n\n if (useCsp()) {\n result = cspCompliantVersion;\n }\n\n return result.str_to_date(format, utc, gantt);\n },\n getISOWeek: function getISOWeek(ndate) {\n return gantt.date._getWeekNumber(ndate, true);\n },\n _getWeekNumber: function _getWeekNumber(ndate, isoWeek) {\n if (!ndate) return false;\n var nday = ndate.getDay();\n\n if (isoWeek) {\n if (nday === 0) {\n nday = 7;\n }\n }\n\n var first_thursday = new Date(ndate.valueOf());\n first_thursday.setDate(ndate.getDate() + (4 - nday));\n var year_number = first_thursday.getFullYear(); // year of the first Thursday\n\n var ordinal_date = Math.round((first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date)\n\n var week_number = 1 + Math.floor(ordinal_date / 7);\n return week_number;\n },\n getWeek: function getWeek(ndate) {\n return gantt.date._getWeekNumber(ndate, gantt.config.start_on_monday);\n },\n getUTCISOWeek: function getUTCISOWeek(ndate) {\n return gantt.date.getISOWeek(ndate);\n },\n convert_to_utc: function convert_to_utc(date) {\n return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());\n },\n parseDate: function parseDate(date, format) {\n // raw date may be of type string, number (timestamp) or something else\n // do not check for instanceof Date explicitly, since we may swap native date with different date implementation at some point\n if (date && !date.getFullYear) {\n if (typeof format !== \"function\") {\n if (typeof format === \"string\") {\n if (format === \"parse_date\" || format === \"xml_date\") {\n format = gantt.defined(gantt.templates.xml_date) ? gantt.templates.xml_date : gantt.templates.parse_date;\n } else {\n format = gantt.defined(gantt.templates[format]) ? gantt.templates[format] : gantt.date.str_to_date(format);\n }\n } else {\n format = gantt.defined(gantt.templates.xml_date) ? gantt.templates.xml_date : gantt.templates.parse_date;\n }\n }\n\n if (date) {\n date = format(date);\n } else {\n date = null;\n }\n }\n\n return date;\n }\n };\n return dateHelper;\n};","export default function serialize(data: object | string) {\r\n\tif (typeof data === \"string\" || typeof data === \"number\") {\r\n\t\treturn data;\r\n\t}\r\n\r\n\tlet result = \"\";\r\n\r\n\tfor (const key in data) {\r\n\t\tlet serialized = \"\";\r\n\t\tif (data.hasOwnProperty(key)) {\r\n\t\t\tif (typeof data[key] === \"string\") {\r\n\t\t\t\tserialized = encodeURIComponent(data[key]);\r\n\t\t\t} else if (typeof data[key] === \"number\") {\r\n\t\t\t\tserialized = data[key];\r\n\t\t\t} else {\r\n\t\t\t\tserialized = encodeURIComponent(JSON.stringify(data[key]));\r\n\t\t\t}\r\n\t\t\tserialized = key + \"=\" + serialized;\r\n\r\n\t\t\tif (result.length) {\r\n\t\t\t\tserialized = \"&\" + serialized;\r\n\t\t\t}\r\n\t\t\tresult += serialized;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar env = require(\"../../utils/env\");\n\nvar global = require(\"../../utils/global\");\n\nvar serialize = require(\"./serialize\")[\"default\"];\n\nfunction createConfig(method, args) {\n var result = {\n method: method\n };\n\n if (args.length === 0) {\n throw new Error(\"Arguments list of query is wrong.\");\n }\n\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n result.url = args[0];\n result.async = true;\n } else {\n result.url = args[0].url;\n result.async = args[0].async || true;\n result.callback = args[0].callback;\n result.headers = args[0].headers;\n }\n\n if (method === \"POST\" || \"PUT\") {\n if (args[0].data) {\n if (typeof args[0].data !== \"string\") {\n result.data = serialize(args[0].data);\n } else {\n result.data = args[0].data;\n }\n } else {\n result.data = \"\";\n }\n }\n\n return result;\n }\n\n result.url = args[0];\n\n switch (method) {\n case \"GET\":\n case \"DELETE\":\n result.callback = args[1];\n result.headers = args[2];\n break;\n\n case \"POST\":\n case \"PUT\":\n if (args[1]) {\n if (typeof args[1] !== \"string\") {\n result.data = serialize(args[1]);\n } else {\n result.data = args[1];\n }\n } else {\n result.data = \"\";\n }\n\n result.callback = args[2];\n result.headers = args[3];\n break;\n }\n\n return result;\n}\n\nmodule.exports = function (gantt) {\n return {\n // if false - dhxr param will added to prevent caching on client side (default),\n // if true - do not add extra params\n cache: true,\n // default method for load/loadStruct, post/get allowed\n // get - since 4.1.1, this should fix 412 error for macos safari\n method: \"get\",\n parse: function parse(data) {\n if (typeof data !== \"string\") return data;\n var obj;\n data = data.replace(/^[\\s]+/, \"\");\n\n if (typeof DOMParser !== \"undefined\" && !env.isIE) {\n // ff,ie9\n obj = new DOMParser().parseFromString(data, \"text/xml\");\n } else if (typeof global.ActiveXObject !== \"undefined\") {\n obj = new global.ActiveXObject(\"Microsoft.XMLDOM\");\n obj.async = \"false\";\n obj.loadXML(data);\n }\n\n return obj;\n },\n xmltop: function xmltop(tagname, xhr, obj) {\n if (typeof xhr.status == \"undefined\" || xhr.status < 400) {\n var xml = !xhr.responseXML ? this.parse(xhr.responseText || xhr) : xhr.responseXML || xhr;\n\n if (xml && xml.documentElement !== null && !xml.getElementsByTagName(\"parsererror\").length) {\n return xml.getElementsByTagName(tagname)[0];\n }\n }\n\n if (obj !== -1) gantt.callEvent(\"onLoadXMLError\", [\"Incorrect XML\", arguments[1], obj]);\n return document.createElement(\"DIV\");\n },\n xpath: function xpath(xpathExp, docObj) {\n if (!docObj.nodeName) docObj = docObj.responseXML || docObj;\n\n if (env.isIE) {\n return docObj.selectNodes(xpathExp) || [];\n } else {\n var rows = [];\n var first;\n var col = (docObj.ownerDocument || docObj).evaluate(xpathExp, docObj, null, XPathResult.ANY_TYPE, null);\n\n while (true) {\n first = col.iterateNext();\n\n if (first) {\n rows.push(first);\n } else {\n break;\n }\n }\n\n return rows;\n }\n },\n query: function query(config) {\n return this._call(config.method || \"GET\", config.url, config.data || \"\", config.async || true, config.callback, config.headers);\n },\n get: function get(url, onLoad, headers) {\n var config = createConfig(\"GET\", arguments);\n return this.query(config);\n },\n getSync: function getSync(url, headers) {\n var config = createConfig(\"GET\", arguments);\n config.async = false;\n return this.query(config);\n },\n put: function put(url, postData, onLoad, headers) {\n var config = createConfig(\"PUT\", arguments);\n return this.query(config);\n },\n del: function del(url, onLoad, headers) {\n /**\r\n * https://tools.ietf.org/html/rfc7231#section-4.3.5\r\n * A payload within a DELETE request message has no defined semantics;\r\n * sending a payload body on a DELETE request might cause some existing\r\n * implementations to reject the request.\r\n */\n var config = createConfig(\"DELETE\", arguments);\n return this.query(config);\n },\n post: function post(url, postData, onLoad, headers) {\n if (arguments.length == 1) {\n postData = \"\";\n } else if (arguments.length == 2 && typeof postData == \"function\") {\n onLoad = postData;\n postData = \"\";\n }\n\n var config = createConfig(\"POST\", arguments);\n return this.query(config);\n },\n postSync: function postSync(url, postData, headers) {\n postData = postData === null ? \"\" : String(postData);\n var config = createConfig(\"POST\", arguments);\n config.async = false;\n return this.query(config);\n },\n _call: function _call(method, url, postData, async, onLoad, headers) {\n return new gantt.Promise(function (resolve, reject) {\n var t = (typeof XMLHttpRequest === \"undefined\" ? \"undefined\" : _typeof(XMLHttpRequest)) !== undefined ? new XMLHttpRequest() : new global.ActiveXObject(\"Microsoft.XMLHTTP\");\n var isQt = navigator.userAgent.match(/AppleWebKit/) !== null && navigator.userAgent.match(/Qt/) !== null && navigator.userAgent.match(/Safari/) !== null;\n\n if (!!async) {\n t.onreadystatechange = function () {\n if (t.readyState == 4 || isQt && t.readyState == 3) {\n // what for long response and status 404?\n if (t.status != 200 || t.responseText === \"\") if (!gantt.callEvent(\"onAjaxError\", [t])) return;\n setTimeout(function () {\n if (typeof onLoad == \"function\") {\n onLoad.apply(global, [{\n xmlDoc: t,\n filePath: url\n }]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText\n }\n\n resolve(t);\n\n if (typeof onLoad == \"function\") {\n onLoad = null;\n t = null;\n }\n }, 0);\n }\n };\n }\n\n var noCache = !this || !this.cache;\n\n if (method == \"GET\" && noCache) {\n url += (url.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + \"dhxr\" + new Date().getTime() + \"=1\";\n }\n\n t.open(method, url, async);\n\n if (headers) {\n for (var key in headers) {\n t.setRequestHeader(key, headers[key]);\n }\n } else if (method.toUpperCase() == \"POST\" || method == \"PUT\" || method == \"DELETE\") {\n t.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n } else if (method == \"GET\") {\n postData = null;\n }\n\n t.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n t.send(postData);\n if (!async) return {\n xmlDoc: t,\n filePath: url\n }; // dhtmlx-compat, response.xmlDoc.responseXML/responseText\n });\n },\n urlSeparator: function urlSeparator(str) {\n if (str.indexOf(\"?\") != -1) return \"&\";else return \"?\";\n }\n };\n};","type DurationUnits = \"minute\" | \"hour\" | \"day\" | \"week\" | \"month\" | \"year\";\r\ntype Align = \"left\" | \"center\" | \"right\";\r\ntype SectionType = \"textarea\"\r\n\t\t\t\t\t| \"time\"\r\n\t\t\t\t\t| \"duration\"\r\n\t\t\t\t\t| \"select\"\r\n\t\t\t\t\t| \"typeselect\"\r\n\t\t\t\t\t| \"parent\"\r\n\t\t\t\t\t| \"template\"\r\n\t\t\t\t\t| \"checkbox\"\r\n\t\t\t\t\t| \"radio\"\r\n\t\t\t\t\t| \"resources\"\r\n\t\t\t\t\t| \"constraint\";\r\n\r\ntype LightboxSection = Array<ILightboxSection\r\n\t| ILightboxTimeAndDurationSection\r\n\t| ILightboxInputControl\r\n\t| ILightboxSelectControl\r\n\t| ILightboxParentControl\r\n\t| ILightboxTypeselectControl>;\r\n\r\ntype LayoutView = \"grid\"\r\n\t| \"timeline\"\r\n\t| \"resizer\"\r\n\t| \"scrollbar\"\r\n\t| \"resourceGrid\"\r\n\t| \"resourceTimeline\";\r\n\r\ninterface IColumnItem {\r\n\tname: string;\r\n\tlabel?: string;\r\n\ttree?: boolean;\r\n\talign?: Align;\r\n\thide?: boolean;\r\n\tmax_width?: number;\r\n\tmin_width?: number;\r\n\tresize?: boolean;\r\n\ttemplate?: (obj: any) => string;\r\n\twidth?: number | \"*\";\r\n}\r\n\r\nexport type TModifierKeys = \"metaKey\" | \"ctrlKey\" | \"altKey\" | \"shiftKey\" | false | undefined;\r\n\r\nexport interface IScale {\r\n\tcss?: () => string;\r\n\tdate?: string;\r\n\tstep: number;\r\n\ttemplate?: (date: Date) => string;\r\n\tunit: DurationUnits;\r\n}\r\n\r\ninterface ILightboxSection {\r\n\tname: string;\r\n\tmap_to: string;\r\n\ttype: SectionType;\r\n\theight?: number;\r\n\tfocus?: boolean;\r\n}\r\n\r\ninterface ILightboxTimeAndDurationSection extends ILightboxSection {\r\n\treadonly: boolean;\r\n\tyear_range: number[] | number;\r\n\tsingle_date: boolean;\r\n\ttime_format: string;\r\n}\r\n\r\ninterface ILightboxInputControl extends ILightboxSection {\r\n\tdefault_value?: any;\r\n\toptions?: Array<{key: string, label: string}>;\r\n}\r\n\r\ninterface ILightboxSelectControl extends ILightboxInputControl {\r\n\tonchange: () => boolean | undefined;\r\n}\r\n\r\ninterface ILightboxParentControl extends ILightboxSection {\r\n\tallow_root: boolean;\r\n\troot_label: string;\r\n\tsort?: (a: any, b: any) => -1 | 0 | 1;\r\n\tfilter?: (task: string | number | object) => boolean;\r\n\ttemplate?: (start: Date, end: Date, ev: object) => string;\r\n}\r\n\r\ninterface ILightboxTypeselectControl extends ILightboxSection {\r\n\tfilter?: (typeName: string) => boolean;\r\n}\r\n\r\n\r\ninterface ILayoutScrollbar {\r\n\tview: \"scrollbar\";\r\n\tscroll?: \"x\" | \"y\";\r\n\tid: string;\r\n\theight?: number;\r\n\twidth?: number;\r\n}\r\n\r\ninterface ILayoutView {\r\n\tview: LayoutView;\r\n\tid?: string;\r\n\tscrollX?: string;\r\n\tscrollY?: string;\r\n\tconfig?: object;\r\n}\r\n\r\ninterface ILayoutGrid extends ILayoutView {\r\n\tview: \"grid\";\r\n\tbind?: string;\r\n}\r\n\r\ninterface ILayoutTimeline extends ILayoutView {\r\n\tview: \"timeline\";\r\n\tbindLinks?: string;\r\n\tlayers?: any[];\r\n}\r\n\r\ninterface ILayoutResizer {\r\n\tview?: undefined;\r\n\tresizer: boolean;\r\n\twidth: number;\r\n}\r\n\r\ninterface ILayoutResourceGrid extends ILayoutView {\r\n\tview: \"resourceGrid\";\r\n\twidth: number;\r\n\tgroup: \"string\";\r\n}\r\n\r\ninterface ILayoutResourceTimeline extends ILayoutView {\r\n\tview: \"resourceTimeline\";\r\n\twidth: number;\r\n\tgroup: \"string\";\r\n}\r\n\r\ninterface ILayoutHtml {\r\n\thtml: string;\r\n\tcss: string;\r\n\twidth: number;\r\n}\r\n\r\ntype LayoutRow = ILayoutGrid\r\n\t| ILayoutTimeline\r\n\t| ILayoutResizer\r\n\t| ILayoutResourceGrid\r\n\t| ILayoutResourceTimeline\r\n\t| ILayoutHtml\r\n\t| ILayoutScrollbar\r\n\t| { cols: LayoutCol[] };\r\n\r\ntype LayoutCol = ILayoutGrid\r\n\t| ILayoutTimeline\r\n\t| ILayoutResizer\r\n\t| ILayoutResourceGrid\r\n\t| ILayoutResourceTimeline\r\n\t| ILayoutHtml\r\n\t| ILayoutScrollbar\r\n\t| { rows: LayoutRow[] };\r\n\r\ninterface ILayout {\r\n\tcss: string;\r\n\trows?: LayoutRow[];\r\n\tcols?: LayoutCol[];\r\n}\r\n\r\ntype TCsp = boolean | \"auto\";\r\n\r\ninterface IResourceConfig {\r\n\tdataprocessor_assignments?: boolean;\r\n\tdataprocessor_resources?: boolean;\r\n\teditable_resource_diagram?: boolean;\r\n\tresource_store?: {\r\n\t\ttype?: \"treeDataStore\"|\"dataStore\"|string;\r\n\t\tfetchTasks?: boolean;\r\n\t\tinitItem?: (item: any) => any;\r\n\t};\r\n\tlightbox_resources?: (resources: any[]) => any[];\r\n\r\n}\r\n\r\ninterface IGanttConfig {\r\n\tlayout: ILayout;\r\n\tlinks: {\r\n\t\tfinish_to_start: \"0\";\r\n\t\tstart_to_start: \"1\";\r\n\t\tfinish_to_finish: \"2\";\r\n\t\tstart_to_finish: \"3\";\r\n\t};\r\n\ttypes: {\r\n\t\ttask: string;\r\n\t\tproject: string;\r\n\t\tmilestone: string;\r\n\t};\r\n\tauto_types: boolean;\r\n\tduration_unit: DurationUnits;\r\n\twork_time: boolean;\r\n\tcorrect_work_time: boolean;\r\n\tskip_off_time: boolean;\r\n\tcascade_delete: boolean;\r\n\tautosize: boolean | string;\r\n\tautoscroll: boolean;\r\n\tshow_links: boolean;\r\n\tshow_task_cells: boolean;\r\n\tautosize_min_width: number;\r\n\tautoscroll_speed: number;\r\n\tdeepcopy_on_parse: boolean;\r\n\tstatic_background: boolean;\r\n\tstatic_background_cells: boolean;\r\n\tbranch_loading: boolean;\r\n\tbranch_loading_property: string;\r\n\tshow_loading: boolean;\r\n\tshow_chart: boolean;\r\n\tshow_grid: boolean;\r\n\tmin_duration: number;\r\n\tdate_format: string; // use instead xml_date\r\n\txml_date?: string; // deprecated\r\n\tstart_on_monday: boolean;\r\n\tserver_utc: boolean;\r\n\tshow_progress: boolean;\r\n\tfit_tasks: boolean;\r\n\tselect_task: boolean;\r\n\tscroll_on_click: boolean;\r\n\tsmart_rendering: boolean;\r\n\tpreserve_scroll: boolean;\r\n\treadonly: boolean;\r\n\tcontainer_resize_timeout: number;\r\n\r\n\t/*grid */\r\n\tdate_grid: string;\r\n\r\n\tdrag_links: boolean;\r\n\tdrag_progress: boolean;\r\n\tdrag_resize: boolean;\r\n\tdrag_project: boolean;\r\n\tdrag_move: boolean;\r\n\tdrag_mode: {\r\n\t\tresize: \"resize\",\r\n\t\tprogress: \"progress\",\r\n\t\tmove: \"move\",\r\n\t\tignore: \"ignore\"\r\n\t};\r\n\tround_dnd_dates: boolean;\r\n\tlink_wrapper_width: number;\r\n\troot_id: string | number;\r\n\r\n\tautofit: boolean;\r\n\tcolumns: IColumnItem[];\r\n\r\n\t/* scale*/\r\n\t/* it will be deprecated */\r\n\tdate_scale?: string;\r\n\tstep?: number;\r\n\tscale_unit?: DurationUnits;\r\n\tsubscales?: IScale[];\r\n\t/* it will be deprecated end */\r\n\r\n\tscales: IScale[];\r\n\r\n\tscale_offset_minimal: boolean;\r\n\r\n\tinherit_scale_class: boolean;\r\n\r\n\r\n\ttime_step: number;\r\n\tduration_step: number;\r\n\r\n\r\n\ttask_date: string;\r\n\ttime_picker: string;\r\n\ttask_attribute: string;\r\n\tlink_attribute: string;\r\n\tlayer_attribute: string;\r\n\tbuttons_left: string[];\r\n\t_migrate_buttons: {\r\n\t\tdhx_save_btn: \"gantt_save_btn\",\r\n\t\tdhx_cancel_btn: \"gantt_cancel_btn\",\r\n\t\tdhx_delete_btn: \"gantt_delete_btn\"\r\n\t};\r\n\r\n\tbuttons_right: string[];\r\n\r\n\r\n\tlightbox: {\r\n\t\tsections?: LightboxSection,\r\n\t\tproject_sections?: LightboxSection,\r\n\t\tmilestone_sections?: LightboxSection\r\n\t};\r\n\tdrag_lightbox: boolean;\r\n\tsort: boolean;\r\n\tdetails_on_create: boolean;\r\n\tdetails_on_dblclick: boolean;\r\n\tinitial_scroll: boolean;\r\n\ttask_scroll_offset: number;\r\n\r\n\torder_branch: boolean;\r\n\torder_branch_free: boolean;\r\n\r\n\t// task_height is deprecated, use 'bar_height` instead\r\n\ttask_height: number | \"full\";\r\n\tbar_height: number | \"full\";\r\n\tmin_column_width: number;\r\n\r\n\t// min width for grid column (when resizing)\r\n\tmin_grid_column_width: number;\r\n\t// name of the attribute with column index for resize element\r\n\tgrid_resizer_column_attribute: string;\r\n\t// name of the attribute with column index for resize element\r\n\t// grid_resizer_attribute: string; // usage of this parameter is not found\r\n\r\n\t// grid width can be increased after the column has been resized\r\n\tkeep_grid_width: boolean;\r\n\r\n\t// grid width can be adjusted\r\n\tgrid_resize: boolean;\r\n\tgrid_elastic_columns: boolean;\r\n\tshow_tasks_outside_timescale: boolean;\r\n\tshow_unscheduled: boolean;\r\n\treadonly_property: string;\r\n\teditable_property: string;\r\n\tcalendar_property: string;\r\n\tresource_calendars: object;\r\n\tdynamic_resource_calendars: boolean;\r\n\tinherit_calendar: boolean;\r\n\ttype_renderers: object;\r\n\r\n\tresize_rows: boolean;\r\n\t// name of the attribute with row index for resize element\r\n\ttask_grid_row_resizer_attribute: string;\r\n\t// min height for row (when resizing)\r\n\tmin_task_grid_row_height: number;\r\n\r\n\topen_tree_initially: boolean;\r\n\toptimize_render: boolean;\r\n\tprevent_default_scroll: boolean;\r\n\tshow_errors: boolean;\r\n\twai_aria_attributes: boolean;\r\n\tsmart_scales: boolean;\r\n\trtl: boolean;\r\n\tplaceholder_task: boolean | object;\r\n\thorizontal_scroll_key: TModifierKeys;\r\n\tdrag_timeline: {\r\n\t\tuseKey: TModifierKeys;\r\n\t\tignore: string;\r\n\t};\r\n\tdrag_multiple: boolean;\r\n\tcsp: TCsp;\r\n\r\n\tresources?: IResourceConfig;\r\n}\r\n\r\nmodule.exports = () => {\r\n\tconst result: IGanttConfig = {\r\n\t\tlayout: {\r\n\t\t\tcss: \"gantt_container\",\r\n\t\t\trows: [\r\n\t\t\t\t{\r\n\t\t\t\t\tcols: [\r\n\t\t\t\t\t\t{view: \"grid\", scrollX: \"scrollHor\", scrollY: \"scrollVer\"},\r\n\t\t\t\t\t\t{resizer: true, width: 1},\r\n\t\t\t\t\t\t{view: \"timeline\", scrollX: \"scrollHor\", scrollY: \"scrollVer\"},\r\n\t\t\t\t\t\t{view: \"scrollbar\", id: \"scrollVer\"}\r\n\t\t\t\t\t]\r\n\t\t\t\t},\r\n\t\t\t\t{view: \"scrollbar\", id: \"scrollHor\", height: 20}\r\n\t\t\t]\r\n\t\t},\r\n\t\tlinks: {\r\n\t\t\tfinish_to_start: \"0\",\r\n\t\t\tstart_to_start: \"1\",\r\n\t\t\tfinish_to_finish: \"2\",\r\n\t\t\tstart_to_finish: \"3\"\r\n\t\t},\r\n\t\ttypes: {\r\n\t\t\ttask: \"task\",\r\n\t\t\tproject: \"project\",\r\n\t\t\tmilestone: \"milestone\"\r\n\t\t},\r\n\t\tauto_types: false,\r\n\t\tduration_unit: \"day\",\r\n\t\twork_time: false,\r\n\t\tcorrect_work_time: false,\r\n\t\tskip_off_time: false,\r\n\r\n\t\tcascade_delete: true,\r\n\r\n\t\tautosize: false,\r\n\t\tautosize_min_width: 0,\r\n\t\tautoscroll: true,\r\n\t\tautoscroll_speed: 30,\r\n\t\tdeepcopy_on_parse: false,\r\n\t\tshow_links: true,\r\n\t\tshow_task_cells: true,\r\n\t\t// replace backgroung of the task area with a canvas img\r\n\t\tstatic_background: false,\r\n\t\tstatic_background_cells: true,\r\n\t\tbranch_loading: false,\r\n\t\tbranch_loading_property: \"$has_child\",\r\n\t\tshow_loading: false,\r\n\t\tshow_chart: true,\r\n\t\tshow_grid: true,\r\n\t\tmin_duration: 60 * 60 * 1000,\r\n\t\tdate_format: \"%d-%m-%Y %H:%i\", // use instead xml_date\r\n\t\txml_date: undefined, // \"%d-%m-%Y %H:%i\", // deprecated\r\n\t\tstart_on_monday: true,\r\n\t\tserver_utc: false,\r\n\t\tshow_progress: true,\r\n\t\tfit_tasks: false,\r\n\t\tselect_task: true,\r\n\t\tscroll_on_click: true,\r\n\t\tsmart_rendering: true,\r\n\t\tpreserve_scroll: true,\r\n\t\treadonly: false,\r\n\t\tcontainer_resize_timeout: 20,\r\n\r\n\t\t/*grid */\r\n\t\tdate_grid: \"%Y-%m-%d\",\r\n\r\n\t\tdrag_links: true,\r\n\t\tdrag_progress: true,\r\n\t\tdrag_resize: true,\r\n\t\tdrag_project: false,\r\n\t\tdrag_move: true,\r\n\t\tdrag_mode: {\r\n\t\t\tresize: \"resize\",\r\n\t\t\tprogress: \"progress\",\r\n\t\t\tmove: \"move\",\r\n\t\t\tignore: \"ignore\"\r\n\t\t},\r\n\t\tround_dnd_dates: true,\r\n\t\tlink_wrapper_width: 20,\r\n\t\troot_id: 0,\r\n\r\n\t\tautofit: false, // grid column automatic fit grid_width config\r\n\t\tcolumns: [\r\n\t\t\t{name: \"text\", tree: true, width: \"*\", resize: true},\r\n\t\t\t{name: \"start_date\", align: \"center\", resize: true},\r\n\t\t\t{name: \"duration\", align: \"center\"},\r\n\t\t\t{name: \"add\", width: 44}\r\n\t\t],\r\n\r\n\t\t/*scale*/\r\n\r\n\t\tscale_offset_minimal: true,\r\n\t\tinherit_scale_class: false,\r\n\r\n\t\tscales: [\r\n\t\t\t{\r\n\t\t\t\tunit: \"day\",\r\n\t\t\t\tstep: 1,\r\n\t\t\t\tdate: \"%d %M\"\r\n\t\t\t}\r\n\t\t],\r\n// \t\tdate_scale: \"%d %M\",\r\n\r\n\t\ttime_step: 60,\r\n\t\tduration_step: 1,\r\n\t\ttask_date: \"%d %F %Y\",\r\n\t\ttime_picker: \"%H:%i\",\r\n\t\ttask_attribute: \"data-task-id\",\r\n\t\tlink_attribute: \"data-link-id\",\r\n\t\tlayer_attribute: \"data-layer\",\r\n\t\tbuttons_left: [\r\n\t\t\t\"gantt_save_btn\",\r\n\t\t\t\"gantt_cancel_btn\"\r\n\t\t],\r\n\t\t_migrate_buttons: {\r\n\t\t\tdhx_save_btn: \"gantt_save_btn\",\r\n\t\t\tdhx_cancel_btn: \"gantt_cancel_btn\",\r\n\t\t\tdhx_delete_btn: \"gantt_delete_btn\"\r\n\t\t},\r\n\t\tbuttons_right: [\r\n\t\t\t\"gantt_delete_btn\"\r\n\t\t],\r\n\t\tlightbox: {\r\n\t\t\tsections: [\r\n\t\t\t\t{name: \"description\", height: 70, map_to: \"text\", type: \"textarea\", focus: true},\r\n\t\t\t\t{name: \"time\", type: \"duration\", map_to: \"auto\"}\r\n\t\t\t],\r\n\t\t\tproject_sections: [\r\n\t\t\t\t{name: \"description\", height: 70, map_to: \"text\", type: \"textarea\", focus: true},\r\n\t\t\t\t{name: \"type\", type: \"typeselect\", map_to: \"type\"},\r\n\t\t\t\t{name: \"time\", type: \"duration\", readonly: true, map_to: \"auto\"}\r\n\t\t\t],\r\n\t\t\tmilestone_sections: [\r\n\t\t\t\t{name: \"description\", height: 70, map_to: \"text\", type: \"textarea\", focus: true},\r\n\t\t\t\t{name: \"type\", type: \"typeselect\", map_to: \"type\"},\r\n\t\t\t\t{name: \"time\", type: \"duration\", single_date: true, map_to: \"auto\"}\r\n\t\t\t]\r\n\t\t},\r\n\t\tdrag_lightbox: true,\r\n\t\tsort: false,\r\n\t\tdetails_on_create: true,\r\n\t\tdetails_on_dblclick: true,\r\n\t\tinitial_scroll: true,\r\n\t\ttask_scroll_offset: 100,\r\n\r\n\t\torder_branch: false,\r\n\t\torder_branch_free: false,\r\n\r\n\t\t// task height is deprecated, use 'bar_height' instead\r\n\t\ttask_height: undefined,// number px of 'full' for row height\r\n\t\tbar_height: \"full\",\r\n\t\tmin_column_width: 70,\r\n\r\n\t\t// min width for grid column (when resizing)\r\n\t\tmin_grid_column_width: 70,\r\n\t\t// name of the attribute with column index for resize element\r\n\t\tgrid_resizer_column_attribute: \"data-column-index\",\r\n\t\t// name of the attribute with column index for resize element\r\n\t\t// grid_resizer_attribute: \"grid_resizer\", // - usage of this parameter is not found in code\r\n\r\n\t\t// grid width can be increased after the column has been resized\r\n\t\tkeep_grid_width: false,\r\n\r\n\t\t// grid width can be adjusted\r\n\t\tgrid_resize: false,\r\n\t\tgrid_elastic_columns: false,\r\n\t\tshow_tasks_outside_timescale: false,\r\n\t\tshow_unscheduled: true,\r\n\r\n\t\tresize_rows: false,\r\n\t\t// name of the attribute with row index for resize element\r\n\t\ttask_grid_row_resizer_attribute: \"data-row-index\",\r\n\t\t// min height for row (when resizing)\r\n\t\tmin_task_grid_row_height: 30,\r\n\r\n\t\t//\r\n\t\treadonly_property: \"readonly\",\r\n\t\teditable_property: \"editable\",\r\n\t\tcalendar_property: \"calendar_id\",\r\n\t\tresource_calendars: {},\r\n\t\tdynamic_resource_calendars: false,\r\n\t\tinherit_calendar: false,\r\n\t\ttype_renderers: {},\r\n\r\n\t\topen_tree_initially: false,\r\n\t\toptimize_render: true,\r\n\t\tprevent_default_scroll: false,\r\n\t\tshow_errors: true,\r\n\t\twai_aria_attributes: true,\r\n\t\tsmart_scales: true,\r\n\t\trtl:false,\r\n\t\tplaceholder_task: false,\r\n\t\thorizontal_scroll_key: \"shiftKey\",\r\n\t\tdrag_timeline: {\r\n\t\t\tuseKey: undefined,\r\n\t\t\tignore: \".gantt_task_line, .gantt_task_link\"\r\n\t\t},\r\n\t\tdrag_multiple: true,\r\n\t\tcsp: \"auto\"\r\n\t};\r\n\treturn result;\r\n};\r\n","module.exports = function () {\n var services = {};\n\n function register(name, getter) {\n services[name] = getter;\n }\n\n function getService(name) {\n if (!services[name]) {\n return null;\n }\n\n return services[name]();\n }\n\n function dropService(name) {\n if (services[name]) {\n delete services[name];\n }\n }\n\n var servicesEnum = {};\n return {\n services: servicesEnum,\n setService: register,\n getService: getService,\n dropService: dropService,\n destructor: function destructor() {\n for (var i in services) {\n if (services[i]) {\n var service = services[i];\n\n if (service && service.destructor) {\n service.destructor();\n }\n }\n }\n\n services = null;\n }\n };\n};","export default class ExtensionsManager{\r\n\tprivate _extensions:{[key:string]: GanttPlugin };\r\n\r\n\tconstructor(config: {[key:string]: GanttPlugin }){\r\n\t\tthis._extensions = {};\r\n\t\tfor(const i in config){\r\n\t\t\tthis._extensions[i] = config[i];\r\n\t\t}\r\n\t}\r\n\r\n\taddExtension = (name: string, ext: GanttPlugin) => {\r\n\t\tthis._extensions[name] = ext;\r\n\t}\r\n\r\n\tgetExtension = (name: string): GanttPlugin => {\r\n\t\treturn this._extensions[name];\r\n\t}\r\n}","module.exports = {\n KEY_CODES: {\n UP: 38,\n DOWN: 40,\n LEFT: 37,\n RIGHT: 39,\n SPACE: 32,\n ENTER: 13,\n DELETE: 46,\n ESC: 27,\n TAB: 9\n }\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction DHXGantt() {\n this.constants = require(\"../constants\");\n this.version = VERSION;\n this.license = LICENSE;\n this.templates = {};\n this.ext = {};\n this.keys = {\n edit_save: this.constants.KEY_CODES.ENTER,\n edit_cancel: this.constants.KEY_CODES.ESC\n };\n}\n\nmodule.exports = function (supportedExtensions) {\n // use a named constructor to make gantt instance discoverable in heap snapshots\n var gantt = new DHXGantt();\n\n var ExtensionManager = require(\"../ext/extension_manager\")[\"default\"];\n\n var extensionManager = new ExtensionManager(supportedExtensions);\n var activePlugins = {};\n\n gantt.plugins = function (config) {\n for (var i in config) {\n if (config[i] && !activePlugins[i]) {\n var plugin = extensionManager.getExtension(i);\n\n if (plugin) {\n plugin(gantt);\n activePlugins[i] = true;\n }\n }\n }\n\n return activePlugins;\n };\n\n gantt.$services = require(\"../core/common/services\")();\n gantt.config = require(\"../core/common/config\")();\n gantt.ajax = require(\"../core/common/ajax\")(gantt);\n gantt.date = require(\"../core/common/date\")(gantt);\n gantt.RemoteEvents = require(\"../core/remote/remote_events\").remoteEvents;\n\n var dnd = require(\"../core/common/dnd\")(gantt);\n\n gantt.$services.setService(\"dnd\", function () {\n return dnd;\n });\n\n var templatesLoader = require(\"../core/common/templates\")(gantt);\n\n gantt.$services.setService(\"templateLoader\", function () {\n return templatesLoader;\n });\n\n require(\"../utils/eventable\")(gantt);\n\n var StateService = require(\"../core/common/state\");\n\n var stateService = new StateService();\n stateService.registerProvider(\"global\", function () {\n var res = {\n min_date: gantt._min_date,\n max_date: gantt._max_date,\n selected_task: null\n }; // do not throw error if getState called from non-initialized gantt\n\n if (gantt.$data && gantt.$data.tasksStore) {\n res.selected_task = gantt.$data.tasksStore.getSelectedId();\n }\n\n return res;\n });\n gantt.getState = stateService.getState;\n gantt.$services.setService(\"state\", function () {\n return stateService;\n });\n\n var utils = require(\"../utils/utils\");\n\n utils.mixin(gantt, utils);\n gantt.Promise = require(\"../utils/promise\");\n gantt.env = require(\"../utils/env\");\n\n require(\"../core/datastore/datastore_hooks\")(gantt);\n\n var DataProcessor = require(\"../core/dataprocessor\");\n\n gantt.dataProcessor = DataProcessor.DEPRECATED_api;\n gantt.createDataProcessor = DataProcessor.createDataProcessor;\n\n require(\"../core/plugins\")(gantt);\n\n require(\"../core/dynamic_loading\")(gantt);\n\n require(\"../core/grid_column_api\")(gantt);\n\n require(\"../core/tasks\")(gantt);\n\n require(\"../core/load\")(gantt);\n\n require(\"../core/worktime/work_time\")(gantt);\n\n require(\"../core/data\")(gantt);\n\n require(\"../publish_helpers/void_script_second\")[\"default\"](gantt);\n\n require(\"../core/data_task_types\")(gantt);\n\n require(\"../core/cached_functions\")(gantt);\n\n require(\"../core/gantt_core\")(gantt);\n\n require(\"../core/destructor\")(gantt);\n\n require(\"../publish_helpers/void_script_third\")[\"default\"](gantt);\n\n var i18n = require(\"../locale\")[\"default\"]();\n\n gantt.i18n = {\n addLocale: i18n.addLocale,\n setLocale: function setLocale(locale) {\n if (typeof locale === \"string\") {\n var localeObject = i18n.getLocale(locale);\n\n if (!localeObject) {\n localeObject = i18n.getLocale(\"en\");\n }\n\n gantt.locale = localeObject;\n } else if (locale) {\n if (!gantt.locale) {\n gantt.locale = locale;\n } else {\n for (var i in locale) {\n if (locale[i] && _typeof(locale[i]) === \"object\") {\n if (!gantt.locale[i]) {\n gantt.locale[i] = {};\n }\n\n gantt.mixin(gantt.locale[i], locale[i], true);\n } else {\n gantt.locale[i] = locale[i];\n }\n }\n }\n }\n },\n getLocale: i18n.getLocale\n };\n gantt.i18n.setLocale(\"en\");\n return gantt;\n};","require(\"css/skins/terrace.less\");\n\nvar factory = require(\"./make_instance_common\");\n\nmodule.exports = function (supportedExtensions) {\n var gantt = factory(supportedExtensions);\n\n if (!gantt.env.isNode) {\n require(\"../core/ui_core\")(gantt);\n }\n\n return gantt;\n};","import { IUndo, IUndoCommand, IUndoCommands, IUndoPropAction, IUndoPropCommand, TActionType, TEntityType, TUndoStack, TUndoValue } from \"./types\";\r\n\r\nconst MAX_UNDO_STEPS = 100;\r\n\r\nexport class Undo implements IUndo {\r\n\r\n\tmaxSteps = MAX_UNDO_STEPS;\r\n\tundoEnabled = true;\r\n\tredoEnabled = true;\r\n\taction: IUndoPropAction = {\r\n\t\tcreate: (commands?: IUndoCommand[]): IUndoCommands => {\r\n\t\t\treturn { commands: (commands ? commands.slice() : []) };\r\n\t\t},\r\n\t\tinvert: (action: IUndoCommands): IUndoCommands => {\r\n\t\t\tconst gantt = this._gantt;\r\n\t\t\tconst revert = gantt.copy(action);\r\n\t\t\tconst commands = this.command;\r\n\t\t\tfor (let i = 0; i < action.commands.length; i++) {\r\n\t\t\t\tconst command = revert.commands[i] = commands.invert(revert.commands[i]);\r\n\t\t\t\tif (command.type === commands.type.update || command.type === commands.type.move) {\r\n\t\t\t\t\t[command.value, command.oldValue] = [command.oldValue, command.value];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn revert as IUndoCommands;\r\n\t\t}\r\n\t};\r\n\tcommand: IUndoPropCommand = {\r\n\t\t// entities that require different processing for undoing-redoing changes (gantt.config.undo_types)\r\n\t\tentity: null,\r\n\r\n\t\t// types of traced actions (gantt.config.undo_actions)\r\n\t\ttype: null,\r\n\r\n\t\tcreate: (value: TUndoValue, oldValue: TUndoValue, type: TActionType, entity: TEntityType): IUndoCommand => {\r\n\t\t\tconst gantt = this._gantt;\r\n\t\t\treturn {\r\n\t\t\t\tentity,\r\n\t\t\t\ttype,\r\n\t\t\t\tvalue: gantt.copy(value),\r\n\t\t\t\toldValue: gantt.copy(oldValue || value)\r\n\t\t\t};\r\n\t\t},\r\n\t\tinvert: (command: IUndoCommand): IUndoCommand => {\r\n\t\t\tconst gantt = this._gantt;\r\n\t\t\tconst revert = gantt.copy(command);\r\n\t\t\trevert.type = this.command.inverseCommands(command.type);\r\n\t\t\treturn revert;\r\n\t\t},\r\n\t\tinverseCommands: (command: TActionType): TActionType => {\r\n\t\t\tconst gantt = this._gantt;\r\n\t\t\tconst types = this.command.type;\r\n\t\t\tswitch (command) {\r\n\t\t\t\tcase types.update:\r\n\t\t\t\t\treturn types.update;\r\n\t\t\t\tcase types.remove:\r\n\t\t\t\t\treturn types.add;\r\n\t\t\t\tcase types.add:\r\n\t\t\t\t\treturn types.remove;\r\n\t\t\t\tcase types.move:\r\n\t\t\t\t\treturn types.move;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgantt.assert(false, \"Invalid command \"+ command);\r\n\t\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tprivate _undoStack = [];\r\n\tprivate _redoStack = [];\r\n\tprivate _gantt: any;\r\n\r\n\tconstructor(gantt: any){\r\n\t\tthis._gantt = gantt;\r\n\t}\r\n\tgetUndoStack() {\r\n\t\treturn this._undoStack;\r\n\t}\r\n\tsetUndoStack(stack: []) {\r\n\t\tthis._undoStack = stack;\r\n\t}\r\n\r\n\tgetRedoStack() {\r\n\t\treturn this._redoStack;\r\n\t}\r\n\tsetRedoStack(stack: []) {\r\n\t\tthis._redoStack = stack;\r\n\t}\r\n\r\n\tclearUndoStack() {\r\n\t\tthis._undoStack = [];\r\n\t}\r\n\r\n\tclearRedoStack() {\r\n\t\tthis._redoStack = [];\r\n\t}\r\n\r\n\tupdateConfigs() {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis.maxSteps = gantt.config.undo_steps || MAX_UNDO_STEPS;\r\n\t\tthis.command.entity = gantt.config.undo_types;\r\n\t\tthis.command.type = gantt.config.undo_actions;\r\n\t\tthis.undoEnabled = !!gantt.config.undo;\r\n\t\tthis.redoEnabled = !!gantt.config.redo; // GS-873, Redo should work even when the `gantt.config.undo` is disabled.\r\n\t}\r\n\r\n\tundo() {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis.updateConfigs();\r\n\t\tif (!this.undoEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst action = this._pop(this._undoStack);\r\n\t\tif (action) {\r\n\t\t\tthis._reorderCommands(action);\r\n\t\t}\r\n\t\tif (gantt.callEvent(\"onBeforeUndo\", [action]) !== false) {\r\n\t\t\tif (action) {\r\n\t\t\t\tthis._applyAction(this.action.invert(action));\r\n\t\t\t\tthis._push(this._redoStack, gantt.copy(action));\r\n\t\t\t\tgantt.callEvent(\"onAfterUndo\", [action]);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tgantt.callEvent(\"onAfterUndo\", [null]);\r\n\t}\r\n\r\n\tredo() {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis.updateConfigs();\r\n\t\tif (!this.redoEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst action = this._pop(this._redoStack);\r\n\t\tif (action) {\r\n\t\t\tthis._reorderCommands(action);\r\n\t\t}\r\n\r\n\t\tif (gantt.callEvent(\"onBeforeRedo\", [action]) !== false) {\r\n\t\t\tif (action) {\r\n\t\t\t\tthis._applyAction(action);\r\n\t\t\t\tthis._push(this._undoStack, gantt.copy(action));\r\n\t\t\t\tgantt.callEvent(\"onAfterRedo\", [action]);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tgantt.callEvent(\"onAfterRedo\", [null]);\r\n\t}\r\n\r\n\t// storeUndo:\r\n\tlogAction(action: IUndoCommands) {\r\n\t\tthis._push(this._undoStack, action);\r\n\t\tthis._redoStack = [];\r\n\t}\r\n\r\n\tprivate _push(stack: TUndoStack, action: IUndoCommands): IUndoCommands {\r\n\t\tconst gantt = this._gantt;\r\n\t\tif (!action.commands.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst event = stack === this._undoStack ? \"onBeforeUndoStack\" : \"onBeforeRedoStack\";\r\n\t\tif (gantt.callEvent(event, [action]) === false){\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// commands can be removed from event handler\r\n\t\tif (!action.commands.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstack.push(action);\r\n\t\twhile (stack.length > this.maxSteps) {\r\n\t\t\tstack.shift();\r\n\t\t}\r\n\t\treturn action;\r\n\t}\r\n\r\n\tprivate _pop(stack: TUndoStack): IUndoCommands {\r\n\t\treturn stack.pop();\r\n\t}\r\n\r\n\tprivate _reorderCommands(action) {\r\n\t\t// firstly process tasks and only then links\r\n\t\t// in order to ensure links are added not earlier than their tasks\r\n\t\t// firstly to 'move' actions and only then updates\r\n\t\tconst weights = { any: 0, link:1, task:2 };\r\n\t\tconst actionWeights = { move: 1, any:0 };\r\n\t\taction.commands.sort(function(a, b) {\r\n\t\t\tif (a.entity === \"task\" && b.entity === \"task\") {\r\n\t\t\t\tif (a.type !== b.type) {\r\n\t\t\t\t\treturn (actionWeights[b.type] || 0) - (actionWeights[a.type] || 0);\r\n\t\t\t\t} else if (a.type === \"move\" && a.oldValue && b.oldValue && b.oldValue.parent === a.oldValue.parent) {\r\n\t\t\t\t\treturn a.oldValue.$index - b.oldValue.$index;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconst weightA = weights[a.entity] || weights.any;\r\n\t\t\t\tconst weightB = weights[b.entity] || weights.any;\r\n\t\t\t\treturn weightB - weightA;\r\n\t\t\t}\r\n\r\n\t\t});\r\n\t}\r\n\r\n\tprivate _applyAction(action: IUndoCommands) {\r\n\t\tlet command = null;\r\n\t\tconst entities = this.command.entity;\r\n\t\tconst actions = this.command.type;\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst methods = {};\r\n\t\tmethods[entities.task] = {\r\n\t\t\tadd: \"addTask\",\r\n\t\t\tget: \"getTask\",\r\n\t\t\tupdate: \"updateTask\",\r\n\t\t\tremove: \"deleteTask\",\r\n\t\t\tmove: \"moveTask\",\r\n\t\t\tisExists: \"isTaskExists\"\r\n\t\t};\r\n\t\tmethods[entities.link] = {\r\n\t\t\tadd: \"addLink\",\r\n\t\t\tget: \"getLink\",\r\n\t\t\tupdate: \"updateLink\",\r\n\t\t\tremove: \"deleteLink\",\r\n\t\t\tisExists: \"isLinkExists\"\r\n\t\t};\r\n\r\n\t\tgantt.batchUpdate(function() {\r\n\t\t\tfor (let i = 0; i < action.commands.length; i++) {\r\n\t\t\t\tcommand = action.commands[i];\r\n\t\t\t\tconst method = methods[command.entity][command.type];\r\n\t\t\t\tconst getMethod = methods[command.entity].get;\r\n\t\t\t\tconst check = methods[command.entity].isExists;\r\n\r\n\t\t\t\tif (command.type === actions.add) {\r\n\t\t\t\t\tgantt[method](command.oldValue, command.oldValue.parent, command.oldValue.$local_index);\r\n\t\t\t\t} else if (command.type === actions.remove) {\r\n\t\t\t\t\tif (gantt[check](command.value.id)) {\r\n\t\t\t\t\t\tgantt[method](command.value.id);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (command.type === actions.update) {\r\n\t\t\t\t\tconst item = gantt[getMethod](command.value.id);\r\n\t\t\t\t\tfor(const prop in command.value){\r\n\t\t\t\t\t\tif(!prop.startsWith(\"$\") && !prop.startsWith(\"_\")){\r\n\t\t\t\t\t\t\titem[prop] = command.value[prop];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tgantt[method](command.value.id);\r\n\t\t\t\t} else if (command.type === actions.move) {\r\n\t\t\t\t\tgantt[method](command.value.id, command.value.$local_index, command.value.parent);\r\n\t\t\t\t\t// GS-680: We should send the changes to the server after we undo vertical reorder\r\n\t\t\t\t\tgantt.callEvent(\"onRowDragEnd\", [command.value.id]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}","import { IInlineEditState, IMonitor, IUndo, IUndoCommand, TActionType, TEntityType, TUndoValue } from \"./types\";\r\n\r\nconst noTrack = {\r\n\tonBeforeUndo: \"onAfterUndo\",\r\n\tonBeforeRedo: \"onAfterRedo\"\r\n};\r\n\r\nconst batchActions = [\r\n\t\"onTaskDragStart\",\r\n\t\"onAfterTaskUpdate\",\r\n\t\"onAfterTaskDelete\",\r\n\t\"onBeforeBatchUpdate\"\r\n];\r\n\r\nexport class Monitor implements IMonitor {\r\n\tprivate _batchAction = null;\r\n\tprivate _batchMode = false;\r\n\tprivate _ignore = false;\r\n\tprivate _ignoreMoveEvents = false;\r\n\tprivate _initialTasks = {};\r\n\tprivate _initialLinks = {};\r\n\tprivate _nestedTasks = {};\r\n\tprivate _nestedLinks = {};\r\n\tprivate _timeout;\r\n\tprivate _gantt: any;\r\n\tprivate _undo: IUndo;\r\n\r\n\tconstructor(undo: IUndo, gantt: any) {\r\n\t\tthis._undo = undo;\r\n\t\tthis._gantt = gantt;\r\n\t\tthis._attachEvents();\r\n\t}\r\n\r\n\tstore(id: TaskID | LinkID, type: TEntityType, overwrite: boolean = false) {\r\n\t\tif (type === this._gantt.config.undo_types.task) {\r\n\t\t\treturn this._storeTask(id, overwrite);\r\n\t\t}\r\n\t\tif (type === this._gantt.config.undo_types.link) {\r\n\t\t\treturn this._storeLink(id, overwrite);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\tisMoveEventsIgnored() {\r\n\t\treturn this._ignoreMoveEvents;\r\n\t}\r\n\ttoggleIgnoreMoveEvents(newValue?: boolean) {\r\n\t\tthis._ignoreMoveEvents = newValue || false;\r\n\t}\r\n\tstartIgnore() {\r\n\t\tthis._ignore = true;\r\n\t}\r\n\tstopIgnore() {\r\n\t\tthis._ignore = false;\r\n\t}\r\n\tstartBatchAction() {\r\n\t\t// try catching updates made from event handlers using timeout\r\n\t\tif (!this._timeout){\r\n\t\t\tthis._timeout = setTimeout(() => {\r\n\t\t\t\tthis.stopBatchAction();\r\n\t\t\t\tthis._timeout = null;\r\n\t\t\t}, 10);\r\n\t\t}\r\n\r\n\r\n\t\tif (this._ignore || this._batchMode) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._batchMode = true;\r\n\t\tthis._batchAction = this._undo.action.create();\r\n\t}\r\n\tstopBatchAction() {\r\n\t\tif (this._ignore) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst undo = this._undo;\r\n\t\tif (this._batchAction) {\r\n\t\t\tundo.logAction(this._batchAction);\r\n\t\t}\r\n\t\tthis._batchMode = false;\r\n\t\tthis._batchAction = null;\r\n\t}\r\n\tonTaskAdded(task: ITask) {\r\n\t\tif (!this._ignore) {\r\n\t\t\tthis._storeTaskCommand(task, this._undo.command.type.add);\r\n\t\t}\r\n\t}\r\n\tonTaskUpdated(task: ITask) {\r\n\t\tif (!this._ignore) {\r\n\t\t\tthis._storeTaskCommand(task, this._undo.command.type.update);\r\n\t\t}\r\n\t}\r\n\tonTaskMoved(task: ITask) {\r\n\t\tif (!this._ignore) {\r\n\t\t\t(task as any).$local_index = this._gantt.getTaskIndex(task.id);\r\n\t\t\tconst oldValue = this.getInitialTask(task.id);\r\n\t\t\tif((task as any).$local_index === oldValue.$local_index &&\r\n\t\t\t\tthis._gantt.getParent(task) === this._gantt.getParent(oldValue)){\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\tthis._storeEntityCommand(\r\n\t\t\t\ttask,\r\n\t\t\t\tthis.getInitialTask(task.id),\r\n\t\t\t\tthis._undo.command.type.move,\r\n\t\t\t\tthis._undo.command.entity.task\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\tonTaskDeleted(task: ITask) {\r\n\t\tif (!this._ignore) {\r\n\t\t\tthis._storeTaskCommand(task, this._undo.command.type.remove);\r\n\t\t\tif (this._nestedTasks[task.id]) {\r\n\t\t\t\tconst children = this._nestedTasks[task.id];\r\n\t\t\t\tfor (let i = 0; i < children.length; i++) {\r\n\t\t\t\t\tthis._storeTaskCommand(children[i], this._undo.command.type.remove);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (this._nestedLinks[task.id]) {\r\n\t\t\t\tconst childrenLinks = this._nestedLinks[task.id];\r\n\t\t\t\tfor (let i = 0; i < childrenLinks.length; i++) {\r\n\t\t\t\t\tthis._storeLinkCommand(childrenLinks[i], this._undo.command.type.remove);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tonLinkAdded(link: ILink) {\r\n\t\tif (!this._ignore) {\r\n\t\t\tthis._storeLinkCommand(link, this._undo.command.type.add);\r\n\t\t}\r\n\t}\r\n\tonLinkUpdated(link: ILink) {\r\n\t\tif (!this._ignore) {\r\n\t\t\tthis._storeLinkCommand(link, this._undo.command.type.update);\r\n\t\t}\r\n\t}\r\n\tonLinkDeleted(link: ILink) {\r\n\t\tif (!this._ignore) {\r\n\t\t\tthis._storeLinkCommand(link, this._undo.command.type.remove);\r\n\t\t}\r\n\t}\r\n\tsetNestedTasks(id: TaskID, taskIds: TaskID[]) {\r\n\t\tconst gantt = this._gantt;\r\n\t\tlet task = null;\r\n\t\tconst tasks = [];\r\n\t\tlet\tlinkIds = this._getLinks(gantt.getTask(id));\r\n\r\n\t\tfor (let i = 0; i < taskIds.length; i++) {\r\n\t\t\ttask = this.setInitialTask(taskIds[i]);\r\n\t\t\tlinkIds = linkIds.concat(this._getLinks(task));\r\n\t\t\ttasks.push(task);\r\n\t\t}\r\n\r\n\t\tconst uniqueLinks = {};\r\n\t\tfor (let i = 0; i < linkIds.length; i++) {\r\n\t\t\tuniqueLinks[linkIds[i]] = true;\r\n\t\t}\r\n\t\tconst links = [];\r\n\t\tfor (const i in uniqueLinks) {\r\n\t\t\tlinks.push(this.setInitialLink(i));\r\n\t\t}\r\n\t\tthis._nestedTasks[id] = tasks;\r\n\t\tthis._nestedLinks[id] = links;\r\n\t}\r\n\tsetInitialTask(id: TaskID, overwrite?: boolean) {\r\n\t\tconst gantt = this._gantt;\r\n\t\tif (overwrite || (!this._initialTasks[id] || !this._batchMode)) {\r\n\t\t\tconst task = gantt.copy(gantt.getTask(id));\r\n\t\t\ttask.$index = gantt.getGlobalTaskIndex(id);\r\n\t\t\ttask.$local_index = gantt.getTaskIndex(id);\r\n\t\t\tthis.setInitialTaskObject(id, task);\r\n\t\t}\r\n\t\treturn this._initialTasks[id];\r\n\t}\r\n\tgetInitialTask(id: TaskID) {\r\n\t\treturn this._initialTasks[id];\r\n\t}\r\n\tclearInitialTasks() {\r\n\t\tthis._initialTasks = {};\r\n\t}\r\n\tsetInitialTaskObject(id: TaskID, object: ITask) {\r\n\t\tthis._initialTasks[id] = object;\r\n\t}\r\n\tsetInitialLink(id: LinkID, overwrite?: boolean) {\r\n\t\tif (!this._initialLinks[id] || !this._batchMode) {\r\n\t\t\tthis._initialLinks[id] = this._gantt.copy(this._gantt.getLink(id));\r\n\t\t}\r\n\t\treturn this._initialLinks[id];\r\n\t}\r\n\tgetInitialLink(id: LinkID) {\r\n\t\treturn this._initialLinks[id];\r\n\t}\r\n\tclearInitialLinks() {\r\n\t\tthis._initialLinks = {};\r\n\t}\r\n\tprivate _attachEvents() {\r\n\t\tlet deleteCacheCooldown = null;\r\n\t\tconst gantt = this._gantt;\r\n\r\n\t\tconst saveInitialAll = () => {\r\n\t\t\tif (!deleteCacheCooldown) {\r\n\t\t\t\tdeleteCacheCooldown = setTimeout(() => {\r\n\t\t\t\t\tdeleteCacheCooldown = null;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.clearInitialTasks();\r\n\t\t\t\tgantt.eachTask((task: ITask) => {\r\n\t\t\t\t\tthis.setInitialTask(task.id);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.clearInitialLinks();\r\n\t\t\t\tgantt.getLinks().forEach((link: ILink) => {\r\n\t\t\t\t\tthis.setInitialLink(link.id);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t\tconst getMoveObjectByTaskId = (id: TaskID) => {\r\n\t\t\treturn gantt.copy(gantt.getTask(id));\r\n\t\t};\r\n\r\n\t\tfor (const i in noTrack) {\r\n\t\t\tgantt.attachEvent(i, () => {\r\n\t\t\t\tthis.startIgnore();\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t\tgantt.attachEvent(noTrack[i], () => {\r\n\t\t\t\tthis.stopIgnore();\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < batchActions.length; i++) {\r\n\t\t\tgantt.attachEvent(batchActions[i], () => {\r\n\t\t\t\tthis.startBatchAction();\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tgantt.attachEvent(\"onParse\", () => {\r\n\t\t\tthis._undo.clearUndoStack();\r\n\t\t\tthis._undo.clearRedoStack();\r\n\t\t\tsaveInitialAll();\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onAfterTaskAdd\", (id: TaskID, task: ITask) => {\r\n\t\t\tthis.setInitialTask(id, true);\r\n\t\t\tthis.onTaskAdded(task);\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onAfterTaskUpdate\", (id: TaskID, task: ITask) => {\r\n\t\t\tthis.onTaskUpdated(task);\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onAfterTaskDelete\", (id: TaskID, task: ITask) => {\r\n\t\t\tthis.onTaskDeleted(task);\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onAfterLinkAdd\", (id: LinkID, link: ILink) => {\r\n\t\t\tthis.setInitialLink(id, true);\r\n\t\t\tthis.onLinkAdded(link);\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onAfterLinkUpdate\", (id: LinkID, link: ILink) => {\r\n\t\t\tthis.onLinkUpdated(link);\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onAfterLinkDelete\", (id: LinkID, link: ILink) => {\r\n\t\t\tthis.onLinkDeleted(link);\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onRowDragEnd\", (id: TaskID, target: TaskID) => {\r\n\t\t\tthis.onTaskMoved(getMoveObjectByTaskId(id));\r\n\t\t\tthis.toggleIgnoreMoveEvents();\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tgantt.attachEvent(\"onBeforeTaskDelete\", (id: TaskID) => {\r\n\t\t\tthis.store(id, gantt.config.undo_types.task);\r\n\t\t\tconst nested = [];\r\n\r\n\t\t\t// remember task indexes in case their being deleted in a loop, so they could be restored in the correct order\r\n\t\t\tsaveInitialAll();\r\n\r\n\t\t\tgantt.eachTask((task: ITask) => {\r\n\t\t\t\tnested.push(task.id);\r\n\t\t\t}, id);\r\n\t\t\tthis.setNestedTasks(id, nested);\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tconst datastore = gantt.getDatastore(\"task\");\r\n\r\n\t\tdatastore.attachEvent(\"onBeforeItemMove\", (id: TaskID, parent: TaskID, tindex: number) => {\r\n\t\t\tif (!this.isMoveEventsIgnored()) {\r\n\t\t\t\tsaveInitialAll();\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tdatastore.attachEvent(\"onAfterItemMove\", (id: TaskID, parent: TaskID, tindex: number) => {\r\n\t\t\tif (!this.isMoveEventsIgnored()) {\r\n\t\t\t\tthis.onTaskMoved(getMoveObjectByTaskId(id));\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tgantt.attachEvent(\"onRowDragStart\", (id: TaskID, target: TaskID, e: Event) => {\r\n\t\t\tthis.toggleIgnoreMoveEvents(true);\r\n\t\t\tsaveInitialAll();\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tgantt.attachEvent(\"onBeforeTaskDrag\", (taskId: TaskID) => this.store(taskId, gantt.config.undo_types.task));\r\n\r\n\t\tgantt.attachEvent(\"onLightbox\", (taskId: TaskID) => this.store(taskId, gantt.config.undo_types.task));\r\n\r\n\t\tgantt.attachEvent(\"onBeforeTaskAutoSchedule\", (task: ITask) => {\r\n\t\t\tthis.store(task.id, gantt.config.undo_types.task);\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tif (gantt.ext.inlineEditors) {\r\n\t\t\tgantt.ext.inlineEditors.attachEvent(\"onEditStart\", (state: IInlineEditState) => {\r\n\t\t\t\tthis.store(state.id, gantt.config.undo_types.task);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _storeCommand(command: IUndoCommand) {\r\n\t\tconst undo = this._undo;\r\n\t\tundo.updateConfigs();\r\n\r\n\t\tif (!undo.undoEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._batchMode) {\r\n\t\t\tthis._batchAction.commands.push(command);\r\n\t\t} else {\r\n\t\t\tconst action = undo.action.create([command]);\r\n\t\t\tundo.logAction(action);\r\n\t\t}\r\n\t}\r\n\tprivate _storeEntityCommand(obj: TUndoValue, old: TUndoValue, actionType: TActionType, entityType: TEntityType) {\r\n\t\tconst undo = this._undo;\r\n\t\tconst command = undo.command.create(obj, old, actionType, entityType);\r\n\t\tthis._storeCommand(command);\r\n\t}\r\n\tprivate _storeTaskCommand(obj: ITask, type: TActionType) {\r\n\t\tif(this._gantt.isTaskExists(obj.id)){\r\n\t\t\t(obj as any).$local_index = this._gantt.getTaskIndex(obj.id);\r\n\t\t}\r\n\r\n\t\tthis._storeEntityCommand(obj, this.getInitialTask(obj.id), type, this._undo.command.entity.task);\r\n\t}\r\n\tprivate _storeLinkCommand(obj: ILink, type: TActionType) {\r\n\t\tthis._storeEntityCommand(obj, this.getInitialLink(obj.id), type, this._undo.command.entity.link);\r\n\t}\r\n\tprivate _getLinks(task: ITask) {\r\n\t\treturn task.$source.concat(task.$target);\r\n\t}\r\n\tprivate _storeTask(taskId: TaskID, overwrite: boolean = false) {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis.setInitialTask(taskId, overwrite);\r\n\t\tgantt.eachTask((child: ITask) => {\r\n\t\t\tthis.setInitialTask(child.id);\r\n\t\t}, taskId);\r\n\t\treturn true;\r\n\t}\r\n\tprivate _storeLink(linkId: LinkID, overwrite: boolean = false) {\r\n\t\tthis.setInitialLink(linkId, overwrite);\r\n\t\treturn true;\r\n\t}\r\n}","import { Monitor } from \"./monitor\";\r\nimport { IMonitor, IUndoCommand, TEntityType, TUndoStack } from \"./types\";\r\nimport { Undo } from \"./undo\";\r\n\r\nexport default function(gantt: any){\r\n\r\nconst _undo = new Undo(gantt);\r\nconst monitor: IMonitor = new Monitor(_undo, gantt);\r\n\r\ngantt.config.undo = true;\r\ngantt.config.redo = true;\r\n\r\n/**\r\n * entities that require different processing for undoing-redoing changes\r\n * @type {{link: string, task: string}}\r\n */\r\ngantt.config.undo_types = {\r\n\tlink: \"link\",\r\n\ttask: \"task\"\r\n};\r\n\r\n/**\r\n * types of traced actions\r\n * @type {{update: string, remove: string, add: string}}\r\n */\r\ngantt.config.undo_actions = {\r\n\tupdate: \"update\",\r\n\tremove: \"remove\", // remove item from datastore\r\n\tadd: \"add\",\r\n\tmove: \"move\" // move task in grid\r\n};\r\n\r\nif (!gantt.ext) {\r\n\tgantt.ext = {};\r\n}\r\n\r\ngantt.ext.undo = {\r\n\tundo: () => _undo.undo(),\r\n\tredo: () => _undo.redo(),\r\n\tgetUndoStack: () => _undo.getUndoStack(),\r\n\tsetUndoStack: (stack:[]) => _undo.setUndoStack(stack),\r\n\tgetRedoStack: () => _undo.getRedoStack(),\r\n\tsetRedoStack: (stack:[]) => _undo.setRedoStack(stack),\r\n\tclearUndoStack: () => _undo.clearUndoStack(),\r\n\tclearRedoStack: () => _undo.clearRedoStack(),\r\n\tsaveState: (id: TaskID | LinkID, type: TEntityType) => monitor.store(id, type, true),\r\n\tgetInitialState: (id: TaskID | LinkID, type: TEntityType) => {\r\n\t\tif(type === gantt.config.undo_types.link){\r\n\t\t\treturn monitor.getInitialLink(id);\r\n\t\t}else{\r\n\t\t\treturn monitor.getInitialTask(id);\r\n\t\t}\r\n\t}\r\n};\r\n\r\ngantt.undo = gantt.ext.undo.undo;\r\ngantt.redo = gantt.ext.undo.redo;\r\ngantt.getUndoStack = gantt.ext.undo.getUndoStack;\r\ngantt.getRedoStack = gantt.ext.undo.getRedoStack;\r\ngantt.clearUndoStack = gantt.ext.undo.clearUndoStack;\r\ngantt.clearRedoStack = gantt.ext.undo.clearRedoStack;\r\n\r\nfunction updTask(task: ITask, oldId: TaskID, newId: TaskID) {\r\n\tif (!task) { return; }\r\n\r\n\tif (task.id === oldId) {\r\n\t\ttask.id = newId;\r\n\t}\r\n\r\n\tif (task.parent === oldId) {\r\n\t\ttask.parent = newId;\r\n\t}\r\n}\r\n\r\nfunction changeTaskCommandId(command: IUndoCommand, oldId: TaskID, newId: TaskID) {\r\n\tupdTask(command.value, oldId, newId);\r\n\tupdTask(command.oldValue, oldId, newId);\r\n}\r\n\r\nfunction updLink(link: ILink, oldTaskId: TaskID, newTaskId: TaskID) {\r\n\tif (!link) { return; }\r\n\tif (link.source === oldTaskId) {\r\n\t\tlink.source = newTaskId;\r\n\t}\r\n\tif (link.target === oldTaskId) {\r\n\t\tlink.target = newTaskId;\r\n\t}\r\n}\r\n\r\nfunction changeLinkCommandId(command: IUndoCommand, oldId: LinkID, newId: LinkID) {\r\n\tupdLink(command.value, oldId, newId);\r\n\tupdLink(command.oldValue, oldId, newId);\r\n}\r\n\r\nfunction updateTasksIds(log: TUndoStack, oldId: TaskID, newId: TaskID) {\r\n\tconst undo = _undo;\r\n\r\n\tfor (let i = 0; i < log.length; i++) {\r\n\t\tconst entry = log[i];\r\n\t\tfor (let j = 0; j < entry.commands.length; j++) {\r\n\t\t\tif (entry.commands[j].entity === undo.command.entity.task) {\r\n\t\t\t\tchangeTaskCommandId(entry.commands[j], oldId, newId);\r\n\t\t\t} else if (entry.commands[j].entity === undo.command.entity.link) {\r\n\t\t\t\tchangeLinkCommandId(entry.commands[j], oldId, newId);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction updateLinksIds(log: TUndoStack, oldId: LinkID, newId: LinkID) {\r\n\tconst undo = _undo;\r\n\r\n\tfor (let i = 0; i < log.length; i++) {\r\n\t\tconst entry = log[i];\r\n\t\tfor (let j = 0; j < entry.commands.length; j++) {\r\n\t\t\tconst command = entry.commands[j];\r\n\t\t\tif (command.entity === undo.command.entity.link) {\r\n\t\t\t\tif (command.value && command.value.id === oldId) {\r\n\t\t\t\t\tcommand.value.id = newId;\r\n\t\t\t\t}\r\n\t\t\t\tif (command.oldValue && command.oldValue.id === oldId) {\r\n\t\t\t\t\tcommand.oldValue.id = newId;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\ngantt.attachEvent(\"onTaskIdChange\", (oldId: TaskID, newId: TaskID) => {\r\n\tconst undo = _undo;\r\n\tupdateTasksIds(undo.getUndoStack(), oldId, newId);\r\n\tupdateTasksIds(undo.getRedoStack(), oldId, newId);\r\n});\r\n\r\ngantt.attachEvent(\"onLinkIdChange\", (oldId: LinkID, newId: LinkID) => {\r\n\tconst undo = _undo;\r\n\tupdateLinksIds(undo.getUndoStack(), oldId, newId);\r\n\tupdateLinksIds(undo.getRedoStack(), oldId, newId);\r\n});\r\n\r\ngantt.attachEvent(\"onGanttReady\", () => {\r\n\t_undo.updateConfigs();\r\n});\r\n\r\n}","import * as domHelpers from \"../../core/ui/utils/dom_helpers\";\r\n\r\ninterface IViewPosition{\r\n\ttop: number;\r\n\tleft: number;\r\n}\r\n\r\ninterface IViewBox extends IViewPosition{\r\n\twidth: number;\r\n\theight: number;\r\n\tbottom: number;\r\n\tright: number;\r\n}\r\n\r\nexport class Tooltip {\r\n\tprivate _root: HTMLElement;\r\n\tprivate _tooltipNode: HTMLElement;\r\n\tprivate _gantt: any;\r\n\r\n\tconstructor(gantt: any){\r\n\t\tthis._gantt = gantt;\r\n\t}\r\n\r\n\tgetNode() : HTMLElement {\r\n\t\tconst gantt = this._gantt;\r\n\t\tif (!this._tooltipNode){\r\n\t\t\tthis._tooltipNode = document.createElement(\"div\");\r\n\t\t\tthis._tooltipNode.className = \"gantt_tooltip\";\r\n\t\t\tgantt._waiAria.tooltipAttr(this._tooltipNode);\r\n\t\t}\r\n\t\treturn this._tooltipNode;\r\n\t}\r\n\r\n\tsetViewport(node: HTMLElement):Tooltip{\r\n\t\tthis._root = node;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tshow(left: number, top: number): Tooltip;\r\n\tshow(event: MouseEvent): Tooltip;\r\n\tshow(left: number | MouseEvent, top?: number): Tooltip {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst container = document.body;\r\n\t\tconst node = this.getNode();\r\n\r\n\t\tif(!domHelpers.isChildOf(node, container)){\r\n\t\t\tthis.hide();\r\n\t\t\tcontainer.appendChild(node);\r\n\t\t}\r\n\r\n\t\tif (this._isLikeMouseEvent(left)) {\r\n\t\t\tconst position = this._calculateTooltipPosition(left as MouseEvent);\r\n\t\t\ttop = position.top;\r\n\t\t\tleft = position.left;\r\n\t\t}\r\n\r\n\t\tnode.style.top = top + \"px\";\r\n\t\tnode.style.left = left + \"px\";\r\n\r\n\t\tgantt._waiAria.tooltipVisibleAttr(node);\r\n\t\treturn this;\r\n\t}\r\n\thide() : Tooltip{\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst node = this.getNode();\r\n\t\tif(node && node.parentNode){\r\n\t\t\tnode.parentNode.removeChild(node);\r\n\t\t}\r\n\t\tgantt._waiAria.tooltipHiddenAttr(node);\r\n\t\treturn this;\r\n\t}\r\n\r\n\tsetContent(html: string) : Tooltip{\r\n\t\tconst node = this.getNode();\r\n\t\tnode.innerHTML = html;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// it is for salesforce, because it proxies event to it own events\r\n\tprivate _isLikeMouseEvent(event: any): boolean {\r\n\t\tif (!event || typeof event !== \"object\") {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn \"clientX\" in event && \"clientY\" in event;\r\n\t}\r\n\r\n\tprivate _getViewPort() : HTMLElement {\r\n\t\treturn this._root || document.body;\r\n\t}\r\n\r\n\r\n\tprivate _calculateTooltipPosition(event: MouseEvent): IViewPosition{\r\n\t\tconst gantt = this._gantt;\r\n\t\t// top/left coordinates inside the viewport by mouse position\r\n\t\tconst viewport = this._getViewPortSize();\r\n\t\tconst tooltipNode = this.getNode();\r\n\t\tconst tooltip: IViewBox = {\r\n\t\t\ttop:0,\r\n\t\t\tleft: 0,\r\n\t\t\twidth: tooltipNode.offsetWidth,\r\n\t\t\theight: tooltipNode.offsetHeight,\r\n\t\t\tbottom: 0,\r\n\t\t\tright: 0\r\n\t\t};\r\n\r\n\t\tconst offsetX = gantt.config.tooltip_offset_x;\r\n\t\tconst offsetY = gantt.config.tooltip_offset_y;\r\n\r\n\t\tconst container = document.body;\r\n\t\tconst mouse = domHelpers.getRelativeEventPosition(event, container);\r\n\t\tconst containerPos = domHelpers.getNodePosition(container);\r\n\t\tmouse.y += containerPos.y; // to fix margin collapsing\r\n\r\n\t\ttooltip.top = mouse.y;\r\n\t\ttooltip.left = mouse.x;\r\n\t\ttooltip.top += offsetY;\r\n\t\ttooltip.left += offsetX;\r\n\t\ttooltip.bottom = tooltip.top + tooltip.height;\r\n\t\ttooltip.right = tooltip.left + tooltip.width;\r\n\r\n\t\tconst scrollTop = window.scrollY + container.scrollTop; // to fix margin collapsing\r\n\t\t// edge cases when the tooltip element can be partially hidden by edges of the viewport\r\n\t\tif(tooltip.top < viewport.top - scrollTop){\r\n\t\t\ttooltip.top = viewport.top;\r\n\t\t\ttooltip.bottom = tooltip.top + tooltip.height;\r\n\t\t}else if(tooltip.bottom > viewport.bottom){\r\n\t\t\ttooltip.bottom = viewport.bottom;\r\n\t\t\ttooltip.top = tooltip.bottom - tooltip.height;\r\n\t\t}\r\n\r\n\t\tif(tooltip.left < viewport.left){\r\n\t\t\ttooltip.left = viewport.left;\r\n\t\t\ttooltip.right = viewport.left + tooltip.width;\r\n\t\t}else if(tooltip.right > viewport.right){\r\n\t\t\ttooltip.right = viewport.right;\r\n\t\t\ttooltip.left = tooltip.right - tooltip.width;\r\n\t\t}\r\n\r\n\t\tif(mouse.x >= tooltip.left && mouse.x <= tooltip.right) {\r\n\t\t\ttooltip.left = mouse.x - tooltip.width - offsetX;\r\n\t\t\ttooltip.right = tooltip.left + tooltip.width;\r\n\t\t}\r\n\r\n\t\tif(mouse.y >= tooltip.top && mouse.y <= tooltip.bottom) {\r\n\t\t\ttooltip.top = mouse.y - tooltip.height - offsetY;\r\n\t\t\ttooltip.bottom = tooltip.top + tooltip.height;\r\n\t\t}\r\n\r\n\t\treturn tooltip;\r\n\t}\r\n\r\n\tprivate _getViewPortSize() : IViewBox {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst container = this._getViewPort();\r\n\t\tlet viewport = container;\r\n\t\tlet scrollTop = window.scrollY + document.body.scrollTop;\r\n\t\tlet scrollLeft = window.scrollX + document.body.scrollLeft;\r\n\t\tlet pos;\r\n\t\t// support for the initial tooltip mode where the tooltip element was attached to the data area of gantt\r\n\t\tif(container === gantt.$task_data){\r\n\t\t\tviewport = gantt.$task;\r\n\t\t\tscrollTop = 0;\r\n\t\t\tscrollLeft = 0;\r\n\t\t\tpos = domHelpers.getNodePosition(gantt.$task);\r\n\t\t}else{\r\n\t\t\tpos = domHelpers.getNodePosition(viewport);\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tleft:pos.x + scrollLeft,\r\n\t\t\ttop: pos.y + scrollTop,\r\n\t\t\twidth: pos.width,\r\n\t\t\theight: pos.height,\r\n\t\t\tbottom: pos.y + pos.height + scrollTop,\r\n\t\t\tright: pos.x + pos.width + scrollLeft\r\n\t\t};\r\n\t}\r\n}\r\n","import * as domEventsScope from \"../../core/ui/utils/dom_event_scope\";\r\nimport * as domHelpers from \"../../core/ui/utils/dom_helpers\";\r\nimport * as helpers from \"../../utils/helpers\";\r\nimport { Tooltip } from \"./tooltip\";\r\n\r\ninterface ITrackerTarget {\r\n\tselector: string;\r\n\tonmouseenter: (event: MouseEvent, node: HTMLElement) => void;\r\n\tonmousemove: (event: MouseEvent, node: HTMLElement) => void;\r\n\tonmouseleave: (event: MouseEvent, node: HTMLElement) => void;\r\n\tglobal: boolean;\r\n}\r\n\r\ninterface ITooltipConfig {\r\n\tselector: string;\r\n\thtml: (event: MouseEvent, node: HTMLElement) => string;\r\n\tglobal: boolean;\r\n}\r\n\r\nexport class TooltipManager{\r\n\ttooltip: Tooltip;\r\n\tprotected _domEvents: any;\r\n\tprivate _listeners: object = {};\r\n\tprivate _gantt: any;\r\n\tprivate delayShow: any;\r\n\tprivate delayHide: any;\r\n\r\n\tconstructor(gantt: any) {\r\n\t\tthis.tooltip = new Tooltip(gantt);\r\n\t\tthis._gantt = gantt;\r\n\t\tthis._domEvents = domEventsScope();\r\n\t\tthis._initDelayedFunctions();\r\n\t}\r\n\r\n\tdestructor(): void{\r\n\t\tthis.tooltip.hide();\r\n\t\tthis._domEvents.detachAll();\r\n\t}\r\n\thideTooltip(): void{\r\n\t\tthis.delayHide();\r\n\t}\r\n\tattach(config: ITrackerTarget): void {\r\n\t\tlet root = document.body;\r\n\t\tconst gantt = this._gantt;\r\n\t\tif(!config.global){\r\n\t\t\troot = gantt.$root;\r\n\t\t}\r\n\r\n\t\tlet watchableTarget = null;\r\n\t\tconst handler = (event) => {\r\n\t\t\tconst eventTarget = domHelpers.getTargetNode(event);\r\n\t\t\tconst targetNode = domHelpers.closest(eventTarget, config.selector);\r\n\t\t\tif(domHelpers.isChildOf(eventTarget, this.tooltip.getNode())){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst doOnMouseEnter = () => {\r\n\t\t\t\twatchableTarget = targetNode;\r\n\t\t\t\tconfig.onmouseenter(event, targetNode);\r\n\t\t\t};\r\n\r\n\t\t\tif(watchableTarget){\r\n\t\t\t\tif(targetNode && targetNode === watchableTarget){\r\n\t\t\t\t\tconfig.onmousemove(event, targetNode);\r\n\t\t\t\t}else{\r\n\t\t\t\t\tconfig.onmouseleave(event, watchableTarget);\r\n\t\t\t\t\twatchableTarget = null;\r\n\r\n\t\t\t\t\tif(targetNode && targetNode !== watchableTarget){\r\n\t\t\t\t\t\tdoOnMouseEnter();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tif(targetNode){\r\n\t\t\t\t\tdoOnMouseEnter();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.detach(config.selector);\r\n\t\tthis._domEvents.attach(root, \"mousemove\", handler);\r\n\t\tthis._listeners[config.selector] = {\r\n\t\t\tnode: root,\r\n\t\t\thandler\r\n\t\t};\r\n\t}\r\n\r\n\tdetach(selector: string): void {\r\n\t\tconst listener = this._listeners[selector];\r\n\t\tif(listener){\r\n\t\t\tthis._domEvents.detach(listener.node, \"mousemove\", listener.handler);\r\n\t\t}\r\n\t}\r\n\r\n\ttooltipFor(config: ITooltipConfig): void {\r\n\t\tconst cloneDomEvent = (event: MouseEvent) => {\r\n\t\t\tlet clone = event;\r\n\t\t\t// making events survive timeout in ie\r\n\t\t\t// tslint:disable-next-line no-string-literal\r\n\t\t\tif(document[\"createEventObject\"] && !document.createEvent){\r\n\t\t\t\t// tslint:disable-next-line no-string-literal\r\n\t\t\t\tclone = document[\"createEventObject\"](event);\r\n\t\t\t}\r\n\t\t\treturn clone;\r\n\t\t};\r\n\t\tthis._initDelayedFunctions();\r\n\t\tthis.attach({\r\n\t\t\tselector: config.selector,\r\n\t\t\tglobal: config.global,\r\n\t\t\tonmouseenter:(event: MouseEvent, node: HTMLElement) => {\r\n\t\t\t\tconst html = config.html(event, node);\r\n\t\t\t\tif(html){\r\n\t\t\t\t\tthis.delayShow(cloneDomEvent(event), html);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tonmousemove:(event: MouseEvent, node: HTMLElement) => {\r\n\t\t\t\tconst html = config.html(event, node);\r\n\t\t\t\tif(html){\r\n\t\t\t\t\tthis.delayShow(cloneDomEvent(event), html);\r\n\t\t\t\t}else{\r\n\t\t\t\t\tthis.delayShow.$cancelTimeout();\r\n\t\t\t\t\tthis.delayHide();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tonmouseleave:() => {\r\n\t\t\t\tthis.delayShow.$cancelTimeout();\r\n\t\t\t\tthis.delayHide();\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\tprivate _initDelayedFunctions(){\r\n\t\tconst gantt = this._gantt;\r\n\t\t// reset delayed functions in order to apply current values of tooltip_timeout\r\n\t\tif(this.delayShow){\r\n\t\t\tthis.delayShow.$cancelTimeout();\r\n\t\t}\r\n\t\tif(this.delayHide){\r\n\t\t\tthis.delayHide.$cancelTimeout();\r\n\t\t}\r\n\t\tthis.tooltip.hide();\r\n\r\n\t\tthis.delayShow = helpers.delay((event: MouseEvent, html: string) => {\r\n\t\t\tif(gantt.callEvent(\"onBeforeTooltip\", [event]) === false) {\r\n\t\t\t\tthis.tooltip.hide();\r\n\t\t\t} else {\r\n\t\t\t\tthis.tooltip.setContent(html);\r\n\t\t\t\tthis.tooltip.show(event);\r\n\t\t\t}\r\n\t\t}, gantt.config.tooltip_timeout || 1);\r\n\r\n\t\tthis.delayHide = helpers.delay(() => {\r\n\t\t\tthis.delayShow.$cancelTimeout();\r\n\t\t\tthis.tooltip.hide();\r\n\t\t}, gantt.config.tooltip_hide_timeout || 1);\r\n\t}\r\n\r\n}","import {TooltipManager} from \"./tooltipManager\";\r\n\r\nexport default function(gantt: any){\r\n\r\ngantt.config.tooltip_timeout = 30;\r\ngantt.config.tooltip_offset_y = 20;\r\ngantt.config.tooltip_offset_x = 10;\r\ngantt.config.tooltip_hide_timeout = 30;\r\n\r\n\r\n\r\nconst tooltipManager = new TooltipManager(gantt);\r\n\r\ngantt.ext.tooltips = tooltipManager;\r\n\r\ngantt.attachEvent(\"onGanttReady\", function(){\r\n\r\n\ttooltipManager.tooltipFor({\r\n\t\tselector: \"[\"+gantt.config.task_attribute+\"]:not(.gantt_task_row)\",\r\n\t\thtml: (event: MouseEvent) => {\r\n\t\t\tif (gantt.config.touch && !gantt.config.touch_tooltip) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst targetTaskId = gantt.locate(event);\r\n\t\t\tif(gantt.isTaskExists(targetTaskId)){\r\n\t\t\t\tconst task = gantt.getTask(targetTaskId);\r\n\t\t\t\treturn gantt.templates.tooltip_text(task.start_date, task.end_date, task);\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t},\r\n\t\tglobal: false\r\n\t});\r\n});\r\n\r\ngantt.attachEvent(\"onDestroy\", function() {\r\n\ttooltipManager.destructor();\r\n});\r\n\r\ngantt.attachEvent(\"onLightbox\", function() {\r\n\ttooltipManager.hideTooltip();\r\n});\r\nconst isLinkCreate = () => {\r\n\tconst state = gantt.getState();\r\n\treturn !!state.link_source_id;\r\n};\r\ngantt.attachEvent(\"onBeforeTooltip\", function() {\r\n\tif (isLinkCreate()){\r\n\t\treturn false;\r\n\t}\r\n});\r\n\r\ngantt.attachEvent(\"onGanttScroll\", function(){\r\n\ttooltipManager.hideTooltip();\r\n});\r\n\r\n}","\r\ninterface IQuickInfoContainer{\r\n\tparent: HTMLElement;\r\n\txViewport: HTMLElement;\r\n\tyViewport: HTMLElement;\r\n}\r\n\r\nexport class QuickInfo {\r\n\tprivate _quickInfoTask: TaskID;\r\n\tprivate _quickInfoBoxId: number | string;\r\n\tprivate _quickInfoBox: HTMLElement;\r\n\tprivate _quickInfoReadonly: boolean | null;\r\n\tprivate _container: HTMLElement;\r\n\tprivate _gantt: any;\r\n\r\n\tconstructor(gantt: any) {\r\n\t\tthis._gantt = gantt;\r\n\t}\r\n\r\n\t// show at coordinates:\r\n\t// show(x: number, y: number)\r\n\t// show for a task:\r\n\t// show(id: TaskID)\r\n\tshow : {\r\n\t\t(x: number, y: number) : void;\r\n\t\t(id: TaskID) : void;\r\n\t} = (id: TaskID | number, y? : number) : void => {\r\n\t\tif (y === undefined) {\r\n\t\t\tthis._showForTask(id);\r\n\t\t} else {\r\n\t\t\tthis._showAtCoordinates(id as number, y);\r\n\t\t}\r\n\t}\r\n\r\n\thide = (forced?: boolean) : any => {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst qi = this._quickInfoBox;\r\n\t\tthis._quickInfoBoxId = 0;\r\n\t\tconst taskId = this._quickInfoTask;\r\n\t\tthis._quickInfoTask = null;\r\n\r\n\t\tif (qi && qi.parentNode){\r\n\r\n\t\t\tif (gantt.config.quick_info_detached) {\r\n\t\t\t\tgantt.callEvent(\"onAfterQuickInfo\", [taskId]);\r\n\t\t\t\treturn qi.parentNode.removeChild(qi);\r\n\t\t\t}\r\n\r\n\t\t\tqi.className += \" gantt_qi_hidden\";\r\n\t\t\tif (qi.style.right === \"auto\"){\r\n\t\t\t\tqi.style.left = \"-350px\";\r\n\t\t\t} else {\r\n\t\t\t\tqi.style.right = \"-350px\";\r\n\t\t\t}\r\n\r\n\t\t\tif (forced) {\r\n\t\t\t\tqi.style.left = qi.style.right = \"\";\r\n\t\t\t\tqi.parentNode.removeChild(qi);\r\n\t\t\t}\r\n\t\t\tgantt.callEvent(\"onAfterQuickInfo\", [taskId]);\r\n\t\t}\r\n\t}\r\n\r\n\tgetNode = (): HTMLElement => {\r\n\t\tif(this._quickInfoBox) {\r\n\t\t\treturn this._quickInfoBox;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tsetContainer = (container: string|HTMLElement): void => {\r\n\t\tif(container){\r\n\t\t\tthis._container = typeof container === \"string\" ? document.getElementById(container) : container;\r\n\t\t}\r\n\t}\r\n\r\n\tsetContent = (content?: IQuickInfoContent) => {\r\n\t\tconst gantt = this._gantt;\r\n\r\n\t\tconst defaultContent = {\r\n\t\t\ttaskId: null,\r\n\t\t\theader: {\r\n\t\t\t\ttitle: \"\",\r\n\t\t\t\tdate: \"\"\r\n\t\t\t},\r\n\t\t\tcontent: \"\",\r\n\t\t\tbuttons: gantt.config.quickinfo_buttons\r\n\t\t};\r\n\r\n\t\tif(!content){\r\n\t\t\tcontent = defaultContent;\r\n\t\t}\r\n\r\n\t\tif(!content.taskId){\r\n\t\t\tcontent.taskId = defaultContent.taskId;\r\n\t\t}\r\n\r\n\t\tif(!content.header){\r\n\t\t\tcontent.header = defaultContent.header;\r\n\t\t}\r\n\r\n\t\tif(!content.header.title){\r\n\t\t\tcontent.header.title = defaultContent.header.title;\r\n\t\t}\r\n\t\tif(!content.header.date){\r\n\t\t\tcontent.header.date = defaultContent.header.date;\r\n\t\t}\r\n\t\tif(!content.content){\r\n\t\t\tcontent.content = defaultContent.content;\r\n\t\t}\r\n\t\tif(!content.buttons){\r\n\t\t\tcontent.buttons = defaultContent.buttons;\r\n\t\t}\r\n\r\n\r\n\t\tlet qi = this.getNode();\r\n\t\tif(!qi){\r\n\t\t\tqi = this._createQuickInfoElement();\r\n\t\t}\r\n\r\n\t\tif(content.taskId){\r\n\t\t\tthis._quickInfoBoxId = content.taskId;\r\n\t\t}\r\n\r\n\t\tconst titleBox = qi.querySelector(\".gantt_cal_qi_title\") as HTMLElement;\r\n\t\tconst titleContent = titleBox.querySelector(\".gantt_cal_qi_tcontent\");\r\n\t\tconst titleDate = titleBox.querySelector(\".gantt_cal_qi_tdate\");\r\n\t\tconst main = qi.querySelector(\".gantt_cal_qi_content\");\r\n\t\tconst controls = qi.querySelector(\".gantt_cal_qi_controls\") as HTMLElement;\r\n\r\n\t\tgantt._waiAria.quickInfoHeader(qi, [content.header.title, content.header.date].join(\" \"));\r\n\r\n\t\ttitleContent.innerHTML = content.header.title;\r\n\t\ttitleDate.innerHTML = content.header.date;\r\n\r\n\t\tif(!content.header.title && !content.header.date){\r\n\t\t\ttitleBox.style.display = \"none\";\r\n\t\t}else{\r\n\t\t\ttitleBox.style.display = \"\";\r\n\t\t}\r\n\t\tmain.innerHTML = content.content;\r\n\r\n\t\tconst buttons = content.buttons;\r\n\t\tif(!buttons.length){\r\n\t\t\tcontrols.style.display = \"none\";\r\n\t\t}else{\r\n\t\t\tcontrols.style.display = \"\";\r\n\t\t}\r\n\t\tlet html = \"\";\r\n\t\tfor (let i = 0; i < buttons.length; i++){\r\n\r\n\t\t\tconst ariaAttr = gantt._waiAria.quickInfoButtonAttrString(gantt.locale.labels[buttons[i]]);\r\n\r\n\t\t\thtml += \"<div class=\\\"gantt_qi_big_icon \"+buttons[i]+\"\\\" title=\\\"\"\r\n\t\t\t\t+gantt.locale.labels[buttons[i]]+\"\\\" \" + ariaAttr +\"><div class='gantt_menu_icon \" + buttons[i]\r\n\t\t\t\t+ \"'></div><div>\"+gantt.locale.labels[buttons[i]]+\"</div></div>\";\r\n\t\t}\r\n\t\tcontrols.innerHTML = html;\r\n\r\n\t\tgantt.eventRemove(qi, \"click\", this._qiButtonClickHandler);\r\n\t\tgantt.eventRemove(qi, \"keypress\", this._qiKeyPressHandler);\r\n\r\n\t\tgantt.event(qi, \"click\", this._qiButtonClickHandler);\r\n\t\tgantt.event(qi, \"keypress\", this._qiKeyPressHandler);\r\n\t}\r\n\r\n\tprivate _qiButtonClickHandler = (ev) => {\r\n\t\tev = ev || event;\r\n\t\tthis._qi_button_click(ev.target || ev.srcElement);\r\n\t}\r\n\r\n\tprivate _qiKeyPressHandler = (e) => {\r\n\t\te = e || event;\r\n\t\t// @ts-ignore\r\n\t\tconst code = e.which||event.keyCode;\r\n\t\tif (code === 13 || code === 32){\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis._qi_button_click(e.target || e.srcElement);\r\n\t\t\t},1);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _showAtCoordinates(x: number, y: number) : void {\r\n\t\tthis.hide(true);\r\n\t\tthis._quickInfoBoxId = 0;\r\n\t\tthis._quickInfoTask = null;\r\n\t\tif(!this._quickInfoBox){\r\n\t\t\tthis._createQuickInfoElement();\r\n\t\t\tthis.setContent();\r\n\t\t}\r\n\r\n\t\tthis._appendAtCoordinates(x, y);\r\n\t\tthis._gantt.callEvent(\"onQuickInfo\", [null]);\r\n\t}\r\n\r\n\tprivate _showForTask(id: TaskID) : void {\r\n\t\tconst gantt = this._gantt;\r\n\t\tif ((\r\n\t\t\tid === this._quickInfoBoxId &&\r\n\t\t\tgantt.utils.dom.isChildOf(this._quickInfoBox, document.body)\r\n\t\t) || !gantt.config.show_quick_info) {\r\n\t\t\t// not show if the quick info is already displayed for this task, or if it shouldn't be displayed\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.hide(true);\r\n\t\tconst offset = 6; // offset TASK <> QI-BOX in 'px'\r\n\t\tconst container = this._getContainer();\r\n\t\tconst pos = this._get_event_counter_part(id, offset, container.xViewport, container.yViewport);\r\n\r\n\t\tif (pos){\r\n\t\t\tthis._quickInfoBox = this._init_quick_info(id);\r\n\t\t\tthis._quickInfoTask = id;\r\n\t\t\tthis._quickInfoBox.className = this._prepare_quick_info_classname(id);\r\n\r\n\t\t\tthis._fill_quick_data(id);\r\n\t\t\tthis._show_quick_info(pos, offset);\r\n\t\t\tgantt.callEvent(\"onQuickInfo\", [id]);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _get_event_counter_part(id: TaskID, offset: number, xViewport: HTMLElement, yViewport: HTMLElement) : any {\r\n\t\tconst gantt = this._gantt;\r\n\t\tlet domEv = gantt.getTaskNode(id);\r\n\t\tif (!domEv) {\r\n\t\t\tdomEv = gantt.getTaskRowNode(id);\r\n\t\t\tif (!domEv) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tlet left = 0;\r\n\t\tconst top = offset + domEv.offsetTop + domEv.offsetHeight;\r\n\r\n\t\tlet node = domEv;\r\n\r\n\t\tif (gantt.utils.dom.isChildOf(node, xViewport)) {\r\n\t\t\twhile (node && node !== xViewport){\r\n\t\t\t\tleft += node.offsetLeft;\r\n\t\t\t\tnode = node.offsetParent;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst scroll = gantt.getScrollState();\r\n\r\n\t\tif(node){\r\n\t\t\tconst dx = (left + domEv.offsetWidth/2) - scroll.x > (xViewport.offsetWidth/2) ? 1 : 0;\r\n\t\t\tconst dy = (top + domEv.offsetHeight/2) - scroll.y > (yViewport.offsetHeight/2) ? 1 : 0;\r\n\r\n\t\t\treturn { left, top, dx, dy, width:domEv.offsetWidth, height:domEv.offsetHeight };\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate _createQuickInfoElement() : HTMLElement {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst qi = document.createElement(\"div\");\r\n\t\tqi.className += \"gantt_cal_quick_info\";\r\n\t\tgantt._waiAria.quickInfoAttr(qi);\r\n\r\n\t\t// title\r\n\t\tconst ariaAttr = gantt._waiAria.quickInfoHeaderAttrString();\r\n\t\tlet html = \"<div class=\\\"gantt_cal_qi_title\\\" \"+ariaAttr+\">\" +\r\n\t\t\t\"<div class=\\\"gantt_cal_qi_tcontent\\\"></div><div class=\\\"gantt_cal_qi_tdate\\\"></div>\" +\r\n\t\t\t\"</div>\" +\r\n\t\t\t\"<div class=\\\"gantt_cal_qi_content\\\"></div>\";\r\n\r\n\t\t// buttons\r\n\t\thtml += \"<div class=\\\"gantt_cal_qi_controls\\\">\";\r\n\t\thtml += \"</div>\";\r\n\r\n\t\tqi.innerHTML = html;\r\n\r\n\r\n\t\tif (gantt.config.quick_info_detached) {\r\n\t\t\tconst container = this._getContainer();\r\n\t\t\tgantt.event(container.parent, \"scroll\", () => { this.hide(); });\r\n\t\t}\r\n\r\n\t\tthis._quickInfoBox = qi;\r\n\t\treturn qi;\r\n\t}\r\n\r\n\tprivate _init_quick_info(id: TaskID) : HTMLElement {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst task = gantt.getTask(id);\r\n\t\tif(typeof this._quickInfoReadonly === \"boolean\"){\r\n\t\t\tif(gantt.isReadonly(task) !== this._quickInfoReadonly){\r\n\t\t\t\tthis.hide(true);\r\n\t\t\t\tthis._quickInfoBox = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._quickInfoReadonly = gantt.isReadonly(task);\r\n\r\n\t\tif (!this._quickInfoBox){\r\n\t\t\tthis._quickInfoBox = this._createQuickInfoElement();\r\n\t\t}\r\n\r\n\t\treturn this._quickInfoBox;\r\n\t}\r\n\r\n\tprivate _prepare_quick_info_classname(id: TaskID) : string {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst task = gantt.getTask(id);\r\n\r\n\t\tlet css = \"gantt_cal_quick_info\";\r\n\t\tconst template = gantt.templates.quick_info_class(task.start_date, task.end_date, task);\r\n\r\n\t\tif(template){\r\n\t\t\tcss += \" \" + template;\r\n\t\t}\r\n\t\treturn css;\r\n\t}\r\n\r\n\tprivate _fill_quick_data(id: TaskID) : void {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst ev = gantt.getTask(id);\r\n\r\n\t\tthis._quickInfoBoxId = id;\r\n\r\n\t\tlet allowedButtons = [];\r\n\t\tif (this._quickInfoReadonly){\r\n\t\t\tconst buttons = gantt.config.quickinfo_buttons;\r\n\t\t\tconst isEditor = {icon_delete: true, icon_edit: true};\r\n\t\t\tfor (let i = 0; i < buttons.length; i++){\r\n\t\t\t\tif(this._quickInfoReadonly && isEditor[buttons[i]]){\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tallowedButtons.push(buttons[i]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tallowedButtons = gantt.config.quickinfo_buttons;\r\n\t\t}\r\n\r\n\t\tthis.setContent({\r\n\t\t\theader: {\r\n\t\t\t\ttitle: gantt.templates.quick_info_title(ev.start_date, ev.end_date, ev),\r\n\t\t\t\tdate: gantt.templates.quick_info_date(ev.start_date, ev.end_date, ev)\r\n\t\t\t},\r\n\t\t\tcontent: gantt.templates.quick_info_content(ev.start_date, ev.end_date, ev),\r\n\t\t\tbuttons: allowedButtons\r\n\t\t});\r\n\t}\r\n\r\n\tprivate _appendAtCoordinates(x: number, y: number): void {\r\n\t\tconst qi = this._quickInfoBox;\r\n\t\tconst container = this._getContainer();\r\n\t\tif (!qi.parentNode ||\r\n\t\t\tqi.parentNode.nodeName.toLowerCase() === \"#document-fragment\"){ // IE8\r\n\t\t\tcontainer.parent.appendChild(qi);\r\n\t\t}\r\n\r\n\t\tqi.style.left = x + \"px\";\r\n\t\tqi.style.top = y + \"px\";\r\n\t}\r\n\r\n\tprivate _show_quick_info(pos: any, offset: number) : void {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst qi = this._quickInfoBox;\r\n\t\tif (gantt.config.quick_info_detached) {\r\n\t\t\tconst container = this._getContainer();\r\n\t\t\tif (!qi.parentNode ||\r\n\t\t\t\tqi.parentNode.nodeName.toLowerCase() === \"#document-fragment\"){ // IE8\r\n\t\t\t\tcontainer.parent.appendChild(qi);\r\n\t\t\t}\r\n\t\t\tconst width = qi.offsetWidth;\r\n\t\t\tconst popupHeight = qi.offsetHeight;\r\n\r\n\t\t\tconst scrolls = gantt.getScrollState();\r\n\t\t\tconst xViewport = container.xViewport;\r\n\t\t\tconst yViewport = container.yViewport;\r\n\t\t\tconst screenWidth = xViewport.offsetWidth + scrolls.x - width;\r\n\r\n\t\t\tconst relativePopupTop = pos.top - scrolls.y;\r\n\t\t\tconst relativePopupBottom = relativePopupTop + popupHeight;\r\n\r\n\t\t\tlet top = pos.top;\r\n\t\t\tif(relativePopupBottom > yViewport.offsetHeight / 2){\r\n\t\t\t\ttop = pos.top - (popupHeight + pos.height + 2*offset);\r\n\t\t\t\tif(top < scrolls.y && relativePopupBottom <= yViewport.offsetHeight){\r\n\t\t\t\t\ttop = pos.top;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (top < scrolls.y) {\r\n\t\t\t\ttop = scrolls.y;\r\n\t\t\t}\r\n\r\n\t\t\tconst x = Math.min(Math.max(scrolls.x, pos.left - pos.dx*(width - pos.width)), screenWidth);\r\n\t\t\tconst y = top;\r\n\r\n\t\t\tthis._appendAtCoordinates(x, y);\r\n\t\t} else {\r\n\t\t\tqi.style.top = 20 + \"px\";\r\n\t\t\tif (pos.dx === 1){\r\n\t\t\t\tqi.style.right = \"auto\";\r\n\t\t\t\tqi.style.left = \"-300px\";\r\n\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tqi.style.left = \"10px\";\r\n\t\t\t\t},1);\r\n\t\t\t} else {\r\n\t\t\t\tqi.style.left = \"auto\";\r\n\t\t\t\tqi.style.right = \"-300px\";\r\n\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tqi.style.right = \"10px\";\r\n\t\t\t\t},1);\r\n\t\t\t}\r\n\t\t\tqi.className += \" gantt_qi_\"+(pos.dx === 1 ? \"left\" : \"right\");\r\n\t\t\tgantt.$root.appendChild(qi);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _qi_button_click(node: any) : void {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst box = this._quickInfoBox;\r\n\t\tif (!node || node === box){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst mask = node.className;\r\n\t\tif (mask.indexOf(\"_icon\") !== -1){\r\n\t\t\tconst id = this._quickInfoBoxId;\r\n\t\t\tgantt.$click.buttons[mask.split(\" \")[1].replace(\"icon_\",\"\")](id);\r\n\t\t} else {\r\n\t\t\tthis._qi_button_click(node.parentNode);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _getContainer(): IQuickInfoContainer{\r\n\t\tconst gantt = this._gantt;\r\n\t\tlet container = this._container ? this._container : gantt.$task_data;\r\n\t\tif (container && container.offsetHeight && container.offsetWidth) {\r\n\t\t\treturn {\r\n\t\t\t\tparent: container,\r\n\t\t\t\txViewport: gantt.$task,\r\n\t\t\t\tyViewport: gantt.$task_data\r\n\t\t\t};\r\n\t\t}\r\n\t\tcontainer = this._container ? this._container : gantt.$grid_data;\r\n\t\tif (container && container.offsetHeight && container.offsetWidth) {\r\n\t\t\treturn {\r\n\t\t\t\tparent: container,\r\n\t\t\t\txViewport: gantt.$grid,\r\n\t\t\t\tyViewport: gantt.$grid_data\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tparent: this._container ? this._container : gantt.$layout,\r\n\t\t\txViewport: gantt.$layout,\r\n\t\t\tyViewport: gantt.$layout\r\n\t\t};\r\n\t}\r\n}\r\n","import { QuickInfo } from \"./quickInfo\";\r\n\r\nexport default function(gantt: any){\r\n\r\nif (!gantt.ext) {\r\n\tgantt.ext = {};\r\n}\r\ngantt.ext.quickInfo = new QuickInfo(gantt);\r\n\r\ngantt.config.quickinfo_buttons = [\"icon_delete\",\"icon_edit\"];\r\ngantt.config.quick_info_detached = true;\r\ngantt.config.show_quick_info = true;\r\n\r\ngantt.templates.quick_info_title = function(start, end, ev){ return ev.text.substr(0,50); };\r\ngantt.templates.quick_info_content = function(start, end, ev){ return ev.details || ev.text; };\r\ngantt.templates.quick_info_date = function(start, end, ev){\r\n\treturn gantt.templates.task_time(start, end, ev);\r\n};\r\ngantt.templates.quick_info_class = function(start, end, task){ return \"\"; };\r\n\r\ngantt.attachEvent(\"onTaskClick\", function(id,e){\r\n\t// GS-1460 Don't show Quick Info when clicking on the \"+\" button\r\n\tif (!gantt.utils.dom.closest(e.target, \".gantt_add\")){\r\n\t\tsetTimeout(function() {\r\n\t\t\tgantt.ext.quickInfo.show(id);\r\n\t\t}, 0);\r\n\t}\r\n\r\n\treturn true;\r\n});\r\n\r\nconst events = [\"onViewChange\", \"onLightbox\", \"onBeforeTaskDelete\", \"onBeforeDrag\"];\r\nconst hidingFunction = function(){\r\n\tgantt.ext.quickInfo.hide();\r\n\treturn true;\r\n};\r\nfor (let i=0; i<events.length; i++){\r\n\tgantt.attachEvent(events[i], hidingFunction);\r\n}\r\n// GS-957: We don't want to hide QuickInfo when we click on it.\r\ngantt.attachEvent(\"onEmptyClick\", function(e){\r\n\tlet hideQuickInfo = true;\r\n\tconst parent = document.querySelector(\".gantt_cal_quick_info\");\r\n\tif (parent){\r\n\t\tconst quickInfoClick = gantt.utils.dom.isChildOf(e.target, parent);\r\n\t\tif (quickInfoClick){\r\n\t\t\thideQuickInfo = false;\r\n\t\t}\r\n\t}\r\n\tif (hideQuickInfo){\r\n\t\thidingFunction();\r\n\t}\r\n});\r\nfunction clearQuickInfo() {\r\n\tgantt.ext.quickInfo.hide();\r\n\tgantt.ext.quickInfo._quickInfoBox = null;\r\n\treturn true;\r\n}\r\ngantt.attachEvent(\"onGanttReady\", clearQuickInfo);\r\ngantt.attachEvent(\"onDestroy\", clearQuickInfo);\r\n\r\ngantt.event(window, \"keydown\", function(e){\r\n\tif (e.keyCode === 27){\r\n\t\tgantt.ext.quickInfo.hide();\r\n\t}\r\n});\r\n\r\n}","var _require = require(\"../utils/helpers\"),\n replaceValidZeroId = _require.replaceValidZeroId;\n\nmodule.exports = function (gantt) {\n gantt.config.multiselect = true;\n gantt.config.multiselect_one_level = false;\n gantt._multiselect = {\n _selected: {},\n _one_level: false,\n _active: true,\n _first_selected_when_shift: null,\n getDefaultSelected: function getDefaultSelected() {\n var selected = this.getSelected();\n return selected.length ? selected[selected.length - 1] : null;\n },\n setFirstSelected: function setFirstSelected(id) {\n this._first_selected_when_shift = id;\n },\n getFirstSelected: function getFirstSelected() {\n return this._first_selected_when_shift;\n },\n isActive: function isActive() {\n this.updateState();\n return this._active;\n },\n updateState: function updateState() {\n this._one_level = gantt.config.multiselect_one_level;\n var active = this._active;\n this._active = gantt.config.select_task;\n\n if (this._active != active) {\n this.reset();\n }\n },\n reset: function reset() {\n this._selected = {};\n },\n setLastSelected: function setLastSelected(id) {\n gantt.$data.tasksStore.silent(function () {\n var store = gantt.$data.tasksStore;\n if (id) store.select(id + \"\");else store.unselect(null);\n });\n },\n getLastSelected: function getLastSelected() {\n var last = gantt.$data.tasksStore.getSelectedId();\n if (last && gantt.isTaskExists(last)) return last;\n return null;\n },\n select: function select(id, e) {\n if (id && gantt.callEvent(\"onBeforeTaskMultiSelect\", [id, true, e]) && gantt.callEvent(\"onBeforeTaskSelected\", [id])) {\n this._selected[id] = true;\n this.setLastSelected(id);\n this.afterSelect(id);\n gantt.callEvent(\"onTaskMultiSelect\", [id, true, e]);\n gantt.callEvent(\"onTaskSelected\", [id]);\n return true;\n }\n\n return false;\n },\n toggle: function toggle(id, e) {\n if (this._selected[id]) {\n this.unselect(id, e);\n } else {\n this.select(id, e);\n }\n },\n unselect: function unselect(id, e) {\n if (id && gantt.callEvent(\"onBeforeTaskMultiSelect\", [id, false, e])) {\n this._selected[id] = false;\n if (this.getLastSelected() == id) this.setLastSelected(this.getDefaultSelected());\n this.afterSelect(id);\n gantt.callEvent(\"onTaskMultiSelect\", [id, false, e]);\n gantt.callEvent(\"onTaskUnselected\", [id]);\n }\n },\n isSelected: function isSelected(id) {\n return !!(gantt.isTaskExists(id) && this._selected[id]);\n },\n getSelected: function getSelected() {\n var res = [];\n\n for (var i in this._selected) {\n if (this._selected[i] && gantt.isTaskExists(i)) {\n res.push(i);\n } else {\n this._selected[i] = false;\n }\n }\n\n res.sort(function (a, b) {\n return gantt.getGlobalTaskIndex(a) > gantt.getGlobalTaskIndex(b) ? 1 : -1;\n });\n return res;\n },\n forSelected: function forSelected(callback) {\n var selected = this.getSelected();\n\n for (var i = 0; i < selected.length; i++) {\n callback(selected[i]);\n }\n },\n isSameLevel: function isSameLevel(id) {\n if (!this._one_level) return true;\n var last = this.getLastSelected();\n if (!last) return true;\n if (!(gantt.isTaskExists(last) && gantt.isTaskExists(id))) return true;\n return !!(gantt.calculateTaskLevel(gantt.getTask(last)) == gantt.calculateTaskLevel(gantt.getTask(id)));\n },\n afterSelect: function afterSelect(id) {\n if (gantt.isTaskExists(id)) {\n // FIXME: quick workaround to prevent re-filtering inside refresh on multiselect\n gantt._quickRefresh(function () {\n gantt.refreshTask(id);\n });\n }\n },\n doSelection: function doSelection(e) {\n if (!this.isActive()) return false; // deny selection when click on 'expand' or 'collapse' icons\n\n if (gantt._is_icon_open_click(e)) return false;\n var target_ev = gantt.locate(e);\n if (!target_ev) return false;\n if (!gantt.callEvent(\"onBeforeMultiSelect\", [e])) return false;\n var selected = this.getSelected();\n var defaultLast = this.getFirstSelected();\n var isLast = false;\n var last = this.getLastSelected();\n var multiSelect = gantt.config.multiselect;\n\n var singleSelection = function () {\n // GS-719: If the multiselect extension is added we still need a way\n // to open the inline editors after clicking on the cells in the grid\n var controller = gantt.ext.inlineEditors;\n var state = controller.getState();\n var cell = controller.locateCell(e.target);\n\n if (gantt.config.inline_editors_multiselect_open && cell && controller.getEditorConfig(cell.columnName)) {\n if (controller.isVisible() && state.id == cell.id && state.columnName == cell.columnName) {// do nothing if editor is already active in this cell\n } else {\n controller.startEdit(cell.id, cell.columnName);\n }\n }\n\n this.setFirstSelected(target_ev);\n\n if (!this.isSelected(target_ev)) {\n this.select(target_ev, e);\n }\n\n selected = this.getSelected();\n\n for (var i = 0; i < selected.length; i++) {\n if (selected[i] !== target_ev) {\n this.unselect(selected[i], e);\n }\n }\n }.bind(this);\n\n var blockSelection = function () {\n if (!last) last = target_ev;else if (target_ev) {\n var first_indx = gantt.getGlobalTaskIndex(this.getFirstSelected());\n var target_indx = gantt.getGlobalTaskIndex(target_ev);\n var last_indx = gantt.getGlobalTaskIndex(last); // clear prev selection\n\n var tmp = last;\n\n while (gantt.getGlobalTaskIndex(tmp) !== first_indx) {\n this.unselect(tmp, e);\n tmp = first_indx > last_indx ? gantt.getNext(tmp) : gantt.getPrev(tmp);\n }\n\n tmp = target_ev;\n\n while (gantt.getGlobalTaskIndex(tmp) !== first_indx) {\n if (this.select(tmp, e) && !isLast) {\n isLast = true;\n defaultLast = tmp;\n }\n\n tmp = first_indx > target_indx ? gantt.getNext(tmp) : gantt.getPrev(tmp);\n }\n }\n }.bind(this);\n\n if (multiSelect && (e.ctrlKey || e.metaKey)) {\n if (!this.isSelected(target_ev)) this.setFirstSelected(target_ev);\n\n if (target_ev) {\n this.toggle(target_ev, e);\n }\n } else if (multiSelect && e.shiftKey) {\n if (!gantt.isTaskExists(this.getFirstSelected()) || this.getFirstSelected() === null) {\n this.setFirstSelected(target_ev);\n }\n\n if (selected.length) {\n // select a group of tasks\n blockSelection();\n } else {\n // select a task when no task is selected and Shift is pressed\n singleSelection();\n }\n } else {\n // no key press or no multiple selection on the mouse click\n singleSelection();\n }\n\n if (this.isSelected(target_ev)) {\n this.setLastSelected(target_ev);\n } else if (defaultLast) {\n if (target_ev == last) this.setLastSelected(e.shiftKey ? defaultLast : this.getDefaultSelected());\n } else {\n this.setLastSelected(null);\n }\n\n if (!this.getSelected().length) this.setLastSelected(null);\n if (!this.getLastSelected() || !this.isSelected(this.getFirstSelected())) this.setFirstSelected(this.getLastSelected());\n return true;\n }\n };\n\n (function () {\n var old_selectTask = gantt.selectTask;\n\n gantt.selectTask = function (id) {\n id = replaceValidZeroId(id, this.config.root_id);\n if (!id) return false;\n var multiselect = gantt._multiselect;\n var res = id;\n\n if (multiselect.isActive()) {\n if (multiselect.select(id, null)) {\n multiselect.setLastSelected(id);\n }\n\n multiselect.setFirstSelected(multiselect.getLastSelected());\n } else {\n res = old_selectTask.call(this, id);\n }\n\n return res;\n };\n\n var old_unselectTask = gantt.unselectTask;\n\n gantt.unselectTask = function (id) {\n var multiselect = gantt._multiselect;\n var isActive = multiselect.isActive();\n id = id || multiselect.getLastSelected();\n\n if (id && isActive) {\n multiselect.unselect(id, null);\n if (id == multiselect.getLastSelected()) multiselect.setLastSelected(null);\n gantt.refreshTask(id);\n multiselect.setFirstSelected(multiselect.getLastSelected());\n }\n\n var res = id;\n if (!isActive) res = old_unselectTask.call(this, id);\n return res;\n };\n\n gantt.toggleTaskSelection = function (id) {\n var multiselect = gantt._multiselect;\n\n if (id && multiselect.isActive()) {\n multiselect.toggle(id);\n multiselect.setFirstSelected(multiselect.getLastSelected());\n }\n };\n\n gantt.getSelectedTasks = function () {\n var multiselect = gantt._multiselect;\n multiselect.isActive();\n return multiselect.getSelected();\n };\n\n gantt.eachSelectedTask = function (callback) {\n return this._multiselect.forSelected(callback);\n };\n\n gantt.isSelectedTask = function (id) {\n return this._multiselect.isSelected(id);\n };\n\n gantt.getLastSelectedTask = function () {\n return this._multiselect.getLastSelected();\n };\n\n gantt.attachEvent(\"onGanttReady\", function () {\n var old_isSelected = gantt.$data.tasksStore.isSelected;\n\n gantt.$data.tasksStore.isSelected = function (id) {\n if (gantt._multiselect.isActive()) {\n return gantt._multiselect.isSelected(id);\n }\n\n return old_isSelected.call(this, id);\n };\n });\n })();\n\n gantt.attachEvent(\"onTaskIdChange\", function (id, new_id) {\n var multiselect = gantt._multiselect;\n if (!multiselect.isActive()) return true;\n\n if (gantt.isSelectedTask(id)) {\n multiselect.unselect(id, null);\n multiselect.select(new_id, null);\n }\n });\n gantt.attachEvent(\"onAfterTaskDelete\", function (id, item) {\n var multiselect = gantt._multiselect;\n if (!multiselect.isActive()) return true;\n\n if (multiselect._selected[id]) {\n multiselect.unselect(id, null);\n multiselect._selected[id] = false;\n multiselect.setLastSelected(multiselect.getDefaultSelected());\n }\n\n multiselect.forSelected(function (task_id) {\n if (!gantt.isTaskExists(task_id)) multiselect.unselect(task_id, null);\n });\n });\n gantt.attachEvent(\"onBeforeTaskMultiSelect\", function (id, state, e) {\n var multiselect = gantt._multiselect;\n\n if (state && multiselect.isActive()) {\n if (multiselect._one_level) {\n return multiselect.isSameLevel(id);\n }\n }\n\n return true;\n });\n gantt.attachEvent(\"onTaskClick\", function (id, e) {\n if (gantt._multiselect.doSelection(e)) gantt.callEvent(\"onMultiSelect\", [e]);\n return true;\n });\n};","module.exports = function (gantt) {\n if (!gantt._markers) {\n gantt._markers = gantt.createDatastore({\n name: \"marker\",\n initItem: function initItem(marker) {\n marker.id = marker.id || gantt.uid();\n return marker;\n }\n });\n }\n\n gantt.config.show_markers = true;\n\n function render_marker(marker) {\n if (!gantt.config.show_markers) return false;\n if (!marker.start_date) return false;\n var state = gantt.getState();\n if (+marker.start_date > +state.max_date) return;\n if ((!marker.end_date || +marker.end_date < +state.min_date) && +marker.start_date < +state.min_date) return;\n var div = document.createElement(\"div\");\n div.setAttribute(\"data-marker-id\", marker.id);\n var css = \"gantt_marker\";\n if (gantt.templates.marker_class) css += \" \" + gantt.templates.marker_class(marker);\n\n if (marker.css) {\n css += \" \" + marker.css;\n }\n\n if (marker.title) {\n div.title = marker.title;\n }\n\n div.className = css;\n var start = gantt.posFromDate(marker.start_date);\n div.style.left = start + \"px\";\n var markerHeight = Math.max(gantt.getRowTop(gantt.getVisibleTaskCount()), 0) + \"px\";\n\n if (gantt.config.timeline_placeholder) {\n markerHeight = gantt.$container.scrollHeight + \"px\";\n }\n\n div.style.height = markerHeight;\n\n if (marker.end_date) {\n var end = gantt.posFromDate(marker.end_date);\n div.style.width = Math.max(end - start, 0) + \"px\";\n }\n\n if (marker.text) {\n div.innerHTML = \"<div class='gantt_marker_content' >\" + marker.text + \"</div>\";\n }\n\n return div;\n }\n\n function initMarkerArea() {\n if (!gantt.$task_data) return;\n var markerArea = document.createElement(\"div\");\n markerArea.className = \"gantt_marker_area\";\n gantt.$task_data.appendChild(markerArea);\n gantt.$marker_area = markerArea;\n }\n\n gantt.attachEvent(\"onBeforeGanttRender\", function () {\n if (!gantt.$marker_area) initMarkerArea();\n });\n gantt.attachEvent(\"onDataRender\", function () {\n if (!gantt.$marker_area) {\n initMarkerArea();\n gantt.renderMarkers();\n }\n });\n gantt.attachEvent(\"onGanttLayoutReady\", function () {\n // GS-1304 - markers should attach when layout is initialized, both on gantt.init and gantt.resetLayout\n // wait for \"onBeforeGanttRender\", so all layout elements will be in DOM\n gantt.attachEvent(\"onBeforeGanttRender\", function () {\n initMarkerArea();\n var layers = gantt.$services.getService(\"layers\");\n var markerRenderer = layers.createDataRender({\n name: \"marker\",\n defaultContainer: function defaultContainer() {\n return gantt.$marker_area;\n }\n });\n markerRenderer.addLayer(render_marker);\n }, {\n once: true\n });\n });\n\n gantt.getMarker = function (id) {\n if (!this._markers) return null;\n return this._markers.getItem(id);\n };\n\n gantt.addMarker = function (marker) {\n return this._markers.addItem(marker);\n };\n\n gantt.deleteMarker = function (id) {\n if (!this._markers.exists(id)) return false;\n\n this._markers.removeItem(id);\n\n return true;\n };\n\n gantt.updateMarker = function (id) {\n this._markers.refresh(id);\n };\n\n gantt._getMarkers = function () {\n return this._markers.getItems();\n };\n\n gantt.renderMarkers = function () {\n this._markers.refresh();\n };\n};","module.exports = function (gantt) {\n gantt.$keyboardNavigation.dispatcher = {\n isActive: false,\n activeNode: null,\n globalNode: new gantt.$keyboardNavigation.GanttNode(),\n enable: function enable() {\n this.isActive = true;\n this.setActiveNode(this.getActiveNode());\n },\n disable: function disable() {\n this.isActive = false;\n },\n isEnabled: function isEnabled() {\n return !!this.isActive;\n },\n getDefaultNode: function getDefaultNode() {\n var node;\n\n if (gantt.config.keyboard_navigation_cells) {\n node = new gantt.$keyboardNavigation.TaskCell();\n } else {\n node = new gantt.$keyboardNavigation.TaskRow();\n }\n\n if (!node.isValid()) {\n node = node.fallback();\n }\n\n return node;\n },\n setDefaultNode: function setDefaultNode() {\n this.setActiveNode(this.getDefaultNode());\n },\n getActiveNode: function getActiveNode() {\n var node = this.activeNode;\n\n if (node && !node.isValid()) {\n node = node.fallback();\n }\n\n return node;\n },\n fromDomElement: function fromDomElement(e) {\n var inputs = [gantt.$keyboardNavigation.TaskRow, gantt.$keyboardNavigation.TaskCell, gantt.$keyboardNavigation.HeaderCell];\n\n for (var i = 0; i < inputs.length; i++) {\n if (inputs[i].prototype.fromDomElement) {\n var node = inputs[i].prototype.fromDomElement(e);\n if (node) return node;\n }\n }\n\n return null;\n },\n focusGlobalNode: function focusGlobalNode() {\n this.blurNode(this.globalNode);\n this.focusNode(this.globalNode);\n },\n setActiveNode: function setActiveNode(el) {\n //console.trace()\n var focusChanged = true;\n\n if (this.activeNode) {\n if (this.activeNode.compareTo(el)) {\n focusChanged = false;\n }\n }\n\n if (this.isEnabled()) {\n if (focusChanged) this.blurNode(this.activeNode);\n this.activeNode = el;\n this.focusNode(this.activeNode, !focusChanged);\n }\n },\n focusNode: function focusNode(el, keptFocus) {\n if (el && el.focus) {\n el.focus(keptFocus);\n }\n },\n blurNode: function blurNode(el) {\n if (el && el.blur) {\n el.blur();\n }\n },\n keyDownHandler: function keyDownHandler(e) {\n if (gantt.$keyboardNavigation.isModal()) return;\n if (!this.isEnabled()) return;\n\n if (e.defaultPrevented) {\n return;\n }\n\n var ganttNode = this.globalNode;\n var command = gantt.$keyboardNavigation.shortcuts.getCommandFromEvent(e);\n var activeElement = this.getActiveNode();\n var eventFacade = gantt.$keyboardNavigation.facade;\n\n if (eventFacade.callEvent(\"onKeyDown\", [command, e]) === false) {\n return;\n }\n\n if (!activeElement) {\n this.setDefaultNode();\n } else if (activeElement.findHandler(command)) {\n activeElement.doAction(command, e);\n } else if (ganttNode.findHandler(command)) {\n ganttNode.doAction(command, e);\n }\n },\n _timeout: null,\n awaitsFocus: function awaitsFocus() {\n return this._timeout !== null;\n },\n delay: function delay(callback, _delay) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(gantt.bind(function () {\n this._timeout = null;\n callback();\n }, this), _delay || 1);\n },\n clearDelay: function clearDelay() {\n clearTimeout(this._timeout);\n }\n };\n};","module.exports = function (gantt) {\n (function () {\n var modalsStack = [];\n\n function isModal() {\n return !!modalsStack.length;\n }\n\n function afterPopup(box) {\n setTimeout(function () {\n if (!isModal()) {\n if (!gantt.$destroyed) {\n gantt.focus();\n }\n }\n }, 1);\n }\n\n function startModal(box) {\n gantt.eventRemove(box, \"keydown\", trapFocus);\n gantt.event(box, \"keydown\", trapFocus);\n modalsStack.push(box); //gantt.$keyboardNavigation.dispatcher.disable();\n }\n\n function endModal() {\n var box = modalsStack.pop();\n\n if (box) {\n gantt.eventRemove(box, \"keydown\", trapFocus);\n }\n\n afterPopup(box);\n }\n\n function isTopModal(box) {\n return box == modalsStack[modalsStack.length - 1];\n }\n\n function trapFocus(event) {\n var target = event.currentTarget;\n if (!isTopModal(target)) return;\n gantt.$keyboardNavigation.trapFocus(target, event);\n }\n\n function traceLightbox() {\n startModal(gantt.getLightbox());\n }\n\n gantt.attachEvent(\"onLightbox\", traceLightbox);\n gantt.attachEvent(\"onAfterLightbox\", endModal);\n gantt.attachEvent(\"onLightboxChange\", function () {\n endModal();\n traceLightbox();\n });\n gantt.attachEvent(\"onAfterQuickInfo\", function () {\n afterPopup();\n });\n gantt.attachEvent(\"onMessagePopup\", function (box) {\n saveFocus();\n startModal(box);\n });\n gantt.attachEvent(\"onAfterMessagePopup\", function () {\n endModal();\n restoreFocus();\n });\n var focusElement = null;\n\n function saveFocus() {\n focusElement = gantt.utils.dom.getActiveElement();\n }\n\n function restoreFocus() {\n setTimeout(function () {\n if (focusElement) {\n focusElement.focus();\n focusElement = null;\n }\n }, 1);\n }\n\n gantt.$keyboardNavigation.isModal = isModal;\n })();\n};","module.exports = function (gantt) {\n var domHelpers = require(\"../../../core/ui/utils/dom_helpers\");\n\n var _require = require(\"../../../utils/helpers\"),\n replaceValidZeroId = _require.replaceValidZeroId;\n\n gantt.$keyboardNavigation.TaskCell = function (taskId, index) {\n taskId = replaceValidZeroId(taskId, gantt.config.root_id);\n\n if (!taskId) {\n var rootLevel = gantt.getChildren(gantt.config.root_id);\n\n if (rootLevel[0]) {\n taskId = rootLevel[0];\n }\n }\n\n this.taskId = taskId;\n this.columnIndex = index || 0; // provided task may not exist, in this case node will be detectes as invalid\n\n if (gantt.isTaskExists(this.taskId)) {\n this.index = gantt.getTaskIndex(this.taskId);\n this.globalIndex = gantt.getGlobalTaskIndex(this.taskId);\n }\n };\n\n gantt.$keyboardNavigation.TaskCell.prototype = gantt._compose(gantt.$keyboardNavigation.TaskRow, {\n _handlers: null,\n isValid: function isValid() {\n return gantt.$keyboardNavigation.TaskRow.prototype.isValid.call(this) && !!gantt.getGridColumns()[this.columnIndex];\n },\n fallback: function fallback() {\n var node = gantt.$keyboardNavigation.TaskRow.prototype.fallback.call(this);\n var result = node;\n\n if (node instanceof gantt.$keyboardNavigation.TaskRow) {\n var visibleColumns = gantt.getGridColumns();\n var index = this.columnIndex;\n\n while (index >= 0) {\n if (visibleColumns[index]) break;\n index--;\n }\n\n if (visibleColumns[index]) {\n result = new gantt.$keyboardNavigation.TaskCell(node.taskId, index);\n }\n }\n\n return result;\n },\n fromDomElement: function fromDomElement(el) {\n if (!gantt.config.keyboard_navigation_cells) {\n return null;\n }\n\n var taskId = gantt.locate(el);\n\n if (gantt.isTaskExists(taskId)) {\n var index = 0;\n var cellElement = domHelpers.locateAttribute(el, \"data-column-index\");\n\n if (cellElement) {\n index = cellElement.getAttribute(\"data-column-index\") * 1;\n }\n\n return new gantt.$keyboardNavigation.TaskCell(taskId, index);\n } else {\n return null;\n }\n },\n getNode: function getNode() {\n if (gantt.isTaskExists(this.taskId) && gantt.isTaskVisible(this.taskId)) {\n if (gantt.config.show_grid) {\n var row = gantt.$grid.querySelector(\".gantt_row[\" + gantt.config.task_attribute + \"='\" + this.taskId + \"']\");\n if (!row) return null;\n return row.querySelector(\"[data-column-index='\" + this.columnIndex + \"']\");\n } else {\n return gantt.getTaskNode(this.taskId);\n }\n }\n },\n keys: {\n \"up\": function up() {\n var nextElement = null;\n var prevTask = gantt.getPrev(this.taskId);\n\n if (!gantt.isTaskExists(prevTask)) {\n nextElement = new gantt.$keyboardNavigation.HeaderCell(this.columnIndex);\n } else {\n nextElement = new gantt.$keyboardNavigation.TaskCell(prevTask, this.columnIndex);\n }\n\n this.moveTo(nextElement);\n },\n \"down\": function down() {\n var nextTask = gantt.getNext(this.taskId);\n\n if (gantt.isTaskExists(nextTask)) {\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(nextTask, this.columnIndex));\n }\n },\n \"left\": function left() {\n if (this.columnIndex > 0) {\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, this.columnIndex - 1));\n }\n },\n \"right\": function right() {\n var columns = gantt.getGridColumns();\n\n if (this.columnIndex < columns.length - 1) {\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, this.columnIndex + 1));\n }\n },\n \"end\": function end() {\n var columns = gantt.getGridColumns();\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, columns.length - 1));\n },\n \"home\": function home() {\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, 0));\n },\n \"pagedown\": function pagedown() {\n if (gantt.getVisibleTaskCount()) {\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(gantt.getTaskByIndex(gantt.getVisibleTaskCount() - 1).id, this.columnIndex));\n }\n },\n \"pageup\": function pageup() {\n if (gantt.getVisibleTaskCount()) {\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(gantt.getTaskByIndex(0).id, this.columnIndex));\n }\n }\n }\n });\n gantt.$keyboardNavigation.TaskCell.prototype.bindAll(gantt.$keyboardNavigation.TaskRow.prototype.keys);\n gantt.$keyboardNavigation.TaskCell.prototype.bindAll(gantt.$keyboardNavigation.TaskCell.prototype.keys);\n};","module.exports = function (gantt) {\n gantt.$keyboardNavigation.TaskRow = function (taskId) {\n if (!taskId) {\n var rootLevel = gantt.getChildren(gantt.config.root_id);\n\n if (rootLevel[0]) {\n taskId = rootLevel[0];\n }\n }\n\n this.taskId = taskId;\n\n if (gantt.isTaskExists(this.taskId)) {\n this.index = gantt.getTaskIndex(this.taskId);\n this.globalIndex = gantt.getGlobalTaskIndex(this.taskId);\n }\n };\n\n gantt.$keyboardNavigation.TaskRow.prototype = gantt._compose(gantt.$keyboardNavigation.KeyNavNode, {\n _handlers: null,\n isValid: function isValid() {\n return gantt.isTaskExists(this.taskId) && gantt.getTaskIndex(this.taskId) > -1;\n },\n fallback: function fallback() {\n if (!gantt.getVisibleTaskCount()) {\n var header = new gantt.$keyboardNavigation.HeaderCell();\n if (!header.isValid()) return null;else return header;\n } else {\n var nextIndex = -1; // GS-1393. When Gantt tries to restore the focus, it should rely on the global index\n\n if (gantt.getTaskByIndex(this.globalIndex - 1)) {\n nextIndex = this.globalIndex - 1;\n } else if (gantt.getTaskByIndex(this.globalIndex + 1)) {\n nextIndex = this.globalIndex + 1;\n } else {\n var globalIndex = this.globalIndex;\n\n while (globalIndex >= 0) {\n if (gantt.getTaskByIndex(globalIndex)) {\n nextIndex = globalIndex;\n break;\n }\n\n globalIndex--;\n }\n }\n\n if (nextIndex > -1) {\n return new gantt.$keyboardNavigation.TaskRow(gantt.getTaskByIndex(nextIndex).id);\n }\n }\n },\n fromDomElement: function fromDomElement(el) {\n if (gantt.config.keyboard_navigation_cells) {\n return null;\n }\n\n var taskId = gantt.locate(el);\n\n if (gantt.isTaskExists(taskId)) {\n return new gantt.$keyboardNavigation.TaskRow(taskId);\n } else {\n return null;\n }\n },\n getNode: function getNode() {\n if (gantt.isTaskExists(this.taskId) && gantt.isTaskVisible(this.taskId)) {\n if (gantt.config.show_grid) {\n return gantt.$grid.querySelector(\".gantt_row[\" + gantt.config.task_attribute + \"='\" + this.taskId + \"']\");\n } else {\n return gantt.getTaskNode(this.taskId);\n }\n }\n },\n focus: function focus(keptFocus) {\n if (!keptFocus) {\n var pos = gantt.getTaskPosition(gantt.getTask(this.taskId));\n var height = gantt.getTaskHeight(this.taskId);\n var scroll = gantt.getScrollState();\n var viewWidth;\n\n if (gantt.$task) {\n viewWidth = gantt.$task.offsetWidth;\n } else {\n viewWidth = scroll.inner_width;\n }\n\n var viewHeight;\n\n if (gantt.$grid_data || gantt.$task_data) {\n viewHeight = (gantt.$grid_data || gantt.$task_data).offsetHeight;\n } else {\n viewHeight = scroll.inner_height;\n }\n\n if (pos.top < scroll.y || pos.top + height > scroll.y + viewHeight) {\n gantt.scrollTo(null, pos.top - height * 5);\n } else if (gantt.config.scroll_on_click && gantt.config.show_chart) {\n // horizontal scroll activated\n if (pos.left > scroll.x + viewWidth) {\n // scroll forward to the start of the task\n gantt.scrollTo(pos.left - gantt.config.task_scroll_offset);\n } else if (pos.left + pos.width < scroll.x) {\n // scroll back to the end of the task\n gantt.scrollTo(pos.left + pos.width - gantt.config.task_scroll_offset);\n }\n }\n }\n\n gantt.$keyboardNavigation.KeyNavNode.prototype.focus.apply(this, [keptFocus]); // GS-152 if there are scrollbars with custom names, change their scroll position\n\n scrollGrid();\n\n function scrollGrid() {\n var grid = gantt.$ui.getView(\"grid\");\n var scrollPositionX = parseInt(grid.$grid.scrollLeft);\n var scrollPositionY = parseInt(grid.$grid_data.scrollTop);\n var attachedScrollbarHorizontal = grid.$config.scrollX;\n\n if (attachedScrollbarHorizontal && grid.$config.scrollable) {\n var scrollbarHorizontal = gantt.$ui.getView(attachedScrollbarHorizontal);\n\n if (scrollbarHorizontal) {\n scrollbarHorizontal.scrollTo(scrollPositionX, scrollPositionY);\n }\n }\n\n var attachedScrollbarVertical = grid.$config.scrollY;\n\n if (attachedScrollbarVertical) {\n var scrollbarVertical = gantt.$ui.getView(attachedScrollbarVertical);\n\n if (scrollbarVertical) {\n scrollbarVertical.scrollTo(scrollPositionX, scrollPositionY);\n }\n }\n }\n },\n keys: {\n \"pagedown\": function pagedown() {\n if (gantt.getVisibleTaskCount()) {\n this.moveTo(new gantt.$keyboardNavigation.TaskRow(gantt.getTaskByIndex(gantt.getVisibleTaskCount() - 1).id));\n }\n },\n \"pageup\": function pageup() {\n if (gantt.getVisibleTaskCount()) {\n this.moveTo(new gantt.$keyboardNavigation.TaskRow(gantt.getTaskByIndex(0).id));\n }\n },\n \"up\": function up() {\n var nextElement = null;\n var prevTask = gantt.getPrev(this.taskId);\n\n if (!gantt.isTaskExists(prevTask)) {\n nextElement = new gantt.$keyboardNavigation.HeaderCell();\n } else {\n nextElement = new gantt.$keyboardNavigation.TaskRow(prevTask);\n }\n\n this.moveTo(nextElement);\n },\n \"down\": function down() {\n var nextTask = gantt.getNext(this.taskId);\n\n if (gantt.isTaskExists(nextTask)) {\n this.moveTo(new gantt.$keyboardNavigation.TaskRow(nextTask));\n }\n },\n \"shift+down\": function shiftDown() {\n if (gantt.hasChild(this.taskId) && !gantt.getTask(this.taskId).$open) {\n gantt.open(this.taskId);\n }\n },\n \"shift+up\": function shiftUp() {\n if (gantt.hasChild(this.taskId) && gantt.getTask(this.taskId).$open) {\n gantt.close(this.taskId);\n }\n },\n \"shift+right\": function shiftRight() {\n if (gantt.isReadonly(this)) {\n return;\n }\n\n var prevId = gantt.getPrevSibling(this.taskId);\n\n if (gantt.isTaskExists(prevId) && !gantt.isChildOf(this.taskId, prevId)) {\n var parent = gantt.getTask(prevId);\n parent.$open = true;\n var result = gantt.moveTask(this.taskId, -1, prevId);\n if (result !== false) gantt.updateTask(this.taskId);\n }\n },\n \"shift+left\": function shiftLeft() {\n if (gantt.isReadonly(this)) {\n return;\n }\n\n var parent = gantt.getParent(this.taskId);\n\n if (gantt.isTaskExists(parent)) {\n var result = gantt.moveTask(this.taskId, gantt.getTaskIndex(parent) + 1, gantt.getParent(parent));\n if (result !== false) gantt.updateTask(this.taskId);\n }\n },\n // select\n \"space\": function space(e) {\n if (!gantt.isSelectedTask(this.taskId)) {\n gantt.selectTask(this.taskId);\n } else {\n gantt.unselectTask(this.taskId);\n }\n },\n // collapse\n \"ctrl+left\": function ctrlLeft(e) {\n gantt.close(this.taskId);\n },\n // expand\n \"ctrl+right\": function ctrlRight(e) {\n gantt.open(this.taskId);\n },\n // delete task\n \"delete\": function _delete(e) {\n if (gantt.isReadonly(this)) {\n return;\n }\n\n gantt.$click.buttons[\"delete\"](this.taskId);\n },\n // open lightbox\n \"enter\": function enter() {\n if (gantt.isReadonly(this)) {\n return;\n }\n\n gantt.showLightbox(this.taskId);\n },\n // add subtask\n \"ctrl+enter\": function ctrlEnter() {\n if (gantt.isReadonly(this)) {\n return;\n }\n\n gantt.createTask({}, this.taskId);\n }\n }\n });\n gantt.$keyboardNavigation.TaskRow.prototype.bindAll(gantt.$keyboardNavigation.TaskRow.prototype.keys);\n};","module.exports = function (gantt) {\n var domHelpers = require(\"../../../core/ui/utils/dom_helpers\");\n\n gantt.$keyboardNavigation.HeaderCell = function (index) {\n this.index = index || 0;\n };\n\n gantt.$keyboardNavigation.HeaderCell.prototype = gantt._compose(gantt.$keyboardNavigation.KeyNavNode, {\n _handlers: null,\n isValid: function isValid() {\n if (!gantt.config.show_grid) {\n if (gantt.getVisibleTaskCount()) return false;\n }\n\n return !!gantt.getGridColumns()[this.index] || !gantt.getVisibleTaskCount();\n },\n fallback: function fallback() {\n if (!gantt.config.show_grid) {\n if (gantt.getVisibleTaskCount()) {\n return new gantt.$keyboardNavigation.TaskRow();\n }\n\n return null;\n }\n\n var visibleColumns = gantt.getGridColumns();\n var index = this.index;\n\n while (index >= 0) {\n if (visibleColumns[index]) break;\n index--;\n }\n\n if (visibleColumns[index]) {\n return new gantt.$keyboardNavigation.HeaderCell(index);\n } else {\n return null;\n }\n },\n fromDomElement: function fromDomElement(el) {\n var cellElement = domHelpers.locateClassName(el, \"gantt_grid_head_cell\");\n\n if (cellElement) {\n var index = 0;\n\n while (cellElement && cellElement.previousSibling) {\n cellElement = cellElement.previousSibling;\n index += 1;\n }\n\n return new gantt.$keyboardNavigation.HeaderCell(index);\n } else {\n return null;\n }\n },\n getNode: function getNode() {\n var cells = gantt.$grid_scale.childNodes;\n return cells[this.index];\n },\n keys: {\n \"left\": function left() {\n if (this.index > 0) {\n this.moveTo(new gantt.$keyboardNavigation.HeaderCell(this.index - 1));\n }\n },\n \"right\": function right() {\n var columns = gantt.getGridColumns();\n\n if (this.index < columns.length - 1) {\n this.moveTo(new gantt.$keyboardNavigation.HeaderCell(this.index + 1));\n }\n },\n \"down\": function down() {\n var taskRow;\n var rootLevel = gantt.getChildren(gantt.config.root_id);\n\n if (gantt.isTaskExists(rootLevel[0])) {\n taskRow = rootLevel[0];\n }\n\n if (taskRow) {\n if (gantt.config.keyboard_navigation_cells) {\n this.moveTo(new gantt.$keyboardNavigation.TaskCell(taskRow, this.index));\n } else {\n this.moveTo(new gantt.$keyboardNavigation.TaskRow(taskRow));\n }\n }\n },\n \"end\": function end() {\n var columns = gantt.getGridColumns();\n this.moveTo(new gantt.$keyboardNavigation.HeaderCell(columns.length - 1));\n },\n \"home\": function home() {\n this.moveTo(new gantt.$keyboardNavigation.HeaderCell(0));\n },\n // press header button\n \"enter, space\": function enterSpace() {\n var node = domHelpers.getActiveElement();\n node.click();\n },\n // add new task\n \"ctrl+enter\": function ctrlEnter() {\n if (gantt.isReadonly(this)) {\n return;\n }\n\n gantt.createTask({}, this.taskId);\n }\n }\n });\n gantt.$keyboardNavigation.HeaderCell.prototype.bindAll(gantt.$keyboardNavigation.HeaderCell.prototype.keys);\n};","module.exports = function (gantt) {\n gantt.$keyboardNavigation.KeyNavNode = function () {};\n\n gantt.$keyboardNavigation.KeyNavNode.prototype = gantt._compose(gantt.$keyboardNavigation.EventHandler, {\n isValid: function isValid() {\n return true;\n },\n fallback: function fallback() {\n return null;\n },\n moveTo: function moveTo(element) {\n gantt.$keyboardNavigation.dispatcher.setActiveNode(element);\n },\n compareTo: function compareTo(b) {\n // good enough comparison of two random objects\n if (!b) return false;\n\n for (var i in this) {\n if (!!this[i] != !!b[i]) return false;\n var canStringifyThis = !!(this[i] && this[i].toString);\n var canStringifyThat = !!(b[i] && b[i].toString);\n if (canStringifyThat != canStringifyThis) return false;\n\n if (!(canStringifyThat && canStringifyThis)) {\n if (b[i] != this[i]) return false;\n } else {\n if (b[i].toString() != this[i].toString()) return false;\n }\n }\n\n return true;\n },\n getNode: function getNode() {},\n focus: function focus() {\n var node = this.getNode();\n if (!node) return;\n var eventFacade = gantt.$keyboardNavigation.facade;\n\n if (eventFacade.callEvent(\"onBeforeFocus\", [node]) === false) {\n return;\n }\n\n if (node) {\n node.setAttribute(\"tabindex\", \"-1\");\n\n if (!node.$eventAttached) {\n node.$eventAttached = true;\n gantt.event(node, \"focus\", function (e) {\n e.preventDefault();\n return false;\n }, false);\n } //node.className += \" gantt_focused\";\n\n\n if (gantt.utils.dom.isChildOf(document.activeElement, node)) {\n node = document.activeElement;\n }\n\n if (node.focus) node.focus();\n eventFacade.callEvent(\"onFocus\", [this.getNode()]);\n }\n },\n blur: function blur() {\n var node = this.getNode();\n\n if (node) {\n var eventFacade = gantt.$keyboardNavigation.facade;\n eventFacade.callEvent(\"onBlur\", [node]);\n node.setAttribute(\"tabindex\", \"-1\"); //node.className = (node.className || \"\").replace(/ ?gantt_focused/g, \"\");\n }\n }\n });\n};","module.exports = function (gantt) {\n gantt.$keyboardNavigation.GanttNode = function () {};\n\n gantt.$keyboardNavigation.GanttNode.prototype = gantt._compose(gantt.$keyboardNavigation.EventHandler, {\n focus: function focus() {\n gantt.focus();\n },\n blur: function blur() {},\n isEnabled: function isEnabled() {\n return gantt.$container.hasAttribute(\"tabindex\");\n },\n scrollHorizontal: function scrollHorizontal(dir) {\n var date = gantt.dateFromPos(gantt.getScrollState().x);\n var scale = gantt.getScale();\n var step = dir < 0 ? -scale.step : scale.step;\n date = gantt.date.add(date, step, scale.unit);\n gantt.scrollTo(gantt.posFromDate(date));\n },\n scrollVertical: function scrollVertical(dir) {\n var top = gantt.getScrollState().y;\n var step = gantt.config.row_height;\n gantt.scrollTo(null, top + (dir < 0 ? -1 : 1) * step);\n },\n keys: {\n \"alt+left\": function altLeft(e) {\n this.scrollHorizontal(-1);\n },\n \"alt+right\": function altRight(e) {\n this.scrollHorizontal(1);\n },\n \"alt+up\": function altUp(e) {\n this.scrollVertical(-1);\n },\n \"alt+down\": function altDown(e) {\n this.scrollVertical(1);\n },\n // undo\n \"ctrl+z\": function ctrlZ() {\n if (gantt.undo) gantt.undo();\n },\n // redo\n \"ctrl+r\": function ctrlR() {\n if (gantt.redo) gantt.redo();\n }\n }\n });\n gantt.$keyboardNavigation.GanttNode.prototype.bindAll(gantt.$keyboardNavigation.GanttNode.prototype.keys);\n};","module.exports = function (gantt) {\n (function () {\n var domHelpers = require(\"../../../core/ui/utils/dom_helpers\");\n\n gantt.$keyboardNavigation.getFocusableNodes = domHelpers.getFocusableNodes;\n\n gantt.$keyboardNavigation.trapFocus = function trapFocus(root, e) {\n if (e.keyCode != 9) return false;\n var focusable = gantt.$keyboardNavigation.getFocusableNodes(root);\n var currentFocus = domHelpers.getActiveElement();\n var currentIndex = -1;\n\n for (var i = 0; i < focusable.length; i++) {\n if (focusable[i] == currentFocus) {\n currentIndex = i;\n break;\n }\n }\n\n if (e.shiftKey) {\n // back tab\n if (currentIndex <= 0) {\n // go to the last element if we focused on the first\n var lastItem = focusable[focusable.length - 1];\n\n if (lastItem) {\n lastItem.focus();\n e.preventDefault();\n return true;\n }\n }\n } else {\n // forward tab\n if (currentIndex >= focusable.length - 1) {\n // forward tab from last element should go back to the first element\n var firstItem = focusable[0];\n\n if (firstItem) {\n firstItem.focus();\n e.preventDefault();\n return true;\n }\n }\n }\n\n return false;\n };\n })();\n};","module.exports = function (gantt) {\n gantt.$keyboardNavigation.EventHandler = {\n _handlers: null,\n findHandler: function findHandler(command) {\n if (!this._handlers) this._handlers = {};\n var shortcuts = gantt.$keyboardNavigation.shortcuts;\n var hash = shortcuts.getHash(command);\n return this._handlers[hash];\n },\n doAction: function doAction(command, e) {\n var handler = this.findHandler(command);\n\n if (handler) {\n var eventFacade = gantt.$keyboardNavigation.facade;\n\n if (eventFacade.callEvent(\"onBeforeAction\", [command, e]) === false) {\n return;\n }\n\n handler.call(this, e);\n if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n }\n },\n bind: function bind(shortcut, handler) {\n if (!this._handlers) this._handlers = {};\n var shortcuts = gantt.$keyboardNavigation.shortcuts;\n var commands = shortcuts.parse(shortcut);\n\n for (var i = 0; i < commands.length; i++) {\n this._handlers[shortcuts.getHash(commands[i])] = handler;\n }\n },\n unbind: function unbind(shortcut) {\n var shortcuts = gantt.$keyboardNavigation.shortcuts;\n var commands = shortcuts.parse(shortcut);\n\n for (var i = 0; i < commands.length; i++) {\n if (this._handlers[shortcuts.getHash(commands[i])]) {\n delete this._handlers[shortcuts.getHash(commands[i])];\n }\n }\n },\n bindAll: function bindAll(map) {\n for (var i in map) {\n this.bind(i, map[i]);\n }\n },\n initKeys: function initKeys() {\n if (!this._handlers) this._handlers = {};\n\n if (this.keys) {\n this.bindAll(this.keys);\n }\n }\n };\n};","module.exports = function (gantt) {\n gantt.$keyboardNavigation.shortcuts = {\n createCommand: function createCommand() {\n return {\n modifiers: {\n \"shift\": false,\n \"alt\": false,\n \"ctrl\": false,\n \"meta\": false\n },\n keyCode: null\n };\n },\n parse: function parse(shortcut) {\n var commands = [];\n var expr = this.getExpressions(this.trim(shortcut));\n\n for (var i = 0; i < expr.length; i++) {\n var words = this.getWords(expr[i]);\n var command = this.createCommand();\n\n for (var j = 0; j < words.length; j++) {\n if (this.commandKeys[words[j]]) {\n command.modifiers[words[j]] = true;\n } else if (this.specialKeys[words[j]]) {\n command.keyCode = this.specialKeys[words[j]];\n } else {\n command.keyCode = words[j].charCodeAt(0);\n }\n }\n\n commands.push(command);\n }\n\n return commands;\n },\n getCommandFromEvent: function getCommandFromEvent(domEvent) {\n var command = this.createCommand();\n command.modifiers.shift = !!domEvent.shiftKey;\n command.modifiers.alt = !!domEvent.altKey;\n command.modifiers.ctrl = !!domEvent.ctrlKey;\n command.modifiers.meta = !!domEvent.metaKey;\n command.keyCode = domEvent.which || domEvent.keyCode;\n\n if (command.keyCode >= 96 && command.keyCode <= 105) {\n // numpad keys 96-105 -> 48-57\n command.keyCode -= 48; //convert numpad number code to regular number code\n }\n\n var printableKey = String.fromCharCode(command.keyCode);\n\n if (printableKey) {\n command.keyCode = printableKey.toLowerCase().charCodeAt(0);\n }\n\n return command;\n },\n getHashFromEvent: function getHashFromEvent(domEvent) {\n return this.getHash(this.getCommandFromEvent(domEvent));\n },\n getHash: function getHash(command) {\n var parts = [];\n\n for (var i in command.modifiers) {\n if (command.modifiers[i]) {\n parts.push(i);\n }\n }\n\n parts.push(command.keyCode);\n return parts.join(this.junctionChar);\n },\n getExpressions: function getExpressions(shortcut) {\n return shortcut.split(this.junctionChar);\n },\n getWords: function getWords(term) {\n return term.split(this.combinationChar);\n },\n trim: function trim(shortcut) {\n return shortcut.replace(/\\s/g, \"\");\n },\n junctionChar: \",\",\n combinationChar: \"+\",\n commandKeys: {\n \"shift\": 16,\n \"alt\": 18,\n \"ctrl\": 17,\n \"meta\": true\n },\n specialKeys: {\n \"backspace\": 8,\n \"tab\": 9,\n \"enter\": 13,\n \"esc\": 27,\n \"space\": 32,\n \"up\": 38,\n \"down\": 40,\n \"left\": 37,\n \"right\": 39,\n \"home\": 36,\n \"end\": 35,\n \"pageup\": 33,\n \"pagedown\": 34,\n \"delete\": 46,\n \"insert\": 45,\n \"plus\": 107,\n \"f1\": 112,\n \"f2\": 113,\n \"f3\": 114,\n \"f4\": 115,\n \"f5\": 116,\n \"f6\": 117,\n \"f7\": 118,\n \"f8\": 119,\n \"f9\": 120,\n \"f10\": 121,\n \"f11\": 122,\n \"f12\": 123\n }\n };\n};","module.exports = function (gantt) {\n var eventable = require(\"../utils/eventable\");\n\n function setupKeyNav(gantt) {\n gantt.config.keyboard_navigation = true;\n gantt.config.keyboard_navigation_cells = false;\n gantt.$keyboardNavigation = {};\n\n gantt._compose = function () {\n var parts = Array.prototype.slice.call(arguments, 0);\n var res = {};\n\n for (var i = 0; i < parts.length; i++) {\n var obj = parts[i];\n\n if (typeof obj == \"function\") {\n obj = new obj();\n }\n\n for (var p in obj) {\n res[p] = obj[p];\n }\n }\n\n return res;\n };\n\n require(\"./keyboard_navigation/common/keyboard_shortcuts\")(gantt);\n\n require(\"./keyboard_navigation/common/eventhandler\")(gantt);\n\n require(\"./keyboard_navigation/common/trap_modal_focus\")(gantt);\n\n require(\"./keyboard_navigation/elements/gantt_node\")(gantt);\n\n require(\"./keyboard_navigation/elements/nav_node\")(gantt);\n\n require(\"./keyboard_navigation/elements/header_cell\")(gantt);\n\n require(\"./keyboard_navigation/elements/task_row\")(gantt);\n\n require(\"./keyboard_navigation/elements/task_cell\")(gantt);\n\n require(\"./keyboard_navigation/modals\")(gantt);\n\n require(\"./keyboard_navigation/core\")(gantt);\n\n var domHelpers = require(\"../core/ui/utils/dom_helpers\");\n\n (function () {\n var dispatcher = gantt.$keyboardNavigation.dispatcher;\n\n dispatcher.isTaskFocused = function (id) {\n var node = dispatcher.activeNode;\n\n if (node instanceof gantt.$keyboardNavigation.TaskRow || node instanceof gantt.$keyboardNavigation.TaskCell) {\n if (node.taskId == id) {\n return true;\n }\n }\n\n return false;\n };\n\n var keyDownHandler = function keyDownHandler(e) {\n if (!gantt.config.keyboard_navigation) return; // GS-734 & GS-1078: we don't need keyboard navigation inside inline editors\n\n if (!gantt.config.keyboard_navigation_cells && isInlineEditorCell(e)) return;\n\n if (isNoKeyboardNavigationElement(e) || isLightboxElement(e)) {\n return;\n }\n\n return dispatcher.keyDownHandler(e);\n };\n\n var focusHandler = function focusHandler(e) {\n if (dispatcher.$preventDefault) {\n e.preventDefault();\n gantt.$container.blur();\n return false; // do nothing if key-nav focus is already planned\n } else if (!dispatcher.awaitsFocus()) {\n // otherwise - re-focus key-nav element on gantt focus\n dispatcher.focusGlobalNode();\n }\n };\n\n var reFocusActiveNode = function reFocusActiveNode() {\n if (!dispatcher.isEnabled()) return;\n var outsideGantt = !domHelpers.isChildOf(document.activeElement, gantt.$container) && document.activeElement.localName != \"body\";\n var activeNode = dispatcher.getActiveNode();\n if (!activeNode || outsideGantt) return;\n var domElement = activeNode.getNode();\n var top, left;\n\n if (domElement && domElement.parentNode) {\n top = domElement.parentNode.scrollTop;\n left = domElement.parentNode.scrollLeft;\n }\n\n activeNode.focus(true);\n\n if (domElement && domElement.parentNode) {\n domElement.parentNode.scrollTop = top;\n domElement.parentNode.scrollLeft = left;\n }\n };\n\n gantt.attachEvent(\"onDataRender\", function () {\n if (!gantt.config.keyboard_navigation) return;\n reFocusActiveNode();\n });\n gantt.attachEvent(\"onGanttRender\", function () {\n gantt.eventRemove(gantt.$root, \"keydown\", keyDownHandler);\n gantt.eventRemove(gantt.$container, \"focus\", focusHandler);\n gantt.eventRemove(gantt.$container, \"mousedown\", mousedownHandler);\n\n if (gantt.config.keyboard_navigation) {\n gantt.event(gantt.$root, \"keydown\", keyDownHandler);\n gantt.event(gantt.$container, \"focus\", focusHandler);\n gantt.event(gantt.$container, \"mousedown\", mousedownHandler);\n gantt.$container.setAttribute(\"tabindex\", \"0\");\n } else {\n gantt.$container.removeAttribute(\"tabindex\");\n }\n });\n\n function getTaskNodeConstructor() {\n if (gantt.config.keyboard_navigation_cells) {\n return gantt.$keyboardNavigation.TaskCell;\n } else {\n return gantt.$keyboardNavigation.TaskRow;\n }\n }\n\n function isInlineEditorCell(e) {\n return !!domHelpers.closest(e.target, \".gantt_grid_editor_placeholder\");\n } // GS-1445. Cancel keyboard navigation within custom elements\n\n\n function isNoKeyboardNavigationElement(e) {\n return !!domHelpers.closest(e.target, \".no_keyboard_navigation\");\n }\n\n function isLightboxElement(e) {\n return !!domHelpers.closest(e.target, \".gantt_cal_light\");\n }\n\n function mousedownHandler(e) {\n if (!gantt.config.keyboard_navigation) return true; // GS-734 & GS-1078: we don't need keyboard navigation inside inline editors\n\n if (!gantt.config.keyboard_navigation_cells && isInlineEditorCell(e)) return true;\n\n if (isNoKeyboardNavigationElement(e)) {\n return;\n }\n\n var focusNode;\n var locateTask = dispatcher.fromDomElement(e);\n\n if (locateTask) {\n //var node = getTaskNodeConstructor();\n if (dispatcher.activeNode instanceof gantt.$keyboardNavigation.TaskCell && domHelpers.isChildOf(e.target, gantt.$task)) {\n locateTask = new gantt.$keyboardNavigation.TaskCell(locateTask.taskId, dispatcher.activeNode.columnIndex);\n }\n\n focusNode = locateTask;\n }\n\n if (focusNode) {\n if (!dispatcher.isEnabled()) {\n dispatcher.activeNode = focusNode;\n } else {\n dispatcher.delay(function () {\n dispatcher.setActiveNode(focusNode);\n });\n }\n } else {\n // empty click should drop focus from gantt, insert of reselecting default node\n dispatcher.$preventDefault = true;\n setTimeout(function () {\n dispatcher.$preventDefault = false;\n }, 300);\n }\n }\n\n var onReady = gantt.attachEvent(\"onGanttReady\", function () {\n // restore focus on repainted tasks\n gantt.detachEvent(onReady);\n gantt.$data.tasksStore.attachEvent(\"onStoreUpdated\", function (id) {\n if (gantt.config.keyboard_navigation && dispatcher.isEnabled()) {\n var currentNode = dispatcher.getActiveNode();\n\n if (currentNode && currentNode.taskId == id) {\n reFocusActiveNode();\n }\n }\n });\n\n if (gantt._smart_render) {\n var updateRender = gantt._smart_render._redrawTasks;\n\n gantt._smart_render._redrawTasks = function (renderers, items) {\n if (gantt.config.keyboard_navigation && dispatcher.isEnabled()) {\n var currentNode = dispatcher.getActiveNode();\n\n if (currentNode && currentNode.taskId !== undefined) {\n var focusedItemVisible = false;\n\n for (var i = 0; i < items.length; i++) {\n if (items[i].id == currentNode.taskId && items[i].start_date) {\n focusedItemVisible = true;\n break;\n }\n }\n\n if (!focusedItemVisible) {\n items.push(gantt.getTask(currentNode.taskId));\n }\n }\n }\n\n var res = updateRender.apply(this, arguments);\n return res;\n };\n }\n });\n var createdTaskId = null;\n var keepFocusOnNewTask = false;\n gantt.attachEvent(\"onTaskCreated\", function (task) {\n createdTaskId = task.id;\n return true;\n });\n gantt.attachEvent(\"onAfterTaskAdd\", function (id, item) {\n if (!gantt.config.keyboard_navigation) return true;\n\n if (dispatcher.isEnabled()) {\n // GS-1394. After adding a new task, the focus shouldn't change to the placeholder task\n if (id == createdTaskId) {\n keepFocusOnNewTask = true;\n setTimeout(function () {\n keepFocusOnNewTask = false;\n createdTaskId = null;\n });\n }\n\n if (keepFocusOnNewTask && item.type == gantt.config.types.placeholder) {\n return;\n }\n\n var columnIndex = 0;\n var node = dispatcher.activeNode;\n\n if (node instanceof gantt.$keyboardNavigation.TaskCell) {\n columnIndex = node.columnIndex;\n }\n\n var nodeConstructor = getTaskNodeConstructor();\n\n if (item.type == gantt.config.types.placeholder && gantt.config.placeholder_task.focusOnCreate === false) {// do not focus on the placeholder task\n } else {\n dispatcher.setActiveNode(new nodeConstructor(id, columnIndex));\n }\n }\n });\n gantt.attachEvent(\"onTaskIdChange\", function (oldId, newId) {\n if (!gantt.config.keyboard_navigation) return true;\n var node = dispatcher.activeNode;\n\n if (dispatcher.isTaskFocused(oldId)) {\n node.taskId = newId;\n }\n\n return true;\n });\n var interval = setInterval(function () {\n if (!gantt.config.keyboard_navigation) return;\n\n if (!dispatcher.isEnabled()) {\n dispatcher.enable();\n }\n\n return;\n }, 500);\n gantt.attachEvent(\"onDestroy\", function () {\n clearInterval(interval);\n });\n\n function getScopeName(obj) {\n if (obj instanceof gantt.$keyboardNavigation.GanttNode) {\n return \"gantt\";\n } else if (obj instanceof gantt.$keyboardNavigation.HeaderCell) {\n return \"headerCell\";\n } else if (obj instanceof gantt.$keyboardNavigation.TaskRow) {\n return \"taskRow\";\n } else if (obj instanceof gantt.$keyboardNavigation.TaskCell) {\n return \"taskCell\";\n }\n\n return null;\n }\n\n function getScope(mode) {\n var scopes = {\n \"gantt\": gantt.$keyboardNavigation.GanttNode,\n \"headerCell\": gantt.$keyboardNavigation.HeaderCell,\n \"taskRow\": gantt.$keyboardNavigation.TaskRow,\n \"taskCell\": gantt.$keyboardNavigation.TaskCell\n };\n return scopes[mode] || scopes.gantt;\n }\n\n function findVisibleColumnIndex(columnName) {\n var columns = gantt.getGridColumns();\n\n for (var i = 0; i < columns.length; i++) {\n if (columns[i].name == columnName) {\n return i;\n }\n }\n\n return 0;\n }\n\n var keyNavFacade = {};\n eventable(keyNavFacade);\n gantt.mixin(keyNavFacade, {\n addShortcut: function addShortcut(shortcut, handler, scope) {\n var scopeObject = getScope(scope);\n\n if (scopeObject) {\n scopeObject.prototype.bind(shortcut, handler);\n }\n },\n getShortcutHandler: function getShortcutHandler(shortcut, scope) {\n var commands = gantt.$keyboardNavigation.shortcuts.parse(shortcut);\n\n if (commands.length) {\n return keyNavFacade.getCommandHandler(commands[0], scope);\n }\n },\n getCommandHandler: function getCommandHandler(command, scope) {\n var scopeObject = getScope(scope);\n\n if (scopeObject) {\n if (command) {\n return scopeObject.prototype.findHandler(command);\n }\n }\n },\n removeShortcut: function removeShortcut(shortcut, scope) {\n var scopeObject = getScope(scope);\n\n if (scopeObject) {\n scopeObject.prototype.unbind(shortcut);\n }\n },\n focus: function focus(config) {\n var type = config ? config.type : null;\n var constructor = getScope(type);\n var node;\n\n switch (type) {\n case \"taskCell\":\n node = new constructor(config.id, findVisibleColumnIndex(config.column));\n break;\n\n case \"taskRow\":\n node = new constructor(config.id);\n break;\n\n case \"headerCell\":\n node = new constructor(findVisibleColumnIndex(config.column));\n break;\n\n default:\n break;\n }\n\n dispatcher.delay(function () {\n if (node) {\n dispatcher.setActiveNode(node);\n } else {\n dispatcher.enable();\n\n if (!dispatcher.getActiveNode()) {\n dispatcher.setDefaultNode();\n } else {\n if (!dispatcher.awaitsFocus()) {\n dispatcher.enable();\n }\n }\n }\n });\n },\n getActiveNode: function getActiveNode() {\n if (dispatcher.isEnabled()) {\n var node = dispatcher.getActiveNode();\n var scope = getScopeName(node);\n var columns = gantt.getGridColumns();\n\n switch (scope) {\n case \"taskCell\":\n return {\n type: \"taskCell\",\n id: node.taskId,\n column: columns[node.columnIndex].name\n };\n\n case \"taskRow\":\n return {\n type: \"taskRow\",\n id: node.taskId\n };\n\n case \"headerCell\":\n return {\n type: \"headerCell\",\n column: columns[node.index].name\n };\n }\n }\n\n return null;\n }\n });\n gantt.$keyboardNavigation.facade = keyNavFacade;\n gantt.ext.keyboardNavigation = keyNavFacade;\n\n gantt.focus = function () {\n keyNavFacade.focus();\n };\n\n gantt.addShortcut = keyNavFacade.addShortcut;\n gantt.getShortcutHandler = keyNavFacade.getShortcutHandler;\n gantt.removeShortcut = keyNavFacade.removeShortcut;\n })();\n }\n\n setupKeyNav(gantt);\n};","export default function(gantt: any){\r\n\r\ninterface IBody extends HTMLElement {\r\n\tmsRequestFullscreen?: () => void;\r\n\tmozRequestFullScreen?: () => void;\r\n\twebkitRequestFullscreen?: (ALLOW_KEYBOARD_INPUT: any) => void;\r\n}\r\n\r\n\r\ninterface IConsole extends Console {\r\n\twarning?: (str: string) => void;\r\n}\r\n\r\ninterface IDocument extends Document {\r\n\tfullscreenElement: Element;\r\n\tmozFullScreenElement?: Element;\r\n\twebkitFullscreenElement?: Element;\r\n\tmsFullscreenElement?: Element;\r\n\twebkitFullscreenEnabled?: boolean;\r\n\tmozFullScreenEnabled?: boolean;\r\n\tmsFullscreenEnabled?: boolean;\r\n\tmsExitFullscreen?: () => void;\r\n\tmozCancelFullScreen?: () => void;\r\n\twebkitExitFullscreen?: () => void;\r\n}\r\n\r\ninterface IElement extends Element {\r\n\tALLOW_KEYBOARD_INPUT?: boolean;\r\n}\r\n\r\ninterface IElementSizes extends ISizes {\r\n\tmodified: boolean;\r\n}\r\n\r\ninterface ISizes {\r\n\twidth: null | string;\r\n\theight: null | string;\r\n\ttop: null | string;\r\n\tleft: null | string;\r\n\tposition: null | string;\r\n\tzIndex: null | number;\r\n}\r\n\r\nfunction isExpanded() {\r\n\tconst element = ((document as IDocument).fullscreenElement ||\r\n\t\t(document as IDocument).mozFullScreenElement ||\r\n\t\t(document as IDocument).webkitFullscreenElement ||\r\n\t\t(document as IDocument).msFullscreenElement);\r\n\treturn !!(element && element === document.body);\r\n}\r\n\r\nfunction isFullscreenAvailable() {\r\n\ttry {\r\n\t\treturn (document as IDocument).fullscreenEnabled ||\r\n\t\t\t(document as IDocument).webkitFullscreenEnabled ||\r\n\t\t\t(document as IDocument).mozFullScreenEnabled ||\r\n\t\t\t(document as IDocument).msFullscreenEnabled;\r\n\t} catch (e) {\r\n\t\tconsole.error(\"Fullscreen is not available:\", e); // tslint:disable-line:no-console\r\n\t}\r\n}\r\n\r\nconst state = gantt.$services.getService(\"state\");\r\nstate.registerProvider(\"fullscreen\", () => {\r\n\tif (isFullscreenAvailable()){\r\n\t\treturn { fullscreen: isExpanded() };\r\n\t} else {\r\n\t\treturn undefined;\r\n\t}\r\n});\r\n\r\nlet backupBodyPadding = {\r\n\toverflow: null,\r\n\tpadding: null,\r\n\tpaddingTop: null,\r\n\tpaddingRight: null,\r\n\tpaddingBottom: null,\r\n\tpaddingLeft: null\r\n};\r\n\r\nconst backupElementSizes: IElementSizes = {\r\n\twidth: null,\r\n\theight: null,\r\n\ttop: null,\r\n\tleft: null,\r\n\tposition: null,\r\n\tzIndex: null,\r\n\tmodified: false\r\n};\r\n\r\nlet backupPositioning = null;\r\nfunction resetParentPositioning(root){\r\n\tlet parent = root.parentNode;\r\n\tconst positions = [];\r\n\twhile(parent && parent.style){\r\n\t\tpositions.push({\r\n\t\t\telement: parent,\r\n\t\t\toriginalPositioning: parent.style.position\r\n\t\t});\r\n\t\tparent.style.position = \"static\";\r\n\t\tparent = parent.parentNode;\r\n\t}\r\n\treturn positions;\r\n}\r\n\r\nfunction restoreParentPositioning(positions: any[]){\r\n\tpositions.forEach(record => {\r\n\t\trecord.element.style.position = record.originalPositioning;\r\n\t});\r\n}\r\n\r\n// expand gantt root element to fullscreen automatically\r\nfunction setFullScreenSizes() {\r\n\tconst root = gantt.ext.fullscreen.getFullscreenElement();\r\n\tconst body = document.body;\r\n\tupdateSizes(root.style, backupElementSizes);\r\n\tbackupBodyPadding = {\r\n\t\toverflow: body.style.overflow,\r\n\t\tpadding: body.style.padding ? body.style.padding : null,\r\n\t\tpaddingTop: body.style.paddingTop ? body.style.paddingTop : null,\r\n\t\tpaddingRight: body.style.paddingRight ? body.style.paddingRight : null,\r\n\t\tpaddingBottom: body.style.paddingBottom ? body.style.paddingBottom : null,\r\n\t\tpaddingLeft: body.style.paddingLeft ? body.style.paddingLeft : null\r\n\t};\r\n\r\n\tif (body.style.padding) {\r\n\t\tbody.style.padding = \"0\";\r\n\t}\r\n\tif (body.style.paddingTop) {\r\n\t\tbody.style.paddingTop = \"0\";\r\n\t}\r\n\tif (body.style.paddingRight) {\r\n\t\tbody.style.paddingRight = \"0\";\r\n\t}\r\n\tif (body.style.paddingBottom) {\r\n\t\tbody.style.paddingBottom = \"0\";\r\n\t}\r\n\tif (body.style.paddingLeft) {\r\n\t\tbody.style.paddingLeft = \"0\";\r\n\t}\r\n\r\n\tbody.style.overflow = \"hidden\";\r\n\r\n\troot.style.width = \"100vw\";\r\n\troot.style.height = \"100vh\";\r\n\troot.style.top = \"0px\";\r\n\troot.style.left = \"0px\";\r\n\troot.style.position = \"absolute\";\r\n\troot.style.zIndex = 1;\r\n\tbackupElementSizes.modified = true;\r\n\tbackupPositioning = resetParentPositioning(root);\r\n}\r\n\r\nfunction restoreSizes() {\r\n\tconst root = gantt.ext.fullscreen.getFullscreenElement();\r\n\tconst body = document.body;\r\n\tif (backupElementSizes.modified) {\r\n\t\tif (backupBodyPadding.padding) {\r\n\t\t\tbody.style.padding = backupBodyPadding.padding;\r\n\t\t}\r\n\t\tif (backupBodyPadding.paddingTop) {\r\n\t\t\tbody.style.paddingTop = backupBodyPadding.paddingTop;\r\n\t\t}\r\n\t\tif (backupBodyPadding.paddingRight) {\r\n\t\t\tbody.style.paddingRight = backupBodyPadding.paddingRight;\r\n\t\t}\r\n\t\tif (backupBodyPadding.paddingBottom) {\r\n\t\t\tbody.style.paddingBottom = backupBodyPadding.paddingBottom;\r\n\t\t}\r\n\t\tif (backupBodyPadding.paddingLeft) {\r\n\t\t\tbody.style.paddingLeft = backupBodyPadding.paddingLeft;\r\n\t\t}\r\n\r\n\t\tbody.style.overflow = backupBodyPadding.overflow;\r\n\t\tbackupBodyPadding = {\r\n\t\t\toverflow: null,\r\n\t\t\tpadding: null,\r\n\t\t\tpaddingTop: null,\r\n\t\t\tpaddingRight: null,\r\n\t\t\tpaddingBottom: null,\r\n\t\t\tpaddingLeft: null\r\n\t\t};\r\n\t\tupdateSizes(backupElementSizes, root.style);\r\n\t\tbackupElementSizes.modified = false;\r\n\t}\r\n\trestoreParentPositioning(backupPositioning);\r\n\tbackupPositioning = null;\r\n}\r\n\r\nfunction updateSizes(source: ISizes, target: ISizes) {\r\n\ttarget.width = source.width;\r\n\ttarget.height = source.height;\r\n\ttarget.top = source.top;\r\n\ttarget.left = source.left;\r\n\ttarget.position = source.position;\r\n\ttarget.zIndex = source.zIndex;\r\n}\r\n\r\nfunction addDOMEvents() {\r\n\tgantt.event(document, \"webkitfullscreenchange\", onFullScreenChange);\r\n\tgantt.event(document, \"mozfullscreenchange\", onFullScreenChange);\r\n\tgantt.event(document, \"MSFullscreenChange\", onFullScreenChange);\r\n\t// For IE on Win 10\r\n\tgantt.event(document, \"fullscreenChange\", onFullScreenChange);\r\n\tgantt.event(document, \"fullscreenchange\", onFullScreenChange);\r\n}\r\n\r\nlet expandGantt = false;\r\nfunction onFullScreenChange() {\r\n\tif (!gantt.$container) {\r\n\t\t// do nothing if gantt is not yet initialized\r\n\t\treturn;\r\n\t}\r\n\tlet event: \"onExpand\" | \"onCollapse\";\r\n\tconst isBodyExpanded = isExpanded();\r\n\r\n\tif (isBodyExpanded) {\r\n\t\tif (expandGantt) {\r\n\t\t\tevent = \"onExpand\";\r\n\t\t\tsetFullScreenSizes();\r\n\t\t}\r\n\t} else if (expandGantt) {\r\n\t\texpandGantt = false;\r\n\t\tevent = \"onCollapse\";\r\n\t\trestoreSizes();\r\n\t}\r\n\tsetTimeout(() => {\r\n\t\tgantt.render();\r\n\t});\r\n\tsetTimeout(() => {\r\n\t\tgantt.callEvent(event, [gantt.ext.fullscreen.getFullscreenElement()]);\r\n\t});\r\n}\r\n\r\nfunction cantFullscreen() {\r\n\tif (!gantt.$container) { // check is gantt initialized or not\r\n\t\treturn true;\r\n\t}\r\n\tif (!gantt.ext.fullscreen.getFullscreenElement()) {\r\n\t\treturn true;\r\n\t}\r\n\tif (!isFullscreenAvailable()) {\r\n\t\t// tslint:disable-next-line: no-console\r\n\t\tconst method = (console as IConsole).warning || console.log;\r\n\t\tmethod(\"The `fullscreen` feature not being allowed, or full-screen mode not being supported\");\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\ngantt.ext.fullscreen = {\r\n\texpand(): void {\r\n\t\tif (cantFullscreen()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (isExpanded()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!gantt.callEvent(\"onBeforeExpand\", [this.getFullscreenElement()])) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\texpandGantt = true;\r\n\r\n\t\t// we switch body to fullscreen and then expand fullscreen element to viewport\r\n\t\t// we do it to correct display common elements: lightboxes, tooltip etc.\r\n\t\tconst element = document.body as IBody;\r\n\t\tconst requestArguments = element.webkitRequestFullscreen ?\r\n\t\t\t[(Element as unknown as IElement).ALLOW_KEYBOARD_INPUT] : [];\r\n\r\n\t\tconst requestFullscreen = element.msRequestFullscreen ||\r\n\t\t\telement.mozRequestFullScreen ||\r\n\t\t\telement.webkitRequestFullscreen ||\r\n\t\t\telement.requestFullscreen;\r\n\r\n\t\tif (requestFullscreen) {\r\n\t\t\trequestFullscreen.apply(element, requestArguments);\r\n\t\t}\r\n\t},\r\n\tcollapse(): void {\r\n\t\tif (cantFullscreen()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!isExpanded()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!gantt.callEvent(\"onBeforeCollapse\", [this.getFullscreenElement()])) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst requestExitFullscreen = (document as IDocument).msExitFullscreen ||\r\n\t\t\t(document as IDocument).mozCancelFullScreen ||\r\n\t\t\t(document as IDocument).webkitExitFullscreen ||\r\n\t\t\t(document as IDocument).exitFullscreen;\r\n\r\n\t\tif (requestExitFullscreen) {\r\n\t\t\trequestExitFullscreen.apply(document);\r\n\t\t}\r\n\t},\r\n\ttoggle(): void {\r\n\t\tif (cantFullscreen()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!isExpanded()) {\r\n\t\t\tthis.expand();\r\n\t\t} else {\r\n\t\t\tthis.collapse();\r\n\t\t}\r\n\r\n\t},\r\n\tgetFullscreenElement(): HTMLElement {\r\n\t\treturn gantt.$root;\r\n\t},\r\n};\r\n\r\ngantt.expand = function() {\r\n\tgantt.ext.fullscreen.expand();\r\n};\r\n\r\ngantt.collapse = function(){\r\n\tgantt.ext.fullscreen.collapse();\r\n};\r\n\r\ngantt.attachEvent(\"onGanttReady\", addDOMEvents);\r\n\r\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict';\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar stringifyPrimitive = function stringifyPrimitive(v) {\n switch (_typeof(v)) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function (obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n\n if (obj === null) {\n obj = undefined;\n }\n\n if (_typeof(obj) === 'object') {\n return map(objectKeys(obj), function (k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n\n if (isArray(obj[k])) {\n return map(obj[k], function (v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map(xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n\n return res;\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict'; // If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function (qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n var maxKeys = 1000;\n\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length; // maxKeys <= 0 means that we should not limit keys count\n\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr,\n vstr,\n k,\n v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');","'use strict';\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nmodule.exports = {\n isString: function isString(arg) {\n return typeof arg === 'string';\n },\n isObject: function isObject(arg) {\n return _typeof(arg) === 'object' && arg !== null;\n },\n isNull: function isNull(arg) {\n return arg === null;\n },\n isNullOrUndefined: function isNullOrUndefined(arg) {\n return arg == null;\n }\n};","module.exports = function (module) {\n if (!module.webpackPolyfill) {\n module.deprecate = function () {};\n\n module.paths = []; // module.parent = undefined by default\n\n if (!module.children) module.children = [];\n Object.defineProperty(module, \"loaded\", {\n enumerable: true,\n get: function get() {\n return module.l;\n }\n });\n Object.defineProperty(module, \"id\", {\n enumerable: true,\n get: function get() {\n return module.i;\n }\n });\n module.webpackPolyfill = 1;\n }\n\n return module;\n};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*! https://mths.be/punycode v1.4.1 by @mathias */\n;\n\n(function (root) {\n /** Detect free variables */\n var freeExports = (typeof exports === \"undefined\" ? \"undefined\" : _typeof(exports)) == 'object' && exports && !exports.nodeType && exports;\n var freeModule = (typeof module === \"undefined\" ? \"undefined\" : _typeof(module)) == 'object' && module && !module.nodeType && module;\n var freeGlobal = (typeof global === \"undefined\" ? \"undefined\" : _typeof(global)) == 'object' && global;\n\n if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) {\n root = freeGlobal;\n }\n /**\n * The `punycode` object.\n * @name punycode\n * @type Object\n */\n\n\n var punycode,\n\n /** Highest positive signed 32-bit float value */\n maxInt = 2147483647,\n // aka. 0x7FFFFFFF or 2^31-1\n\n /** Bootstring parameters */\n base = 36,\n tMin = 1,\n tMax = 26,\n skew = 38,\n damp = 700,\n initialBias = 72,\n initialN = 128,\n // 0x80\n delimiter = '-',\n // '\\x2D'\n\n /** Regular expressions */\n regexPunycode = /^xn--/,\n regexNonASCII = /[^\\x20-\\x7E]/,\n // unprintable ASCII chars + non-ASCII chars\n regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g,\n // RFC 3490 separators\n\n /** Error messages */\n errors = {\n 'overflow': 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input'\n },\n\n /** Convenience shortcuts */\n baseMinusTMin = base - tMin,\n floor = Math.floor,\n stringFromCharCode = String.fromCharCode,\n\n /** Temporary variable */\n key;\n /*--------------------------------------------------------------------------*/\n\n /**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\n\n function error(type) {\n throw new RangeError(errors[type]);\n }\n /**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\n\n\n function map(array, fn) {\n var length = array.length;\n var result = [];\n\n while (length--) {\n result[length] = fn(array[length]);\n }\n\n return result;\n }\n /**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\n\n\n function mapDomain(string, fn) {\n var parts = string.split('@');\n var result = '';\n\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@';\n string = parts[1];\n } // Avoid `split(regex)` for IE8 compatibility. See #17.\n\n\n string = string.replace(regexSeparators, '\\x2E');\n var labels = string.split('.');\n var encoded = map(labels, fn).join('.');\n return result + encoded;\n }\n /**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\n\n\n function ucs2decode(string) {\n var output = [],\n counter = 0,\n length = string.length,\n value,\n extra;\n\n while (counter < length) {\n value = string.charCodeAt(counter++);\n\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // high surrogate, and there is a next character\n extra = string.charCodeAt(counter++);\n\n if ((extra & 0xFC00) == 0xDC00) {\n // low surrogate\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // unmatched surrogate; only append this code unit, in case the next\n // code unit is the high surrogate of a surrogate pair\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n\n return output;\n }\n /**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\n\n\n function ucs2encode(array) {\n return map(array, function (value) {\n var output = '';\n\n if (value > 0xFFFF) {\n value -= 0x10000;\n output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n value = 0xDC00 | value & 0x3FF;\n }\n\n output += stringFromCharCode(value);\n return output;\n }).join('');\n }\n /**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\n\n\n function basicToDigit(codePoint) {\n if (codePoint - 48 < 10) {\n return codePoint - 22;\n }\n\n if (codePoint - 65 < 26) {\n return codePoint - 65;\n }\n\n if (codePoint - 97 < 26) {\n return codePoint - 97;\n }\n\n return base;\n }\n /**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\n\n\n function digitToBasic(digit, flag) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n }\n /**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\n\n\n function adapt(delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n\n for (;\n /* no initialization */\n delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n }\n /**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\n\n\n function decode(input) {\n // Don't use UCS-2\n var output = [],\n inputLength = input.length,\n out,\n i = 0,\n n = initialN,\n bias = initialBias,\n basic,\n j,\n index,\n oldi,\n w,\n k,\n digit,\n t,\n\n /** Cached calculation results */\n baseMinusT; // Handle the basic code points: let `basic` be the number of input code\n // points before the last delimiter, or `0` if there is none, then copy\n // the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n\n if (basic < 0) {\n basic = 0;\n }\n\n for (j = 0; j < basic; ++j) {\n // if it's not a basic code point\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic');\n }\n\n output.push(input.charCodeAt(j));\n } // Main decoding loop: start just after the last delimiter if any basic code\n // points were copied; start at the beginning otherwise.\n\n\n for (index = basic > 0 ? basic + 1 : 0; index < inputLength;)\n /* no final expression */\n {\n // `index` is the index of the next character to be consumed.\n // Decode a generalized variable-length integer into `delta`,\n // which gets added to `i`. The overflow checking is easier\n // if we increase `i` as we go, then subtract off its starting\n // value at the end to obtain `delta`.\n for (oldi = i, w = 1, k = base;;\n /* no condition */\n k += base) {\n if (index >= inputLength) {\n error('invalid-input');\n }\n\n digit = basicToDigit(input.charCodeAt(index++));\n\n if (digit >= base || digit > floor((maxInt - i) / w)) {\n error('overflow');\n }\n\n i += digit * w;\n t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n if (digit < t) {\n break;\n }\n\n baseMinusT = base - t;\n\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow');\n }\n\n w *= baseMinusT;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi == 0); // `i` was supposed to wrap around from `out` to `0`,\n // incrementing `n` each time, so we'll fix that now:\n\n if (floor(i / out) > maxInt - n) {\n error('overflow');\n }\n\n n += floor(i / out);\n i %= out; // Insert `n` at position `i` of the output\n\n output.splice(i++, 0, n);\n }\n\n return ucs2encode(output);\n }\n /**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\n\n\n function encode(input) {\n var n,\n delta,\n handledCPCount,\n basicLength,\n bias,\n j,\n m,\n q,\n k,\n t,\n currentValue,\n output = [],\n\n /** `inputLength` will hold the number of code points in `input`. */\n inputLength,\n\n /** Cached calculation results */\n handledCPCountPlusOne,\n baseMinusT,\n qMinusT; // Convert the input in UCS-2 to Unicode\n\n input = ucs2decode(input); // Cache the length\n\n inputLength = input.length; // Initialize the state\n\n n = initialN;\n delta = 0;\n bias = initialBias; // Handle the basic code points\n\n for (j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n handledCPCount = basicLength = output.length; // `handledCPCount` is the number of code points that have been handled;\n // `basicLength` is the number of basic code points.\n // Finish the basic string - if it is not empty - with a delimiter\n\n if (basicLength) {\n output.push(delimiter);\n } // Main encoding loop:\n\n\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next\n // larger one:\n for (m = maxInt, j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n } // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n // but guard against overflow\n\n\n handledCPCountPlusOne = handledCPCount + 1;\n\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow');\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (j = 0; j < inputLength; ++j) {\n currentValue = input[j];\n\n if (currentValue < n && ++delta > maxInt) {\n error('overflow');\n }\n\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer\n for (q = delta, k = base;;\n /* no condition */\n k += base) {\n t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n if (q < t) {\n break;\n }\n\n qMinusT = q - t;\n baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n\n return output.join('');\n }\n /**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\n\n\n function toUnicode(input) {\n return mapDomain(input, function (string) {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n });\n }\n /**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\n\n\n function toASCII(input) {\n return mapDomain(input, function (string) {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n });\n }\n /*--------------------------------------------------------------------------*/\n\n /** Define the public API */\n\n\n punycode = {\n /**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n 'version': '1.4.1',\n\n /**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode\n * @type Object\n */\n 'ucs2': {\n 'decode': ucs2decode,\n 'encode': ucs2encode\n },\n 'decode': decode,\n 'encode': encode,\n 'toASCII': toASCII,\n 'toUnicode': toUnicode\n };\n /** Expose `punycode` */\n // Some AMD build optimizers, like r.js, check for specific condition patterns\n // like the following:\n\n if (typeof define == 'function' && _typeof(define.amd) == 'object' && define.amd) {\n define('punycode', function () {\n return punycode;\n });\n } else if (freeExports && freeModule) {\n if (module.exports == freeExports) {\n // in Node.js, io.js, or RingoJS v0.8.0+\n freeModule.exports = punycode;\n } else {\n // in Narwhal or RingoJS v0.7.0-\n for (key in punycode) {\n punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n }\n }\n } else {\n // in Rhino or a web browser\n root.punycode = punycode;\n }\n})(this);","module.exports = {\n \"100\": \"Continue\",\n \"101\": \"Switching Protocols\",\n \"102\": \"Processing\",\n \"200\": \"OK\",\n \"201\": \"Created\",\n \"202\": \"Accepted\",\n \"203\": \"Non-Authoritative Information\",\n \"204\": \"No Content\",\n \"205\": \"Reset Content\",\n \"206\": \"Partial Content\",\n \"207\": \"Multi-Status\",\n \"208\": \"Already Reported\",\n \"226\": \"IM Used\",\n \"300\": \"Multiple Choices\",\n \"301\": \"Moved Permanently\",\n \"302\": \"Found\",\n \"303\": \"See Other\",\n \"304\": \"Not Modified\",\n \"305\": \"Use Proxy\",\n \"307\": \"Temporary Redirect\",\n \"308\": \"Permanent Redirect\",\n \"400\": \"Bad Request\",\n \"401\": \"Unauthorized\",\n \"402\": \"Payment Required\",\n \"403\": \"Forbidden\",\n \"404\": \"Not Found\",\n \"405\": \"Method Not Allowed\",\n \"406\": \"Not Acceptable\",\n \"407\": \"Proxy Authentication Required\",\n \"408\": \"Request Timeout\",\n \"409\": \"Conflict\",\n \"410\": \"Gone\",\n \"411\": \"Length Required\",\n \"412\": \"Precondition Failed\",\n \"413\": \"Payload Too Large\",\n \"414\": \"URI Too Long\",\n \"415\": \"Unsupported Media Type\",\n \"416\": \"Range Not Satisfiable\",\n \"417\": \"Expectation Failed\",\n \"418\": \"I'm a teapot\",\n \"421\": \"Misdirected Request\",\n \"422\": \"Unprocessable Entity\",\n \"423\": \"Locked\",\n \"424\": \"Failed Dependency\",\n \"425\": \"Unordered Collection\",\n \"426\": \"Upgrade Required\",\n \"428\": \"Precondition Required\",\n \"429\": \"Too Many Requests\",\n \"431\": \"Request Header Fields Too Large\",\n \"451\": \"Unavailable For Legal Reasons\",\n \"500\": \"Internal Server Error\",\n \"501\": \"Not Implemented\",\n \"502\": \"Bad Gateway\",\n \"503\": \"Service Unavailable\",\n \"504\": \"Gateway Timeout\",\n \"505\": \"HTTP Version Not Supported\",\n \"506\": \"Variant Also Negotiates\",\n \"507\": \"Insufficient Storage\",\n \"508\": \"Loop Detected\",\n \"509\": \"Bandwidth Limit Exceeded\",\n \"510\": \"Not Extended\",\n \"511\": \"Network Authentication Required\"\n};","module.exports = extend;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {};\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n}","var Buffer = require('buffer').Buffer;\n\nmodule.exports = function (buf) {\n // If the buffer is backed by a Uint8Array, a faster version will work\n if (buf instanceof Uint8Array) {\n // If the buffer isn't a subarray, return the underlying ArrayBuffer\n if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {\n return buf.buffer;\n } else if (typeof buf.buffer.slice === 'function') {\n // Otherwise we need to get a proper copy\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n }\n }\n\n if (Buffer.isBuffer(buf)) {\n // This is the slow version that will work with any Buffer\n // implementation (even in old browsers)\n var arrayCopy = new Uint8Array(buf.length);\n var len = buf.length;\n\n for (var i = 0; i < len; i++) {\n arrayCopy[i] = buf[i];\n }\n\n return arrayCopy.buffer;\n } else {\n throw new Error('Argument must be a Buffer');\n }\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n/*<replacement>*/\n\n\nvar util = require('core-util-is');\n\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};","/**\n * Module exports.\n */\nmodule.exports = deprecate;\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate(fn, msg) {\n if (config('noDeprecation')) {\n return fn;\n }\n\n var warned = false;\n\n function deprecated() {\n if (!warned) {\n if (config('throwDeprecation')) {\n throw new Error(msg);\n } else if (config('traceDeprecation')) {\n console.trace(msg);\n } else {\n console.warn(msg);\n }\n\n warned = true;\n }\n\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n}\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\n\nfunction config(name) {\n // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n try {\n if (!global.localStorage) return false;\n } catch (_) {\n return false;\n }\n\n var val = global.localStorage[name];\n if (null == val) return false;\n return String(val).toLowerCase() === 'true';\n}","(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n } // Copy function arguments\n\n\n var args = new Array(arguments.length - 1);\n\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n } // Store and register the task\n\n\n var task = {\n callback: callback,\n args: args\n };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n\n switch (args.length) {\n case 0:\n callback();\n break;\n\n case 1:\n callback(args[0]);\n break;\n\n case 2:\n callback(args[0], args[1]);\n break;\n\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n\n if (task) {\n currentlyRunningATask = true;\n\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function registerImmediate(handle) {\n process.nextTick(function () {\n runIfPresent(handle);\n });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n\n global.onmessage = function () {\n postMessageIsAsynchronous = false;\n };\n\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n\n var onGlobalMessage = function onGlobalMessage(event) {\n if (event.source === global && typeof event.data === \"string\" && event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function registerImmediate(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n\n channel.port1.onmessage = function (event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function registerImmediate(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n\n registerImmediate = function registerImmediate(handle) {\n // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement(\"script\");\n\n script.onreadystatechange = function () {\n runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n\n html.appendChild(script);\n };\n }\n\n function installSetTimeoutImplementation() {\n registerImmediate = function registerImmediate(handle) {\n setTimeout(runIfPresent, 0, handle);\n };\n } // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n\n\n var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n attachTo = attachTo && attachTo.setTimeout ? attachTo : global; // Don't get fooled by e.g. browserify environments.\n\n if ({}.toString.call(global.process) === \"[object process]\") {\n // For Node.js before 0.9\n installNextTickImplementation();\n } else if (canUsePostMessage()) {\n // For non-IE10 modern browsers\n installPostMessageImplementation();\n } else if (global.MessageChannel) {\n // For web workers, where supported\n installMessageChannelImplementation();\n } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n // For IE 6鈥�8\n installReadyStateChangeImplementation();\n } else {\n // For older browsers\n installSetTimeoutImplementation();\n }\n\n attachTo.setImmediate = setImmediate;\n attachTo.clearImmediate = clearImmediate;\n})(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self);","'use strict';\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nvar Buffer = require('safe-buffer').Buffer;\n\nvar util = require('util');\n\nfunction copyBuffer(src, target, offset) {\n src.copy(target, offset);\n}\n\nmodule.exports = function () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n BufferList.prototype.push = function push(v) {\n var entry = {\n data: v,\n next: null\n };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n };\n\n BufferList.prototype.unshift = function unshift(v) {\n var entry = {\n data: v,\n next: this.head\n };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n };\n\n BufferList.prototype.shift = function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n };\n\n BufferList.prototype.clear = function clear() {\n this.head = this.tail = null;\n this.length = 0;\n };\n\n BufferList.prototype.join = function join(s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n\n while (p = p.next) {\n ret += s + p.data;\n }\n\n return ret;\n };\n\n BufferList.prototype.concat = function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n if (this.length === 1) return this.head.data;\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n\n return ret;\n };\n\n return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n module.exports.prototype[util.inspect.custom] = function () {\n var obj = util.inspect({\n length: this.length\n });\n return this.constructor.name + ' ' + obj;\n };\n}","var capability = require('./capability');\n\nvar inherits = require('inherits');\n\nvar response = require('./response');\n\nvar stream = require('readable-stream');\n\nvar toArrayBuffer = require('to-arraybuffer');\n\nvar IncomingMessage = response.IncomingMessage;\nvar rStates = response.readyStates;\n\nfunction decideMode(preferBinary, useFetch) {\n if (capability.fetch && useFetch) {\n return 'fetch';\n } else if (capability.mozchunkedarraybuffer) {\n return 'moz-chunked-arraybuffer';\n } else if (capability.msstream) {\n return 'ms-stream';\n } else if (capability.arraybuffer && preferBinary) {\n return 'arraybuffer';\n } else if (capability.vbArray && preferBinary) {\n return 'text:vbarray';\n } else {\n return 'text';\n }\n}\n\nvar ClientRequest = module.exports = function (opts) {\n var self = this;\n stream.Writable.call(self);\n self._opts = opts;\n self._body = [];\n self._headers = {};\n if (opts.auth) self.setHeader('Authorization', 'Basic ' + new Buffer(opts.auth).toString('base64'));\n Object.keys(opts.headers).forEach(function (name) {\n self.setHeader(name, opts.headers[name]);\n });\n var preferBinary;\n var useFetch = true;\n\n if (opts.mode === 'disable-fetch' || 'requestTimeout' in opts && !capability.abortController) {\n // If the use of XHR should be preferred. Not typically needed.\n useFetch = false;\n preferBinary = true;\n } else if (opts.mode === 'prefer-streaming') {\n // If streaming is a high priority but binary compatibility and\n // the accuracy of the 'content-type' header aren't\n preferBinary = false;\n } else if (opts.mode === 'allow-wrong-content-type') {\n // If streaming is more important than preserving the 'content-type' header\n preferBinary = !capability.overrideMimeType;\n } else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') {\n // Use binary if text streaming may corrupt data or the content-type header, or for speed\n preferBinary = true;\n } else {\n throw new Error('Invalid value for opts.mode');\n }\n\n self._mode = decideMode(preferBinary, useFetch);\n self._fetchTimer = null;\n self.on('finish', function () {\n self._onFinish();\n });\n};\n\ninherits(ClientRequest, stream.Writable);\n\nClientRequest.prototype.setHeader = function (name, value) {\n var self = this;\n var lowerName = name.toLowerCase(); // This check is not necessary, but it prevents warnings from browsers about setting unsafe\n // headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but\n // http-browserify did it, so I will too.\n\n if (unsafeHeaders.indexOf(lowerName) !== -1) return;\n self._headers[lowerName] = {\n name: name,\n value: value\n };\n};\n\nClientRequest.prototype.getHeader = function (name) {\n var header = this._headers[name.toLowerCase()];\n\n if (header) return header.value;\n return null;\n};\n\nClientRequest.prototype.removeHeader = function (name) {\n var self = this;\n delete self._headers[name.toLowerCase()];\n};\n\nClientRequest.prototype._onFinish = function () {\n var self = this;\n if (self._destroyed) return;\n var opts = self._opts;\n var headersObj = self._headers;\n var body = null;\n\n if (opts.method !== 'GET' && opts.method !== 'HEAD') {\n if (capability.arraybuffer) {\n body = toArrayBuffer(Buffer.concat(self._body));\n } else if (capability.blobConstructor) {\n body = new global.Blob(self._body.map(function (buffer) {\n return toArrayBuffer(buffer);\n }), {\n type: (headersObj['content-type'] || {}).value || ''\n });\n } else {\n // get utf8 string\n body = Buffer.concat(self._body).toString();\n }\n } // create flattened list of headers\n\n\n var headersList = [];\n Object.keys(headersObj).forEach(function (keyName) {\n var name = headersObj[keyName].name;\n var value = headersObj[keyName].value;\n\n if (Array.isArray(value)) {\n value.forEach(function (v) {\n headersList.push([name, v]);\n });\n } else {\n headersList.push([name, value]);\n }\n });\n\n if (self._mode === 'fetch') {\n var signal = null;\n var fetchTimer = null;\n\n if (capability.abortController) {\n var controller = new AbortController();\n signal = controller.signal;\n self._fetchAbortController = controller;\n\n if ('requestTimeout' in opts && opts.requestTimeout !== 0) {\n self._fetchTimer = global.setTimeout(function () {\n self.emit('requestTimeout');\n if (self._fetchAbortController) self._fetchAbortController.abort();\n }, opts.requestTimeout);\n }\n }\n\n global.fetch(self._opts.url, {\n method: self._opts.method,\n headers: headersList,\n body: body || undefined,\n mode: 'cors',\n credentials: opts.withCredentials ? 'include' : 'same-origin',\n signal: signal\n }).then(function (response) {\n self._fetchResponse = response;\n\n self._connect();\n }, function (reason) {\n global.clearTimeout(self._fetchTimer);\n if (!self._destroyed) self.emit('error', reason);\n });\n } else {\n var xhr = self._xhr = new global.XMLHttpRequest();\n\n try {\n xhr.open(self._opts.method, self._opts.url, true);\n } catch (err) {\n process.nextTick(function () {\n self.emit('error', err);\n });\n return;\n } // Can't set responseType on really old browsers\n\n\n if ('responseType' in xhr) xhr.responseType = self._mode.split(':')[0];\n if ('withCredentials' in xhr) xhr.withCredentials = !!opts.withCredentials;\n if (self._mode === 'text' && 'overrideMimeType' in xhr) xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\n if ('requestTimeout' in opts) {\n xhr.timeout = opts.requestTimeout;\n\n xhr.ontimeout = function () {\n self.emit('requestTimeout');\n };\n }\n\n headersList.forEach(function (header) {\n xhr.setRequestHeader(header[0], header[1]);\n });\n self._response = null;\n\n xhr.onreadystatechange = function () {\n switch (xhr.readyState) {\n case rStates.LOADING:\n case rStates.DONE:\n self._onXHRProgress();\n\n break;\n }\n }; // Necessary for streaming in Firefox, since xhr.response is ONLY defined\n // in onprogress, not in onreadystatechange with xhr.readyState = 3\n\n\n if (self._mode === 'moz-chunked-arraybuffer') {\n xhr.onprogress = function () {\n self._onXHRProgress();\n };\n }\n\n xhr.onerror = function () {\n if (self._destroyed) return;\n self.emit('error', new Error('XHR error'));\n };\n\n try {\n xhr.send(body);\n } catch (err) {\n process.nextTick(function () {\n self.emit('error', err);\n });\n return;\n }\n }\n};\n/**\n * Checks if xhr.status is readable and non-zero, indicating no error.\n * Even though the spec says it should be available in readyState 3,\n * accessing it throws an exception in IE8\n */\n\n\nfunction statusValid(xhr) {\n try {\n var status = xhr.status;\n return status !== null && status !== 0;\n } catch (e) {\n return false;\n }\n}\n\nClientRequest.prototype._onXHRProgress = function () {\n var self = this;\n if (!statusValid(self._xhr) || self._destroyed) return;\n if (!self._response) self._connect();\n\n self._response._onXHRProgress();\n};\n\nClientRequest.prototype._connect = function () {\n var self = this;\n if (self._destroyed) return;\n self._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode, self._fetchTimer);\n\n self._response.on('error', function (err) {\n self.emit('error', err);\n });\n\n self.emit('response', self._response);\n};\n\nClientRequest.prototype._write = function (chunk, encoding, cb) {\n var self = this;\n\n self._body.push(chunk);\n\n cb();\n};\n\nClientRequest.prototype.abort = ClientRequest.prototype.destroy = function () {\n var self = this;\n self._destroyed = true;\n global.clearTimeout(self._fetchTimer);\n if (self._response) self._response._destroyed = true;\n if (self._xhr) self._xhr.abort();else if (self._fetchAbortController) self._fetchAbortController.abort();\n};\n\nClientRequest.prototype.end = function (data, encoding, cb) {\n var self = this;\n\n if (typeof data === 'function') {\n cb = data;\n data = undefined;\n }\n\n stream.Writable.prototype.end.call(self, data, encoding, cb);\n};\n\nClientRequest.prototype.flushHeaders = function () {};\n\nClientRequest.prototype.setTimeout = function () {};\n\nClientRequest.prototype.setNoDelay = function () {};\n\nClientRequest.prototype.setSocketKeepAlive = function () {}; // Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method\n\n\nvar unsafeHeaders = ['accept-charset', 'accept-encoding', 'access-control-request-headers', 'access-control-request-method', 'connection', 'content-length', 'cookie', 'cookie2', 'date', 'dnt', 'expect', 'host', 'keep-alive', 'origin', 'referer', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'via'];","var http = require('http');\n\nvar url = require('url');\n\nvar https = module.exports;\n\nfor (var key in http) {\n if (http.hasOwnProperty(key)) https[key] = http[key];\n}\n\nhttps.request = function (params, cb) {\n params = validateParams(params);\n return http.request.call(this, params, cb);\n};\n\nhttps.get = function (params, cb) {\n params = validateParams(params);\n return http.get.call(this, params, cb);\n};\n\nfunction validateParams(params) {\n if (typeof params === 'string') {\n params = url.parse(params);\n }\n\n if (!params.protocol) {\n params.protocol = 'https:';\n }\n\n if (params.protocol !== 'https:') {\n throw new Error('Protocol \"' + params.protocol + '\" not supported. Expected \"https:\"');\n }\n\n return params;\n}","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = -7;\n var i = isLE ? nBytes - 1 : 0;\n var d = isLE ? -1 : 1;\n var s = buffer[offset + i];\n i += d;\n e = s & (1 << -nBits) - 1;\n s >>= -nBits;\n nBits += eLen;\n\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : (s ? -1 : 1) * Infinity;\n } else {\n m = m + Math.pow(2, mLen);\n e = e - eBias;\n }\n\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n var i = isLE ? 0 : nBytes - 1;\n var d = isLE ? 1 : -1;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n value = Math.abs(value);\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0;\n e = eMax;\n } else {\n e = Math.floor(Math.log(value) / Math.LN2);\n\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * Math.pow(2, 1 - eBias);\n }\n\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n e = 0;\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = e << mLen | m;\n eLen += mLen;\n\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128;\n};","'use strict';\n\nexports.byteLength = byteLength;\nexports.toByteArray = toByteArray;\nexports.fromByteArray = fromByteArray;\nvar lookup = [];\nvar revLookup = [];\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i];\n revLookup[code.charCodeAt(i)] = i;\n} // Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\n\n\nrevLookup['-'.charCodeAt(0)] = 62;\nrevLookup['_'.charCodeAt(0)] = 63;\n\nfunction getLens(b64) {\n var len = b64.length;\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4');\n } // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n\n\n var validLen = b64.indexOf('=');\n if (validLen === -1) validLen = len;\n var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4;\n return [validLen, placeHoldersLen];\n} // base64 is 4/3 + up to two characters of the original data\n\n\nfunction byteLength(b64) {\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\n\nfunction _byteLength(b64, validLen, placeHoldersLen) {\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\n\nfunction toByteArray(b64) {\n var tmp;\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n var curByte = 0; // if there are placeholders, only get up to the last complete 4 chars\n\n var len = placeHoldersLen > 0 ? validLen - 4 : validLen;\n\n for (var i = 0; i < len; i += 4) {\n tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)];\n arr[curByte++] = tmp >> 16 & 0xFF;\n arr[curByte++] = tmp >> 8 & 0xFF;\n arr[curByte++] = tmp & 0xFF;\n }\n\n if (placeHoldersLen === 2) {\n tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4;\n arr[curByte++] = tmp & 0xFF;\n }\n\n if (placeHoldersLen === 1) {\n tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2;\n arr[curByte++] = tmp >> 8 & 0xFF;\n arr[curByte++] = tmp & 0xFF;\n }\n\n return arr;\n}\n\nfunction tripletToBase64(num) {\n return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];\n}\n\nfunction encodeChunk(uint8, start, end) {\n var tmp;\n var output = [];\n\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16 & 0xFF0000) + (uint8[i + 1] << 8 & 0xFF00) + (uint8[i + 2] & 0xFF);\n output.push(tripletToBase64(tmp));\n }\n\n return output.join('');\n}\n\nfunction fromByteArray(uint8) {\n var tmp;\n var len = uint8.length;\n var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes\n\n var parts = [];\n var maxChunkLength = 16383; // must be multiple of 3\n // go through the array every three bytes, we'll deal with trailing stuff later\n\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength));\n } // pad the end with zeros, but make sure to not forget the extra bytes\n\n\n if (extraBytes === 1) {\n tmp = uint8[len - 1];\n parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + '==');\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1];\n parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + '=');\n }\n\n return parts.join('');\n}","export default function(gantt: any) {\r\n\r\n\tgantt.ext = gantt.ext || {};\r\n\r\n\tgantt.ext.export_api = gantt.ext.export_api || {\r\n\r\n\t\t_apiUrl: \"https://export.dhtmlx.com/gantt\",\r\n\r\n\t\tgetNodeJSTransport(url: string): { module: {request: any}, defaultPort: number } {\r\n\t\t\tconst protocol = url.split(\"://\")[0];\r\n\t\t\tlet module;\r\n\t\t\tlet defaultPort;\r\n\t\t\tswitch (protocol) {\r\n\t\t\t\tcase \"https\":\r\n\t\t\t\t\tmodule = require(\"https\");\r\n\t\t\t\t\tdefaultPort = 443;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"http\":\r\n\t\t\t\t\tmodule = require(\"http\");\r\n\t\t\t\t\tdefaultPort = 80;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tthrow new Error(`Unsupported protocol: ${protocol}, url: ${url}`);\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\tmodule,\r\n\t\t\t\tdefaultPort\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t_prepareConfigPDF(config, type){\r\n\t\t\tif (config && config.raw) {\r\n\t\t\t\tlet previousDateRage = null;\r\n\t\t\t\tif (config.start && config.end){\r\n\t\t\t\t\tpreviousDateRage = {\r\n\t\t\t\t\t\tstart_date: gantt.config.start_date,\r\n\t\t\t\t\t\tend_date: gantt.config.end_date,\r\n\t\t\t\t\t};\r\n\t\t\t\t\tgantt.config.start_date = gantt.date.str_to_date(gantt.config.date_format)(config.start);\r\n\t\t\t\t\tgantt.config.end_date = gantt.date.str_to_date(gantt.config.date_format)(config.end);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconfig = gantt.mixin(config, {\r\n\t\t\t\t\tname: \"gantt.\" + type, data: gantt.ext.export_api._serializeHtml()\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (previousDateRage){\r\n\t\t\t\t\tgantt.config.start_date = previousDateRage.start_date;\r\n\t\t\t\t\tgantt.config.end_date = previousDateRage.end_date;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconfig = gantt.mixin((config || {}), {\r\n\t\t\t\t\tname: \"gantt.\" + type,\r\n\t\t\t\t\tdata: gantt.ext.export_api._serializeAll(),\r\n\t\t\t\t\tconfig: gantt.config\r\n\t\t\t\t});\r\n\t\t\t\tgantt.ext.export_api._fixColumns(config.config.columns);\r\n\t\t\t}\r\n\r\n\t\t\tconfig.version = gantt.version;\r\n\t\t\tgantt.ext.export_api._sendToExport(config, type);\r\n\t\t},\r\n\r\n\t\texportToPDF(config) {\r\n\t\t\tgantt.ext.export_api._prepareConfigPDF(config, \"pdf\");\r\n\t\t},\r\n\r\n\t\texportToPNG(config) {\r\n\t\t\tgantt.ext.export_api._prepareConfigPDF(config, \"png\");\r\n\t\t},\r\n\r\n\r\n\t\texportToICal(config) {\r\n\t\t\tconfig = gantt.mixin((config || {}), {\r\n\t\t\t\tname: \"gantt.ical\",\r\n\t\t\t\tdata: gantt.ext.export_api._serializePlain().data,\r\n\t\t\t\tversion: gantt.version\r\n\t\t\t});\r\n\t\t\tgantt.ext.export_api._sendToExport(config, \"ical\");\r\n\t\t},\r\n\r\n\t\texportToExcel(config) {\r\n\t\t\tconfig = config || {};\r\n\r\n\t\t\tlet tasks;\r\n\t\t\tlet dates;\r\n\t\t\tlet state;\r\n\t\t\tlet scroll;\r\n\t\t\t// GS-2124, we need to get all task nodes to correctly obtain the colors\r\n\t\t\tconst smartRendering = gantt.config.smart_rendering;\r\n\t\t\tif (config.visual === \"base-colors\"){\r\n\t\t\t\tgantt.config.smart_rendering = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (config.start || config.end) {\r\n\t\t\t\tstate = gantt.getState();\r\n\t\t\t\tdates = [gantt.config.start_date, gantt.config.end_date];\r\n\t\t\t\tscroll = gantt.getScrollState();\r\n\t\t\t\tconst convert = gantt.date.str_to_date(gantt.config.date_format);\r\n\t\t\t\ttasks = gantt.eachTask;\r\n\r\n\t\t\t\tif (config.start){\r\n\t\t\t\t\tgantt.config.start_date = convert(config.start);\r\n\t\t\t\t}\r\n\t\t\t\tif (config.end){\r\n\t\t\t\t\tgantt.config.end_date = convert(config.end);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tgantt.render();\r\n\t\t\t\tgantt.config.smart_rendering = smartRendering;\r\n\r\n\t\t\t\tgantt.eachTask = gantt.ext.export_api._eachTaskTimed(gantt.config.start_date, gantt.config.end_date);\r\n\t\t\t} else if (config.visual === \"base-colors\"){\r\n\t\t\t\tgantt.render();\r\n\t\t\t\tgantt.config.smart_rendering = smartRendering;\r\n\t\t\t}\r\n\r\n\t\t\tgantt._no_progress_colors = config.visual === \"base-colors\";\r\n\r\n\t\t\tlet data = null;\r\n\t\t\tif (!gantt.env.isNode) {\r\n\t\t\t\tdata = gantt.ext.export_api._serializeTable(config).data;\r\n\t\t\t}\r\n\r\n\t\t\tconfig = gantt.mixin(config, {\r\n\t\t\t\tname: \"gantt.xlsx\",\r\n\t\t\t\ttitle: \"Tasks\",\r\n\t\t\t\tdata,\r\n\t\t\t\tcolumns: gantt.ext.export_api._serializeColumns({ rawDates: true }),\r\n\t\t\t\tversion: gantt.version\r\n\t\t\t});\r\n\r\n\t\t\tif (config.visual){\r\n\t\t\t\tconfig.scales = gantt.ext.export_api._serializeScales(config);\r\n\t\t\t}\r\n\r\n\t\t\tgantt.ext.export_api._sendToExport(config, \"excel\");\r\n\r\n\t\t\tif (config.start || config.end) {\r\n\t\t\t\tgantt.config.start_date = state.min_date;\r\n\t\t\t\tgantt.config.end_date = state.max_date;\r\n\t\t\t\tgantt.eachTask = tasks;\r\n\r\n\t\t\t\tgantt.render();\r\n\t\t\t\tgantt.scrollTo(scroll.x, scroll.y);\r\n\r\n\t\t\t\tgantt.config.start_date = dates[0];\r\n\t\t\t\tgantt.config.end_date = dates[1];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\texportToJSON(config) {\r\n\t\t\tconfig = gantt.mixin((config || {}), {\r\n\t\t\t\tname: \"gantt.json\",\r\n\t\t\t\tdata: gantt.ext.export_api._serializeAll(),\r\n\t\t\t\tconfig: gantt.config,\r\n\t\t\t\tcolumns: gantt.ext.export_api._serializeColumns(),\r\n\t\t\t\tworktime: gantt.ext.export_api._getWorktimeSettings(),\r\n\t\t\t\tversion: gantt.version\r\n\t\t\t});\r\n\t\t\tgantt.ext.export_api._sendToExport(config, \"json\");\r\n\t\t},\r\n\r\n\r\n\t\timportFromExcel(config) {\r\n\t\t\ttry {\r\n\t\t\t\tconst formData = config.data;\r\n\t\t\t\tif (formData instanceof FormData) {\r\n\r\n\t\t\t\t} else if (formData instanceof File) {\r\n\t\t\t\t\tconst data = new FormData();\r\n\t\t\t\t\tdata.append(\"file\", formData);\r\n\t\t\t\t\tconfig.data = data;\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {}\r\n\t\t\tif (gantt.env.isNode) {\r\n\t\t\t\tgantt.ext.export_api._nodejsImportExcel(config);\r\n\t\t\t} else {\r\n\t\t\t\tgantt.ext.export_api._sendImportAjaxExcel(config);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\timportFromMSProject(config) {\r\n\t\t\tconst formData = config.data;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tif (formData instanceof FormData) {\r\n\r\n\t\t\t\t} else if (formData instanceof File) {\r\n\t\t\t\t\tconst data = new FormData();\r\n\t\t\t\t\tdata.append(\"file\", formData);\r\n\t\t\t\t\tconfig.data = data;\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {}\r\n\t\t\tif (gantt.env.isNode) {\r\n\t\t\t\tgantt.ext.export_api._nodejsImportMSP(config);\r\n\t\t\t} else {\r\n\t\t\t\tgantt.ext.export_api._sendImportAjaxMSP(config);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\timportFromPrimaveraP6(config) {\r\n\t\t\tconfig.type = \"primaveraP6-parse\";\r\n\t\t\treturn gantt.importFromMSProject(config);\r\n\t\t},\r\n\t\texportToMSProject(config) {\r\n\t\t\tconfig = config || {};\r\n\t\t\tconfig.skip_circular_links = config.skip_circular_links === undefined ? true : !!config.skip_circular_links;\r\n\r\n\t\t\tconst oldXmlFormat = gantt.templates.xml_format;\r\n\t\t\tconst oldFormatDate = gantt.templates.format_date;\r\n\t\t\tconst oldXmlDate = gantt.config.xml_date;\r\n\t\t\tconst oldDateFormat = gantt.config.date_format;\r\n\r\n\t\t\tconst exportServiceDateFormat = \"%d-%m-%Y %H:%i:%s\";\r\n\r\n\t\t\tgantt.config.xml_date = exportServiceDateFormat;\r\n\t\t\tgantt.config.date_format = exportServiceDateFormat;\r\n\t\t\tgantt.templates.xml_format = gantt.date.date_to_str(exportServiceDateFormat);\r\n\t\t\tgantt.templates.format_date = gantt.date.date_to_str(exportServiceDateFormat);\r\n\t\t\tconst data = gantt.ext.export_api._serializeAll();\r\n\r\n\t\t\tgantt.ext.export_api._customProjectProperties(data, config);\r\n\r\n\t\t\tgantt.ext.export_api._customTaskProperties(data, config);\r\n\r\n\t\t\tif (config.skip_circular_links) {\r\n\t\t\t\tgantt.ext.export_api._clearRecLinks(data);\r\n\t\t\t}\r\n\r\n\t\t\tconfig = gantt.ext.export_api._exportConfig(data, config);\r\n\r\n\t\t\tgantt.ext.export_api._sendToExport(config, config.type || \"msproject\");\r\n\t\t\tgantt.config.xml_date = oldXmlDate;\r\n\t\t\tgantt.config.date_format = oldDateFormat;\r\n\t\t\tgantt.templates.xml_format = oldXmlFormat;\r\n\t\t\tgantt.templates.format_date = oldFormatDate;\r\n\r\n\t\t\tgantt.config.$custom_data = null;\r\n\t\t\tgantt.config.custom = null;\r\n\t\t},\r\n\r\n\t\texportToPrimaveraP6(config) {\r\n\t\t\tconfig = config || {};\r\n\t\t\tconfig.type = \"primaveraP6\";\r\n\t\t\treturn gantt.exportToMSProject(config);\r\n\t\t},\r\n\r\n\t\t_nodejsImportExcel(config) {\r\n\t\t\t// tslint:disable-next-line no-implicit-dependencies\r\n\t\t\tconst formDataInstance = require(\"form-data\");\r\n\r\n\t\t\tconst url = config.server || gantt.ext.export_api._apiUrl;\r\n\t\t\tconst network = gantt.ext.export_api.getNodeJSTransport(url);\r\n\t\t\tconst parts1 = url.split(\"://\")[1];\r\n\t\t\tconst parts2 = parts1.split(\"/\")[0].split(\":\");\r\n\t\t\tconst parts3 = parts1.split(\"/\");\r\n\r\n\t\t\tconst hostname = parts2[0];\r\n\t\t\tconst port = parts2[1] || network.defaultPort;\r\n\t\t\tconst path = \"/\" + parts3.slice(1).join(\"/\");\r\n\r\n\t\t\tconst options = {\r\n\t\t\t\thostname,\r\n\t\t\t\tport,\r\n\t\t\t\tpath,\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\"\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tconst formData = new formDataInstance();\r\n\t\t\tformData.append(\"file\", config.data);\r\n\t\t\tformData.append(\"type\", \"excel-parse\");\r\n\t\t\tformData.append(\"data\", JSON.stringify({\r\n\t\t\t\tsheet: config.sheet || 0\r\n\t\t\t}));\r\n\r\n\t\t\toptions.headers[\"Content-Type\"] = formData.getHeaders()[\"content-type\"];\r\n\r\n\t\t\tconst req = network.module.request(options, function(res) {\r\n\t\t\t\tlet resData = \"\";\r\n\t\t\t\tres.on(\"data\", function(d) {\r\n\t\t\t\t\tresData += d;\r\n\t\t\t\t});\r\n\t\t\t\tres.on(\"end\", function(d) {\r\n\t\t\t\t\tconfig.callback(resData.toString());\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\treq.on(\"error\", function(error) {\r\n\t\t\t\t// tslint:disable-next-line no-console\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t});\r\n\t\t\tformData.pipe(req);\r\n\t\t},\r\n\t\t_nodejsImportMSP(config) {\r\n\r\n\t\t\t// tslint:disable-next-line no-implicit-dependencies\r\n\t\t\tconst formDataInstance = require(\"form-data\");\r\n\r\n\t\t\tconst url = config.server || gantt.ext.export_api._apiUrl;\r\n\t\t\tconst network = gantt.ext.export_api.getNodeJSTransport(url);\r\n\t\t\tconst parts1 = url.split(\"://\")[1];\r\n\t\t\tconst parts2 = parts1.split(\"/\")[0].split(\":\");\r\n\t\t\tconst parts3 = parts1.split(\"/\");\r\n\r\n\t\t\tconst hostname = parts2[0];\r\n\t\t\tconst port = parts2[1] || network.defaultPort;\r\n\t\t\tconst path = \"/\" + parts3.slice(1).join(\"/\");\r\n\r\n\t\t\tconst options = {\r\n\t\t\t\thostname,\r\n\t\t\t\tport,\r\n\t\t\t\tpath,\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\"\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tconst settings = {\r\n\t\t\t\tdurationUnit: config.durationUnit || undefined,\r\n\t\t\t\tprojectProperties: config.projectProperties || undefined,\r\n\t\t\t\ttaskProperties: config.taskProperties || undefined,\r\n\t\t\t};\r\n\r\n\t\t\tconst formData = new formDataInstance();\r\n\t\t\tformData.append(\"file\", config.data);\r\n\t\t\tformData.append(\"type\", config.type || \"msproject-parse\");\r\n\t\t\tformData.append(\"data\", JSON.stringify(settings), options);\r\n\r\n\t\t\toptions.headers[\"Content-Type\"] = formData.getHeaders()[\"content-type\"];\r\n\r\n\t\t\tconst req = network.module.request(options, function(res) {\r\n\t\t\t\tlet resData = \"\";\r\n\t\t\t\tres.on(\"data\", function(d) {\r\n\t\t\t\t\tresData += d;\r\n\t\t\t\t});\r\n\t\t\t\tres.on(\"end\", function(d) {\r\n\t\t\t\t\tconfig.callback(resData.toString());\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\treq.on(\"error\", function(error) {\r\n\t\t\t\t// tslint:disable-next-line no-console\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t});\r\n\t\t\tformData.pipe(req);\r\n\t\t},\r\n\r\n\r\n\r\n\t\t_fixColumns(columns) {\r\n\t\t\tfor (let i = 0; i < columns.length; i++) {\r\n\t\t\t\tcolumns[i].label = columns[i].label || gantt.locale.labels[\"column_\" + columns[i].name];\r\n\t\t\t\tif (typeof columns[i].width === \"string\") {\r\n\t\t\t\t\tcolumns[i].width = columns[i].width * 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\r\n\t\t_xdr(url, pack, cb) {\r\n\t\t\tif (gantt.env.isNode) {\r\n\t\t\t\tgantt.ext.export_api._nodejsPostRequest(url, pack, cb);\r\n\t\t\t} else {\r\n\t\t\t\tgantt.ajax.post(url, pack, cb);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_nodejsPostRequest(url, pack, cb){\r\n\t\t\tconst network = gantt.ext.export_api.getNodeJSTransport(url);\r\n\r\n\t\t\tconst parts1 = url.split(\"://\")[1];\r\n\t\t\tconst parts2 = parts1.split(\"/\")[0].split(\":\");\r\n\t\t\tconst parts3 = parts1.split(\"/\");\r\n\r\n\t\t\tconst hostname = parts2[0];\r\n\t\t\tconst port = parts2[1] || network.defaultPort;\r\n\t\t\tconst path = \"/\" + parts3.slice(1).join(\"/\");\r\n\r\n\t\t\tconst options = {\r\n\t\t\t\thostname,\r\n\t\t\t\tport,\r\n\t\t\t\tpath,\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\"Content-Length\": JSON.stringify(pack).length\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tconst req = network.module.request(options, function(res) {\r\n\t\t\t\tconst resData = [];\r\n\t\t\t\tres.on(\"data\", function(d) {\r\n\t\t\t\t\tresData.push(d);\r\n\t\t\t\t});\r\n\t\t\t\tres.on(\"end\", function(d) {\r\n\t\t\t\t\tcb(Buffer.concat(resData));\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\treq.on(\"error\", function(error) {\r\n\t\t\t\t// tslint:disable-next-line no-console\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t});\r\n\r\n\t\t\treq.write(JSON.stringify(pack));\r\n\t\t\treq.end();\r\n\t\t},\r\n\r\n\t\t_markColumns(base) {\r\n\t\t\tconst columns = base.config.columns;\r\n\t\t\tif (columns){\r\n\t\t\t\tfor (let i = 0; i < columns.length; i++) {\r\n\t\t\t\t\tif (columns[i].template){\r\n\t\t\t\t\t\tcolumns[i].$template = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\r\n\t\t_sendImportAjaxExcel(config) {\r\n\t\t\tconst url = config.server || gantt.ext.export_api._apiUrl;\r\n\t\t\tconst store = config.store || 0;\r\n\t\t\tconst formData = config.data;\r\n\t\t\tconst callback = config.callback;\r\n\r\n\t\t\tformData.append(\"type\", \"excel-parse\");\r\n\t\t\tformData.append(\"data\", JSON.stringify({\r\n\t\t\t\tsheet: config.sheet || 0\r\n\t\t\t}));\r\n\r\n\t\t\tif (store){\r\n\t\t\t\tformData.append(\"store\", store);\r\n\t\t\t}\r\n\r\n\t\t\tconst xhr = new XMLHttpRequest();\r\n\t\t\txhr.onreadystatechange = function(e) {\r\n\t\t\t\tif (xhr.readyState === 4 && xhr.status === 0) {// network error\r\n\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\tcallback(null);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\txhr.onload = function() {\r\n\t\t\t\tconst fail = xhr.status > 400;\r\n\t\t\t\tlet info = null;\r\n\r\n\t\t\t\tif (!fail) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tinfo = JSON.parse(xhr.responseText);\r\n\t\t\t\t\t} catch (e) { }\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (callback) {\r\n\t\t\t\t\tcallback(info);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\txhr.open(\"POST\", url, true);\r\n\t\t\txhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n\t\t\txhr.send(formData);\r\n\t\t},\r\n\r\n\r\n\t\t_ajaxToExport(data, type, callback) {\r\n\t\t\tdelete data.callback;\r\n\r\n\t\t\tconst url = data.server || gantt.ext.export_api._apiUrl;\r\n\t\t\tconst pack = \"type=\" + type + \"&store=1&data=\" + encodeURIComponent(JSON.stringify(data));\r\n\r\n\t\t\tconst cb = function(loader) {\r\n\t\t\t\tconst xdoc = loader.xmlDoc || loader;\r\n\t\t\t\tconst fail = xdoc.status > 400;\r\n\t\t\t\tlet info = null;\r\n\r\n\t\t\t\tif (!fail) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tinfo = JSON.parse(xdoc.responseText);\r\n\t\t\t\t\t} catch (e) { }\r\n\t\t\t\t}\r\n\t\t\t\tcallback(info);\r\n\t\t\t};\r\n\r\n\t\t\tgantt.ext.export_api._xdr(url, pack, cb);\r\n\t\t},\r\n\t\t_serializableGanttConfig(config) {\r\n\t\t\tconst result = gantt.mixin({}, config);\r\n\r\n\t\t\tif (result.columns) {\r\n\t\t\t\tresult.columns = result.columns.map(function(col) {\r\n\t\t\t\t\tconst copy = gantt.mixin({}, col);\r\n\t\t\t\t\tdelete copy.editor;\r\n\t\t\t\t\treturn copy;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tdelete result.editor_types;\r\n\t\t\treturn result;\r\n\t\t},\r\n\r\n\t\t_sendToExport(data, type) {\r\n\t\t\tconst convert = gantt.date.date_to_str(gantt.config.date_format || gantt.config.xml_date);\r\n\t\t\tif (data.config) {\r\n\t\t\t\tdata.config = gantt.copy(gantt.ext.export_api._serializableGanttConfig(data.config));\r\n\t\t\t\tgantt.ext.export_api._markColumns(data, type);\r\n\r\n\t\t\t\tif (data.config.start_date && data.config.end_date) {\r\n\t\t\t\t\tif (data.config.start_date instanceof Date) {\r\n\t\t\t\t\t\tdata.config.start_date = convert(data.config.start_date);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (data.config.end_date instanceof Date) {\r\n\t\t\t\t\t\tdata.config.end_date = convert(data.config.end_date);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (gantt.env.isNode) {\r\n\t\t\t\tconst url = data.server || gantt.ext.export_api._apiUrl;\r\n\t\t\t\tconst pack = {\r\n\t\t\t\t\ttype,\r\n\t\t\t\t\tstore: 0,\r\n\t\t\t\t\tdata: JSON.stringify(data)\r\n\t\t\t\t};\r\n\t\t\t\tconst callbackFunction = data.callback || function(response) {\r\n\t\t\t\t\t// tslint:disable-next-line no-console\r\n\t\t\t\t\tconsole.log(response);\r\n\t\t\t\t};\r\n\r\n\t\t\t\treturn gantt.ext.export_api._xdr(url, pack, callbackFunction);\r\n\t\t\t}\r\n\r\n\t\t\tif (data.callback) {\r\n\t\t\t\treturn gantt.ext.export_api._ajaxToExport(data, type, data.callback);\r\n\t\t\t}\r\n\r\n\r\n\t\t\tconst form = gantt.ext.export_api._createHiddenForm();\r\n\t\t\tform.firstChild.action = data.server || gantt.ext.export_api._apiUrl;\r\n\t\t\tform.firstChild.childNodes[0].value = JSON.stringify(data);\r\n\t\t\tform.firstChild.childNodes[1].value = type;\r\n\t\t\tform.firstChild.submit();\r\n\t\t},\r\n\r\n\t\t_createHiddenForm() {\r\n\t\t\tif (!gantt.ext.export_api._hidden_export_form) {\r\n\t\t\t\tconst t = gantt.ext.export_api._hidden_export_form = document.createElement(\"div\");\r\n\t\t\t\tt.style.display = \"none\";\r\n\t\t\t\tt.innerHTML = \"<form method='POST' target='_blank'><textarea name='data' style='width:0px; height:0px;' readonly='true'></textarea><input type='hidden' name='type' value=''></form>\";\r\n\t\t\t\tdocument.body.appendChild(t);\r\n\t\t\t}\r\n\t\t\treturn gantt.ext.export_api._hidden_export_form;\r\n\t\t},\r\n\r\n\r\n\t\t_copyObjectBase(obj) {\r\n\t\t\tconst copy = {\r\n\t\t\t\tstart_date: undefined,\r\n\t\t\t\tend_date: undefined\r\n\t\t\t};\r\n\t\t\tfor (const key in obj) {\r\n\t\t\t\tif (key.charAt(0) === \"$\"){\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tcopy[key] = obj[key];\r\n\t\t\t}\r\n\t\t\tconst formatDate = gantt.templates.xml_format || gantt.templates.format_date;\r\n\r\n\t\t\tcopy.start_date = formatDate(copy.start_date);\r\n\t\t\tif (copy.end_date){\r\n\t\t\t\tcopy.end_date = formatDate(copy.end_date);\r\n\t\t\t}\r\n\r\n\t\t\treturn copy;\r\n\t\t},\r\n\r\n\r\n\t\t_color_box: null,\r\n\t\t_color_hash: {},\r\n\r\n\t\t_getStyles(css) {\r\n\t\t\tif (!gantt.ext.export_api._color_box) {\r\n\t\t\t\tgantt.ext.export_api._color_box = document.createElement(\"DIV\");\r\n\t\t\t\tgantt.ext.export_api._color_box.style.cssText = \"position:absolute; display:none;\";\r\n\t\t\t\tdocument.body.appendChild(gantt.ext.export_api._color_box);\r\n\t\t\t}\r\n\t\t\tif (gantt.ext.export_api._color_hash[css]){\r\n\t\t\t\treturn gantt.ext.export_api._color_hash[css];\r\n\t\t\t}\r\n\r\n\t\t\tgantt.ext.export_api._color_box.className = css;\r\n\t\t\tconst color = gantt.ext.export_api._getColor(gantt.ext.export_api._color_box, \"color\");\r\n\t\t\tconst backgroundColor = gantt.ext.export_api._getColor(gantt.ext.export_api._color_box, \"backgroundColor\");\r\n\t\t\treturn (gantt.ext.export_api._color_hash[css] = color + \";\" + backgroundColor);\r\n\t\t},\r\n\r\n\r\n\t\t_getMinutesWorktimeSettings(parsedRanges) {\r\n\t\t\tconst minutes = [];\r\n\t\t\tparsedRanges.forEach(function(range) {\r\n\t\t\t\tminutes.push(range.startMinute);\r\n\t\t\t\tminutes.push(range.endMinute);\r\n\t\t\t});\r\n\t\t\treturn minutes;\r\n\t\t},\r\n\r\n\t\t_getWorktimeSettings() {\r\n\r\n\t\t\tconst defaultWorkTimes = {\r\n\t\t\t\thours: [0, 24],\r\n\t\t\t\tminutes: null,\r\n\t\t\t\tdates: { 0: true, 1: true, 2: true, 3: true, 4: true, 5: true, 6: true }\r\n\t\t\t};\r\n\r\n\t\t\tlet time;\r\n\t\t\tif (!gantt.config.work_time) {\r\n\t\t\t\ttime = defaultWorkTimes;\r\n\t\t\t} else {\r\n\t\t\t\tconst wTime = gantt._working_time_helper;\r\n\t\t\t\tif (wTime && wTime.get_calendar) {\r\n\t\t\t\t\ttime = wTime.get_calendar();\r\n\t\t\t\t} else if (wTime) {\r\n\t\t\t\t\ttime = {\r\n\t\t\t\t\t\thours: wTime.hours,\r\n\t\t\t\t\t\tminutes: null,\r\n\t\t\t\t\t\tdates: wTime.dates\r\n\t\t\t\t\t};\r\n\t\t\t\t} else if (gantt.config.worktimes && gantt.config.worktimes.global) {\r\n\t\t\t\t\tconst settings = gantt.config.worktimes.global;\r\n\r\n\t\t\t\t\tif (settings.parsed) {\r\n\t\t\t\t\t\tconst minutes = gantt.ext.export_api._getMinutesWorktimeSettings(settings.parsed.hours);\r\n\t\t\t\t\t\ttime = {\r\n\t\t\t\t\t\t\thours: null,\r\n\t\t\t\t\t\t\tminutes,\r\n\t\t\t\t\t\t\tdates: {}\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tfor (const i in settings.parsed.dates) {\r\n\t\t\t\t\t\t\tif (Array.isArray(settings.parsed.dates[i])) {\r\n\t\t\t\t\t\t\t\ttime.dates[i] = gantt.ext.export_api._getMinutesWorktimeSettings(settings.parsed.dates[i]);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\ttime.dates[i] = settings.parsed.dates[i];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttime = {\r\n\t\t\t\t\t\t\thours: settings.hours,\r\n\t\t\t\t\t\t\tminutes: null,\r\n\t\t\t\t\t\t\tdates: settings.dates\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttime = defaultWorkTimes;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn time;\r\n\t\t},\r\n\r\n\r\n\t\t_eachTaskTimed(start, end) {\r\n\t\t\treturn function(code, parent, master) {\r\n\t\t\t\tparent = parent || gantt.config.root_id;\r\n\t\t\t\tmaster = master || gantt;\r\n\r\n\t\t\t\tconst branch = gantt.getChildren(parent);\r\n\t\t\t\tif (branch){\r\n\t\t\t\t\tfor (let i = 0; i < branch.length; i++) {\r\n\t\t\t\t\t\tconst item = gantt._pull[branch[i]];\r\n\t\t\t\t\t\tif ((!start || item.end_date > start) && (!end || item.start_date < end)){\r\n\t\t\t\t\t\t\tcode.call(master, item);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (gantt.hasChild(item.id)){\r\n\t\t\t\t\t\t\tgantt.eachTask(code, item.id, master);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t},\r\n\r\n\r\n\t\t// patch broken json serialization in gantt 2.1\r\n\t\t_originalCopyObject: gantt.json._copyObject,\r\n\r\n\r\n\t\t_copyObjectPlain(obj) {\r\n\t\t\tconst text = gantt.templates.task_text(obj.start_date, obj.end_date, obj);\r\n\r\n\t\t\tconst copy = gantt.ext.export_api._copyObjectBase(obj);\r\n\t\t\tcopy.text = text || copy.text;\r\n\r\n\t\t\treturn copy;\r\n\t\t},\r\n\r\n\t\t_getColor(node, style) {\r\n\t\t\tconst value = node.currentStyle ? node.currentStyle[style] : getComputedStyle(node, null)[style];\r\n\t\t\tconst rgb = value.replace(/\\s/g, \"\").match(/^rgba?\\((\\d+),(\\d+),(\\d+)/i);\r\n\t\t\treturn ((rgb && rgb.length === 4) ?\r\n\t\t\t\t(\"0\" + parseInt(rgb[1], 10).toString(16)).slice(-2) +\r\n\t\t\t\t(\"0\" + parseInt(rgb[2], 10).toString(16)).slice(-2) +\r\n\t\t\t\t(\"0\" + parseInt(rgb[3], 10).toString(16)).slice(-2) : value).replace(\"#\", \"\");\r\n\t\t},\r\n\r\n\r\n\t\t// excel serialization\r\n\t\t_copyObjectTable(obj) {\r\n\t\t\t// Excel interprets UTC time as local time in every timezone, send local time instead of actual UTC time.\r\n\t\t\t// https://github.com/SheetJS/js-xlsx/issues/126#issuecomment-60531614\r\n\t\t\tconst toISOstring = gantt.date.date_to_str(\"%Y-%m-%dT%H:%i:%s.000Z\");\r\n\r\n\t\t\tconst copy = gantt.ext.export_api._copyObjectColumns(obj, gantt.ext.export_api._copyObjectPlain(obj));\r\n\t\t\tif (copy.start_date){\r\n\t\t\t\tcopy.start_date = toISOstring(obj.start_date);\r\n\t\t\t}\r\n\t\t\tif (copy.end_date){\r\n\t\t\t\tcopy.end_date = toISOstring(obj.end_date);\r\n\t\t\t}\r\n\r\n\t\t\t// private gantt._day_index_by_date was replaced by public gantt.columnIndexByDate in gantt 5.0\r\n\t\t\tconst getDayIndex = gantt._day_index_by_date ? gantt._day_index_by_date : gantt.columnIndexByDate;\r\n\r\n\t\t\tcopy.$start = getDayIndex.call(gantt, obj.start_date);\r\n\t\t\tcopy.$end = getDayIndex.call(gantt, obj.end_date);\r\n\r\n\t\t\t// GS-2100. Correct bar position considering hidden cells\r\n\t\t\tlet hiddenCells = 0;\r\n\t\t\tconst scaleCellsWidth = gantt.getScale().width;\r\n\t\t\tif (scaleCellsWidth.indexOf(0) > -1) {\r\n\t\t\t\tlet i = 0;\r\n\t\t\t\tfor (i; i < copy.$start; i++) {\r\n\t\t\t\t\tif (!scaleCellsWidth[i]) {\r\n\t\t\t\t\t\thiddenCells++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcopy.$start -= hiddenCells;\r\n\r\n\t\t\t\tfor (i; i < copy.$end; i++) {\r\n\t\t\t\t\tif (!scaleCellsWidth[i]) {\r\n\t\t\t\t\t\thiddenCells++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcopy.$end -= hiddenCells;\r\n\t\t\t}\r\n\r\n\t\t\tcopy.$level = obj.$level;\r\n\t\t\tcopy.$type = obj.$rendered_type;\r\n\r\n\t\t\tconst tmps = gantt.templates;\r\n\t\t\tcopy.$text = tmps.task_text(obj.start, obj.end_date, obj);\r\n\t\t\tcopy.$left = tmps.leftside_text ? tmps.leftside_text(obj.start, obj.end_date, obj) : \"\";\r\n\t\t\tcopy.$right = tmps.rightside_text ? tmps.rightside_text(obj.start, obj.end_date, obj) : \"\";\r\n\r\n\t\t\treturn copy;\r\n\t\t},\r\n\r\n\t\t_copyObjectColors(obj) {\r\n\t\t\tconst copy = gantt.ext.export_api._copyObjectTable(obj);\r\n\r\n\t\t\tconst node = gantt.getTaskNode(obj.id);\r\n\t\t\tif (node && node.firstChild) {\r\n\t\t\t\tlet color = gantt.ext.export_api._getColor((gantt._no_progress_colors ? node : node.firstChild), \"backgroundColor\");\r\n\t\t\t\tif (color === \"363636\"){\r\n\t\t\t\t\tcolor = gantt.ext.export_api._getColor(node, \"backgroundColor\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcopy.$color = color;\r\n\t\t\t} else if (obj.color){\r\n\t\t\t\tcopy.$color = obj.color;\r\n\t\t\t}\r\n\r\n\t\t\treturn copy;\r\n\t\t},\r\n\r\n\t\t_copyObjectColumns(obj, copy) {\r\n\t\t\tfor (let i = 0; i < gantt.config.columns.length; i++) {\r\n\t\t\t\tconst ct = gantt.config.columns[i].template;\r\n\t\t\t\tif (ct) {\r\n\t\t\t\t\tlet val = ct(obj);\r\n\t\t\t\t\tif (val instanceof Date){\r\n\t\t\t\t\t\tval = gantt.templates.date_grid(val, obj);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcopy[\"_\" + i] = val;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn copy;\r\n\t\t},\r\n\r\n\t\t_copyObjectAll(obj) {\r\n\t\t\tconst copy = gantt.ext.export_api._copyObjectBase(obj);\r\n\r\n\t\t\tconst templates = [\r\n\t\t\t\t\"leftside_text\",\r\n\t\t\t\t\"rightside_text\",\r\n\t\t\t\t\"task_text\",\r\n\t\t\t\t\"progress_text\",\r\n\t\t\t\t\"task_class\"\r\n\t\t\t];\r\n\r\n\t\t\t// serialize all text templates\r\n\t\t\tfor (let i = 0; i < templates.length; i++) {\r\n\t\t\t\tconst template = gantt.templates[templates[i]];\r\n\t\t\t\tif (template){\r\n\t\t\t\t\tcopy[\"$\" + i] = template(obj.start_date, obj.end_date, obj);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tgantt.ext.export_api._copyObjectColumns(obj, copy);\r\n\t\t\tcopy.open = obj.$open;\r\n\t\t\treturn copy;\r\n\t\t},\r\n\r\n\r\n\t\t_serializeHtml() {\r\n\t\t\tconst smartScales = gantt.config.smart_scales;\r\n\t\t\tconst smartRendering = gantt.config.smart_rendering;\r\n\t\t\tif (smartScales || smartRendering) {\r\n\t\t\t\tgantt.config.smart_rendering = false;\r\n\t\t\t\tgantt.config.smart_scales = false;\r\n\t\t\t\tgantt.render();\r\n\t\t\t}\r\n\r\n\t\t\tconst html = gantt.$container.parentNode.innerHTML;\r\n\r\n\t\t\tif (smartScales || smartRendering) {\r\n\t\t\t\tgantt.config.smart_scales = smartScales;\r\n\t\t\t\tgantt.config.smart_rendering = smartRendering;\r\n\t\t\t\tgantt.render();\r\n\t\t\t}\r\n\r\n\t\t\treturn html;\r\n\t\t},\r\n\r\n\t\t_serializeAll() {\r\n\t\t\tgantt.json._copyObject = gantt.ext.export_api._copyObjectAll;\r\n\t\t\tconst data = gantt.ext.export_api._exportSerialize();\r\n\t\t\tgantt.json._copyObject = gantt.ext.export_api._originalCopyObject;\r\n\t\t\treturn data;\r\n\t\t},\r\n\r\n\t\t_serializePlain() {\r\n\t\t\tconst oldXmlFormat = gantt.templates.xml_format;\r\n\t\t\tconst oldFormatDate = gantt.templates.format_date;\r\n\t\t\tgantt.templates.xml_format = gantt.date.date_to_str(\"%Y%m%dT%H%i%s\", true);\r\n\t\t\tgantt.templates.format_date = gantt.date.date_to_str(\"%Y%m%dT%H%i%s\", true);\r\n\t\t\tgantt.json._copyObject = gantt.ext.export_api._copyObjectPlain;\r\n\r\n\t\t\tconst data = gantt.ext.export_api._exportSerialize();\r\n\r\n\t\t\tgantt.templates.xml_format = oldXmlFormat;\r\n\t\t\tgantt.templates.format_date = oldFormatDate;\r\n\t\t\tgantt.json._copyObject = gantt.ext.export_api._originalCopyObject;\r\n\r\n\t\t\tdelete data.links;\r\n\t\t\treturn data;\r\n\t\t},\r\n\r\n\t\t_getRaw() {\r\n\t\t\t// support Gantt < 5.0\r\n\t\t\tif (gantt._scale_helpers) {\r\n\t\t\t\tconst scales = gantt._get_scales();\r\n\t\t\t\tconst\tminWidth = gantt.config.min_column_width;\r\n\t\t\t\tconst\tautosizeMinWidth = gantt._get_resize_options().x ? Math.max(gantt.config.autosize_min_width, 0) : gantt.config.$task.offsetWidth;\r\n\t\t\t\tconst\theight = gantt.config.config.scale_height - 1;\r\n\t\t\t\treturn gantt._scale_helpers.prepareConfigs(scales, minWidth, autosizeMinWidth, height);\r\n\t\t\t} else { // Gantt >= 5.0\r\n\t\t\t\tconst timeline = gantt.$ui.getView(\"timeline\");\r\n\t\t\t\tif (timeline) {\r\n\t\t\t\t\tlet availWidth = timeline.$config.width;\r\n\t\t\t\t\tif (gantt.config.autosize === \"x\" || gantt.config.autosize === \"xy\") {\r\n\t\t\t\t\t\tavailWidth = Math.max(gantt.config.autosize_min_width, 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst state = gantt.getState();\r\n\t\t\t\t\tconst\tscales = timeline._getScales();\r\n\t\t\t\t\tconst\tminWidth = gantt.config.min_column_width;\r\n\t\t\t\t\tconst\theight = gantt.config.scale_height - 1;\r\n\t\t\t\t\tconst\trtl = gantt.config.rtl;\r\n\t\t\t\t\treturn timeline.$scaleHelper.prepareConfigs(scales, minWidth, availWidth, height, state.min_date, state.max_date, rtl);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_serializeTable(config) {\r\n\t\t\tgantt.json._copyObject = config.visual ? gantt.ext.export_api._copyObjectColors : gantt.ext.export_api._copyObjectTable;\r\n\t\t\tconst data = gantt.ext.export_api._exportSerialize();\r\n\t\t\tgantt.json._copyObject = gantt.ext.export_api._originalCopyObject;\r\n\r\n\t\t\tdelete data.links;\r\n\r\n\t\t\tif (config.cellColors) {\r\n\t\t\t\tconst css = gantt.templates.timeline_cell_class || gantt.templates.task_cell_class;\r\n\t\t\t\tif (css) {\r\n\t\t\t\t\tconst raw = gantt.ext.export_api._getRaw();\r\n\t\t\t\t\tlet steps = raw[0].trace_x;\r\n\t\t\t\t\tfor (let i = 1; i < raw.length; i++){\r\n\t\t\t\t\t\tif (raw[i].trace_x.length > steps.length){\r\n\t\t\t\t\t\t\tsteps = raw[i].trace_x;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfor (let i = 0; i < data.data.length; i++) {\r\n\t\t\t\t\t\tdata.data[i].styles = [];\r\n\t\t\t\t\t\tconst task = gantt.getTask(data.data[i].id);\r\n\t\t\t\t\t\tfor (let j = 0; j < steps.length; j++) {\r\n\t\t\t\t\t\t\tconst date = steps[j];\r\n\t\t\t\t\t\t\tconst cellCss = css(task, date);\r\n\t\t\t\t\t\t\tif (cellCss){\r\n\t\t\t\t\t\t\t\tdata.data[i].styles.push({ index: j, styles: gantt.ext.export_api._getStyles(cellCss) });\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn data;\r\n\t\t},\r\n\r\n\t\t_serializeScales(config) {\r\n\t\t\tconst scales = [];\r\n\t\t\tconst raw = gantt.ext.export_api._getRaw();\r\n\r\n\t\t\tlet min = Infinity;\r\n\t\t\tlet max = 0;\r\n\t\t\tfor (let i = 0; i < raw.length; i++) {\r\n\t\t\t\tmin = Math.min(min, raw[i].col_width);\r\n\t\t\t}\r\n\r\n\t\t\tfor (let i = 0; i < raw.length; i++) {\r\n\t\t\t\tlet start = 0;\r\n\t\t\t\tlet end = 0;\r\n\t\t\t\tconst row = [];\r\n\r\n\t\t\t\tscales.push(row);\r\n\t\t\t\tconst step = raw[i];\r\n\t\t\t\tmax = Math.max(max, step.trace_x.length);\r\n\t\t\t\tconst template = step.format || step.template || (step.date ? gantt.date.date_to_str(step.date) : gantt.config.date_scale);\r\n\r\n\t\t\t\tfor (let j = 0; j < step.trace_x.length; j++) {\r\n\t\t\t\t\tconst date = step.trace_x[j];\r\n\t\t\t\t\tend = start + Math.round(step.width[j] / min);\r\n\r\n\t\t\t\t\tconst scaleCell = { text: template(date), start, end, styles: \"\" };\r\n\r\n\t\t\t\t\tif (config.cellColors) {\r\n\t\t\t\t\t\tconst css = step.css || gantt.templates.scaleCell_class;\r\n\t\t\t\t\t\tif (css) {\r\n\t\t\t\t\t\t\tconst scaleCss = css(date);\r\n\t\t\t\t\t\t\tif (scaleCss){\r\n\t\t\t\t\t\t\t\tscaleCell.styles = gantt.ext.export_api._getStyles(scaleCss);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\trow.push(scaleCell);\r\n\t\t\t\t\tstart = end;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn { width: max, height: scales.length, data: scales };\r\n\t\t},\r\n\r\n\t\t_serializeColumns(config) {\r\n\t\t\tgantt.exportMode = true;\r\n\r\n\t\t\tconst columns = [];\r\n\t\t\tconst cols = gantt.config.columns;\r\n\r\n\t\t\tlet ccount = 0;\r\n\t\t\tfor (let i = 0; i < cols.length; i++) {\r\n\t\t\t\tif (cols[i].name === \"add\" || cols[i].name === \"buttons\") {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcolumns[ccount] = {\r\n\t\t\t\t\tid: ((cols[i].template) ? (\"_\" + i) : cols[i].name),\r\n\t\t\t\t\theader: cols[i].label || gantt.locale.labels[\"column_\" + cols[i].name],\r\n\t\t\t\t\twidth: (cols[i].width ? Math.floor(cols[i].width / 4) : \"\")\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (cols[i].name === \"duration\"){\r\n\t\t\t\t\tcolumns[ccount].type = \"number\";\r\n\t\t\t\t}\r\n\t\t\t\tif (cols[i].name === \"start_date\" || cols[i].name === \"end_date\") {\r\n\t\t\t\t\tcolumns[ccount].type = \"date\";\r\n\t\t\t\t\tif (config && config.rawDates){\r\n\t\t\t\t\t\tcolumns[ccount].id = cols[i].name;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tccount++;\r\n\t\t\t}\r\n\r\n\t\t\tgantt.exportMode = false;\r\n\t\t\treturn columns;\r\n\t\t},\r\n\r\n\t\t_exportSerialize() {\r\n\t\t\tgantt.exportMode = true;\r\n\r\n\t\t\tconst xmlFormat = gantt.templates.xml_format;\r\n\t\t\tconst formatDate = gantt.templates.format_date;\r\n\r\n\t\t\t// use configuration date format for serialization so date could be parsed on the export\r\n\t\t\t// required when custom format date function is defined\r\n\t\t\tgantt.templates.xml_format =\r\n\t\t\t\tgantt.templates.format_date =\r\n\t\t\t\tgantt.date.date_to_str(gantt.config.date_format || gantt.config.xml_date);\r\n\r\n\t\t\tconst data = gantt.serialize();\r\n\r\n\t\t\tgantt.templates.xml_format = xmlFormat;\r\n\t\t\tgantt.templates.format_date = formatDate;\r\n\t\t\tgantt.exportMode = false;\r\n\t\t\treturn data;\r\n\t\t},\r\n\r\n\r\n\t\t_setLevel(data) {\r\n\t\t\tfor (let i = 0; i < data.length; i++) {\r\n\t\t\t\t// tslint:disable-next-line triple-equals\r\n\t\t\t\tif (data[i].parent == 0) {\r\n\t\t\t\t\tdata[i]._lvl = 1;\r\n\t\t\t\t}\r\n\t\t\t\tfor (let j = i + 1; j < data.length; j++) {\r\n\t\t\t\t\t// tslint:disable-next-line triple-equals\r\n\t\t\t\t\tif (data[i].id == data[j].parent) {\r\n\t\t\t\t\t\tdata[j]._lvl = data[i]._lvl + 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_clearLevel(data) {\r\n\t\t\tfor (let i = 0; i < data.length; i++) {\r\n\t\t\t\tdelete data[i]._lvl;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_clearRecLinks(data) {\r\n\t\t\tgantt.ext.export_api._setLevel(data.data);\r\n\t\t\tconst tasks = {};\r\n\t\t\tfor (let i = 0; i < data.data.length; i++) {\r\n\t\t\t\ttasks[data.data[i].id] = data.data[i];\r\n\t\t\t}\r\n\r\n\t\t\tconst links = {};\r\n\r\n\t\t\tfor (let i = 0; i < data.links.length; i++) {\r\n\t\t\t\tconst link = data.links[i];\r\n\t\t\t\tif (gantt.isTaskExists(link.source) && gantt.isTaskExists(link.target) &&\r\n\t\t\t\t\ttasks[link.source] && tasks[link.target]) {\r\n\t\t\t\t\tlinks[link.id] = link;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor (const j in links) {\r\n\t\t\t\tgantt.ext.export_api._makeLinksSameLevel(links[j], tasks);\r\n\t\t\t}\r\n\r\n\t\t\tconst skippedLinks = {};\r\n\t\t\tfor (const j in tasks) {\r\n\t\t\t\tgantt.ext.export_api._clearCircDependencies(tasks[j], links, tasks, {}, skippedLinks, null);\r\n\t\t\t}\r\n\r\n\t\t\tif (Object.keys(links)) {\r\n\t\t\t\tgantt.ext.export_api._clearLinksSameLevel(links, tasks);\r\n\t\t\t}\r\n\r\n\t\t\tfor (let i = 0; i < data.links.length; i++) {\r\n\t\t\t\tif (!links[data.links[i].id]) {\r\n\t\t\t\t\tdata.links.splice(i, 1);\r\n\t\t\t\t\ti--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tgantt.ext.export_api._clearLevel(data.data);\r\n\t\t},\r\n\r\n\t\t_clearCircDependencies(task, links, tasks, usedTasks, skippedLinks, prevLink) {\r\n\t\t\tconst sources = task.$_source;\r\n\t\t\tif (!sources) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (usedTasks[task.id]) {\r\n\t\t\t\tgantt.ext.export_api._onCircDependencyFind(prevLink, links, usedTasks, skippedLinks);\r\n\t\t\t}\r\n\r\n\t\t\tusedTasks[task.id] = true;\r\n\r\n\t\t\tconst targets = {};\r\n\r\n\t\t\tfor (let i = 0; i < sources.length; i++) {\r\n\t\t\t\tif (skippedLinks[sources[i]]) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tconst curLink = links[sources[i]];\r\n\t\t\t\tconst targetTask = tasks[curLink._target];\r\n\t\t\t\tif (targets[targetTask.id]) { // two link from one task to another\r\n\t\t\t\t\tgantt.ext.export_api._onCircDependencyFind(curLink, links, usedTasks, skippedLinks);\r\n\t\t\t\t}\r\n\t\t\t\ttargets[targetTask.id] = true;\r\n\t\t\t\tgantt.ext.export_api._clearCircDependencies(targetTask, links, tasks, usedTasks, skippedLinks, curLink);\r\n\t\t\t}\r\n\t\t\tusedTasks[task.id] = false;\r\n\t\t},\r\n\r\n\t\t_onCircDependencyFind(link, links, usedTasks, skippedLinks) {\r\n\t\t\tif (link) {\r\n\t\t\t\tif (gantt.callEvent(\"onExportCircularDependency\", [link.id, link])) {\r\n\t\t\t\t\tdelete links[link.id];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete usedTasks[link._source];\r\n\t\t\t\tdelete usedTasks[link._target];\r\n\t\t\t\tskippedLinks[link.id] = true;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_makeLinksSameLevel(link, tasks) {\r\n\t\t\tlet task;\r\n\t\t\tlet targetLvl;\r\n\t\t\tconst linkT = {\r\n\t\t\t\ttarget: tasks[link.target],\r\n\t\t\t\tsource: tasks[link.source]\r\n\t\t\t};\r\n\t\t\t// tslint:disable-next-line triple-equals\r\n\t\t\tif (linkT.target._lvl != linkT.source._lvl) {\r\n\t\t\t\tif (linkT.target._lvl < linkT.source._lvl) {\r\n\t\t\t\t\ttask = \"source\";\r\n\t\t\t\t\ttargetLvl = linkT.target._lvl;\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttask = \"target\";\r\n\t\t\t\t\ttargetLvl = linkT.source._lvl;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdo {\r\n\t\t\t\t\tconst parent = tasks[linkT[task].parent];\r\n\t\t\t\t\tif (!parent) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlinkT[task] = parent;\r\n\t\t\t\t} while (linkT[task]._lvl < targetLvl);\r\n\r\n\t\t\t\tlet sourceParent = tasks[linkT.source.parent];\r\n\t\t\t\tlet\ttargetParent = tasks[linkT.target.parent];\r\n\t\t\t\t// tslint:disable-next-line triple-equals\r\n\t\t\t\twhile (sourceParent && targetParent && sourceParent.id != targetParent.id) {\r\n\t\t\t\t\tlinkT.source = sourceParent;\r\n\t\t\t\t\tlinkT.target = targetParent;\r\n\t\t\t\t\tsourceParent = tasks[linkT.source.parent];\r\n\t\t\t\t\ttargetParent = tasks[linkT.target.parent];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlink._target = linkT.target.id;\r\n\t\t\tlink._source = linkT.source.id;\r\n\r\n\t\t\tif (!linkT.target.$_target){\r\n\t\t\t\tlinkT.target.$_target = [];\r\n\t\t\t}\r\n\t\t\tlinkT.target.$_target.push(link.id);\r\n\r\n\t\t\tif (!linkT.source.$_source){\r\n\t\t\t\tlinkT.source.$_source = [];\r\n\t\t\t}\r\n\t\t\tlinkT.source.$_source.push(link.id);\r\n\t\t},\r\n\r\n\t\t_clearLinksSameLevel(links, tasks) {\r\n\t\t\tfor (const link in links) {\r\n\t\t\t\tdelete links[link]._target;\r\n\t\t\t\tdelete links[link]._source;\r\n\t\t\t}\r\n\r\n\t\t\tfor (const task in tasks) {\r\n\t\t\t\tdelete tasks[task].$_source;\r\n\t\t\t\tdelete tasks[task].$_target;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\r\n\t\t_customProjectProperties(data, config) {\r\n\t\t\tif (config && config.project) {\r\n\t\t\t\tfor (const i in config.project) {\r\n\t\t\t\t\tif (!gantt.config.$custom_data){\r\n\t\t\t\t\t\tgantt.config.$custom_data = {};\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgantt.config.$custom_data[i] = typeof config.project[i] === \"function\" ? config.project[i](gantt.config) : config.project[i];\r\n\t\t\t\t}\r\n\t\t\t\tdelete config.project;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_customTaskProperties(data, config) {\r\n\t\t\tif (config && config.tasks) {\r\n\t\t\t\tdata.data.forEach(function(el) {\r\n\t\t\t\t\tfor (const i in config.tasks) {\r\n\t\t\t\t\t\tif (!el.$custom_data){\r\n\t\t\t\t\t\t\tel.$custom_data = {};\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tel.$custom_data[i] = typeof config.tasks[i] === \"function\" ? config.tasks[i](el, gantt.config) : config.tasks[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tdelete config.tasks;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_exportConfig(data, config) {\r\n\t\t\tconst projectName = config.name || \"gantt.xml\";\r\n\t\t\tdelete config.name;\r\n\r\n\t\t\tgantt.config.custom = config;\r\n\r\n\t\t\tconst time = gantt.ext.export_api._getWorktimeSettings();\r\n\r\n\t\t\tconst projectDates = gantt.getSubtaskDates();\r\n\t\t\tif (projectDates.start_date && projectDates.end_date) {\r\n\t\t\t\tconst formatDate = gantt.templates.format_date || gantt.templates.xml_format;\r\n\t\t\t\tgantt.config.start_end = {\r\n\t\t\t\t\tstart_date: formatDate(projectDates.start_date),\r\n\t\t\t\t\tend_date: formatDate(projectDates.end_date)\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tconst manual = config.auto_scheduling === undefined ? false : !!config.auto_scheduling;\r\n\r\n\t\t\tconst res = {\r\n\t\t\t\tcallback: config.callback || null,\r\n\t\t\t\tconfig: gantt.config,\r\n\t\t\t\tdata,\r\n\t\t\t\tmanual,\r\n\t\t\t\tname: projectName,\r\n\t\t\t\tworktime: time\r\n\t\t\t};\r\n\t\t\tfor (const i in config) {\r\n\t\t\t\tres[i] = config[i];\r\n\t\t\t}\r\n\t\t\treturn res;\r\n\t\t},\r\n\r\n\r\n\t\t_sendImportAjaxMSP(config) {\r\n\t\t\tconst url = config.server || gantt.ext.export_api._apiUrl;\r\n\t\t\tconst store = config.store || 0;\r\n\t\t\tconst formData = config.data;\r\n\t\t\tconst callback = config.callback;\r\n\r\n\t\t\tconst settings = {\r\n\t\t\t\tdurationUnit: config.durationUnit || undefined,\r\n\t\t\t\tprojectProperties: config.projectProperties || undefined,\r\n\t\t\t\ttaskProperties: config.taskProperties || undefined,\r\n\t\t\t};\r\n\r\n\t\t\tformData.append(\"type\", config.type || \"msproject-parse\");\r\n\t\t\tformData.append(\"data\", JSON.stringify(settings));\r\n\r\n\t\t\tif (store){\r\n\t\t\t\tformData.append(\"store\", store);\r\n\t\t\t}\r\n\r\n\t\t\tconst xhr = new XMLHttpRequest();\r\n\t\t\txhr.onreadystatechange = function(e) {\r\n\t\t\t\tif (xhr.readyState === 4 && xhr.status === 0) {// network error\r\n\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\tcallback(null);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\txhr.onload = function(){\r\n\t\t\t\tconst fail = xhr.status > 400;\r\n\t\t\t\tlet info = null;\r\n\r\n\t\t\t\tif (!fail) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tinfo = JSON.parse(xhr.responseText);\r\n\t\t\t\t\t} catch (e) { }\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (callback) {\r\n\t\t\t\t\tcallback(info);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\txhr.open(\"POST\", url, true);\r\n\t\t\txhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n\t\t\txhr.send(formData);\r\n\t\t}\r\n\r\n\t};\r\n\r\n\r\n\tgantt.exportToPDF = gantt.ext.export_api.exportToPDF;\r\n\tgantt.exportToPNG = gantt.ext.export_api.exportToPNG;\r\n\tgantt.exportToICal = gantt.ext.export_api.exportToICal;\r\n\tgantt.exportToExcel = gantt.ext.export_api.exportToExcel;\r\n\tgantt.exportToJSON = gantt.ext.export_api.exportToJSON;\r\n\tgantt.importFromExcel = gantt.ext.export_api.importFromExcel;\r\n\tgantt.importFromMSProject = gantt.ext.export_api.importFromMSProject;\r\n\tgantt.exportToMSProject = gantt.ext.export_api.exportToMSProject;\r\n\tgantt.importFromPrimaveraP6 = gantt.ext.export_api.importFromPrimaveraP6;\r\n\tgantt.exportToPrimaveraP6 = gantt.ext.export_api.exportToPrimaveraP6;\r\n\r\n\r\n}\r\n","interface IPoint {\r\n\tx: number;\r\n\ty: number;\r\n}\r\n\r\nexport class EventsManager {\r\n\tstatic create(gantt: any) {\r\n\t\treturn new EventsManager(gantt);\r\n\t}\r\n\tprivate _mouseDown: boolean = false;\r\n\tprivate _startPoint: IPoint;\r\n\tprivate _scrollState: IPoint;\r\n\tprivate _originAutoscroll: boolean;\r\n\tprivate _domEvents: any;\r\n\tprivate _timeline: any;\r\n\tprivate _gantt: any;\r\n\tprivate _trace: IPoint[];\r\n\tprivate _originalReadonly: boolean;\r\n\r\n\tconstructor(gantt: any) {\r\n\t\tthis._gantt = gantt;\r\n\t\tthis._domEvents = gantt._createDomEventScope();\r\n\t\tthis._trace = [];\r\n\t}\r\n\r\n\tdestructor() {\r\n\t\tthis._domEvents.detachAll();\r\n\t}\r\n\r\n\tattach(timeline: any): void {\r\n\t\tthis._timeline = timeline;\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis._domEvents.attach(timeline.$task, \"mousedown\", (event) => {\r\n\t\t\tif (!gantt.config.drag_timeline) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst { useKey,ignore, enabled } = gantt.config.drag_timeline;\r\n\t\t\tif(enabled === false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlet filterTargets = \".gantt_task_line, .gantt_task_link\";\r\n\t\t\tif(ignore !== undefined) {\r\n\t\t\t\tif(ignore instanceof Array){\r\n\t\t\t\t\tfilterTargets = ignore.join(\", \");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfilterTargets = ignore;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (filterTargets) {\r\n\t\t\t\tif (gantt.utils.dom.closest(event.target, filterTargets)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (useKey && event[useKey] !== true) { return; }\r\n\r\n\t\t\tthis._startDrag(event);\r\n\t\t});\r\n\r\n\t\tthis._domEvents.attach(document, \"keydown\", (event) => {\r\n\t\t\tif (!gantt.config.drag_timeline) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst { useKey } = gantt.config.drag_timeline;\r\n\t\t\tif (useKey && event[useKey] === true) {\r\n\t\t\t\tthis._applyDndReadyStyles();\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._domEvents.attach(document, \"keyup\", (event) => {\r\n\t\t\tif (!gantt.config.drag_timeline) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst { useKey } = gantt.config.drag_timeline;\r\n\t\t\tif (useKey && event[useKey] === false) {\r\n\t\t\t\tthis._clearDndReadyStyles();\r\n\t\t\t\tthis._stopDrag(event);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._domEvents.attach(document, \"mouseup\", (event) => {\r\n\t\t\tthis._stopDrag(event);\r\n\t\t});\r\n\t\tthis._domEvents.attach(gantt.$root, \"mouseup\", (event) => {\r\n\t\t\tthis._stopDrag(event);\r\n\t\t});\r\n\t\tthis._domEvents.attach(document, \"mouseleave\", (event) => {\r\n\t\t\tthis._stopDrag(event);\r\n\t\t});\r\n\t\tthis._domEvents.attach(gantt.$root, \"mouseleave\", (event) => {\r\n\t\t\tthis._stopDrag(event);\r\n\t\t});\r\n\r\n\t\tthis._domEvents.attach(gantt.$root, \"mousemove\", (event) => {\r\n\t\t\tif (!gantt.config.drag_timeline) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst { useKey } = gantt.config.drag_timeline;\r\n\t\t\tif (useKey && event[useKey] !== true) { return; }\r\n\t\t\t// GS-854. If we don't have useKey for the drag_timeline extension,\r\n\t\t\t// check the click_drag to not simultaneously use both extensions\r\n\t\t\tconst clickDrag = this._gantt.ext.clickDrag;\r\n\t\t\tconst clickDragUseKey = (this._gantt.config.click_drag || {}).useKey;\r\n\t\t\tif (clickDrag && clickDragUseKey) {\r\n\t\t\t\tif (!useKey && event[clickDragUseKey]) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (this._mouseDown === true) {\r\n\t\t\t\tthis._trace.push({ x: event.clientX, y: event.clientY });\r\n\t\t\t\tconst scrollPosition: IPoint = this._countNewScrollPosition({ x: event.clientX, y: event.clientY });\r\n\t\t\t\tthis._setScrollPosition(timeline, scrollPosition);\r\n\t\t\t\tthis._scrollState = scrollPosition;\r\n\t\t\t\tthis._startPoint = { x: event.clientX, y: event.clientY };\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate _calculateDirectionVector = () => {\r\n\t\tconst traceSteps = 10;\r\n\t\tif(this._trace.length >= traceSteps) {\r\n\t\t\tconst dots = this._trace.slice(this._trace.length - traceSteps);\r\n\r\n\t\t\tconst vectors = [];\r\n\t\t\tfor(let i = 1; i < dots.length; i++) {\r\n\t\t\t\tvectors.push({\r\n\t\t\t\t\tx: dots[i].x - dots[i - 1].x,\r\n\t\t\t\t\ty: dots[i].y - dots[i - 1].y\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tconst resultVector = {x:0, y:0};\r\n\r\n\t\t\tvectors.forEach((vector) => {\r\n\t\t\t\tresultVector.x += vector.x;\r\n\t\t\t\tresultVector.y += vector.y;\r\n\t\t\t});\r\n\r\n\t\t\tconst magnitude = Math.sqrt(resultVector.x*resultVector.x + resultVector.y*resultVector.y);\r\n\t\t\tconst angleDegrees = Math.atan2(Math.abs(resultVector.y), Math.abs(resultVector.x)) * 180 / Math.PI;\r\n\r\n\t\t\treturn {\r\n\t\t\t\tmagnitude,\r\n\t\t\t\tangleDegrees\r\n\t\t\t};\r\n\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate _applyDndReadyStyles = (): void => {\r\n\t\tthis._timeline.$task.classList.add(\"gantt_timeline_move_available\");\r\n\t}\r\n\r\n\tprivate _clearDndReadyStyles = (): void => {\r\n\t\tthis._timeline.$task.classList.remove(\"gantt_timeline_move_available\");\r\n\t}\r\n\r\n\tprivate _getScrollPosition = (timeline: any): IPoint => {\r\n\t\tconst gantt = this._gantt;\r\n\t\treturn {\r\n\t\t\tx: gantt.$ui.getView(timeline.$config.scrollX).getScrollState().position,\r\n\t\t\ty: gantt.$ui.getView(timeline.$config.scrollY).getScrollState().position\r\n\t\t};\r\n\t}\r\n\tprivate _countNewScrollPosition = (coords: IPoint): IPoint => {\r\n\t\tconst vector = this._calculateDirectionVector();\r\n\t\tlet shiftX = this._startPoint.x - coords.x;\r\n\t\tlet shiftY = this._startPoint.y - coords.y;\r\n\t\tif(vector){\r\n\t\t\tif(vector.angleDegrees < 15){\r\n\t\t\t\tshiftY = 0;\r\n\t\t\t} else if(vector.angleDegrees > 75){\r\n\t\t\t\tshiftX = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst result = {\r\n\t\t\tx: this._scrollState.x + shiftX,\r\n\t\t\ty: this._scrollState.y + shiftY\r\n\t\t};\r\n\t\treturn result;\r\n\t}\r\n\tprivate _setScrollPosition = (timeline: any, coords: IPoint): void => {\r\n\t\tconst gantt = this._gantt;\r\n\t\trequestAnimationFrame(() => {\r\n\t\t\tgantt.scrollLayoutCell(timeline.$id, coords.x, coords.y);\r\n\t\t});\r\n\t}\r\n\tprivate _stopDrag = (event: Event): void => {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis._trace = [];\r\n\t\tgantt.$root.classList.remove(\"gantt_noselect\");\r\n\r\n\t\tif(this._originalReadonly !== undefined){\r\n\t\t\tgantt.config.readonly = this._originalReadonly;\r\n\t\t}\r\n\r\n\t\tif(this._originAutoscroll !== undefined){\r\n\t\t\tgantt.config.autoscroll = this._originAutoscroll;\r\n\t\t}\r\n\r\n\t\tif(gantt.config.drag_timeline){\r\n\t\t\tconst { useKey } = gantt.config.drag_timeline;\r\n\t\t\tif (useKey && event[useKey] !== true) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._mouseDown = false;\r\n\t}\r\n\r\n\tprivate _startDrag = (event: any) : void => {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis._originAutoscroll = gantt.config.autoscroll;\r\n\t\tgantt.config.autoscroll = false;\r\n\r\n\t\tgantt.$root.classList.add(\"gantt_noselect\");\r\n\t\tthis._originalReadonly = gantt.config.readonly;\r\n\t\tgantt.config.readonly = true;\r\n\r\n\t\tthis._trace = [];\r\n\t\tthis._mouseDown = true;\r\n\t\tconst { x, y } = this._getScrollPosition(this._timeline);\r\n\t\tthis._scrollState = { x, y };\r\n\t\tthis._startPoint = { x: event.clientX, y: event.clientY };\r\n\t\tthis._trace.push(this._startPoint);\r\n\t}\r\n}","import { EventsManager } from \"./eventsManager\";\r\nexport default function(gantt: any){\r\n\tif (!gantt.ext){\r\n\t\tgantt.ext = {};\r\n\t}\r\n\r\n\tgantt.ext.dragTimeline = {\r\n\t\tcreate: () => EventsManager.create(gantt)\r\n\t};\r\n\r\n\tgantt.config.drag_timeline = {\r\n\t\tenabled: true\r\n\t};\r\n}","import * as eventable from \"../../utils/eventable\";\r\nimport { isEventable } from \"../../utils/helpers\";\r\n\r\nexport interface ISelectedRegionConfig {\r\n\tclassName?: string;\r\n\trender?: (startPoint: IPoint, endPoint: IPoint) => HTMLElement;\r\n\tviewPort?: HTMLElement;\r\n\tuseRequestAnimationFrame: boolean;\r\n\tcallback?: (startPoint: IPoint, endPoint: IPoint, startDate: Date, endDate: Date, tasksByDate: any[], tasksByIndex: any[]) => void;\r\n\tsingleRow: boolean;\r\n}\r\n\r\ninterface ICoordinates {\r\n\tleft: number;\r\n\ttop: number;\r\n}\r\n\r\nexport interface IPoint {\r\n\tabsolute: ICoordinates;\r\n\trelative: ICoordinates;\r\n}\r\n\r\nexport class SelectedRegion {\r\n\trender: () => void;\r\n\tprivate _viewPort: HTMLElement & eventable;\r\n\tprivate _el: HTMLElement = document.createElement(\"div\");\r\n\tprivate _callback: (startPoint: IPoint, endPoint: IPoint, startDate: Date, endDate: Date, tasksByDate: any[], tasksByIndex: any[]) => void;\r\n\tprivate _startPoint: IPoint;\r\n\tprivate _endPoint: IPoint;\r\n\tprivate _positionPoint: IPoint;\r\n\tprivate _useRequestAnimationFrame: boolean;\r\n\tprivate _startDate: Date;\r\n\tprivate _endDate: Date;\r\n\tprivate _singleRow: boolean;\r\n\tprivate _gantt: any;\r\n\tprivate _view: any;\r\n\r\n\tconstructor(config: ISelectedRegionConfig, gantt: any, view: any) {\r\n\t\tthis._gantt = gantt;\r\n\t\tthis._view = view;\r\n\t\tthis._viewPort = config.viewPort;\r\n\t\tthis._el.classList.add(config.className);\r\n\t\tif (typeof config.callback === \"function\") {\r\n\t\t\tthis._callback = config.callback;\r\n\t\t}\r\n\r\n\t\tthis.render = () => {\r\n\t\t\tlet node;\r\n\t\t\tif(config.render){\r\n\t\t\t\tnode = config.render(this._startPoint, this._endPoint);\r\n\t\t\t}else{\r\n\t\t\t\tnode = this.defaultRender(this._startPoint, this._endPoint);\r\n\t\t\t}\r\n\r\n\t\t\tif(node !== this._el){\r\n\t\t\t\tif(this._el && this._el.parentNode){\r\n\t\t\t\t\tthis._el.parentNode.removeChild(this._el);\r\n\t\t\t\t}\r\n\t\t\t\tthis._el = node;\r\n\t\t\t}\r\n\r\n\t\t\tif (config.className !== \"\") {\r\n\t\t\t\tthis._el.classList.add(config.className);\r\n\t\t\t}\r\n\t\t\tthis.draw();\r\n\t\t};\r\n\r\n\t\tif (!isEventable(this._viewPort)) {\r\n\t\t\teventable(this._viewPort);\r\n\t\t}\r\n\t\tthis._singleRow = config.singleRow;\r\n\t\tthis._useRequestAnimationFrame = config.useRequestAnimationFrame;\r\n\t}\r\n\r\n\tdefaultRender = (start: IPoint, end: IPoint) => {\r\n\t\tif(!this._el){\r\n\t\t\tthis._el = document.createElement(\"div\");\r\n\t\t}\r\n\t\tconst node = this._el;\r\n\t\t// const gantt = this._gantt;\r\n\r\n\t\tconst top = Math.min(start.relative.top, end.relative.top);\r\n\t\tconst bottom = Math.max(start.relative.top, end.relative.top);\r\n\t\tconst left = Math.min(start.relative.left, end.relative.left);\r\n\t\tconst right = Math.max(start.relative.left, end.relative.left);\r\n\r\n\t\tif (this._singleRow) {\r\n\t\t\tconst pos = this._getTaskPositionByTop(this._startPoint.relative.top);\r\n\t\t\tnode.style.height = pos.height + \"px\";\r\n\t\t\tnode.style.top = pos.top + \"px\";\r\n\t\t} else {\r\n\t\t\tnode.style.height = Math.abs(bottom - top) + \"px\";\r\n\t\t\tnode.style.top = top + \"px\";\r\n\t\t}\r\n\t\tnode.style.width = Math.abs(right - left) + \"px\";\r\n\t\tnode.style.left = left + \"px\";\r\n\t\treturn node;\r\n\t}\r\n\r\n\tdraw() {\r\n\t\tif (this._useRequestAnimationFrame) {\r\n\t\t\treturn requestAnimationFrame(() => {\r\n\t\t\t\tthis._viewPort.appendChild(this.getElement());\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis._viewPort.appendChild(this.getElement());\r\n\t\t}\r\n\t}\r\n\r\n\tclear() {\r\n\t\tif (this._useRequestAnimationFrame) {\r\n\t\t\treturn requestAnimationFrame(() => {\r\n\t\t\t\tif (!this._el.parentNode) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._viewPort.removeChild(this._el);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tif (!this._el.parentNode) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._viewPort.removeChild(this._el);\r\n\t\t}\r\n\t}\r\n\r\n\tgetElement() {\r\n\t\treturn this._el;\r\n\t}\r\n\r\n\tgetViewPort() {\r\n\t\treturn this._viewPort;\r\n\t}\r\n\r\n\tsetStart(startPoint: IPoint) {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis._startPoint = startPoint;\r\n\t\tthis._startDate = gantt.dateFromPos(this._startPoint.relative.left);\r\n\t\tthis._viewPort.callEvent(\"onBeforeDrag\", [this._startPoint]);\r\n\t}\r\n\r\n\tsetEnd(endPoint: IPoint) {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis._endPoint = endPoint;\r\n\t\tif (this._singleRow) {\r\n\t\t\tconst pos = this._getTaskPositionByTop(this._startPoint.relative.top);\r\n\t\t\tthis._endPoint.relative.top = pos.top;\r\n\t\t}\r\n\t\tthis._endDate = gantt.dateFromPos(this._endPoint.relative.left);\r\n\t\tif (this._startPoint.relative.left > this._endPoint.relative.left) {\r\n\t\t\tthis._positionPoint = {\r\n\t\t\t\trelative: { left: this._endPoint.relative.left, top: this._positionPoint.relative.top },\r\n\t\t\t\tabsolute: { left: this._endPoint.absolute.left, top: this._positionPoint.absolute.top }\r\n\t\t\t};\r\n\t\t}\r\n\t\tif (this._startPoint.relative.top > this._endPoint.relative.top) {\r\n\t\t\tthis._positionPoint = {\r\n\t\t\t\trelative: { left: this._positionPoint.relative.left, top: this._endPoint.relative.top },\r\n\t\t\t\tabsolute: { left: this._positionPoint.absolute.left, top: this._endPoint.absolute.top }\r\n\t\t\t};\r\n\t\t}\r\n\r\n\r\n\t\tthis._viewPort.callEvent(\"onDrag\", [this._startPoint, this._endPoint]);\r\n\t}\r\n\r\n\tsetPosition(positionPoint: IPoint) {\r\n\t\tthis._positionPoint = positionPoint;\r\n\t}\r\n\r\n\tdragEnd(endPoint: IPoint) {\r\n\t\tconst gantt = this._gantt;\r\n\t\tif(endPoint.relative.left < 0){\r\n\t\t\tendPoint.relative.left = 0;\r\n\t\t}\r\n\t\tthis._viewPort.callEvent(\"onBeforeDragEnd\", [this._startPoint, endPoint]);\r\n\t\tthis.setEnd(endPoint);\r\n\t\t// GS-1422. The endDate can be null if we drag the mouse outside the Gantt container\r\n\t\tthis._endDate = this._endDate || gantt.getState().max_date;\r\n\r\n\t\tif (this._startDate.valueOf() > this._endDate.valueOf()) {\r\n\t\t\t[ this._startDate, this._endDate ] = [ this._endDate, this._startDate ];\r\n\t\t}\r\n\t\tthis.clear();\r\n\t\tconst tasksByTime = gantt.getTaskByTime(this._startDate, this._endDate);\r\n\t\tconst tasksByIndex = this._getTasksByTop(this._startPoint.relative.top, this._endPoint.relative.top);\r\n\r\n\t\tthis._viewPort.callEvent(\"onDragEnd\", [this._startPoint, this._endPoint]);\r\n\t\tif (this._callback) {\r\n\t\t\tthis._callback(this._startPoint, this._endPoint, this._startDate, this._endDate, tasksByTime, tasksByIndex);\r\n\t\t}\r\n\t}\r\n\r\n\tgetInBounds() {\r\n\t\treturn this._singleRow;\r\n\t}\r\n\r\n\tprivate _getTasksByTop(start: number, end:number) {\r\n\t\tconst gantt = this._gantt;\r\n\t\tlet startValue = start;\r\n\t\tlet endValue = end;\r\n\t\tif (start > end) {\r\n\t\t\tstartValue = end;\r\n\t\t\tendValue = start;\r\n\t\t}\r\n\t\tconst startIndex = this._getTaskPositionByTop(startValue).index;\r\n\t\tconst endIndex = this._getTaskPositionByTop(endValue).index;\r\n\t\tconst result = [];\r\n\t\tfor (let i = startIndex; i <= endIndex; i++) {\r\n\t\t\tconst task = gantt.getTaskByIndex(i);\r\n\t\t\tif (task) {\r\n\t\t\t\tresult.push(gantt.getTaskByIndex(i));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprivate _getTaskPositionByTop(top: number){\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst view = this._view;\r\n\t\tconst index = view.getItemIndexByTopPosition(top);\r\n\t\tconst task = gantt.getTaskByIndex(index);\r\n\t\tif(task){\r\n\t\t\tconst height = view.getItemHeight(task.id);\r\n\t\t\tconst itemTop = view.getItemTop(task.id);\r\n\t\t\treturn {\r\n\t\t\t\ttop: itemTop || 0,\r\n\t\t\t\theight: height || 0,\r\n\t\t\t\tindex,\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tconst dataHeight = view.getTotalHeight();\r\n\t\t\treturn {\r\n\t\t\t\ttop: top > dataHeight ? dataHeight : 0,\r\n\t\t\t\theight: gantt.config.row_height,\r\n\t\t\t\tindex: top > dataHeight ? gantt.getTaskCount() : 0,\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n}","import * as domHelpers from \"../../core/ui/utils/dom_helpers\";\r\nimport { SelectedRegion } from \"./selectedRegion\";\r\n\r\nexport class EventsManager {\r\n\tprivate _mouseDown: boolean = false;\r\n\tprivate _domEvents: any;\r\n\tprivate _originPosition: string;\r\n\tprivate _gantt: any;\r\n\tprivate _restoreOriginPosition: () => void;\r\n\tconstructor(gantt: any) {\r\n\t\tthis._gantt = gantt;\r\n\t\tthis._domEvents = gantt._createDomEventScope();\r\n\t}\r\n\r\n\tattach(selectedRegion: SelectedRegion, useKey?: \"shiftKey\" | \"ctrlKey\" | \"altKey\", ignore?: any): void {\r\n\t\tconst gantt = this._gantt;\r\n\t\tconst _target = selectedRegion.getViewPort();\r\n\t\tthis._originPosition = window.getComputedStyle(_target).display;\r\n\t\tthis._restoreOriginPosition = () => {\r\n\t\t\t_target.style.position = this._originPosition;\r\n\t\t};\r\n\t\tif (this._originPosition === \"static\") {\r\n\t\t\t_target.style.position = \"relative\";\r\n\t\t}\r\n\t\tconst state = gantt.$services.getService(\"state\");\r\n\t\tstate.registerProvider(\"clickDrag\", () => {\r\n\t\t\tconst result = { autoscroll: false };\r\n\t\t\treturn result;\r\n\t\t});\r\n\r\n\r\n\t\tlet scheduledDndCoordinates = null;\r\n\t\tconst startDragAndDrop = () => {\r\n\t\t\tif (!scheduledDndCoordinates) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._mouseDown = true;\r\n\t\t\tselectedRegion.setStart(gantt.copy(scheduledDndCoordinates));\r\n\t\t\tselectedRegion.setPosition(gantt.copy(scheduledDndCoordinates));\r\n\t\t\tselectedRegion.setEnd(gantt.copy(scheduledDndCoordinates));\r\n\t\t\tscheduledDndCoordinates = null;\r\n\t\t};\r\n\r\n\t\tthis._domEvents.attach(_target, \"mousedown\", (event) => {\r\n\t\t\tscheduledDndCoordinates = null;\r\n\t\t\tlet filterTargets = \".gantt_task_line, .gantt_task_link\";\r\n\t\t\tif (ignore !== undefined) {\r\n\t\t\t\tif (ignore instanceof Array) {\r\n\t\t\t\t\tfilterTargets = ignore.join(\", \");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfilterTargets = ignore;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (filterTargets) {\r\n\t\t\t\tif (gantt.utils.dom.closest(event.target, filterTargets)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstate.registerProvider(\"clickDrag\", () => {\r\n\t\t\t\tconst result = { autoscroll: this._mouseDown };\r\n\t\t\t\treturn result;\r\n\t\t\t});\r\n\r\n\t\t\tif (useKey && event[useKey] !== true) { return; }\r\n\t\t\tscheduledDndCoordinates = this._getCoordinates(event, selectedRegion);\r\n\t\t});\r\n\t\tconst eventElement = domHelpers.getRootNode(gantt.$root) || document.body;\r\n\t\tthis._domEvents.attach(eventElement, \"mouseup\", (event) => {\r\n\t\t\tscheduledDndCoordinates = null;\r\n\t\t\tif (useKey && event[useKey] !== true) { return; }\r\n\t\t\tif (this._mouseDown === true) {\r\n\t\t\t\tthis._mouseDown = false;\r\n\t\t\t\tconst coordinates = this._getCoordinates(event, selectedRegion);\r\n\t\t\t\tselectedRegion.dragEnd(coordinates);\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._domEvents.attach(_target, \"mousemove\", (event) => {\r\n\t\t\tif (useKey && event[useKey] !== true) { return; }\r\n\t\t\t// GS-854. If we don't have useKey for the click_drag extension,\r\n\t\t\t// check the drag_timeline to not simultaneously use both extensions\r\n\t\t\tconst dragTimeline = this._gantt.ext.clickDrag;\r\n\t\t\tconst dragTimelineUseKey = (this._gantt.config.drag_timeline || {}).useKey;\r\n\t\t\tif (dragTimeline && dragTimelineUseKey) {\r\n\t\t\t\tif (!useKey && event[dragTimelineUseKey]) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlet coordinates = null;\r\n\t\t\tif(!this._mouseDown && scheduledDndCoordinates){\r\n\t\t\t\tcoordinates = this._getCoordinates(event, selectedRegion);\r\n\t\t\t\tif(Math.abs(scheduledDndCoordinates.relative.left - coordinates.relative.left) > 5){\r\n\t\t\t\t\t// add small threshold not to start dnd on simple click\r\n\t\t\t\t\tstartDragAndDrop();\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (this._mouseDown === true) {\r\n\t\t\t\tcoordinates = this._getCoordinates(event, selectedRegion);\r\n\t\t\t\tselectedRegion.setEnd(coordinates);\r\n\t\t\t\tselectedRegion.render();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tdetach(): void {\r\n\t\tconst gantt = this._gantt;\r\n\t\tthis._domEvents.detachAll();\r\n\t\tif(this._restoreOriginPosition){\r\n\t\t\tthis._restoreOriginPosition();\r\n\t\t}\r\n\r\n\t\tconst state = gantt.$services.getService(\"state\");\r\n\t\tstate.unregisterProvider(\"clickDrag\");\r\n\t}\r\n\r\n\tdestructor(): void {\r\n\t\tthis.detach();\r\n\t}\r\n\r\n\tprivate _getCoordinates(event: MouseEvent, selectedRegion: SelectedRegion) {\r\n\t\tconst viewPort = selectedRegion.getViewPort();\r\n\t\tconst viewPortBounds = viewPort.getBoundingClientRect();\r\n\t\tconst { clientX, clientY } = event;\r\n\t\tconst result = {\r\n\t\t\tabsolute: {\r\n\t\t\t\tleft: clientX,\r\n\t\t\t\ttop: clientY,\r\n\t\t\t},\r\n\t\t\trelative: {\r\n\t\t\t\tleft: clientX - viewPortBounds.left + viewPort.scrollLeft,\r\n\t\t\t\ttop: clientY - viewPortBounds.top + viewPort.scrollTop\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn result;\r\n\t}\r\n}","import { EventsManager } from \"./eventsManager\";\r\nimport { ISelectedRegionConfig, SelectedRegion } from \"./selectedRegion\";\r\n\r\nexport default function(gantt: any){\r\n\tif (!gantt.ext) {\r\n\t\tgantt.ext = {};\r\n\t}\r\n\r\n\tconst defaultConfig: ISelectedRegionConfig = {\r\n\t\tclassName: \"gantt_click_drag_rect\",\r\n\t\tuseRequestAnimationFrame: true,\r\n\t\tcallback: undefined,\r\n\t\tsingleRow: false\r\n\t};\r\n\r\n\tconst eventsManager = new EventsManager(gantt);\r\n\r\n\tgantt.ext.clickDrag = eventsManager;\r\n\r\n\tgantt.attachEvent(\"onGanttReady\", () => {\r\n\t\tconst config: ISelectedRegionConfig = { viewPort: gantt.$task_data, ...defaultConfig };\r\n\t\tif (gantt.config.click_drag){\r\n\t\t\tconst clickDrag = gantt.config.click_drag;\r\n\t\t\tconfig.render = clickDrag.render || defaultConfig.render;\r\n\t\t\tconfig.className = clickDrag.className || defaultConfig.className;\r\n\t\t\tconfig.callback = clickDrag.callback || defaultConfig.callback;\r\n\t\t\tconfig.viewPort = clickDrag.viewPort || gantt.$task_data;\r\n\t\t\tconfig.useRequestAnimationFrame = clickDrag.useRequestAnimationFrame === undefined ?\r\n\t\t\t\tdefaultConfig.useRequestAnimationFrame : clickDrag.useRequestAnimationFrame;\r\n\r\n\t\t\tconfig.singleRow = clickDrag.singleRow === undefined ? defaultConfig.singleRow : clickDrag.singleRow;\r\n\t\t\tconst timeline = gantt.$ui.getView(\"timeline\");\r\n\t\t\tconst selectedRegion = new SelectedRegion(config, gantt, timeline);\r\n\t\t\tgantt.ext.clickDrag.attach(selectedRegion, clickDrag.useKey, clickDrag.ignore);\r\n\t\t}\r\n\t});\r\n\r\n\tgantt.attachEvent(\"onDestroy\", () => {\r\n\t\teventsManager.destructor();\r\n\t});\r\n\r\n}","\r\nimport click_drag from \"./click_drag\";\r\nimport drag_timeline from \"./drag_timeline\";\r\nimport export_api from \"./export_api\";\r\nimport fullscreen from \"./fullscreen\";\r\nimport * as keyboard_navigation from \"./keyboard_navigation\";\r\nimport * as marker from \"./marker\";\r\nimport * as multiselect from \"./multiselect\";\r\nimport quick_info from \"./quick_info\";\r\nimport tooltip from \"./tooltip\";\r\nimport undo from \"./undo\";\r\n\r\nexport default {\r\n\tclick_drag,\r\n\tdrag_timeline,\r\n\tfullscreen,\r\n\tkeyboard_navigation,\r\n\tquick_info,\r\n\ttooltip,\r\n\tundo,\r\n\tmarker,\r\n\tmultiselect,\r\n\texport_api,\r\n};","import extensions from \"./ext/extensions_gpl\";\r\nimport * as base from \"./factory/make_instance_web\";\r\nimport * as scope from \"./utils/global\";\r\nconst gantt = (scope as any).gantt = base(extensions);\r\n\r\nexport default gantt;\r\nexport { gantt };"],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_broadway.css b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_broadway.css
new file mode 100644
index 0000000..3a0a6c1
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_broadway.css
@@ -0,0 +1 @@
+.gantt_grid{background-color:#d6d6d6}.gantt_grid_scale .gantt_grid_head_cell{border-top:none!important;border-right:1px solid #4f4f4f!important;border-left:1px solid #5b5b5b!important}.gantt_popup_title{background-color:#4f4f4f;background-size:5px 5px;background-size:4px 4px;background-position:0 0,2px 2px;background-image:linear-gradient(45deg,hsla(0,0%,100%,.05) 25%,transparent 0,transparent 75%,hsla(0,0%,100%,.05) 0,hsla(0,0%,100%,.05)),linear-gradient(45deg,hsla(0,0%,100%,.05) 25%,transparent 0,transparent 75%,hsla(0,0%,100%,.05) 0,hsla(0,0%,100%,.05));color:#e1e1e1;font-size:14px}.gantt_grid_data .gantt_row,.gantt_grid_data .gantt_row.odd{background-color:#dbdbdb;border-top:1px solid #f6f6f6;border-bottom:1px solid #bababa}.gantt_grid_data .gantt_row .gantt_cell,.gantt_grid_data .gantt_row.odd .gantt_cell{border-right:none}.gridHoverStyle{border-top:1px solid #ededed;background-color:#ededed}.gridSelection{border-top-color:#fff087}.gridSelection,.timelineSelection{background-color:#fff3a1}.gantt_cell .gantt_tree_icon.gantt_folder_closed,.gantt_cell .gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODhBMDIwQzhDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODhBMDIwQzlDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEEwMjBDNkNFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEEwMjBDN0NFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PntuzoIAAACySURBVHjaYmTAAjo6Ov4z4AAVFRWM6GJM6ALt7e0OUCYjFowsDwfIEjDbDRgZGSf8//8fUzEj4wGgeAGQeQFJ+CIj0IALQEl9BjIB0NADTJQYAHWdAxMDFQBVDGEB+ukgxYYAcQNSzCCnh4NY0o89VkOAAbMfV5gBNR0AytuDXAs01AEUxbhcwoAj1c4HaUTi9wMNwWnb/0ERO0xA/z6k0IyP4NgBGpRApgEfgHgBQIABAAcyQOF3e6FiAAAAAElFTkSuQmCC)}.gantt_cell .gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkQ2NjJFM0ZDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkQ2NjJFNDBDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRDY2MkUzRENFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRDY2MkUzRUNFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhnnqLUAAAExSURBVHjanFPtUcMwDI28AB0BJkg6AWEEJqAbxPxLJkh+phuUDdiAbtAwAYxAJ0jf60k51ecWDt3pZFtPn5akSKjv+3uIBlyLSMW3eZ4niD1423Xdt8dLYjzCqCluEJyNcPJq9+CMJzMGaAtet20rZJ7Bb+eIIhHYw0UGLvIRwBoRplx04CrgWModgwAXhTXj8Usjr73xMAwzJbNInBwU/8ASoqV9LbInYqwc2tJBrZdd8XcaVT4GpFOa52topL1Ks9CGVuGXL/vU40fqZPlGA7E5GX1NvQ7U4sSw1AWdMNIm07CfxIn1K6rcB2sI5yCXhXPyjPO7fuOLNfNikAAi+OnWILEUYFfLICWjXGptO12cyRk20G+sduiq/y7TOXJ2G906R13n0n0nmz2m63wSYAB0aMIyVTQbywAAAABJRU5ErkJggg==)}.chartHeaderBg{background-color:#dbdbdb}.gantt_task .gantt_task_scale .gantt_scale_cell{border-left:1px solid #f6f6f6;border-right:1px solid #bababa;color:#494949;font-size:14px}.taskProgressStyle{border-right:1px solid #1cb3fb;box-shadow:inset -1px 0 0 1px #04a1eb}.gantt_task_line{background-size:4px 4px;background-image:linear-gradient(135deg,hsla(0,0%,100%,.2) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.2) 0,hsla(0,0%,100%,.2) 75%,transparent 0,transparent);background-image:-moz-linear-gradient(0deg,transparent,transparent)}.gantt_task_line .gantt_task_content{text-align:left;font-weight:700;padding:0 8px;box-sizing:border-box}.gantt_task_link .gantt_link_arrow_right{border-width:5px;margin-top:-1px}.gantt_task_link .gantt_link_arrow_left{border-width:5px;margin-left:-3px;margin-top:-2px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_up{border-width:5px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:10px;margin-left:-8px;width:16px}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51;border-right:1px solid #5abc65;box-shadow:inset -1px 0 0 1px #45a94f}.gantt_cal_light{background-color:#fff;border:none!important}.gantt_cal_light .gantt_cal_lsection{color:#959595}.gantt_cal_light .gantt_cal_larea{border-bottom:none}.gantt_cal_light .gantt_cal_ltitle{background-color:#4f4f4f;background-size:5px 5px;background-size:4px 4px;background-position:0 0,2px 2px;background-image:linear-gradient(45deg,hsla(0,0%,100%,.05) 25%,transparent 0,transparent 75%,hsla(0,0%,100%,.05) 0,hsla(0,0%,100%,.05)),linear-gradient(45deg,hsla(0,0%,100%,.05) 25%,transparent 0,transparent 75%,hsla(0,0%,100%,.05) 0,hsla(0,0%,100%,.05));font-size:14px;color:#e1e1e1;position:relative;padding-top:12px;padding-bottom:12px;font-weight:400}.gantt_cal_light .gantt_cal_ltitle .gantt_title{font-size:13px}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.buttonBg{background:#fff}.gantt_btn_set.gantt_save_btn_set{background:#46ad51;text-shadow:0 -1px 0 #307738;color:#fff}.gantt_btn_set.gantt_delete_btn_set{margin-left:0;text-shadow:0 -1px 0 #6f6f6f;background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_cal_ltitle .gantt_cancel_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYLEgAjh/DRnAAAAMdJREFUGNN1kcsNwjAQRF9iCkgJdJCUkBJQpDkDFUALdBAqAM6WQglQAlxzSglQgAUH1tIKgS9ezzztz0Vd18QYW0lXfpzsFeM49sAGOEpaf0FHYAnsS6evYoy9g3qDAB6Flb4BtYk568Huu6RmBhBCaFNKV4MPrso9hNAClABd1z2ABfB00BNYmEf5NeTrT/wBh2GogDNQOa8CzuZ9QOuvccPkgZqU0gXA7xFgL2nr1pP1ne/xlCEAi0/5nfc4lzT9+cK5pOkNX8hRT8hMyVwAAAAASUVORK5CYII=);width:30px;top:0;right:0;background-position:6px 12px;background-repeat:no-repeat;position:absolute;height:100%}.gantt_popup_button.gantt_ok_button{background:#46ad51;text-shadow:0 -1px 0 #307738;color:#fff;font-weight:700}.gantt_popup_button.gantt_cancel_button{font-weight:700}.gantt_popup_shadow{box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_qi_big_icon.icon_edit{color:#454544}.gantt_qi_big_icon.icon_delete{text-shadow:0 -1px 0 #6f6f6f;background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff;font-weight:700}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-size:8pt;color:#494949}.gantt_container,.gantt_tooltip{background-color:#fff;font-family:Arial}.gantt_container{font-size:13px;border:1px solid #bababa;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#494949;font-size:12px;border-bottom:1px solid #bababa;box-sizing:border-box}.gantt_grid_scale{background-color:#4f4f4f;background-size:5px 5px;background-size:4px 4px;background-position:0 0,2px 2px;background-image:linear-gradient(45deg,hsla(0,0%,100%,.05) 25%,transparent 0,transparent 75%,hsla(0,0%,100%,.05) 0,hsla(0,0%,100%,.05)),linear-gradient(45deg,hsla(0,0%,100%,.05) 25%,transparent 0,transparent 75%,hsla(0,0%,100%,.05) 0,hsla(0,0%,100%,.05));color:#e1e1e1;font-size:14px}.gantt_task_scale,.gantt_task_vscroll{background-color:#dbdbdb}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #bababa}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #bababa;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:33px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYHCygkHejN0gAAAD1JREFUOMtjtN15mYESwIJLwvHo6v/I/P3WoYzY1DExUAiGgQGMtjsvYwQYsWC/dSjjcAmD0YREo0AkFgAASgkTQxnJ6ggAAAAASUVORK5CYII=);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{border-top:1px solid #ededed;background-color:#ededed}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#bababa;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#ebebeb;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #bababa;border-right:1px solid #bababa}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #bababa;border-bottom:1px solid #bababa;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #bababa;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAW0lEQVQ4T2NkoBJgpJI5DEPEoGnTpv0n5OWsrCwU32B4DWQIuiJshqKro7tBIK+iWEquiyg2CFugg102YC6CRRjFXsOZnMj1GoaBBA2CBSTFKZuQAbjkB1/uBwBrVFUTxDarVwAAAABJRU5ErkJggg==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAASElEQVQ4T2NkoBJgpJI5DEPEoGnTpv0n5OWsrCwU32B4DWQIuiJshqKrG8EGYQt0cHCMhhFqYiMrHcECkuKUTcgAXPKDL/cDAMbOURO+6QJ7AAAAAElFTkSuQmCC);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAs0lEQVQ4T62T0Q2EIBBEpQlzuaaMsQoqooqLsSljbMLLmMxmUXBR4U+Qt7Mzi2sqLVeJ00SgEMKWAnvvzYLyAyHfT5sU2fXDJSwCAXK8MI0/UTkva7IIFJsg3NSwnKdFoKtAWOQ1CN7CEqeTotE5L7QyJhmBcklZM4ZgTiAr3iOU3kD93ppO5SkMjB1EeXdBWoSkRql3YeIRe+cGvktS056JR9wsmeBUkujCfNXWCPC8GugPqn5ii/hV+FoAAAAASUVORK5CYII=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAfElEQVQ4T2NkoBJgpJI5DCgGTZ8+/T82gzMzMwlaCFcAM0RKQgyrI/0Dg/EahmIQyBB0DRvXr4W78tmLV1gtAbmYoEEgnciG4QpTogzCFyEwSyg2CBS2oCAZNQh3cA+hMAJ5AlcKxuVBlOgnNgVjMwyUrQjmamKLGaoZBAAOTFyLnFFW4wAAAABJRU5ErkJggg==)}.gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAeElEQVQ4T2NkoBJgRDZn+vTp/wmZm5mZiaIHph7DICkJMUJmMfgHBmMYhtUgbAo3rl+L4lp0NUQbBPI2umuRDaPIIFAYwAyjv0HoMQALM5JdhG4QLMxGDcKdyIdoGIE89OzFK4KZF5Rl8EY/QROQFGA1iBQD0NUCAJVjcxO0naAQAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#ffa011;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#ffa011}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#ffa011}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:Arial;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #bababa;background:#fff}.gantt_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.gantt_button,.gantt_popup_button{border:1px solid #bababa;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:10px}.gantt_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:4px;font-size:14px;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:1px solid #bababa;height:40px;line-height:40px;font-size:20px}.gantt_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.gantt-error,.gantt-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #bababa}.gantt-error{background-color:#d81b1b;border:1px solid #ff3c3c}.gantt-error div{background-color:#d81b1b;border:1px solid #940000;color:#fff}.gantt-warning{background-color:#f57c00;border:1px solid #ffa242}.gantt-warning div{background-color:#f57c00;border:1px solid #845030;color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:13px;color:#fff;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#04a4f0;border-right:1px solid #1cb3fb;box-shadow:inset -1px 0 0 1px #04a1eb}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:2px;position:absolute;box-sizing:border-box;background-color:#17b2fb;border:1px solid #049ae1;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;top:0;font-size:11px;font-size:12px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:8.75px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #04a4f0}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#ffbf5e;border-color:#ffa011}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:2.5px 0 2.5px 5px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#ffa011}.gantt_link_arrow_left{border-width:2.5px 5px 2.5px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#ffa011;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 2.5px 5px;border-color:transparent transparent #ffa011;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#ffa011;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:2.5px 5px 0 2.5px;border-top-color:#ffa011;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:100%;width:8px;z-index:1;top:-1px}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAq0lEQVQoz6WMsQnCABBFXyII9rqB7qDNZQdtsoWirmAltpnh0BkUfhOHEqLNiaAJIeZ19+//lxRFQR3ungKnOHd5nld1vbRhPALOkjaSNsAlsnaBu4+Bq6TVO5O0BK7xaxa4+xQoJS2+i5GV0fkVuPs8xjMaiN89uh+Buy+Bm6QJLUgaA7fYkJjZGjhJGtCBLMsqYIuZPf/FzJ4pPektSMzsAOyBYcftAzi+ANj8gShpeTzJAAAAAElFTkSuQmCC)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected{background-color:#fff3a1;border-top-color:#fff087}.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #04a4f0}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#db7dc5;border:0 solid #cd49ae;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;border-radius:6px;font-family:Arial;font-size:13px;border:1px solid #bababa;color:#494949;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:Arial;border:1px solid #bababa;font-size:13px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:Arial;font-size:13px;box-sizing:border-box;border:1px solid #bababa;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #bababa;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;border-radius:4px;border:0 solid #bababa;height:32px;font-weight:700;background:#fff;box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTBBQUI0RDhDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTBBQUI0RDlDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMEFBQjRENkNFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBMEFBQjREN0NFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdPZV0AAACtSURBVHjanJPbDYUgEESvtwJKoQRLoRNL0RK0ArUCS9AOpAMclDVkw0s2mQ9XcpwJY2OM+VWMgDQ9/CsAEtoh9W6skw+S0Akd5hl1J6kADJBwADs9j9MmIszQ5GJo793qf2nwLUYc0E7xONbaBmloZKAsgCCLW0p2qCsBEEQ6F33gcBbg304I1JYA+BWHQFlAqCcclAXEykaguQSQaiyBVEmbm8RfLFgzo3MJMACZSGxiH8QaMAAAAABJRU5ErkJggg==);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #bababa}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:13px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #bababa}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #bababa}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:70px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px;padding-bottom:1px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #ebebeb;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:1px solid #bababa;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#494949;background-color:#dbdbdb;border-bottom:1px solid #bababa}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:13px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#494949;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:6px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-top-left-radius:0;border-bottom-left-radius:6px;border-top-right-radius:0;border-bottom-right-radius:6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #bababa}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:13px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:13px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #bababa}.gantt_layout_cell_border_right{border-right:1px solid #bababa}.gantt_layout_cell_border_top{border-top:1px solid #bababa}.gantt_layout_cell_border_bottom{border-bottom:1px solid #bababa}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:Arial;font-size:13px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#dbf3fe}.gantt_popup_button.gantt_delete_button{background:#46ad51;text-shadow:0 -1px 0 #307738;color:#fff;font-weight:700}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_black.css b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_black.css
new file mode 100644
index 0000000..89feb71
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_black.css
@@ -0,0 +1 @@
+.gridHoverStyle,.gridSelection,.timelineSelection{background-color:#42425e}.gantt_grid_scale .gantt_grid_head_cell,.header_text_style{text-transform:uppercase;font-weight:700}.gantt_grid_scale .gantt_grid_head_cell{color:#c1c1c1;border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none;color:#fff}.gantt_grid_placeholder_text_explanation{color:#c1c1c1}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_up{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:10px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#000}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#c1c1c1;text-transform:uppercase;font-weight:700;border-right:1px solid #7e7e7e}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffee}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff5}.gantt_task_line.gantt_project{background-color:#006803;border:1px solid #006803}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#003b01}.gantt_popup_shadow,.modalBorder{border-color:#fff;box-shadow:inset 0 0 0 4px #0505ff;padding:4px}.buttonBg{background:#000}.gantt_cal_larea input,.gantt_cal_larea select,.gantt_cal_larea textarea{background:#000;color:#fff}.gantt_cal_larea .gantt_section_time{background:#000}.gantt_cal_larea .gantt_cal_lsection{color:#c1c1c1;font-size:14px}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.gantt_btn_set.gantt_cancel_btn_set{border:2px solid #fff;background:#000;color:#fff}.gantt_btn_set.gantt_save_btn_set{border:2px solid #76ff03;background:#000;color:#76ff03}.gantt_btn_set.gantt_delete_btn_set{border:2px solid #ffc400;background:#000;color:#ffc400}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_popup_button.gantt_ok_button{font-weight:700;border:2px solid #76ff03;background:#000;color:#76ff03}.gantt_popup_button.gantt_cancel_button{font-weight:700;color:#454544;border:2px solid #fff;background:#000;color:#fff}.gantt_popup_title{color:#fff}.gantt_qi_big_icon,.gantt_qi_big_icon.icon_edit{border:2px solid #fff;color:#fff}.gantt_qi_big_icon.icon_edit{background:#000}.gantt_qi_big_icon.icon_delete{border:2px solid #ffc400;background:#000;color:#ffc400}.gantt_tooltip{color:#fff;background:#000}.gantt_container,.gantt_tooltip{font-size:14px;border:1px solid #ff0}.gantt_container{background-color:#000;font-family:arial;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#fff;font-size:14px;border-bottom:1px solid #ff0;box-sizing:border-box}.gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{background-color:#000}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #ff0}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #ff0;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:33px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTk4MTk1QzM2ODc4MTFFNkFCNkFDOUZDNzZFNjgxRkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTk4MTk1QzQ2ODc4MTFFNkFCNkFDOUZDNzZFNjgxRkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFOTgxOTVDMTY4NzgxMUU2QUI2QUM5RkM3NkU2ODFGQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFOTgxOTVDMjY4NzgxMUU2QUI2QUM5RkM3NkU2ODFGQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Psrbi8sAAABYSURBVHjaYiz7z8xACWDCI/cBiP9D8QdyDODHwSbaAIq9QF8DkAMMhtEBuvwHZAP4ybCcn6pe+EiGXrAeFihHAIefkQHjME8HOAOJUCCz4DFAgBgXAAQYACAZFHJhx3hLAAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#42425e}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #7e7e7e;background-color:#000}.gantt_row.odd,.gantt_task_row.odd{background-color:#000}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#ff0;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#7e7e7e;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #ff0;border-right:1px solid #ff0}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #ff0;border-bottom:1px solid #ff0;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #7e7e7e;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:14px}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #ff0;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #7e7e7e}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjRFQzM4RjY2ODc3MTFFNjlGNUVCQUVCQzgyNkQ5RUUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjRFQzM4Rjc2ODc3MTFFNjlGNUVCQUVCQzgyNkQ5RUUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNEVDMzhGNDY4NzcxMUU2OUY1RUJBRUJDODI2RDlFRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNEVDMzhGNTY4NzcxMUU2OUY1RUJBRUJDODI2RDlFRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpdfxE8AAABySURBVHjaYjx48CADucDOzo6BiYFCwILE/k+iXkZ0A+CCRAC4ZXi9sNXO6T8IE+sFkAZcBqHwvQ/tYyDKBaQGIr7A/I8rnGjiAkYsNjMSZQBy4CAHHro4zb2A7CJGUg34T4kLGMnxAuP///8pCgOAAAMAxcMbX5R+AnUAAAAASUVORK5CYII=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qjg3ODU2QTg2ODc3MTFFNkE4MDlDMDMyQkRGNDgyQTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qjg3ODU2QTk2ODc3MTFFNkE4MDlDMDMyQkRGNDgyQTAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCODc4NTZBNjY4NzcxMUU2QTgwOUMwMzJCREY0ODJBMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCODc4NTZBNzY4NzcxMUU2QTgwOUMwMzJCREY0ODJBMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqbUJTYAAABdSURBVHjaYjx48CADucDOzo6BiYFCwILE/k+iXkZ0A+CCRAC4ZVT1AsNWOyeiNHkf2sdAGxcQGZgo4UQTFzCSbQBy4BALKPYC1cPgPyUGMJLjAsb///9T5AWAAAMAJ4wO9WM7P60AAAAASUVORK5CYII=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM2MUMyMzQ2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM2MUMyMzU2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzYxQzIzMjY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzYxQzIzMzY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlC39FYAAADWSURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYVWOtFYi/IIn9JxI7oBtUBMTcZDiiHt2gE1B2C55wQMZiQPwZ6iIHZINgMZIKxFxEuOQ1EE9GdxXIoANQLA7E2UR6qweIP6K7iAHJVaVAzEuEQe+BeBqyAAuUBrloBxB7APEnMgL+BXI6ygfiR2QY8hSIk1mQBG4BsTy5CZLx////VEnZAAEGAO3yNxaCOyWPAAAAAElFTkSuQmCC)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkZDMUZDMkI2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkZDMUZDMkM2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRkMxRkMyOTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRkMxRkMyQTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvnU3ycAAAB9SURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYTWJt1KChaNBzKP2fRAwCL5ANSgEJkOGYp0CczIIksA1PpiUIGP///0+VMAIIMAC11ShRpw6rxAAAAABJRU5ErkJggg==)}.gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDQwMTVBMUU2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDQwMTVBMUY2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowNDAxNUExQzY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowNDAxNUExRDY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsHnBgAAAAB8SURBVHjaYvz//z/Dpg3rGCgBfgFBDExoYp5A/AyI/+PB9dgMQzdoLhBLEnBAAzbDWND4MEMYsRjwH80wEGjE5SJSAIrLmBgoAw3UMghnGOEDjHjCjHouGjVoOBj0HCmNEMIg8AKXQSnIkgTAUyBOxpWytxFRjGAFAAEGAOcUI0XiA1ItAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#18ffff;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#18ffff}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#18ffff}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:arial;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;border-color:#fff;box-shadow:inset 0 0 0 4px #0505ff;padding:4px;font-family:arial;border-radius:6px;border:1px solid #ff0;background:#000}.gantt_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.gantt_button,.gantt_popup_button{border:1px solid #ff0;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#000}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:10px}.gantt_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:4px;font-size:16px;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:1px solid #c1c1c1;height:40px;line-height:40px;font-size:20px}.gantt_popup_text{margin:15px 15px 5px;font-size:16px;color:#fff;min-height:30px;border-radius:6px}.gantt-error,.gantt-info{font-size:16px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #ff0}.gantt-error{background-color:#b60000;border:1px solid #ff0}.gantt-error div{background-color:#b60000;border:1px solid transparent;color:#fff}.gantt-warning{background-color:#ef7f00;border:1px solid #ff0}.gantt-warning div{background-color:#ef7f00;border:1px solid transparent;color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:14px;color:#fff;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#0e2d7d}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:2px;position:absolute;box-sizing:border-box;background-color:#0042e9;border:1px solid #0042e9;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#fff;top:0;font-size:11px;font-size:13px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:8.75px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#18ffff}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #18ffff}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #0042e9}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #65ffff}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#65ffff;border-color:#18ffff}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#18ffff}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#18ffff;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 4px 6px;border-color:transparent transparent #18ffff;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#18ffff;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-top-color:#18ffff;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:100%;width:8px;z-index:1;top:-1px}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDQ2MjFDRjU2ODc4MTFFNjk2MEVEQjgxRDU3RThDRjQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDQ2MjFDRjY2ODc4MTFFNjk2MEVEQjgxRDU3RThDRjQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENDYyMUNGMzY4NzgxMUU2OTYwRURCODFENTdFOENGNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENDYyMUNGNDY4NzgxMUU2OTYwRURCODFENTdFOENGNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkyX4qoAAADrSURBVHjaYiz7z8yADXQx/mUCUr1QbjFQ3T9s6phwaOYEUqvkHBkLQBjIXg0VI2wAUKEIkNqrFc0YHLqDiQGEtWMYg0BiUDncBgAVqACpY5bVjJY+i5kYmNkYwNh7ERMDSAwkB1WDaQBQwoKJheGY+ywmVdsWoDAjkiogGyTmMZtJFajmOEgtigFAgSA2HoZ9wZuZRPVTGRlwAb0URgagGhGQWpAeqNkM+TySDL3BW5mYxQ1xa0YGL8//Z1jr8+/fl2cMRSAd/zMeMjPwyTGQBD49YmCYIf8X4gVSNSPrYWKgEIC9QIkBAAEGAKWdQQSo7CbHAAAAAElFTkSuQmCC);background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA+UlEQVQoz6WPP0tCURiHn9+5d7huEd5VKhIEwaEQlOtQS0HjbXBy6ANUkuEo4njAz9Bee5tu2bfoCwTRVsu5p6E7GHoJ8dneP7+H99XQB6zDyhlgmpeDoQ+ydXumIFwCHuOG+nFDfeAp7/0vsHJlYFY50WVnIjoTUTlVCszyWbHAyh0Ci1pX7ea9MCGYEJoDUeuqDSzynVWBlWspYHF0rWq9p5VT6z1xfKOqAl6tXOuPwMqlYcQ8GSnePxdF7J2JZKRyGDG3cimAgNtol2kyVrBzUBxe5vPN8zL22fcHdwL8xYOhFLMRX+/wfJX9vrBpeDlj2BIBfhvBD+rwPMTN8+ghAAAAAElFTkSuQmCC)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #18ffff;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#42425e}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#2d2d40}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #0e2d7d}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #006803}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#c06fce;border:0 solid #ef8eff;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#000;border-radius:6px;font-family:arial;border:1px solid #c1c1c1;color:#fff;font-size:14px;position:absolute;z-index:10001;width:550px;height:250px;border-color:#fff;box-shadow:inset 0 0 0 4px #0505ff;padding:4px}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:arial;border:1px solid #c1c1c1;font-size:14px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:arial;font-size:14px;box-sizing:border-box;border:1px solid #c1c1c1;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #c1c1c1;border-left:none;border-right:none;background-color:#000;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;border-radius:4px;border:2px solid #c1c1c1;height:32px;font-weight:700;background:#000;box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:13px;height:18px;line-height:18px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEEyMTFDOUM2ODc5MTFFNjlDOTRDREYyNUQ4NENENTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEEyMTFDOUQ2ODc5MTFFNjlDOTRDREYyNUQ4NENENTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowQTIxMUM5QTY4NzkxMUU2OUM5NENERjI1RDg0Q0Q1MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowQTIxMUM5QjY4NzkxMUU2OUM5NENERjI1RDg0Q0Q1MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhVZXooAAAD2SURBVHjaxNO/a8JAFMBxUx1KQXAQcWj9sdhBCDg52I6FgjgIIi7duunsIl0dxNmxW3EUHaS0tFj1DxJRKiX1/AZeIYTGNMnQg8927727e++0tgqHgqyTUMDlN8E55tAjPoIzeEcWPa8nyEllM3iJupcEeXzgAm+4xdpMoGOB9JHgAmZIYooKtj+P2MWVHO3yl+Ci3DmOEar4tHahIRtSkqRgCb7GK2IYmnfGl72NG5QxRkKSlXCDZ0TxiDsYTnOwQw1PUu0FE5xhgHt8uw2SIVUGEniKPlpQTq9rHyRzYxMr7PHg1lunSez8dTg0pdT//saDAAMAj/Mt6qJaGUkAAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MERGODM2RkI2ODc5MTFFNkFCOTRCOTNEMkMwODJCQkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MERGODM2RkM2ODc5MTFFNkFCOTRCOTNEMkMwODJCQkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowREY4MzZGOTY4NzkxMUU2QUI5NEI5M0QyQzA4MkJCRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowREY4MzZGQTY4NzkxMUU2QUI5NEI5M0QyQzA4MkJCRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ppyd3J4AAAFPSURBVHjajJO5SkNRFEVfnlEbU9qrjVMwYiMBEbSK4g8IllFQK/EvLCwEEYdS/AOHIiJYWinEqREtbLQKCGpQcW3YgUuI8R1YvOTdvU9uzpCqVCpRXQxAEaag2+8e4AT24CYUp4IEbbAOixBHjePHSVbhLQqEMh/CMnzBBuQhY/J+p7MFOIaO8AabsATPMAOXDX69E86hz9+35FGCQT5cwTeMNjGfgbT30AVpyMUuWAtsJzBfwzjs2FNUgoKFBwnMk/ASaAv6C58uYjtUE5gjaz+kT//RrnrzBLwG561+VmMPiWIkoVmR9fMp9oQpZhOaa1pFSTXIuvoakkfo/cc8BBdu47BuUIZdF0bmuybmHBxZq7aXa5OY8cGYO6Ep24dbG/thznuijp3CtLThMinJmme92TLptivwXr+NtVAB5z1gPb6RalPyJpZD8a8AAwBoDGzHPr0K4wAAAABJRU5ErkJggg==);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTZBMjlFNkU2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTZBMjlFNkY2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxNkEyOUU2QzY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxNkEyOUU2RDY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpeemjIAAABMSURBVHjaYvx/hAEbqAfiBjQxEL8RXSETkZphBtSjCzJCXfCfgTzAyMRAIWCBmUSpATBArFcY8QUiSWDUgFEDsBlwhAg9R5E5AAEGAFNACzFr4MENAAAAAElFTkSuQmCC);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:arial;font-size:14px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #c1c1c1}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #7e7e7e}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:14px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #c1c1c1}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #c1c1c1}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:70px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px;padding-bottom:1px;background:#000}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #7e7e7e;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:1px solid #ff0;border-radius:6px;position:absolute;z-index:300;border-color:#fff;box-shadow:inset 0 0 0 4px #0505ff;padding:4px;background-color:#000;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#fff;background-color:#000;border-bottom:1px solid #ff0}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:14px}.gantt_cal_qi_content{padding:16px 8px;font-size:14px;color:#fff;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:6px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-top-left-radius:0;border-bottom-left-radius:6px;border-top-right-radius:0;border-bottom-right-radius:6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTZBMjlFNkU2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTZBMjlFNkY2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxNkEyOUU2QzY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxNkEyOUU2RDY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpeemjIAAABMSURBVHjaYvx/hAEbqAfiBjQxEL8RXSETkZphBtSjCzJCXfCfgTzAyMRAIWCBmUSpATBArFcY8QUiSWDUgFEDsBlwhAg9R5E5AAEGAFNACzFr4MENAAAAAElFTkSuQmCC)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#000;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #ff0}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:14px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:14px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #ff0}.gantt_layout_cell_border_right{border-right:1px solid #ff0}.gantt_layout_cell_border_top{border-top:1px solid #ff0}.gantt_layout_cell_border_bottom{border-bottom:1px solid #ff0}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:arial;font-size:14px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#000}.gantt_drag_marker .gantt_row{border-left:1px solid #656565;border-top:1px solid #656565}.gantt_drag_marker .gantt_cell{border-color:#656565}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#d0ddff}.gantt_popup_button.gantt_delete_button{font-weight:700;border:2px solid #76ff03;background:#000;color:#76ff03}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_white.css b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_white.css
new file mode 100644
index 0000000..bed67df
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_contrast_white.css
@@ -0,0 +1 @@
+.buttonBg{background:#fff}.gridHoverStyle,.gridSelection,.timelineSelection{background-color:#5868c5}.gantt_grid_scale .gantt_grid_head_cell,.header_text_style{text-transform:uppercase;font-weight:700}.gantt_grid_scale .gantt_grid_head_cell{color:#585858;border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none;color:#000}.gantt_grid_data .gantt_row.gantt_selected .gantt_cell,.gantt_grid_data .gantt_row:hover .gantt_cell{color:#fff}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_up{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:10px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#585858;text-transform:uppercase;font-weight:700;border-right:1px solid #000}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edfff4}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff9}.gantt_task_line.gantt_project{background-color:#74ffa9}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#47bb55}.gantt_cal_larea input,.gantt_cal_larea select,.gantt_cal_larea textarea{color:#000;border:#000}.gantt_cal_larea .gantt_cal_lsection{color:#000;font-size:14px}.gantt_popup_shadow,.modalBorder{border-color:#000;box-shadow:inset 0 0 0 2px #000;padding:2px}.gantt_cal_larea,.lightboxHeaderBackground{background:#fff}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.gantt_btn_set.gantt_cancel_btn_set{border:2px solid #000;background:#fff;color:#000}.gantt_btn_set.gantt_save_btn_set{border-color:#000;background:#060;color:#000;border:2px solid transparent;color:#fff}.gantt_btn_set.gantt_delete_btn_set{border-color:#000;background:#9f3500;color:#000;border:2px solid transparent;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_popup_button.gantt_ok_button{font-weight:700;border-color:#000;background:#060;color:#000;border:2px solid transparent;color:#fff}.gantt_popup_button.gantt_cancel_button{font-weight:700;color:#454544;border:2px solid #000;background:#fff;color:#000}.gantt_popup_title{color:#000}.gantt_qi_big_icon,.gantt_qi_big_icon.icon_edit{border:2px solid #000;color:#000}.gantt_qi_big_icon.icon_edit{background:#fff}.gantt_qi_big_icon.icon_delete{border-color:#000;background:#9f3500;color:#000;border:2px solid transparent;color:#fff}.gantt_tooltip{color:#000;background:#fff}.gantt_container,.gantt_tooltip{font-size:14px;border:1px solid #000}.gantt_container{background-color:#fff;font-family:arial;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#262626;font-size:14px;border-bottom:1px solid #000;box-sizing:border-box}.gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #000}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #000;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:33px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkM1NEUwREQ2ODc4MTFFNkJCN0REMkNCNDBBRDc4Q0UiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkM1NEUwREU2ODc4MTFFNkJCN0REMkNCNDBBRDc4Q0UiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2QzU0RTBEQjY4NzgxMUU2QkI3REQyQ0I0MEFENzhDRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2QzU0RTBEQzY4NzgxMUU2QkI3REQyQ0I0MEFENzhDRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PopaRyYAAABHSURBVHjaYmCgIfgAxP+h+AMuRYx4DPhPjFomSp05eAxADrD/WPzPgEX+A3LA/CfTAYxU88JHMvR+HE0HhA34iINNXQAQYAAFOhSSoOBmvgAAAABJRU5ErkJggg==);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#5868c5}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #000;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#000;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#000;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #000;border-right:1px solid #000}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #000;border-bottom:1px solid #000;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #000;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:15px}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{white-space:nowrap;overflow:hidden;text-align:center}.gantt_scale_cell,.gantt_task_cell{display:inline-block;border-right:1px solid #000;height:100%}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzVDNzJCOEM2ODc3MTFFNkFGNTdEMzMyODI3QzgxN0EiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzVDNzJCOEQ2ODc3MTFFNkFGNTdEMzMyODI3QzgxN0EiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNUM3MkI4QTY4NzcxMUU2QUY1N0QzMzI4MjdDODE3QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNUM3MkI4QjY4NzcxMUU2QUY1N0QzMzI4MjdDODE3QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pin6TiQAAABfSURBVHja1JLBDoAwCEOp2Ufyh/CXnSezLDoU9CAnLi3tC1BVyY6ZySbFacPOh1rMBuLuuKPcax/HogqMkpUZvApxBZMzvE8T4OQy/gXxqk5sMH5YJgEyFUCyxKALMAAp9xIuO3IRpAAAAABJRU5ErkJggg==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzk5M0JBOUI2ODc3MTFFNjg3NkRDN0U4RTlDQjZBRjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzk5M0JBOUM2ODc3MTFFNjg3NkRDN0U4RTlDQjZBRjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDOTkzQkE5OTY4NzcxMUU2ODc2REM3RThFOUNCNkFGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDOTkzQkE5QTY4NzcxMUU2ODc2REM3RThFOUNCNkFGMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkhdOa8AAABXSURBVHjatFJBDsAwCJJmj/SH+kt2M91OVi0nYwICEaoqVZiZLGni2WYecvEXiGUCcWw0grh7irQXP+sgWeanpysOUBaofGU7wngH7Aig4gAkWxFeAQYA3h0OMhsl2ScAAAAASUVORK5CYII=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM2MUMyMzQ2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM2MUMyMzU2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzYxQzIzMjY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzYxQzIzMzY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlC39FYAAADWSURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYVWOtFYi/IIn9JxI7oBtUBMTcZDiiHt2gE1B2C55wQMZiQPwZ6iIHZINgMZIKxFxEuOQ1EE9GdxXIoANQLA7E2UR6qweIP6K7iAHJVaVAzEuEQe+BeBqyAAuUBrloBxB7APEnMgL+BXI6ygfiR2QY8hSIk1mQBG4BsTy5CZLx////VEnZAAEGAO3yNxaCOyWPAAAAAElFTkSuQmCC)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkZDMUZDMkI2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkZDMUZDMkM2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRkMxRkMyOTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRkMxRkMyQTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvnU3ycAAAB9SURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYTWJt1KChaNBzKP2fRAwCL5ANSgEJkOGYp0CczIIksA1PpiUIGP///0+VMAIIMAC11ShRpw6rxAAAAABJRU5ErkJggg==)}.gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDQwMTVBMUU2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDQwMTVBMUY2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowNDAxNUExQzY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowNDAxNUExRDY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsHnBgAAAAB8SURBVHjaYvz//z/Dpg3rGCgBfgFBDExoYp5A/AyI/+PB9dgMQzdoLhBLEnBAAzbDWND4MEMYsRjwH80wEGjE5SJSAIrLmBgoAw3UMghnGOEDjHjCjHouGjVoOBj0HCmNEMIg8AKXQSnIkgTAUyBOxpWytxFRjGAFAAEGAOcUI0XiA1ItAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#000;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#000}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#000}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:arial;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;border-color:#000;box-shadow:inset 0 0 0 2px #000;padding:2px;font-family:arial;border-radius:6px;border:1px solid #000;background:#fff}.gantt_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.gantt_button,.gantt_popup_button{border:1px solid #000;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:10px}.gantt_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:4px;font-size:16px;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:1px solid #000;height:40px;line-height:40px;font-size:20px}.gantt_popup_text{margin:15px 15px 5px;font-size:16px;color:#000;min-height:30px;border-radius:6px}.gantt-error,.gantt-info{font-size:16px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #000}.gantt-error{background-color:#b60000;border:1px solid #000}.gantt-error div{background-color:#b60000;border:1px solid #940000;color:#fff}.gantt-warning{background-color:#ef7f00;border:1px solid #000}.gantt-warning div{background-color:#ef7f00;border:1px solid #c97110;color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:15px;color:#000;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#18eeff}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:1px;position:absolute;box-sizing:border-box;background-color:#bbf9ff;border:1px solid #000;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;top:0;font-size:11px;font-size:14px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:8.75px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#000}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #000}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #bbf9ff}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #262626}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#262626;border-color:#000}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#000}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#000;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 4px 6px;border-color:transparent transparent #000;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#000;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-top-color:#000;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:100%;width:8px;z-index:1;top:-1px}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzM0N0ZFRkM2ODc4MTFFNjhFNUREOTU2N0ZBMkI4ODUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzM0N0ZFRkQ2ODc4MTFFNjhFNUREOTU2N0ZBMkI4ODUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMzQ3RkVGQTY4NzgxMUU2OEU1REQ5NTY3RkEyQjg4NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMzQ3RkVGQjY4NzgxMUU2OEU1REQ5NTY3RkEyQjg4NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pkl1dsMAAADJSURBVHjapJK9DcIwEIXjKA2SSxqnZghar0Cb7EBBmRlYwF4Bam+QMgPQuYUeKVLwcc+QAmQIKJ/05J9772TpLIgoSyGEyHnZP4879oWkEQ3exSxYB601Qbw/4i7pTYSXrLaqKur7PqquaxRa1L42YFasU9M0FEKgEexxhxo8yQbMuiiKszGGPmGtJfZc4H1pwGyklFfnHE0BD7zIjAPYKqWGruvoV+Aty/KGbByE957+BRlkxWOS6b8wBf+VLM9mEl8wp8FdgAEAX8VEJCVY4FsAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJElEQVQoz6WRsWqDUBSG/3uvXFHQoBwcMgtu1U6BQAn4BoUMTi7t5JBH0EHo1pdw6liwa8mQMVM6BzrHJUOgNZJws4XQEkjItx04/wfn/MAZiEhKKVdSyhURSVwDEfU1TfsJw1CFYag0Tfslov5FYdd1B5zzXRzHqq5rVde1iuNYcc53rusO/u6L08FxnHS9Xn8kScKzLIMQAkIIDIdD7Pd7Pp/PnxzH+W7bdvFP0Ov1XjabzetkMmHj8RiMsaOYMYYoikBEbDabPdq2rW+328+jwLKs967rnouiwGg0Onue7/sIggDT6fTBMIz7ruvemGmaC13X78qyhO/7F/1puVwiz3O0bfvFAKiqquB53lVNNU2DNE3BAVwdPs1w3AgDoG4RHADj3FVF5NgPuQAAAABJRU5ErkJggg==)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #000;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#5868c5}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#3d4dad}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #18eeff}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #74ffa9}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#c06fce;border:0 solid #6e2a7a;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:6px;font-family:arial;border:1px solid #c1c1c1;color:#262626;font-size:14px;position:absolute;z-index:10001;width:550px;height:250px;border-color:#000;box-shadow:inset 0 0 0 2px #000;padding:2px}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:arial;border:1px solid #c1c1c1;font-size:14px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:arial;font-size:14px;box-sizing:border-box;border:1px solid #c1c1c1;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #c1c1c1;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;border-radius:4px;border:2px solid #c1c1c1;height:32px;font-weight:700;background:#fff;box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:13px;height:18px;line-height:18px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTM5MTFCMzA2ODc4MTFFNjk0MEE5ODRFRjQ3MEY2MkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTM5MTFCMzE2ODc4MTFFNjk0MEE5ODRFRjQ3MEY2MkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MzkxMUIyRTY4NzgxMUU2OTQwQTk4NEVGNDcwRjYyRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MzkxMUIyRjY4NzgxMUU2OTQwQTk4NEVGNDcwRjYyRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pnl+P+YAAADRSURBVHjaYvz//z8DJYCJgUJArgEyQHwIiPUYQF4gESsA8b3/ELCDVM1qQPwIqvkwEPORolkbiJ9DNe8BYm5wBAAJPahp8ng0GwLxa6jmrUDMCZMDEVugEg+BWB2LZnMgfg9Vsw6I2ZDlQQQPEO+FKngJtQ2mwBaIP0HllgExC7oFMAYHEG+AKgTZZg3ErkD8FSo2F4iZsXkPmQMyfQlUA0jjdyh7KhAz4gofdAFGqAYY6ManGYRZ0FIYKGNkA/EHIP4HxLWEkiTjkM1McAAQYAAwa97nPE+LsgAAAABJRU5ErkJggg==);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTc0QzgxQ0U2ODc4MTFFNkE5NTJDMTkyNTg2QUExRDAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTc0QzgxQ0Y2ODc4MTFFNkE5NTJDMTkyNTg2QUExRDAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NzRDODFDQzY4NzgxMUU2QTk1MkMxOTI1ODZBQTFEMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NzRDODFDRDY4NzgxMUU2QTk1MkMxOTI1ODZBQTFEMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pk+05wsAAAFbSURBVHjajNM7LwRRGMbxNQYFSpXKNqwVEtFsIhIismQ/wOg3roVoNL6BhhWFy2p9A5dCKCjEJktiCQWJQkOJiEXi/ybPyJiwmTf5ZWbPnOedObNnqjzPi4WqHVkMo0Vjd9hDHlfByU7gvBYruMAs2lAnCY3ZtTU0hBtYeBvT+MQyUmiUlMbs2hh2/SauGixiEA/I4Dy0rBPcYkhP1osFTNkTJDGO8j9hqyYcKnyDdz1J0tELq9baKoXtRpfow7oyWWuQ1sStCOEBPAbmpq1BXD+KEcNWZzrG3djfFQ734ylwvUbHsqNNYtUdMWzVoeO9ox1mNRox7M+12rcGm/jSX3kUIdypuZbJW4MSNrRlW3FdIdyFHc21v73kb+U5HPtvFvPoQb3Y+RJO0YwDfRs/38IzRrCq7T2DAl6koDFXd85o5/76Gq3JpNaY05b9wKveSU5LmMCbH/oWYAA8HFpKXgW38QAAAABJRU5ErkJggg==);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NUFDNTg4MDI2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NUFDNTg4MDM2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1QUM1ODgwMDY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1QUM1ODgwMTY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQSVckAAABGSURBVHjaYvj//z8DFlz/HxPUY1NLrGachjCCTQGaw0AeYGRioBCwwEyi1AAYINYrcAsp9sKoAaMGYDPgCBF6jiJzAAIMAPUxcjmgixXRAAAAAElFTkSuQmCC);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:arial;font-size:14px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #c1c1c1}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #000}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:14px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #c1c1c1}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #c1c1c1}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:70px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px;padding-bottom:1px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #000;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:1px solid #000;border-radius:6px;position:absolute;z-index:300;border-color:#000;box-shadow:inset 0 0 0 2px #000;padding:2px;background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#000;background-color:#fff;border-bottom:1px solid #000}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:14px}.gantt_cal_qi_content{padding:16px 8px;font-size:14px;color:#000;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:6px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-top-left-radius:0;border-bottom-left-radius:6px;border-top-right-radius:0;border-bottom-right-radius:6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NUFDNTg4MDI2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NUFDNTg4MDM2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1QUM1ODgwMDY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1QUM1ODgwMTY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQSVckAAABGSURBVHjaYvj//z8DFlz/HxPUY1NLrGachjCCTQGaw0AeYGRioBCwwEyi1AAYINYrcAsp9sKoAaMGYDPgCBF6jiJzAAIMAPUxcjmgixXRAAAAAElFTkSuQmCC)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #000}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:14px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:14px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #000}.gantt_layout_cell_border_right{border-right:1px solid #000}.gantt_layout_cell_border_top{border-top:1px solid #000}.gantt_layout_cell_border_bottom{border-bottom:1px solid #000}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:arial;font-size:14px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #000;border-top:1px solid #000}.gantt_drag_marker .gantt_cell{border-color:#000}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#fff}.gantt_popup_button.gantt_delete_button{font-weight:700;border-color:#000;background:#060;color:#000;border:2px solid transparent;color:#fff}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_material.css b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_material.css
new file mode 100644
index 0000000..da17138
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_material.css
@@ -0,0 +1 @@
+.buttonBg{background:#fff}.gantt_task_line.gantt_critical_task{background-color:#ff5252;border:1px solid #ff5252}.gantt_task_line.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.15)}.gantt_task_line.gantt_critical_task.gantt_milestone,.gantt_task_line.gantt_critical_task.gantt_project{border-color:#ff5252}.gantt_links_area .gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 1px 3px 0 rgba(0,0,0,.2)}.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_left:before,.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_right:before{content:"";position:absolute;width:0;height:0;border:3px solid;transform-origin:center;box-shadow:0 2px 3px 0 rgba(0,0,0,.2)}.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_right:before{border-color:transparent transparent #87a4bc #87a4bc;transform:skewY(-40deg);top:-3px;left:-7px}.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_left:before{border-color:transparent #87a4bc #87a4bc transparent;transform:skewY(40deg);top:-3px;left:1px}.gantt_task_link.gantt_critical_link:hover .gantt_line_wrapper div{box-shadow:0 2px 4px 0 rgba(255,82,82,.2)}.gantt_task_link.gantt_critical_link:hover .gantt_link_arrow_left:before,.gantt_task_link.gantt_critical_link:hover .gantt_link_arrow_right:before{border-color:transparent;box-shadow:0 2px 3px 0 rgba(255,82,82,.4),0 1px 1px 0 rgba(255,82,82,.25)}.gridHoverStyle,.gridSelection,.timelineSelection{background-color:rgba(0,199,181,.2)}.gantt_layout_cell.grid_cell{border-right:none}.gantt_grid .gantt_grid_scale,.gantt_grid .gantt_row{border-right:1px solid #d7d7d7}.gantt_grid .gantt_grid_scale .gantt_grid_head_cell.gantt_grid_head_text{text-align:left;padding-left:15px}.gantt_grid .gantt_grid_scale .gantt_grid_head_cell{color:rgba(0,0,0,.54);border:none;text-transform:uppercase;font-weight:500}.gantt_grid .gantt_grid_scale .gantt_grid_column_resize_wrap{opacity:0}.gantt_grid .gantt_grid_scale:hover .gantt_grid_column_resize_wrap{opacity:1}div.gantt_grid_scale:after,div.gantt_scale_line:last-child:after{content:"";width:100%;display:block;height:1px;background-color:transparent;position:absolute;box-shadow:0 1px 2px 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1);z-index:1}div.gantt_scale_line:last-child:after{bottom:-1px}.gantt_grid_data .gantt_cell{border-right:none;border-left:none;color:rgba(0,0,0,.8);font-weight:400}.gantt_data_area .gantt_task_row:last-child,.gantt_grid_data .gantt_row:last-child{border-bottom:1px solid #d7d7d7}.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{animation:a .15s}.gantt_task_line.gantt_drag_animation .gantt_link_control div,.gantt_task_line.gantt_drag_animation .gantt_task_drag,.gantt_task_line.gantt_drag_animation .gantt_task_progress_drag,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag{animation:a 0}.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line.gantt_selected:hover .gantt_link_control div,.gantt_task_line.gantt_selected:hover .gantt_task_drag,.gantt_task_line.gantt_selected:hover .gantt_task_progress_drag{animation:none}.gantt_grid_data .gantt_row,.gantt_grid_data .gantt_row.odd{transition:background .15s}.gantt_grid_column_resize_wrap{transition:opacity .15s}.gantt_link_line_down,.gantt_link_line_left,.gantt_link_line_right,.gantt_link_line_up{transition:box-shadow .15s}@keyframes a{0%{opacity:0}to{opacity:1}}.gantt_task_link .gantt_link_arrow_right{border-width:6px 7px;margin-left:-2px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px 7px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_up{border-width:6px}.gantt_task_line.gantt_milestone{margin-top:-1px}.gantt_task_line.gantt_milestone .gantt_link_control.task_left{left:-21px}.gantt_task_line.gantt_milestone .gantt_link_control.task_right{right:-19px}.gantt_task_line.gantt_milestone .gantt_side_content{color:rgba(0,0,0,.8)}.gantt_task_line.gantt_milestone .gantt_side_content.gantt_right{margin-left:3px}.gantt_task_line.gantt_milestone .gantt_side_content.gantt_left{margin-right:3px}.gantt_task_line.gantt_milestone .gantt_task_content{padding:0}.gantt_task_line{font-weight:500}.gantt_task_line .gantt_task_drag{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAHElEQVQYV2NkQAOMIP6vX7/+g2g2NjZG7ALIugAfzQgFD7inoAAAAABJRU5ErkJggg==);opacity:.95}.gantt_task_line .gantt_task_drag.task_left{left:9px}.gantt_task_line .gantt_task_drag.task_right{right:9px}.gantt_task_line .gantt_link_point{border:2px solid;border-color:inherit;height:15px;background-color:#fafafa;width:15px;border-radius:100%;box-shadow:0 3px 5px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.1)}.gantt_task_line .gantt_link_control{top:-1px;border-color:inherit}.gantt_task_line .gantt_link_control.task_left{left:-17px}.gantt_task_line .gantt_link_control.task_right{right:-15px}.gantt_task_line.gantt_thin_task .gantt_task_drag.task_end_date{left:3px}.gantt_task_line.gantt_thin_task .gantt_task_drag.task_start_date{left:-13px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:rgba(0,0,0,.54);text-transform:uppercase;font-weight:500}.gantt_row.gantt_project{background-color:#edfffb}.gantt_task_row.gantt_project{background-color:#f5fffc}.gantt_task_line.gantt_project{background-color:#1de9b6;border-color:#16e1ae}.gantt_task_line.gantt_project .gantt_task_content{color:rgba(0,0,0,.6);font-weight:500}.gantt_task_content{text-overflow:ellipsis;box-sizing:border-box;padding:0 17px}div.gantt_cal_light{border:0;box-shadow:0 2px 3px 0 rgba(0,0,0,.2),0 0 3px 1px rgba(0,0,0,.1);width:560px;padding:25px}div.gantt_cal_light .gantt_cal_ltitle{text-overflow:ellipsis;font-size:16px;margin:-15px 0 0;padding:16px 5px 9px 7px;color:rgba(0,0,0,.8)}div.gantt_cal_light .gantt_cal_ltitle .gantt_mark{display:none}div.gantt_cal_light .gantt_cal_ltitle .gantt_time{font-weight:500}div.gantt_cal_light .gantt_cal_ltitle .gantt_title{font-weight:400}div.gantt_cal_light .gantt_cal_ltext{padding:7px}div.gantt_cal_light .gantt_cal_ltext textarea{padding:6px 8px}div.gantt_cal_light .gantt_cal_ltext:focus,div.gantt_cal_light .gantt_cal_ltext textarea:focus{outline-color:rgba(68,138,255,.9);box-shadow:none}div.gantt_cal_light .gantt_cal_lsection{padding:12px 0 5px 7px;color:rgba(0,0,0,.8);font-size:14px;font-weight:500}div.gantt_cal_light .gantt_cal_larea{border:0;padding:2px 0 0;color:rgba(0,0,0,.8)}div.gantt_cal_light .gantt_section_time{padding:10px 7px}div.gantt_cal_light .gantt_section_time :focus{outline-color:rgba(68,138,255,.9);box-shadow:none}div.gantt_cal_light .gantt_btn_set{margin:10px 7px;text-transform:uppercase;height:32px;padding:7px 15px}div.gantt_cal_light .gantt_section_time select,div.gantt_cal_light select{height:30px}div.gantt_cal_light select:focus{outline-color:rgba(68,138,255,.9);box-shadow:none}div.gantt_cal_light_wide{width:650px}.gantt_popup_button{float:right;text-transform:uppercase;font-weight:500}.gantt_cal_quick_info .gantt_qi_big_icon{font-weight:500;height:32px;text-transform:uppercase}.gantt_cal_quick_info .gantt_qi_big_icon div{padding-top:1px}.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set{background:#fff;color:#116aff}.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set .gantt_cancel_btn{display:none}.gantt_popup_button.gantt_cancel_button{color:#116aff}.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set:hover,.gantt_popup_button.gantt_cancel_button:hover{background:rgba(17,106,255,.25);color:#005cf7}.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set:focus,.gantt_popup_button.gantt_cancel_button:focus{background:rgba(17,106,255,.35);color:#0053dd;outline:none;box-shadow:none}.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set{background:#fff;color:#ff584c}.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set .gantt_delete_btn{display:none}.gantt_qi_big_icon.icon_delete{background:#fff;color:#ff584c}.gantt_qi_big_icon.icon_delete .gantt_menu_icon{display:none}.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set:hover,.gantt_qi_big_icon.icon_delete:hover{background:rgba(255,88,76,.25)}.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set:focus,.gantt_qi_big_icon.icon_delete:focus{background:rgba(255,88,76,.35);color:#ff4032;outline:none;box-shadow:none}.gantt_cal_light .gantt_btn_set.gantt_save_btn_set .gantt_save_btn,.gantt_qi_big_icon.icon_edit .gantt_menu_icon{display:none}.gantt_cal_light .gantt_btn_set.gantt_save_btn_set,.gantt_popup_button.gantt_ok_button,.gantt_qi_big_icon.icon_edit{background-color:#448aff;color:#fff}.gantt_cal_light .gantt_btn_set.gantt_save_btn_set:hover,.gantt_popup_button.gantt_ok_button:hover,.gantt_qi_big_icon.icon_edit:hover{background-color:#005cf6}.gantt_cal_light .gantt_btn_set.gantt_save_btn_set:focus,.gantt_popup_button.gantt_ok_button:focus,.gantt_qi_big_icon.icon_edit:focus{background-color:#005cf6;outline:none;box-shadow:none}.gantt_duration{color:rgba(0,0,0,.54);font-weight:500}.gantt_duration .gantt_duration_dec{color:transparent}.gantt_duration .gantt_duration_inc{color:transparent;margin-right:2px}div.gantt_duration .gantt_duration_dec{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAM0lEQVQ4T2NkoBAwUqifYdQABiqFgcaMDf/JiY0bGQGM4Fig2ABybIfpGU0H1EoHlMQCAIgYCBGYGr9NAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:50%}div.gantt_duration .gantt_duration_inc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAO0lEQVQ4T2NkoBAw4tOvMWPDf5D8jYwAnOpGDWBgoE4YwEKb1BgFxQ7YBRQbgMvm0XSACNyBywvEpAsA12c4ER3FU64AAAAASUVORK5CYII=);background-repeat:no-repeat;background-position:50%}.gantt_task_line.gantt_milestone{border-radius:2px}.gantt-info{border-radius:2px;border-width:0;width:237px}.gantt-info div{border:0;padding:11px}.gantt_cal_quick_info{padding:15px 25px;min-width:210px;max-width:400px;font-size:16px}.gantt_cal_quick_info .gantt_cal_qi_title{padding:5px 0 10px;border-bottom:0}.gantt_cal_quick_info .gantt_cal_qi_title .gantt_cal_qi_tcontent{display:none}.gantt_cal_quick_info .gantt_cal_qi_title .gantt_cal_qi_tdate{font-size:16px;font-weight:500}.gantt_cal_quick_info .gantt_cal_qi_content{padding:8px 0;font-size:14px;text-overflow:ellipsis}.gantt_cal_quick_info .gantt_cal_qi_controls{padding:5px 0 0;float:right}.gantt_tooltip{box-shadow:0 2px 3px 0 rgba(0,0,0,.2),0 0 3px 1px rgba(0,0,0,.1);background-color:#fff;border:0;font-family:Roboto,arial,sans-serif;font-size:14px;line-height:1.5em;overflow:hidden}.gantt_modal_box,.gantt_tooltip{color:rgba(0,0,0,.8);max-width:400px;text-overflow:ellipsis}.gantt_modal_box{padding:15px 25px}.gantt_modal_box .gantt_popup_text{font-size:14px;line-height:1.5;text-align:left;padding:1px 0;margin:0}.gantt_modal_box .gantt_popup_title{background-color:#fff;margin:0;padding:4px 0 14px;text-align:left;font-weight:500}.gantt_tree_icon.gantt_file,.gantt_tree_icon.gantt_folder_closed,.gantt_tree_icon.gantt_folder_open{display:none}.gantt_popup_shadow{box-shadow:0 2px 3px 0 rgba(0,0,0,.2),0 0 3px 1px rgba(0,0,0,.1)}.gantt_task_line .gantt_side_content{font-size:14px;color:rgba(0,0,0,.54)}div.gantt_drag_marker{z-index:4}div.gantt_drag_marker .gantt_link_tooltip{font-size:14px;font-family:Roboto;border-width:0;box-shadow:0 2px 3px 0 rgba(0,0,0,.2),0 0 3px 1px rgba(0,0,0,.1)}.switch_unsetted{display:none}.matherial_checkbox_icon{background-size:cover;height:1.3em;width:1.3em;display:inline-block;vertical-align:-.3em}.matherial_checkbox_checked,.switch_unsetted:checked+.matherial_checkbox_icon,label.gantt_resource_row input[type=checkbox]:checked+div.gantt_resource_cell_checkbox .matherial_checkbox_icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cg fill-opacity='.8'%3E%3Cpath d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z'/%3E%3Cpath d='M17.99 9l-1.41-1.42-6.59 6.59-2.58-2.57-1.42 1.41 4 3.99z'/%3E%3C/g%3E%3C/svg%3E")}.matherial_checkbox_unchecked,.switch_unsetted+.matherial_checkbox_icon,label.gantt_resource_row input[type=checkbox]+div.gantt_resource_cell_checkbox .matherial_checkbox_icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z' fill-opacity='.8'/%3E%3C/svg%3E")}label.gantt_resource_row input[type=checkbox]{display:none}label.gantt_resource_row select{height:calc(1.3em + 4px);border-width:.5px}.gantt_container{background-color:#fff;font-family:Roboto,arial,sans-serif;font-size:14px;border:1px solid #d7d7d7;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:rgba(31,31,31,.8);font-size:14px;border-bottom:1px solid #d7d7d7;box-sizing:border-box}.gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #d7d7d7}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #d7d7d7;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:35px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAO0lEQVQ4T2NkoBAw4tMvuGHWf5D8+4A0nOpGDWBgoE4YwEKb1BgFxQ7YBRQbgMvm0XSACNyBywvEpAsAxlc4EbYmh6oAAAAASUVORK5CYII=);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.6;opacity:.6}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:rgba(0,199,181,.2)}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:0;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#d7d7d7;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#d7d7d7;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #d7d7d7;border-right:1px solid #d7d7d7}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #d7d7d7;border-bottom:1px solid #d7d7d7;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #d7d7d7;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:14px;font-weight:500}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{white-space:nowrap;overflow:hidden;text-align:center}.gantt_scale_cell,.gantt_task_cell{display:inline-block;border-right:1px solid #d7d7d7;height:100%}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAuUAAALlAF37bb0AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAH/SURBVHgBAO8BEP4B////AAAAAAB1dXWV2NjYa+7u7gAJCQkA////AAAAAAAAAAAAvb29AAAAAAACAAAAAAAAAAAGBgZqKysrvREREQD7+/sACAgIAAgICAAICAgAAAAAAAAAAAACAAAAAAAAAAD6+vr1BAQEQisrK8YQEBAA9vb2AP39/QD9/f0AAAAAAAAAAAACAAAAAAAAAAABAQEA+fn5AAUFBTkqKirWCAgIBPLy8gD5+fkAAAAAAAAAAAACAAAAAAAAAAAAAAAAAQEBAPn5+QADAwMpMjIy3xkZGRsEBAQAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQD4+PgABQUFHCQkJKoVFRUwAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAICAgA+/v76N3d3Vvx8fHgAAAAAAAAAAAEAAAAAAAAAAAAAAAA////AAcHBwD9/f3b0dHRLfDw8PkGBgYAAAAAAAAAAAAEAAAAAAAAAAD///8ABwcHAPv7+8vY2Ng29/f3AA4ODgAAAAAAAAAAAAAAAAACAAAAAAAAAAAGBgYL+/v7w9LS0jbu7u4ACAgIAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAD4+Pia2traPvj4+AAMDAwA////AAAAAAAAAAAAAAAAAAAAAAABAAD//z9HdQMRW/QpAAAAAElFTkSuQmCC);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAuUAAALlAF37bb0AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAH/SURBVHgBAO8BEP4B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcnJymQgICGb6+vr1AQEBAAAAAAAAAAAAAAAAAAAAAAD///8ABgYGC/r6+pYDFxcXtBEREUMGBgYk/Pz8BgEBAQYAAAAGAAAABv///wYHBwcG/f39vtfX11cC8PDwANLS0j77+/vLBwcHAP///wAAAAAA////AAcHBwD7+/vH1NTUQ+7u7gACCAgIAPT09ADY2Ng2/f392wcHBwD+/v4ABwcHAP39/dfY2Ng68/PzAAkJCQAC////AAwMDADy8vIA0dHRLf///+gMDAwA////5NDQ0C7y8vIADAwMAP///wACAAAAAP///wAHBwcA8PDw+dnZ2Tn39/fG2NjYOPHx8fwHBwcAAAAAAAAAAAADJCQkAAAAAAAAAAAA////APv7+/D8/PzO7+/v2wICAgAEBAQAAgICAPz8/AAB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//4RfjvnDJoM6AAAAAElFTkSuQmCC);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_file,.gantt_tree_icon.gantt_folder_closed,.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#87a4bc;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#87a4bc}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#87a4bc}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:Roboto,arial,sans-serif;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:210px;width:210px;text-align:center;position:fixed;z-index:20000;box-shadow:0 2px 3px 0 rgba(0,0,0,.2),0 0 3px 1px rgba(0,0,0,.1);font-family:Roboto,arial,sans-serif;border-radius:2px;border:0;background:#fff}.gantt_popup_title{border-top-left-radius:2px;border-top-right-radius:2px;border-width:0}.gantt_button,.gantt_popup_button{border:0;height:32px;line-height:32px;display:inline-block;margin:4px 0 4px 14px;border-radius:2px;background:#fff}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:4px 0 0}.gantt_popup_button{min-width:80px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:2px;font-size:14px;box-sizing:content-box;padding:1px;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:0;height:auto;line-height:16px;font-size:16px}.gantt_popup_text{margin:15px 15px 5px;font-size:14px;color:rgba(0,0,0,.8);min-height:30px;border-radius:2px}.gantt-error,.gantt-info{font-size:14px;color:#000;box-shadow:0 10px 20px 0 rgba(0,0,0,.2),0 1px 6px 0 rgba(0,0,0,.2);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #d7d7d7}.gantt-error,.gantt-error div{background-color:#ff5252;border:1px solid #ff5252}.gantt-error div{color:#fff}.gantt-warning,.gantt-warning div{background-color:#ffab00;border:1px solid #ffab00}.gantt-warning div{color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:14px;color:#fff;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:rgba(0,0,0,.15)}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:50px;position:absolute;box-sizing:border-box;background-color:#448aff;border:1px solid #448aff;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;top:0;font-size:11px;font-size:13px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:8px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#87a4bc}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #87a4bc}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #448aff}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #b8c9d7}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #ff5252}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#b8c9d7;border-color:#87a4bc}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#ff5252;border-color:#ff0505}.gantt_link_arrow_right{border-width:6px 0 6px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#87a4bc}.gantt_link_arrow_left{border-width:6px 6px 6px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#87a4bc;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 6px 6px;border-color:transparent transparent #87a4bc;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#87a4bc;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:6px 6px 0;border-top-color:#87a4bc;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:80%;width:8px;z-index:1;top:10%}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:19px;width:25px;bottom:-10px;margin-left:-14px;background-position:bottom;background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag,.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAAeNJREFUOBGlU0tOAkEQdQAHiIpDjPGz87fxCu400Wt4C1gRbsAhPARbbsCKxISFsjDqUiMfgRl8r+WRYmCExEoeVV1d9V51N+NtrG/ektLJktxCalmjLVq1b2sTBf8isXuKrY+mCpbcxrMBUrNoPrBkjFmXBjaBfL1evxyPx412u32CtWoRzsVcJxqb4sRZ5LaAvVqtdjUajV4msDAMn1ut1jnyHICDqBdhsqnITp5D+Q5wUK1WrweDwSsFZBRqNpsX2F9LKEmgAIKjcrl82+/330Ru/bpCfwkcl0qlu16v926J4/EqIQnQ63F5RTzBWgISNG+08D4S4UYG8IFt4JBXtOoEEpBPEpKITpGHwH6lUrlJegMRJvkoip46nc4peBy3BOQpxJMUG43Gve/7Z/g3+ZguDUKPwJ4zz/MmQiqVijKZTJjNZodBEHSLxWI3l8s9FgqFBxS7JgnQU4TfRADsArw2ijLP66SxTl82v/rQ4BvxF/ABfAJDYMI3sMZmNnWnng0kp4iGQeiMtURciMSDaR5uvpFkOg1JOYBycQFsOZOQhosLMu+Ifsvnr0ATWnLGcXMkSKre+lmtJWFSaxHG/azRBFaIaa4FV5ZEorwrwk98rTy9RJRbWNtmG6vhv94J/gATDnWOR2FfEQAAAABJRU5ErkJggg==)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px solid #cecece;border-top:1px solid #cecece;font-family:Tahoma;font-size:14px;color:rgba(0,0,0,.8);padding:11px;line-height:20px}.gantt_link_direction{height:0;border:0 none #87a4bc;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:rgba(0,199,181,.2)}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:rgba(145,210,210,.7)}.gantt_task_line.gantt_project.gantt_selected,.gantt_task_line.gantt_selected{box-shadow:none}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#ffc107;border:0 solid #ffc107;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#ff5252;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#ff5252}.gantt_critical_link .gantt_link_arrow{border-color:#ff5252}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:2px;font-family:Roboto,arial,sans-serif;border:1px solid #d7d7d7;color:rgba(31,31,31,.8);font-size:14px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:0 2px 3px 0 rgba(0,0,0,.2),0 0 3px 1px rgba(0,0,0,.1)}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:Roboto,arial,sans-serif;border:1px solid #d7d7d7;font-size:14px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:2px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:2px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:2px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:2px;-moz-border-radius-bottomright:0;border-top-left-radius:2px;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:Roboto,arial,sans-serif;font-size:14px;box-sizing:border-box;border:1px solid #d7d7d7;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #d7d7d7;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:6px 15px;float:left;border-radius:2px;border:0 solid #d7d7d7;height:32px;font-weight:500;background:#fff;box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:14px;height:20px;line-height:20px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn,.gantt_delete_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Roboto,arial,sans-serif;font-size:14px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #d7d7d7}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #d7d7d7}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:14px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #d7d7d7}.gantt_duration{width:100px;height:30px;float:left;white-space:nowrap;margin-left:20px;line-height:32px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #d7d7d7}.gantt_duration .gantt_duration_value{width:36px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:66px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:30px;padding:1px;padding-bottom:1px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:2px;-moz-border-bottom-left-radius:2px;-webkit-border-top-left-radius:2px;-webkit-border-bottom-left-radius:2px;border-top-left-radius:2px;border-bottom-left-radius:2px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:2px;-moz-border-bottom-right-radius:2px;-webkit-border-top-right-radius:2px;-webkit-border-bottom-right-radius:2px;border-top-right-radius:2px;border-bottom-right-radius:2px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #d7d7d7;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:0;border-radius:2px;position:absolute;z-index:300;box-shadow:0 2px 3px 0 rgba(0,0,0,.2),0 0 3px 1px rgba(0,0,0,.1);background-color:#fff;width:auto;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:2px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:2px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:2px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:2px;-moz-border-radius-bottomright:0;border-top-left-radius:2px;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:rgba(0,0,0,.8);background-color:#fff;border-bottom:1px solid #d7d7d7}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:14px}.gantt_cal_qi_content{padding:16px 8px;font-size:14px;color:rgba(0,0,0,.8);overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:2px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:2px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:2px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:2px;border-top-left-radius:0;border-bottom-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:2px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete,.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=)}.gantt_qi_big_icon{font-size:14px;border-radius:2px;font-weight:500;background:#fff;margin:4px 0 4px 14px;min-width:auto;line-height:32px;vertical-align:middle;padding:0 16px;cursor:pointer;border:0}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:14px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:14px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #d7d7d7}.gantt_layout_cell_border_right{border-right:1px solid #d7d7d7}.gantt_layout_cell_border_top{border-top:1px solid #d7d7d7}.gantt_layout_cell_border_bottom{border-bottom:1px solid #d7d7d7}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:Roboto,arial,sans-serif;font-size:14px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #bebebe;border-top:1px solid #bebebe}.gantt_drag_marker .gantt_cell{border-color:#bebebe}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#fff}.gantt_popup_button.gantt_delete_button{background-color:#448aff;color:#fff}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_meadow.css b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_meadow.css
new file mode 100644
index 0000000..21c5474
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_meadow.css
@@ -0,0 +1 @@
+.buttonBg{background:#fff}.chartHeaderBg{background-color:#f4f2ea}.gridHoverStyle{background-color:#ffebbc!important}.gantt_grid_scale .gantt_grid_head_cell{border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none}.gridSelection,.timelineSelection{background-color:#ffebbc!important}.gantt_task_link .gantt_link_arrow_left,.gantt_task_link .gantt_link_arrow_right{margin-top:-1px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:10px;margin-left:-8px;width:16px}.gantt_task .gantt_task_scale .gantt_scale_cell{border-right:1px solid #cac8bd}.gantt_row.gantt_project .gantt_cell,.gantt_row.odd.gantt_project .gantt_cell{background-color:#edf4ff}.gantt_task_row.gantt_project .gantt_task_cell,.gantt_task_row.odd.gantt_project .gantt_task_cell{background-color:#f5f8ff}.gantt_task_line.gantt_project{background-color:#c7d8f7;border:1px solid #7ba3ed}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#9ab9f1}.gantt_cal_light .gantt_cal_ltitle{padding:7px 10px}.gantt_cal_light .gantt_cal_ltext textarea{border:1px solid #d8d6ce}.gantt_cal_light .gantt_cal_larea{border-color:#d8d6ce!important;background-color:#fcfaf3}.gantt_cal_light .gantt_cal_larea .gantt_section_time{background-color:#fcfaf3}.buttonBg{background:#e0ded7}.gantt_cal_light .gantt_btn_set{height:27px;margin:5px 10px;padding:0 15px 0 10px}.gantt_cal_light .gantt_btn_set div{height:25px;margin-top:0;background-position:50%;line-height:25px}.gantt_btn_set.gantt_save_btn_set{border:1px solid #98d27e;background:#a7d991}.gantt_btn_set.gantt_cancel_btn_set{background:#fff;background:#e0ded7;border:1px solid #cac8bd}.gantt_btn_set.gantt_delete_btn_set{border:1px solid #ffad54;background:#ffb96d}.gantt_cal_light_wide{padding:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_cal_light_wide .gantt_cal_larea .gantt_cal_lsection{width:90px}.gantt_cal_light_wide .gantt_btn_set{margin:7px 10px}.gantt_popup_button.gantt_ok_button{border:1px solid #98d27e;background:#a7d991}.gantt_popup_title{background-color:#f4f2ea}.gantt_popup_shadow{box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_data_area .gantt_cal_quick_info{background-color:#f4f2ea}.gantt_data_area .gantt_cal_qi_content{background:#fcfaf3;border-bottom:1px solid #cac8bd}.gantt_qi_big_icon.icon_delete{border-color:#ffad54;background:#ffb96d}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-size:8pt;color:#3f3f3f}.gantt_container,.gantt_tooltip{background-color:#fff;font-family:Verdana}.gantt_container{font-size:11px;border:1px solid #cac8bd;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#3f3f3f;font-size:8pt;border-bottom:1px solid #cac8bd;box-sizing:border-box}.gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{background-color:#f4f2ea}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cac8bd}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cac8bd;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:28px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDAzOTZDREFDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDAzOTZDREJDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDM5NkNEOEM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDM5NkNEOUM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnzqpNoAAAEFSURBVHjapJPPDsFAEMbHZqXSi1ZC3Dg7O9bbeA7v4czZE4hLSRwkbiI4cCAN4Uyqs/pPs1vbrTDJHL7Mb77sbr8WeuMu/FOEMQaStplYdgYHFBnKjK1atZqI8+ViZZ2AMmS5x1QxFNHLNVAx1EPMNVAxBBFtvxnfuq4LUKDTTLwXXsFqNprKE1RMM2y+9oe9FV3Bw5++/3svfMRWpS0MV7fFx0Ka2e62kQEhBEbzoTA0DAPqtXqinbMD643IFGkR3KcL1Cib0yA4/DBY4A2u15ug45oFHD05x44sO+kc+FwhI0j4RZBQlUT5kH+0JS4VBpKfqaSVYDDpJ1rz9eNxlxq8BBgAcMHBu6BPeX8AAAAASUVORK5CYII=);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#ffebbc!important}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #eae9e5;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#cac8bd;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#eae9e5;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #cac8bd;border-right:1px solid #cac8bd}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #cac8bd;border-bottom:1px solid #cac8bd;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #eae9e5;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:8pt}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cac8bd;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #eae9e5}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAWUlEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZyDKIkZGR4f9/hCMHziCQS9AByGUD5yKYa6gWRujeI8lrVElHhAxBlh/GmRYA5MZIE4VV1O8AAAAASUVORK5CYII=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAATElEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZhrhBjIyYIfD//3+GYeA1XNFGkteoko4IGYIsP4wzLQBu8jwTv5HhogAAAABJRU5ErkJggg==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB30lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodz0A0xSbqMas6/nwzf/3AwcLL8YPjxYhvDlR11DMiGoRgkp63OIGY0ieHPt7cMF9ZGwQ0yjj0EZv/4L8TAwfiO4f+3awzn1mbgNsgkdidEM6sU3JA/Hy+jGhq+jOH/n09EGoTsKZihQK+dWWDCYBQ8AyxLnIugBv3/9RbMArmAkUuL4exiOwYD/26w2IWNpbi9Zhy5gYHh3zewxn9/PjMw/3nDwPD7HQODsDdY89nlAQw6Hk1gNt7ABjkb2YD/f78w/P3xloFFLoth8cRsBi2xp8QZZOxdDnYBzACQzb+/f2BgUywAB7iyaRA89DiFDVBchRL9Rs6RYBfADADRf398ZuDUrIUYZB6GiIZ/fxh4pP0YLm5IAIcVikH61m4YhjD++cbArtUI1oDson9/fjDwqqQxXFodgGmQlpEZ2CCQKyAmfgIG/i8GDt1u0gxS19IE6we54v//P2BDQABmkKKhF8JrQBZOF4EMghsC0kKuQZICXxj4xbQhroECRkYWoIvawYEtp20NF2dm42dgk4ljuLk5AjWMQCpgJQDMQJgumEEo/oJyYCUASpkCU4hcpIAMFXfeBHYRehmEbDBWg5AVIBuKzyAAfjsXIj7TBm0AAAAASUVORK5CYII=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB90lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodzQIboWYUwsGnU4tR/Zp4+g6J1NQM/HzvDhe11DMiGoRhkErMHiyHMEDE2IQaQQZwcHAxqXvMZLq6LJMUgiCH//3xlYOSSJccgqAG/3oAN+vv7GwMLtxzDmSWOYBepe85kuLA+npCLmMEuYPj3neHfjxcQF/1+z8AibAU0yAVskIZbN8P5Tbm4DTKO2AI2AOQCxr+fwAb8+/2JgVXEAWzg2RU+EBc5VuEPbIPAhSgGMPwFuuznawZWuQSGxZPSGbTEnoINUrXJYbi0pwe3iww8m8AugBkAcsXv728Y2FXyGC6sDmJgZmZmYGNlZVC1TGRgYOZGMQw1HTlmgl0AM+D/ny9gNrtqMTi6QQaJC3Mw8Mm5gcU5pZzgYYWRIH/9+MzA+P8nMMC/AMPoK8O/P78YuHXrwLHEyMzGICnMCjHo3zcGDuV0sEtBCRPFIE1DB7ABkJiCGPL/3y8GHv0WuEEi/CwMwkru+A3S0DWBGwA2DGgICGAYpGALFsfpInUNTYa//xgYGKEGwAzjNugChxHIayAXicibMfxnZMdtkKTANwYeEV2G/0xsYMNANDjgJRIYHh4qhwQwMPrlVXUYGFl4GL7xeoLFUcIIpIiUYgRsKhDASgCUMgUmSQ5NNYMAK+sKIlqSof0AAAAASUVORK5CYII=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAA/klEQVQ4T63Uyw5FMBAG4CliIcHOE9pIeBrCxou69py/yUgvnLRymogS85lOL4L+1ITu1HUtfdx5no04xFwvgPR9T3EckxDOd8rf913du64jGzOgcRxpWRYDQvB5nrSuK5VleSVsYwY0TRNt20ZRFKlgzuI4DgUVRWGMXMccCEHcgEkp1ZCQaZ7n/hACuUboA8YFDNkCR7+qKmqa5qqVk5E9azrGKDDUKwgCzBgAYHjOsiwcAsb14hqmafoOQhY8k+gnSeIPIYAb9xl7Bekgw1hrQcW+Q9Te+m6jIOjXJn6EhmFQm9anYfbatnUXJIJ9jxH+kX4C3J8XPilZ33wAwx73EyvYLYIAAAAASUVORK5CYII=)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#ffb96d;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#ffb96d}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#ffb96d}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:Verdana;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Verdana;border-radius:6px;border:1px solid #cac8bd;background:#fcfaf3}.gantt_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.gantt_button,.gantt_popup_button{border:1px solid #cac8bd;height:25px;line-height:25px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff;background:#e0ded7}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:10px}.gantt_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:4px;font-size:14px;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:1px solid #cac8bd;height:40px;line-height:40px;font-size:20px}.gantt_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.gantt-error,.gantt-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cac8bd}.gantt-error{background-color:#d81b1b;border:1px solid #ff3c3c}.gantt-error div{background-color:#d81b1b;border:1px solid #940000;color:#fff}.gantt-warning{background-color:#ff9000;border:1px solid #ffa633}.gantt-warning div{background-color:#ff9000;border:1px solid #b36500;color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:11px;color:#3f3f3f;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#a7d991}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:2px;position:absolute;box-sizing:border-box;background-color:#e1ffd4;border:1px solid #7fbc64;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;top:0;font-size:11px;font-size:10px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:6.75px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffb96d}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffb96d}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #a7d991}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffdeba}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#ffdeba;border-color:#ffb96d}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#ffb96d}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#ffb96d;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 4px 6px;border-color:transparent transparent #ffb96d;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#ffb96d;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-top-color:#ffb96d;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:100%;width:8px;z-index:1;top:-1px}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0JCMkQyRDhDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0JCMkQyRDlDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQkIyRDJENkM5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQkIyRDJEN0M5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ppy3ICwAAADsSURBVHjafFBbaoNQEB1vghtIPlJX4Z/iX/cSsoZQGl80JZvIAvxVf1yNX6EFH+ADK8Y6nblQaGzagXNnmHPODHMVRIR5+L7/Sqm2bfv0i2TDT3ied4zjGBlU7+f8XPzCwrZtsSzLb9PTXQMRfhRFWFUVdl0nURQFco+45xsDNdwwDOVUNuR5LlHXNWZZhsyR5sDahRDC1XXdsSwLFCHgo+/hc5okhusVVFUFTdNgHMfHIAhQ0N2OaZowkbtpGhiG4Qa0RX6OYRicvCU9b2maPqzWa/grKtpE93D5zoZtkiRnyhv4Py6E3ZcAAwDb89Sl5rtPtAAAAABJRU5ErkJggg==);background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAjklEQVQY043LwQ0BURjE8aEKPfy3EoWoQQTZCKKI5yUvX0m7W4Jw1sC4cNjF8kvmNDMT2xqqquoo6d627emttN0LcIgIR4SB5bAfjvcR4ZfnafXxAOxKKR4qpRhY9w5AnXP2NzlnAxvbElCnlPxLSsnAVoD/BXgq6do0jSyNpuk6SbpNgLmks6SZxl0kLR44uvaQZ7V7eAAAAABJRU5ErkJggg==)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #ffb96d;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#ffebbc!important}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffdc89}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #a7d991}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #9ab9f1}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#db7dc5;border:0 solid #cd49ae;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#f4f2ea;border-radius:6px;font-family:Verdana;font-size:11px;border:1px solid #cac8bd;color:#3f3f3f;font-size:8pt;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:Verdana;border:1px solid #cac8bd;font-size:11px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:Verdana;font-size:11px;box-sizing:border-box;border:1px solid #cac8bd;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #cac8bd;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;border-radius:4px;border:0 solid #cac8bd;height:27px;color:#4f4f4f;background:#fff;background:#e0ded7;box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:13px;height:17px;line-height:17px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUUzMDA3NzlDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUUzMDA3N0FDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBRTMwMDc3N0M5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBRTMwMDc3OEM5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtHrmoUAAAF4SURBVHjaYvr//z8DNTATA5UA1QxiIUdTQEAAG5CaA8S6QGyyYcOGvyzkGMLIyLgSGC4BHBwcr1RUVBhJdhHQEGagIctAhjAzM/9OSkrqd3Nz+ws3CKjAA0hNA+JcoDO34jIESC0FGhIM4tvb2y8FGjIbyPwPD2wNDQ1RIKUItG09UIM3LkOAOBzEB3rnaF5eXieQ+RYl1jo6Og4oKCicAtrGCjXMA82Q+TBD+Pj4HtfU1NQDmTewRf/jjIyMNmDgfYAatgnJMFDsxIIYrKysX7Ozs9sFBAT240xHQO/t8PT0BGliQHLZdiA3AabGz89vlrm5+RIg8x++BPkzPj5+Msj/UMM4gBTciwYGBttiY2MnAJmfiUnZj4CB2MzFxfUGWVBcXPx6WVlZE0ie6CwiJye3D+il6UCvgZ0PCreCggKQ4adIzWu/w8LCpoO8wsLC8j0yMnKipqbmelh6wQUYQUUADmACxDpADArwl4RSPT6DBqYYAQgwANyusz7jloxAAAAAAElFTkSuQmCC);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjQxN0VEOUZDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjQxN0VEQTBDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNDE3RUQ5REM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNDE3RUQ5RUM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq9E2PUAAAH/SURBVHjaYvz//z8DNQAjTQ0KCAjgAVJFQOwBxGZQ4VNAvAOI+zZs2PCFoEFAQ+wZGRkXAMUVsNrMyPgAKJcANOwgToOAhgQCqXUgtqCg4ANXV9ctzs7Od0D8vXv3quzYsSPw06dP0lDl/kDDNmEYBDRECGjbYyCfS09Pb0dNTc1sNja2M0CpF1C1EjExMfu/fPmiBHXZZ5CrgYa9A/FZYCaysLCU/vnzh0tUVPRGU1NTPVDoNBD/R3ItyKVKAgICj/79+8cIdJksSA9QrBIkz4RkUBCINjU1XQUNWGRDQC4zBhrycMGCBYW2trbLkPWgGPTz50+wk6WlpTegBT6yIaCYXMfJybkRJPf7928ZDIOYmZl/g+jjx4+/xmcISPz27dsfYNowDOLi4gIb8PDhQ1N8hkDVGIBobm7ulxgGAb0EClyGX79+leAzBCjH9vXr13pkPSgGhYeHTwd6DxhUP62ghjzCZggw2icCw0YdGNDfQXrgkQVjGBgYHPHx8Zm9cePGHGhA/gdq/ANkysGUAHELMO3ogji+vr6zQXpwZREFkEErV66M//btmwi2LAIMyzdAlyz09/efDAoufJlW8tWrVx7Tp08PevDggc779+8VYFlGQUHhSmZm5joxMTFQ5n1OTDHCCsT6QAxKJ2JQsVdA/ASIL4J8TrPyCCDAAK8E80CvM3cMAAAAAElFTkSuQmCC);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Verdana;font-size:11px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #cac8bd}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #eae9e5}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:11px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #cac8bd}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cac8bd}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:70px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px;padding-bottom:1px;background:#fff;background:#e0ded7}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #eae9e5;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:1px solid #cac8bd;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fcfaf3;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#3f3f3f;background-color:#f4f2ea;border-bottom:1px solid #cac8bd}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:11px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#3f3f3f;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:6px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-top-left-radius:0;border-bottom-left-radius:6px;border-top-right-radius:0;border-bottom-right-radius:6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:3.5px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDgcMloNXJQAAAFNJREFUOMvt0zEOACAIA0Dkg30rL8TJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAT/KLVk9yshBAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;color:#4f4f4f;background:#fff;background:#e0ded7;margin:5px 9px 8px 0;min-width:60px;line-height:27px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cac8bd}.gantt_cal_qi_controls div{float:left;height:27px;text-align:center;line-height:27px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:11px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:11px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #cac8bd}.gantt_layout_cell_border_right{border-right:1px solid #cac8bd}.gantt_layout_cell_border_top{border-top:1px solid #cac8bd}.gantt_layout_cell_border_bottom{border-bottom:1px solid #cac8bd}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:Verdana;font-size:11px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d3d1c8;border-top:1px solid #d3d1c8}.gantt_drag_marker .gantt_cell{border-color:#d3d1c8}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#fff}.gantt_popup_button.gantt_delete_button{border:1px solid #98d27e;background:#a7d991}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_skyblue.css b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_skyblue.css
new file mode 100644
index 0000000..ef6cfe3
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_skyblue.css
@@ -0,0 +1 @@
+.buttonBg{background:#fff}.gridHoverStyle{background-color:#ffe6b1!important;background-color:#ffebc1;background-image:linear-gradient(0deg,#ffe09d 0,#ffeabb);border-top-color:#ffc341;border-bottom-color:#ffc341}.gridSelection,.timelineSelection{background-color:#ffe6b1!important;border-bottom-color:#ffc341}.timelineSelection{background-color:#ffebc1;background-image:linear-gradient(0deg,#ffe09d 0,#ffeabb);border-top-color:#ffc341}.timelineSelection .gantt_task_cell{border-right-color:#ffce65}.gantt_popup_shadow{box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_quick_info .gantt_cal_qi_title{background:#fff}.gantt_cal_qi_controls .gantt_qi_big_icon .gantt_menu_icon.icon_delete{margin-top:5px}.gantt_popup_title{box-shadow:inset 0 1px 1px #fff;background-color:#dfedff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e4f0ff),color-stop(50%,#dfedff),color-stop(100%,#d5e8ff));background-image:-o-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);background-position:0 1px;background-repeat:repeat-x}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-size:8pt;color:#1e2022}.gantt_container,.gantt_tooltip{background-color:#fff;font-family:Tahoma}.gantt_container{font-size:11px;border:1px solid #a4bed4;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#42464b;border-bottom:1px solid #a4bed4;box-sizing:border-box}.gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{box-shadow:inset 0 1px 1px #fff;background-color:#dfedff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e4f0ff),color-stop(50%,#dfedff),color-stop(100%,#d5e8ff));background-image:-o-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);background-position:0 1px;background-repeat:repeat-x}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #a4bed4}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #a4bed4;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:25px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzZCMThBRUFCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzZCMThBRUJCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NkIxOEFFOEJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NkIxOEFFOUJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVHygEAAAEpSURBVHjaYgzeGcyABfxnwA4Y0QVY/v79i1VlsUMxCr/3QC9WdTgN+P//P8Ohr4fAbDtuOwZc6lj+/PmDVeLfv39wTSA2LnU4DQC5AGYAiI1LHRNQ4j861pfSZ3j36x1YEwiD2CAxbGoZbRbZ/K/3qUcx9cPvDwzXv11n+PL3C5jPw8zDoMmlySDAKoCirnFLI8QLID/ufLOTARf48OcDw/Gfx1HE3EXcwa5j+f37N95AwgVAekB64QaATISB97/fM1z5dIXh85/PYD4vCy+DDp8OgyCrIIYBjFoTtDBSnYWyBYO9rj3DsbfHwHwrYSuGg5cPMpy4ewIzFoCmMKLjwzcOMwiwCMBjAcQGiWFTizchweRompDwuiBANoCgCxjFasQoys4AAQYARt4I/K036xQAAAAASUVORK5CYII=);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#ffe6b1!important;background-color:#ffebc1;background-image:linear-gradient(0deg,#ffe09d 0,#ffeabb);border-top-color:#ffc341;border-bottom-color:#ffc341}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#a4bed4;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#ebebeb;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #a4bed4;border-right:1px solid #a4bed4}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #a4bed4;border-bottom:1px solid #a4bed4;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #a4bed4;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAWUlEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZyDKIkZGR4f9/hCMHziCQS9AByGUD5yKYa6gWRujeI8lrVElHhAxBlh/GmRYA5MZIE4VV1O8AAAAASUVORK5CYII=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAATElEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZhrhBjIyYIfD//3+GYeA1XNFGkteoko4IGYIsP4wzLQBu8jwTv5HhogAAAABJRU5ErkJggg==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB30lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodz0A0xSbqMas6/nwzf/3AwcLL8YPjxYhvDlR11DMiGoRgkp63OIGY0ieHPt7cMF9ZGwQ0yjj0EZv/4L8TAwfiO4f+3awzn1mbgNsgkdidEM6sU3JA/Hy+jGhq+jOH/n09EGoTsKZihQK+dWWDCYBQ8AyxLnIugBv3/9RbMArmAkUuL4exiOwYD/26w2IWNpbi9Zhy5gYHh3zewxn9/PjMw/3nDwPD7HQODsDdY89nlAQw6Hk1gNt7ABjkb2YD/f78w/P3xloFFLoth8cRsBi2xp8QZZOxdDnYBzACQzb+/f2BgUywAB7iyaRA89DiFDVBchRL9Rs6RYBfADADRf398ZuDUrIUYZB6GiIZ/fxh4pP0YLm5IAIcVikH61m4YhjD++cbArtUI1oDson9/fjDwqqQxXFodgGmQlpEZ2CCQKyAmfgIG/i8GDt1u0gxS19IE6we54v//P2BDQABmkKKhF8JrQBZOF4EMghsC0kKuQZICXxj4xbQhroECRkYWoIvawYEtp20NF2dm42dgk4ljuLk5AjWMQCpgJQDMQJgumEEo/oJyYCUASpkCU4hcpIAMFXfeBHYRehmEbDBWg5AVIBuKzyAAfjsXIj7TBm0AAAAASUVORK5CYII=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB90lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodzQIboWYUwsGnU4tR/Zp4+g6J1NQM/HzvDhe11DMiGoRhkErMHiyHMEDE2IQaQQZwcHAxqXvMZLq6LJMUgiCH//3xlYOSSJccgqAG/3oAN+vv7GwMLtxzDmSWOYBepe85kuLA+npCLmMEuYPj3neHfjxcQF/1+z8AibAU0yAVskIZbN8P5Tbm4DTKO2AI2AOQCxr+fwAb8+/2JgVXEAWzg2RU+EBc5VuEPbIPAhSgGMPwFuuznawZWuQSGxZPSGbTEnoINUrXJYbi0pwe3iww8m8AugBkAcsXv728Y2FXyGC6sDmJgZmZmYGNlZVC1TGRgYOZGMQw1HTlmgl0AM+D/ny9gNrtqMTi6QQaJC3Mw8Mm5gcU5pZzgYYWRIH/9+MzA+P8nMMC/AMPoK8O/P78YuHXrwLHEyMzGICnMCjHo3zcGDuV0sEtBCRPFIE1DB7ABkJiCGPL/3y8GHv0WuEEi/CwMwkru+A3S0DWBGwA2DGgICGAYpGALFsfpInUNTYa//xgYGKEGwAzjNugChxHIayAXicibMfxnZMdtkKTANwYeEV2G/0xsYMNANDjgJRIYHh4qhwQwMPrlVXUYGFl4GL7xeoLFUcIIpIiUYgRsKhDASgCUMgUmSQ5NNYMAK+sKIlqSof0AAAAASUVORK5CYII=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAA/klEQVQ4T63Uyw5FMBAG4CliIcHOE9pIeBrCxou69py/yUgvnLRymogS85lOL4L+1ITu1HUtfdx5no04xFwvgPR9T3EckxDOd8rf913du64jGzOgcRxpWRYDQvB5nrSuK5VleSVsYwY0TRNt20ZRFKlgzuI4DgUVRWGMXMccCEHcgEkp1ZCQaZ7n/hACuUboA8YFDNkCR7+qKmqa5qqVk5E9azrGKDDUKwgCzBgAYHjOsiwcAsb14hqmafoOQhY8k+gnSeIPIYAb9xl7Bekgw1hrQcW+Q9Te+m6jIOjXJn6EhmFQm9anYfbatnUXJIJ9jxH+kX4C3J8XPilZ33wAwx73EyvYLYIAAAAASUVORK5CYII=)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#4a8f43;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#4a8f43}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#4a8f43}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:Tahoma;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Tahoma;border-radius:0;border:1px solid #a4bed4;background:#fff}.gantt_popup_title{border-top-left-radius:0;border-top-right-radius:0;border-width:0}.gantt_button,.gantt_popup_button{border:1px solid #a4bed4;height:24px;line-height:24px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff;background-color:#f8f8f8;background-image:linear-gradient(0deg,#e6e6e6 0,#fff)}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:10px}.gantt_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:4px;font-size:15px;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:1px solid #a4bed4;height:40px;line-height:40px;font-size:20px}.gantt_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:0}.gantt-error,.gantt-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #a4bed4}.gantt-error{background-color:#d81b1b;border:1px solid #ff3c3c}.gantt-error div{background-color:#d81b1b;border:1px solid #940000;color:#fff}.gantt-warning{background-color:#ffa000;border:1px solid #ffb333}.gantt-warning div{background-color:#ffa000;border:1px solid #b37000;color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#1e2022;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#5aa0d3;background-color:#82b7de;background-image:linear-gradient(0deg,#abcee8 0,#5aa0d3 36%,#bfdaee)}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:0;position:absolute;box-sizing:border-box;background-color:#eff6fb;border:1px solid #3588c5;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;top:0;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:6.75px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#4a8f43}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #4a8f43}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #0070fe}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #6eb867}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#6eb867;border-color:#4a8f43}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 8px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#4a8f43}.gantt_link_arrow_left{border-width:4px 8px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#4a8f43;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 4px 8px;border-color:transparent transparent #4a8f43;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#4a8f43;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 8px 0 4px;border-top-color:#4a8f43;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:100%;width:8px;z-index:1;top:-1px}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDNGNzQ1MTZCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDNGNzQ1MTdCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0M0Y3NDUxNEJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0M0Y3NDUxNUJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrBLI3EAAACISURBVHjafE07DkMhDAuftQdgYuCWbZ9a0WtwGJC4BgMbYmVGaZLpqWpryZFjOwrACSmlSLzCN1DwrLUik/TtM3yUUnDOiWMMZE3enTNF4gghRO89KKXkABGh9w6ttcPSHp1zsNaCvbcUjDHAHhVemg1rrVxprYWs2ZOMR84ZfoGfXuAP3gIMABorQUvC1invAAAAAElFTkSuQmCC);background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAUklEQVQY04XNsQ2AMAxE0W+oGYjZCAIxmuk9gze5VCmIIvLaf9KtfD3ADrwM3JmpzBRw9PGKCDURIaC0eLq7eu4uoBggSaNLzIyFCQM0G2x/gwpRwTYDaW9lwQAAAABJRU5ErkJggg==)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #4a8f43;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#ffe6b1!important;border-bottom-color:#ffc341}.gantt_task_row.gantt_selected{background-color:#ffebc1;background-image:linear-gradient(0deg,#ffe09d 0,#ffeabb);border-top-color:#ffc341}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffb30e;border-right-color:#ffce65}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #5aa0d3}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #9ab9f1}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#db7dc5;border:0 solid #cd49ae;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background-color:#eff6fb;border-radius:0;font-family:Tahoma;font-size:11px;border:1px solid #a4bed4;color:#42464b;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:Tahoma;border:1px solid #a4bed4;font-size:11px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:Tahoma;font-size:11px;box-sizing:border-box;border:1px solid #a4bed4;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #a4bed4;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:2px 25px 2px 10px;float:left;border-radius:4px;border:1px solid #a4bed4;height:26px;color:#42464b;background:#fff;background-color:#f8f8f8;background-image:linear-gradient(0deg,#e6e6e6 0,#fff);box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:13px;height:20px;line-height:20px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkE5Nzc4RENDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkE5Nzc4RERDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQTk3NzhEQUMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQTk3NzhEQkMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pr5Ot2UAAAFoSURBVHjapFO7SgNRED0rxkjEELbcQksLBUMg4EfkG7YV/AFTpBAUfNQisVDQD7CQlBaWwoZ8gNEiFttmg3GTfbF6JtzFTUJYyIHhDnfOnJm5Dy2OYywDjQJnF5ex/dXDweENNtaAzT/jur46IY1D4McHvv3J+nZ7BGNrG436sSaU3ucHqtUqzP1sVcflMizLEl8EwjBEFEXwomwC5DInEeDGaDSC62cTIJc5iUAQBGJukE1A8YkVNYLv++h232WMRUYOuakRlOLTwzU8z1tYPZ/Po1QqJR0kAgQDWTEjwLaIWq0GwzDmJtm2jVarNSvAeeQQXVe6ME1Tgs1mMyXA2GAwQKFQmH8G/X4fjuOgWCxKkP40yMnlcukO1MNgAivoui5B+tMgh3H1DuQa66fnaLfbGA6HMgY7oNGfNnL+v0RN/cbnl9f46qSBSqUiM9J4ZQSvVgl0Oh1pf2d3D4/3d5q27Hf+FWAAc90EKSR5k78AAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzU4NTQ3NUZDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzU4NTQ3NjBDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNTg1NDc1REMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNTg1NDc1RUMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVB3hoAAAEYSURBVHjapJM9CsJAEIUTFStbQRA8gKCNKSIIeohUVraC9oKiGBRsBDvBylbwEkJQCys9gJUgeIOAxDfwEpYNpsmDL7PZ+cn+TMwgCIw0yhgplZPH3bbVuRqYgiYogxe4ABc8wqD69RpbQR6MwQ04TDZoHc6LP/tvC2uw4Fi+Vgcmrct58W9iW4BaYAB80OGSQ8my7xz7jDsAT11Bn3alJYvUa1pp8VGBNu0uIVm2s9fiowJF8OWJ/0sWPRlX1At8eLqlhGRRhXEfvcCJtpeQLOpq8VGBLe04Ibmh+Ld6AY8HWOBVzUCVvio780z/LrxCtQ9EQ+5tBOZElRzeUmmqWCfKlyfAAkfw5vyb7xb9vlrATPs7/wQYAISgQGDaq6hUAAAAAElFTkSuQmCC);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Tahoma;font-size:11px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #a4bed4}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:11px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #a4bed4}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #a4bed4}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:70px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px;padding-bottom:1px;background:#fff;background-color:#f8f8f8;background-image:linear-gradient(0deg,#e6e6e6 0,#fff)}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #ebebeb;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:1px solid #a4bed4;border-radius:0;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#1e2022;box-shadow:inset 0 1px 1px #fff;background-color:#dfedff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e4f0ff),color-stop(50%,#dfedff),color-stop(100%,#d5e8ff));background-image:-o-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);background-position:0 1px;background-repeat:repeat-x;border-bottom:1px solid #a4bed4}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:11px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#1e2022;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:3px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDhEuX3ujFgAAAFNJREFUOMvt0zEOACAIA0DksTyqn8XJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+sNUIROnQoAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;color:#42464b;background:#fff;background-color:#f8f8f8;background-image:linear-gradient(0deg,#e6e6e6 0,#fff);margin:5px 9px 8px 0;min-width:60px;line-height:26px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #a4bed4}.gantt_cal_qi_controls div{float:left;height:26px;text-align:center;line-height:26px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:11px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:11px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #a4bed4}.gantt_layout_cell_border_right{border-right:1px solid #a4bed4}.gantt_layout_cell_border_top{border-top:1px solid #a4bed4}.gantt_layout_cell_border_bottom{border-bottom:1px solid #a4bed4}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:Tahoma;font-size:11px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#e4f0ff}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_terrace.css b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_terrace.css
new file mode 100644
index 0000000..56226a3
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/skins/dhtmlxgantt_terrace.css
@@ -0,0 +1 @@
+.gridHoverStyle,.gridSelection,.timelineSelection{background-color:#fff3a1}.gantt_grid_scale .gantt_grid_head_cell{color:#a6a6a6;border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none;color:#454545}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_up{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:10px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#a6a6a6;border-right:1px solid #ebebeb}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51}.buttonBg{background:#fff}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.gantt_btn_set.gantt_cancel_btn_set{background:#fff;color:#454545;border:1px solid #cecece}.gantt_btn_set.gantt_save_btn_set{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff}.gantt_btn_set.gantt_delete_btn_set{text-shadow:0 -1px 0 #6f6f6f;background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_popup_button.gantt_ok_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.gantt_popup_button.gantt_cancel_button{font-weight:700;color:#454544}.gantt_popup_title{background-color:#fff}.gantt_popup_shadow{box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_qi_big_icon.icon_edit{color:#454545;background:#fff}.gantt_qi_big_icon.icon_delete{text-shadow:0 -1px 0 #a60;background:#ec8e00;color:#fff;border-width:0}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-size:8pt;color:#454545}.gantt_container,.gantt_tooltip{background-color:#fff;font-family:Arial}.gantt_container{font-size:13px;border:1px solid #cecece;position:relative;white-space:nowrap;overflow-x:hidden;overflow-y:hidden}.gantt_touch_active{overscroll-behavior:none}.gantt_task_scroll{overflow-x:scroll}.gantt_grid,.gantt_task{position:relative;overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#6b6b6b;font-size:12px;border-bottom:1px solid #cecece;box-sizing:border-box}.gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cecece}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cecece;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:33px;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden;position:relative}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#fff3a1}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px;margin-left:-7px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#cecece;height:100%;width:1px;margin:0 auto}.gantt_task_grid_row_resize_wrap{cursor:row-resize;position:absolute;height:13px;margin-top:-7px;left:0;width:100%}.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize{background-color:#ebebeb;top:6px;height:1px;width:100%;margin:0 auto;position:relative}.gantt_drag_marker{pointer-events:none}.gantt_drag_marker.gantt_grid_resize_area,.gantt_drag_marker.gantt_row_grid_resize_area{background-color:hsla(0,0%,91%,.5);height:100%;width:100%;box-sizing:border-box}.gantt_drag_marker.gantt_grid_resize_area{border-left:1px solid #cecece;border-right:1px solid #cecece}.gantt_drag_marker.gantt_row_grid_resize_area{border-top:1px solid #cecece;border-bottom:1px solid #cecece;pointer-events:none}.gantt_row{display:flex}.gantt_row>div{flex-shrink:0;flex-grow:0}.gantt_cell{vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_cell_tree{display:flex;flex-wrap:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell{border-right-width:1px}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cecece;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_layout_cell.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;position:absolute;right:0;z-index:1}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden}.gantt_layout_cell .gantt_hor_scroll{position:absolute}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_icon,.gantt_tree_indent{flex-grow:0;flex-shrink:0}.gantt_tree_indent{width:15px;height:100%}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;background-repeat:no-repeat;background-position:50%}.gantt_tree_content{height:100%;white-space:nowrap;min-width:0}.gantt_tree_icon.gantt_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAArklEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNUAGcXJyMnz//h3uQrJdRLFBIAPQAchlJLsIFuCMjIwM////B5sJMoRkg2CuIdtrQcHBDOxsbHBfCQgIMHz48AHO//nrF8O6tWsJR7+7uzsDIxMTznT0/98/hp07d+I3iGopm2DewKFg8OV+AJWkfRMrTobLAAAAAElFTkSuQmCC);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAkUlEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNeIN4uTkxAin79+/M5AcRtgCHGQIyQbhijaiDQoKDmZgZ2PDGf0/f/1iWLd2LeHod3d3Z2BkYsJp0P9//xh27tyJ3yCqpWyCeQOHgsGX+wEZpW4T5LCxKwAAAABJRU5ErkJggg==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAs0lEQVQ4T62T0Q2EIBBEpQlzuaaMsQoqooqLsSljbMLLmMxmUXBR4U+Qt7Mzi2sqLVeJ00SgEMKWAnvvzYLyAyHfT5sU2fXDJSwCAXK8MI0/UTkva7IIFJsg3NSwnKdFoKtAWOQ1CN7CEqeTotE5L7QyJhmBcklZM4ZgTiAr3iOU3kD93ppO5SkMjB1EeXdBWoSkRql3YeIRe+cGvktS056JR9wsmeBUkujCfNXWCPC8GugPqn5ii/hV+FoAAAAASUVORK5CYII=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAfElEQVQ4T2NkoBJgpJI5DCgGTZ8+/T82gzMzMwlaCFcAM0RKQgyrI/0Dg/EahmIQyBB0DRvXr4W78tmLV1gtAbmYoEEgnciG4QpTogzCFyEwSyg2CBS2oCAZNQh3cA+hMAJ5AlcKxuVBlOgnNgVjMwyUrQjmamKLGaoZBAAOTFyLnFFW4wAAAABJRU5ErkJggg==)}.gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAeElEQVQ4T2NkoBJgRDZn+vTp/wmZm5mZiaIHph7DICkJMUJmMfgHBmMYhtUgbAo3rl+L4lp0NUQbBPI2umuRDaPIIFAYwAyjv0HoMQALM5JdhG4QLMxGDcKdyIdoGIE89OzFK4KZF5Rl8EY/QROQFGA1iBQD0NUCAJVjcxO0naAQAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:50%}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:#ffe0e0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:hsla(0,0%,61%,.1);position:absolute;top:1px;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.gantt_column_drag_marker{border:1px solid #cecece;opacity:.8;pointer-events:none}.gantt_grid_head_cell_dragged{border:1px solid #cecece;opacity:.3}.gantt_grid_target_marker{position:absolute;top:0;width:2px;height:100%;background-color:#ffa011;transform:translateX(-1px)}.gantt_grid_target_marker:after,.gantt_grid_target_marker:before{display:block;content:"";position:absolute;left:-5px;width:0;height:0;border:6px solid transparent}.gantt_grid_target_marker:before{border-top-color:#ffa011}.gantt_grid_target_marker:after{bottom:0;border-bottom-color:#ffa011}.gantt_message_area{position:fixed;right:5px;width:250px;z-index:1000}.gantt-info{min-width:120px;padding:4px 4px 4px 20px;font-family:Arial;z-index:10000;margin:5px;margin-bottom:10px;transition:all .5s ease}.gantt-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.gantt_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #cecece;background:#fff}.gantt_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.gantt_button,.gantt_popup_button{border:1px solid #cecece;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.gantt-info,.gantt_button,.gantt_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.gantt_popup_text{overflow:hidden}.gantt_popup_controls{border-radius:6px;padding:10px}.gantt_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.gantt-info img,.gantt_modal_box img{float:left;margin-right:20px}.gantt-alert-error,.gantt-confirm-error{border:1px solid red}.gantt_button input,.gantt_popup_button div{border-radius:4px;font-size:14px;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.gantt_popup_title{border-bottom:1px solid #cecece;height:40px;line-height:40px;font-size:20px}.gantt_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.gantt-error,.gantt-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#fff;border-radius:3px;border:1px solid #fff}.gantt-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cecece}.gantt-error{background-color:#d81b1b;border:1px solid #ff3c3c}.gantt-error div{background-color:#d81b1b;border:1px solid #940000;color:#fff}.gantt-warning{background-color:#ff9000;border:1px solid #ffa633}.gantt-warning div{background-color:#ff9000;border:1px solid #b36500;color:#fff}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#fff;width:100%;top:0;cursor:pointer;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#299cb4}.gantt_task_progress_wrapper{border-radius:inherit;position:relative;width:100%;height:100%;overflow:hidden}.gantt_task_line{border-radius:2px;position:absolute;box-sizing:border-box;background-color:#3db9d3;border:1px solid #2898b0;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{transform:scale(1.02,1.1);transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{transform:scaleY(1.3);transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;top:0;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:20px}.gantt_side_content.gantt_right{left:100%;padding-left:20px}.gantt_side_content.gantt_link_crossing{bottom:8.75px;top:auto}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:20px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control.task_right div.gantt_link_point{margin-left:7px}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-20px}.gantt_link_control.task_right{right:-20px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_link_control div,.gantt_task_line.gantt_drag_move .gantt_task_drag,.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,.gantt_task_line.gantt_drag_progress .gantt_link_control div,.gantt_task_line.gantt_drag_progress .gantt_task_drag,.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,.gantt_task_line.gantt_drag_resize .gantt_link_control div,.gantt_task_line.gantt_drag_resize .gantt_task_drag,.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_link_control div,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #3db9d3}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_end_date div,.link_start_allow .gantt_link_control.task_start_date div{background-color:#ffbf5e;border-color:#ffa011}.link_finish_deny .gantt_link_control.task_end_date div,.link_start_deny .gantt_link_control.task_start_date div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:#ffa011}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-right-color:#ffa011;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_up{border-width:0 4px 6px;border-color:transparent transparent #ffa011;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:#ffa011;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-top-color:#ffa011;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:ew-resize;display:none;position:absolute}.gantt_task_drag.task_right{cursor:e-resize}.gantt_task_drag.task_left{cursor:w-resize}.gantt_task_drag{height:100%;width:8px;z-index:1;top:-1px}.gantt_task_drag.task_left{left:-7px}.gantt_task_drag.task_right{right:-7px}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:1}.gantt_task_progress_drag:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAs0lEQVQoz6WMPW7CQBgFJxZaiZ60qcgdwjVMmzu8gpwhDULabXyBdHAGuzRHivQiQZovigS2+Jtu95t5T03TMITtCtjEc5VSOgx5k5F4CnxJWgKUUl5sv6eUvk/daiCeAe1fDCCpBtq4jQ/YngO9pMWpGH99OOcDtt8ifmWEuO3D/R+wXQOdpGcuIGkGdNFQ2RawlTTlSsLd2RY55+O95JyPFQ/y8MAE+CylfADpxvYHWP8CXj+JR4wdKHYAAAAASUVORK5CYII=)}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #299cb4}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#d33daf;border:0 solid #61164f;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_btn_set:focus,.gantt_cell:focus,.gantt_grid_head_cell:focus,.gantt_popup_button:focus,.gantt_qi_big_icon:focus,.gantt_row:focus{box-shadow:inset 0 0 1px 1px #4d90fe}.gantt_split_parent,.gantt_split_subproject{opacity:.1;pointer-events:none}.gantt_rollup_child .gantt_link_control,.gantt_rollup_child:hover .gantt_link_control{display:none}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:6px;font-family:Arial;font-size:13px;border:1px solid #cecece;color:#6b6b6b;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light_wide{width:650px}.gantt_cal_light select{font-family:Arial;border:1px solid #cecece;font-size:13px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0}.gantt_cal_ltitle,.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow-y:auto;overflow-x:hidden;font-family:Arial;font-size:13px;box-sizing:border-box;border:1px solid #cecece;height:100%;width:100%;outline:none!important;resize:none}.gantt_section_constraint [data-constraint-time-select]{margin-left:20px}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #cecece;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;border-radius:4px;border:0 solid #cecece;height:32px;font-weight:700;background:#fff;box-sizing:border-box;cursor:pointer}.gantt_hidden{display:none}.gantt_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:fixed;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #cecece;text-align:center;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{box-sizing:border-box;border:1px solid #cecece}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:transparent}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:13px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #cecece}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cecece}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_value.gantt_duration_value_formatted{width:70px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px;padding-bottom:1px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_resources{max-height:150px;height:auto;overflow-y:auto}.gantt_resource_row{display:block;padding:10px 0;border-bottom:1px solid #ebebeb;cursor:pointer}.gantt_resource_row input[type=checkbox]:not(:checked),.gantt_resource_row input[type=checkbox]:not(:checked)~div{opacity:.5}.gantt_resource_toggle{vertical-align:middle}.gantt_resources_filter .gantt_resources_filter_input{padding:1px 2px;box-sizing:border-box}.gantt_resources_filter .switch_unsetted{vertical-align:middle}.gantt_resource_cell{display:inline-block}.gantt_resource_cell.gantt_resource_cell_checkbox{width:24px;max-width:24px;min-width:24px;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_label{width:40%;max-width:40%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value{width:30%;max-width:30%;vertical-align:middle}.gantt_resource_cell.gantt_resource_cell_value input,.gantt_resource_cell.gantt_resource_cell_value select{width:80%;vertical-align:middle;padding:1px 2px;box-sizing:border-box}.gantt_resource_cell.gantt_resource_cell_unit{width:10%;max-width:10%;vertical-align:middle}.gantt_resource_early_value{opacity:.8;font-size:.9em}.gantt_cal_quick_info{border:1px solid #cecece;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#454545;background-color:#fff;border-bottom:1px solid #cecece}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:13px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#454545;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:6px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-top-left-radius:0;border-bottom-left-radius:6px;border-top-right-radius:0;border-bottom-right-radius:6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cecece}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_cal_quick_info.gantt_qi_hidden{display:none}.gantt_tooltip{padding:10px;position:absolute;z-index:50;white-space:nowrap}.gantt_resource_marker{position:absolute;text-align:center;font-size:14px;color:#fff}.gantt_resource_marker_ok{background:rgba(78,208,134,.75)}.gantt_resource_marker_overtime{background:hsla(0,100%,76%,.69)}.gantt_histogram_label{width:100%;height:100%;position:absolute;z-index:1;font-weight:700;font-size:13px}.gantt_histogram_fill{background-color:rgba(41,157,180,.2);width:100%;position:absolute;bottom:0}.gantt_histogram_hor_bar{height:1px;margin-top:-1px}.gantt_histogram_hor_bar,.gantt_histogram_vert_bar{position:absolute;background:#299db4;margin-left:-1px}.gantt_histogram_vert_bar{width:1px}.gantt_histogram_cell{position:absolute;text-align:center;font-size:13px;color:#000}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_grid_editor_placeholder{position:absolute}.gantt_grid_editor_placeholder>div,.gantt_grid_editor_placeholder input,.gantt_grid_editor_placeholder select{width:100%;height:100%;box-sizing:border-box}.gantt_row_placeholder div{opacity:.5}.gantt_row_placeholder .gantt_add,.gantt_row_placeholder .gantt_file{display:none}.gantt_drag_marker.gantt_grid_dnd_marker{background-color:transparent;transition:all .1s ease}.gantt_grid_dnd_marker_line{height:4px;width:100%;background-color:#3498db}.gantt_grid_dnd_marker_line:before{background:#fff;width:12px;height:12px;box-sizing:border-box;border:3px solid #3498db;border-radius:6px;content:"";line-height:1px;display:block;position:absolute;margin-left:-11px;margin-top:-4px;pointer-events:none}.gantt_grid_dnd_marker_folder{height:100%;width:100%;position:absolute;pointer-events:none;box-sizing:border-box;box-shadow:inset 0 0 0 2px #3f98db;background:transparent}.gantt_overlay_area{display:none}.gantt_overlay,.gantt_overlay_area{position:absolute;height:inherit;width:inherit;top:0;left:0}.gantt_click_drag_rect{position:absolute;left:0;top:0;outline:1px solid #3f98db;background-color:rgba(52,152,219,.3)}.gantt_timeline_move_available,.gantt_timeline_move_available *{cursor:move}.gantt_rtl .gantt_grid{text-align:right}.gantt_rtl .gantt_cell,.gantt_rtl .gantt_row{flex-direction:row-reverse}.gantt_layout_content{width:100%;overflow:auto;box-sizing:border-box}.gantt_layout_cell{position:relative;box-sizing:border-box}.gantt_layout_cell>.gantt_layout_header{background:#33aae8;color:#fff;font-size:17px;padding:5px 10px;box-sizing:border-box}.gantt_layout_header.collapsed_x{background:#a9a9a9}.gantt_layout_header.collapsed_x .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_header.collapsed_y{background:#a9a9a9}.gantt_layout_header.collapsed_y .gantt_header_arrow:before{content:"\21E9"}.gantt_layout_header{cursor:pointer}.gantt_layout_header .gantt_header_arrow{float:right;text-align:right}.gantt_layout_header .gantt_header_arrow:before{content:"\21E6"}.gantt_layout_header.vertical .gantt_header_arrow:before{content:"\21E7"}.gantt_layout_outer_scroll_vertical .gantt_layout_content{overflow-y:hidden}.gantt_layout_outer_scroll_horizontal .gantt_layout_content{overflow-x:hidden}.gantt_layout_x>.gantt_layout_cell{display:inline-block;vertical-align:top}.gantt_layout_x{white-space:nowrap}.gantt_resizing{opacity:.7;background:#f2f2f2}.gantt_layout_cell_border_right.gantt_resizer{overflow:visible;border-right:0}.gantt_resizer{cursor:e-resize;position:relative}.gantt_resizer_y{cursor:n-resize}.gantt_resizer_stick{background:#33aae8;z-index:9999;position:absolute;top:0;width:100%}.gantt_resizer_x .gantt_resizer_x{position:absolute;width:20px;height:100%;margin-left:-10px;top:0;left:0;z-index:1}.gantt_resizer_y .gantt_resizer_y{position:absolute;height:20px;width:100%;top:-10px;left:0;z-index:1}.gantt_resizer_error{background:#cd5c5c!important}.gantt_layout_cell_border_left{border-left:1px solid #cecece}.gantt_layout_cell_border_right{border-right:1px solid #cecece}.gantt_layout_cell_border_top{border-top:1px solid #cecece}.gantt_layout_cell_border_bottom{border-bottom:1px solid #cecece}.gantt_layout_cell_border_transparent{border-color:transparent}.gantt_window{position:absolute;top:50%;left:50%;z-index:999999999;background:#fff}.gantt_window_content{position:relative}.gantt_window_content_header{background:#39c;color:#fff;height:33px;padding:10px 10px 0;border-bottom:2px solid #fff;position:relative}.gantt_window_content_header_text{padding-left:10%}.gantt_window_content_header_buttons{position:absolute;top:10px;right:10px}.gantt_window_content_header_buttons:hover{color:#000;cursor:pointer}.gantt_window_content_resizer{position:absolute;width:15px;height:15px;bottom:0;line-height:15px;right:-1px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);cursor:nw-resize;z-index:999}.gantt_window_content_frame{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.1);z-index:9999}.gantt_window_drag{cursor:pointer!important}.gantt_window_resizing{overflow:visible}.gantt_window_resizing_body{overflow:hidden!important}.gantt_window_modal{background:rgba(0,0,0,.1);z-index:9999;top:0;left:0;width:100%;height:100%;position:fixed}.gantt_cal_light,.gantt_cal_quick_info,.gantt_container,.gantt_message_area,.gantt_modal_box,.gantt_tooltip{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.gantt_noselect .gantt_grid_data .gantt_row.odd:hover,.gantt_noselect .gantt_grid_data .gantt_row:hover{background-color:unset}.gantt_drag_marker{position:absolute;top:-1000px;left:-1000px;font-family:Arial;font-size:13px;z-index:1;white-space:nowrap}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_empty_state_wrapper{position:relative}.gantt_empty_state{height:100%;max-width:500px;box-sizing:border-box;white-space:pre-line;overflow-wrap:break-word;display:flex;flex-direction:column;justify-content:flex-start;margin:0 auto}.gantt_empty_state_image{background-image:url("data:image/png;base64,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");background-repeat:no-repeat;width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;min-height:0;height:200px;background-size:contain;background-position-x:center;background-position-y:bottom;margin-top:40px}.gantt_empty_state_text{text-align:center}.gantt_empty_state_text_link{color:#03a9f4;background-position:100% 0;background:none;opacity:1;height:unset;cursor:pointer}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#f8fdfd}.gantt_popup_button.gantt_delete_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.gantt_container_resize_watcher{background:transparent;width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;pointer-events:none;border:0;box-sizing:border-box;opacity:0}
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.css b/src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.css
new file mode 100644
index 0000000..d1d22b3
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.css
@@ -0,0 +1,2027 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #fff;
+}
+/* colors for items with inline styles assigned (task.color, link.color)*/
+.gridHoverStyle {
+ background-color: #FFF3A1;
+}
+.gridSelection {
+ background-color: #FFF3A1;
+}
+.timelineSelection {
+ background-color: #FFF3A1;
+}
+.gantt_grid_scale .gantt_grid_head_cell {
+ color: #a6a6a6;
+ border-top: none !important;
+ border-right: none !important;
+}
+.gantt_grid_data .gantt_cell {
+ border-right: none;
+ color: #454545;
+}
+/*
+ Tasks
+*/
+.gantt_task_link .gantt_link_arrow_right {
+ border-width: 6px 6px 6px 6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_left {
+ border-width: 6px 6px 6px 6px;
+ margin-left: -6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_up {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_link .gantt_link_arrow_down {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_line .gantt_task_progress_drag {
+ bottom: -4px;
+ height: 10px;
+ margin-left: -8px;
+ width: 16px;
+}
+.chartHeaderBg {
+ background-color: #fff;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ color: #a6a6a6;
+ border-right: 1px solid #ebebeb;
+}
+/*
+ project highlight
+*/
+.gantt_row.gantt_project,
+.gantt_row.odd.gantt_project {
+ background-color: #edffef;
+}
+.gantt_task_row.gantt_project,
+.gantt_task_row.odd.gantt_project {
+ background-color: #f5fff6;
+}
+.gantt_task_line.gantt_project {
+ background-color: #65c16f;
+ border: 1px solid #3c9445;
+}
+.gantt_task_line.gantt_project .gantt_task_progress {
+ background-color: #46ad51;
+}
+/*
+ milestone
+*/
+/*
+ lightbox
+*/
+.buttonBg {
+ background: #fff;
+}
+.gantt_cal_light .gantt_btn_set {
+ margin: 5px 10px;
+}
+.gantt_btn_set.gantt_cancel_btn_set {
+ background: #fff;
+ color: #454545;
+ border: 1px solid #CECECE;
+}
+.gantt_btn_set.gantt_save_btn_set {
+ background: #3db9d3;
+ text-shadow: 0 -1px 0 #248a9f;
+ color: #fff;
+}
+.gantt_btn_set.gantt_delete_btn_set {
+ text-shadow: 0 -1px 0 #6F6F6F;
+ background: #ec8e00;
+ text-shadow: 0 -1px 0 #aa6600;
+ color: #fff;
+}
+.gantt_delete_btn {
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_light_wide {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ border-left: none !important;
+ border-right: none !important;
+}
+/*
+ Message
+*/
+.gantt_popup_button.gantt_ok_button {
+ background: #3db9d3;
+ text-shadow: 0 -1px 0 #248a9f;
+ color: #fff;
+ font-weight: bold;
+ border-width: 0;
+}
+.gantt_popup_button.gantt_cancel_button {
+ font-weight: bold;
+ color: #454544;
+}
+.gantt_popup_title {
+ background-color: #fff;
+}
+.gantt_popup_shadow {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+/*
+ Quick info
+*/
+.gantt_qi_big_icon.icon_edit {
+ color: #454545;
+ background: #fff;
+}
+.gantt_qi_big_icon.icon_delete {
+ text-shadow: 0 -1px 0 #aa6600;
+ background: #ec8e00;
+ color: #fff;
+ border-width: 0;
+}
+/*links dnd*/
+.gantt_tooltip {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: white;
+ border-left: 1px solid rgba(0, 0, 0, 0.07);
+ border-top: 1px solid rgba(0, 0, 0, 0.07);
+ font-family: "Arial";
+ font-size: 8pt;
+ color: #454545;
+}
+.gantt_container {
+ background-color: #FFFFFF;
+ font-family: "Arial";
+ font-size: 13px;
+ border: 1px solid #CECECE;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: #6b6b6b;
+ font-size: 12px;
+ border-bottom: 1px solid #CECECE;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ background-color: #fff;
+}
+.gantt_task_scale {
+ background-color: #fff;
+}
+.gantt_task_vscroll {
+ background-color: #fff;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #CECECE;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #CECECE;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 33px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.3;
+ opacity: 0.3;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ background-color: #FFF3A1;
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #FFFFFF;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #CECECE;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #ebebeb;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #CECECE;
+ border-right: 1px solid #CECECE;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #CECECE;
+ border-bottom: 1px solid #CECECE;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #ebebeb;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 13px;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #CECECE;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #ebebeb;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAArklEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNUAGcXJyMnz//h3uQrJdRLFBIAPQAchlJLsIFuCMjIwM////B5sJMoRkg2CuIdtrQcHBDOxsbHBfCQgIMHz48AHO//nrF8O6tWsJR7+7uzsDIxMTznT0/98/hp07d+I3iGopm2DewKFg8OV+AJWkfRMrTobLAAAAAElFTkSuQmCC);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAkUlEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNeIN4uTkxAin79+/M5AcRtgCHGQIyQbhijaiDQoKDmZgZ2PDGf0/f/1iWLd2LeHod3d3Z2BkYsJp0P9//xh27tyJ3yCqpWyCeQOHgsGX+wEZpW4T5LCxKwAAAABJRU5ErkJggg==);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAs0lEQVQ4T62T0Q2EIBBEpQlzuaaMsQoqooqLsSljbMLLmMxmUXBR4U+Qt7Mzi2sqLVeJ00SgEMKWAnvvzYLyAyHfT5sU2fXDJSwCAXK8MI0/UTkva7IIFJsg3NSwnKdFoKtAWOQ1CN7CEqeTotE5L7QyJhmBcklZM4ZgTiAr3iOU3kD93ppO5SkMjB1EeXdBWoSkRql3YeIRe+cGvktS056JR9wsmeBUkujCfNXWCPC8GugPqn5ii/hV+FoAAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAfElEQVQ4T2NkoBJgpJI5DCgGTZ8+/T82gzMzMwlaCFcAM0RKQgyrI/0Dg/EahmIQyBB0DRvXr4W78tmLV1gtAbmYoEEgnciG4QpTogzCFyEwSyg2CBS2oCAZNQh3cA+hMAJ5AlcKxuVBlOgnNgVjMwyUrQjmamKLGaoZBAAOTFyLnFFW4wAAAABJRU5ErkJggg==);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAeElEQVQ4T2NkoBJgRDZn+vTp/wmZm5mZiaIHph7DICkJMUJmMfgHBmMYhtUgbAo3rl+L4lp0NUQbBPI2umuRDaPIIFAYwAyjv0HoMQALM5JdhG4QLMxGDcKdyIdoGIE89OzFK4KZF5Rl8EY/QROQFGA1iBQD0NUCAJVjcxO0naAQAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #FFA011;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #FFA011;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #FFA011;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "Arial";
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 250px;
+ width: 250px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ font-family: "Arial";
+ border-radius: 6px;
+ border: 1px solid #CECECE;
+ background: #fff;
+}
+.gantt_popup_title {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 1px solid #CECECE;
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 4px;
+ background: #fff;
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 10px;
+}
+.gantt_popup_button {
+ min-width: 100px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 4px;
+ font-size: 14px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 1px solid #CECECE;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #CECECE;
+}
+.gantt-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+}
+.gantt-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #FF9000;
+ border: 1px solid #ffa633;
+}
+.gantt-warning div {
+ background-color: #FF9000;
+ border: 1px solid #b36500;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 12px;
+ color: #fff;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: #299cb4;
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #3db9d3;
+ border: 1px solid #2898b0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #6e6e6e;
+ top: 0;
+ font-size: 11px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 8.75px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #FFA011;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #FFA011;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #3db9d3;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #ffbf5e;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #e87e7b;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #ffbf5e;
+ border-color: #ffa011;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #e87e7b;
+ border-color: #dd3e3a;
+}
+.gantt_link_arrow_right {
+ border-width: 4px 0 4px 6px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #FFA011;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 4px 6px 4px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #FFA011;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 4px 6px 4px;
+ border-color: transparent transparent #FFA011 transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #FFA011;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 4px 6px 0 4px;
+ border-top-color: #FFA011;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 100%;
+ width: 8px;
+ z-index: 1;
+ top: -1px;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 8px;
+ width: 8px;
+ bottom: -4px;
+ margin-left: -4px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAs0lEQVQoz6WMPW7CQBgFJxZaiZ60qcgdwjVMmzu8gpwhDULabXyBdHAGuzRHivQiQZovigS2+Jtu95t5T03TMITtCtjEc5VSOgx5k5F4CnxJWgKUUl5sv6eUvk/daiCeAe1fDCCpBtq4jQ/YngO9pMWpGH99OOcDtt8ifmWEuO3D/R+wXQOdpGcuIGkGdNFQ2RawlTTlSsLd2RY55+O95JyPFQ/y8MAE+CylfADpxvYHWP8CXj+JR4wdKHYAAAAASUVORK5CYII=);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #fff;
+ border-left: 1px dotted #cecece;
+ border-top: 1px dotted #cecece;
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #444;
+ padding: 6px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #FFA011;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: #FFF3A1;
+}
+.gantt_task_row.gantt_selected {
+ background-color: #FFF3A1;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #ffec6e;
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: 0 0 5px #299cb4;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #46ad51;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #D33DAF;
+ border: 0px solid #61164f;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #e63030;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #e63030;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #e63030;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background: #fff;
+ border-radius: 6px;
+ font-family: "Arial";
+ font-size: 13px;
+ border: 1px solid #CECECE;
+ color: #6b6b6b;
+ font-size: 12px;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "Arial";
+ border: 1px solid #CECECE;
+ font-size: 13px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "Arial";
+ font-size: 13px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #CECECE;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #CECECE;
+ border-left: none;
+ border-right: none;
+ background-color: #fff;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 5px 15px 5px 10px;
+ float: left;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border-width: 0;
+ border-color: #CECECE;
+ border-style: solid;
+ height: 32px;
+ font-weight: bold;
+ background: #fff;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 13px;
+ height: 22px;
+ line-height: 22px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "Arial";
+ font-size: 13px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #CECECE;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 13px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #CECECE;
+}
+.gantt_duration {
+ width: 100px;
+ height: 23px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 23px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #CECECE;
+}
+.gantt_duration .gantt_duration_value {
+ width: 40px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 70px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 20px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #fff;
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 4px;
+ -moz-border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 4px;
+ -moz-border-bottom-right-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #ebebeb;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 1px solid #CECECE;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 300;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: #fff;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: #454545;
+ background-color: #fff;
+ border-bottom: 1px solid #CECECE;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 13px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 13px;
+ color: #454545;
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 6px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 6px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 6px;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 6px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);
+}
+.gantt_qi_big_icon {
+ font-size: 13px;
+ border-radius: 4px;
+ font-weight: bold;
+ background: #fff;
+ margin: 5px 9px 8px 0px;
+ min-width: 60px;
+ line-height: 32px;
+ vertical-align: middle;
+ padding: 0px 10px 0px 5px;
+ cursor: pointer;
+ border: 1px solid #CECECE;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 32px;
+ text-align: center;
+ line-height: 32px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 13px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 13px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "Arial";
+ font-size: 13px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #d2d2d2;
+ border-top: 1px solid #d2d2d2;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #d2d2d2;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #f8fdfd;
+}
+.gantt_popup_button.gantt_delete_button {
+ background: #3db9d3;
+ text-shadow: 0 -1px 0 #248a9f;
+ color: #fff;
+ font-weight: bold;
+ border-width: 0;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.js b/src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.js
new file mode 100644
index 0000000..78a5b33
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/dhtmlxgantt.js
@@ -0,0 +1,54865 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define("dhtmlxgantt", [], factory);
+ else if(typeof exports === 'object')
+ exports["dhtmlxgantt"] = factory();
+ else
+ root["dhtmlxgantt"] = factory();
+})(window, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "/codebase/sources/";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./sources/dhtmlxgantt.gpl.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./node_modules/base64-js/index.js":
+/*!*****************************************!*\
+ !*** ./node_modules/base64-js/index.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.byteLength = byteLength;
+exports.toByteArray = toByteArray;
+exports.fromByteArray = fromByteArray;
+var lookup = [];
+var revLookup = [];
+var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
+var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i];
+ revLookup[code.charCodeAt(i)] = i;
+} // Support decoding URL-safe base64 strings, as Node.js does.
+// See: https://en.wikipedia.org/wiki/Base64#URL_applications
+
+
+revLookup['-'.charCodeAt(0)] = 62;
+revLookup['_'.charCodeAt(0)] = 63;
+
+function getLens(b64) {
+ var len = b64.length;
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4');
+ } // Trim off extra bytes after placeholder bytes are found
+ // See: https://github.com/beatgammit/base64-js/issues/42
+
+
+ var validLen = b64.indexOf('=');
+ if (validLen === -1) validLen = len;
+ var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4;
+ return [validLen, placeHoldersLen];
+} // base64 is 4/3 + up to two characters of the original data
+
+
+function byteLength(b64) {
+ var lens = getLens(b64);
+ var validLen = lens[0];
+ var placeHoldersLen = lens[1];
+ return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;
+}
+
+function _byteLength(b64, validLen, placeHoldersLen) {
+ return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;
+}
+
+function toByteArray(b64) {
+ var tmp;
+ var lens = getLens(b64);
+ var validLen = lens[0];
+ var placeHoldersLen = lens[1];
+ var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));
+ var curByte = 0; // if there are placeholders, only get up to the last complete 4 chars
+
+ var len = placeHoldersLen > 0 ? validLen - 4 : validLen;
+
+ for (var i = 0; i < len; i += 4) {
+ tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)];
+ arr[curByte++] = tmp >> 16 & 0xFF;
+ arr[curByte++] = tmp >> 8 & 0xFF;
+ arr[curByte++] = tmp & 0xFF;
+ }
+
+ if (placeHoldersLen === 2) {
+ tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4;
+ arr[curByte++] = tmp & 0xFF;
+ }
+
+ if (placeHoldersLen === 1) {
+ tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2;
+ arr[curByte++] = tmp >> 8 & 0xFF;
+ arr[curByte++] = tmp & 0xFF;
+ }
+
+ return arr;
+}
+
+function tripletToBase64(num) {
+ return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];
+}
+
+function encodeChunk(uint8, start, end) {
+ var tmp;
+ var output = [];
+
+ for (var i = start; i < end; i += 3) {
+ tmp = (uint8[i] << 16 & 0xFF0000) + (uint8[i + 1] << 8 & 0xFF00) + (uint8[i + 2] & 0xFF);
+ output.push(tripletToBase64(tmp));
+ }
+
+ return output.join('');
+}
+
+function fromByteArray(uint8) {
+ var tmp;
+ var len = uint8.length;
+ var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
+
+ var parts = [];
+ var maxChunkLength = 16383; // must be multiple of 3
+ // go through the array every three bytes, we'll deal with trailing stuff later
+
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength));
+ } // pad the end with zeros, but make sure to not forget the extra bytes
+
+
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1];
+ parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + '==');
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + uint8[len - 1];
+ parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + '=');
+ }
+
+ return parts.join('');
+}
+
+/***/ }),
+
+/***/ "./node_modules/bluebird/js/browser/bluebird.js":
+/*!******************************************************!*\
+ !*** ./node_modules/bluebird/js/browser/bluebird.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, global, setImmediate) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+/* @preserve
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2018 Petka Antonov
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+
+/**
+ * bluebird build version 3.5.4
+ * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
+*/
+!function (e) {
+ if ("object" == ( false ? undefined : _typeof(exports)) && "undefined" != typeof module) module.exports = e();else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (e),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else { var f; }
+}(function () {
+ var define, module, exports;
+ return function e(t, n, r) {
+ function s(o, u) {
+ if (!n[o]) {
+ if (!t[o]) {
+ var a = typeof _dereq_ == "function" && _dereq_;
+ if (!u && a) return a(o, !0);
+ if (i) return i(o, !0);
+ var f = new Error("Cannot find module '" + o + "'");
+ throw f.code = "MODULE_NOT_FOUND", f;
+ }
+
+ var l = n[o] = {
+ exports: {}
+ };
+ t[o][0].call(l.exports, function (e) {
+ var n = t[o][1][e];
+ return s(n ? n : e);
+ }, l, l.exports, e, t, n, r);
+ }
+
+ return n[o].exports;
+ }
+
+ var i = typeof _dereq_ == "function" && _dereq_;
+
+ for (var o = 0; o < r.length; o++) {
+ s(r[o]);
+ }
+
+ return s;
+ }({
+ 1: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise) {
+ var SomePromiseArray = Promise._SomePromiseArray;
+
+ function any(promises) {
+ var ret = new SomePromiseArray(promises);
+ var promise = ret.promise();
+ ret.setHowMany(1);
+ ret.setUnwrap();
+ ret.init();
+ return promise;
+ }
+
+ Promise.any = function (promises) {
+ return any(promises);
+ };
+
+ Promise.prototype.any = function () {
+ return any(this);
+ };
+ };
+ }, {}],
+ 2: [function (_dereq_, module, exports) {
+ "use strict";
+
+ var firstLineError;
+
+ try {
+ throw new Error();
+ } catch (e) {
+ firstLineError = e;
+ }
+
+ var schedule = _dereq_("./schedule");
+
+ var Queue = _dereq_("./queue");
+
+ var util = _dereq_("./util");
+
+ function Async() {
+ this._customScheduler = false;
+ this._isTickUsed = false;
+ this._lateQueue = new Queue(16);
+ this._normalQueue = new Queue(16);
+ this._haveDrainedQueues = false;
+ this._trampolineEnabled = true;
+ var self = this;
+
+ this.drainQueues = function () {
+ self._drainQueues();
+ };
+
+ this._schedule = schedule;
+ }
+
+ Async.prototype.setScheduler = function (fn) {
+ var prev = this._schedule;
+ this._schedule = fn;
+ this._customScheduler = true;
+ return prev;
+ };
+
+ Async.prototype.hasCustomScheduler = function () {
+ return this._customScheduler;
+ };
+
+ Async.prototype.enableTrampoline = function () {
+ this._trampolineEnabled = true;
+ };
+
+ Async.prototype.disableTrampolineIfNecessary = function () {
+ if (util.hasDevTools) {
+ this._trampolineEnabled = false;
+ }
+ };
+
+ Async.prototype.haveItemsQueued = function () {
+ return this._isTickUsed || this._haveDrainedQueues;
+ };
+
+ Async.prototype.fatalError = function (e, isNode) {
+ if (isNode) {
+ process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) + "\n");
+ process.exit(2);
+ } else {
+ this.throwLater(e);
+ }
+ };
+
+ Async.prototype.throwLater = function (fn, arg) {
+ if (arguments.length === 1) {
+ arg = fn;
+
+ fn = function fn() {
+ throw arg;
+ };
+ }
+
+ if (typeof setTimeout !== "undefined") {
+ setTimeout(function () {
+ fn(arg);
+ }, 0);
+ } else try {
+ this._schedule(function () {
+ fn(arg);
+ });
+ } catch (e) {
+ throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n");
+ }
+ };
+
+ function AsyncInvokeLater(fn, receiver, arg) {
+ this._lateQueue.push(fn, receiver, arg);
+
+ this._queueTick();
+ }
+
+ function AsyncInvoke(fn, receiver, arg) {
+ this._normalQueue.push(fn, receiver, arg);
+
+ this._queueTick();
+ }
+
+ function AsyncSettlePromises(promise) {
+ this._normalQueue._pushOne(promise);
+
+ this._queueTick();
+ }
+
+ if (!util.hasDevTools) {
+ Async.prototype.invokeLater = AsyncInvokeLater;
+ Async.prototype.invoke = AsyncInvoke;
+ Async.prototype.settlePromises = AsyncSettlePromises;
+ } else {
+ Async.prototype.invokeLater = function (fn, receiver, arg) {
+ if (this._trampolineEnabled) {
+ AsyncInvokeLater.call(this, fn, receiver, arg);
+ } else {
+ this._schedule(function () {
+ setTimeout(function () {
+ fn.call(receiver, arg);
+ }, 100);
+ });
+ }
+ };
+
+ Async.prototype.invoke = function (fn, receiver, arg) {
+ if (this._trampolineEnabled) {
+ AsyncInvoke.call(this, fn, receiver, arg);
+ } else {
+ this._schedule(function () {
+ fn.call(receiver, arg);
+ });
+ }
+ };
+
+ Async.prototype.settlePromises = function (promise) {
+ if (this._trampolineEnabled) {
+ AsyncSettlePromises.call(this, promise);
+ } else {
+ this._schedule(function () {
+ promise._settlePromises();
+ });
+ }
+ };
+ }
+
+ function _drainQueue(queue) {
+ while (queue.length() > 0) {
+ _drainQueueStep(queue);
+ }
+ }
+
+ function _drainQueueStep(queue) {
+ var fn = queue.shift();
+
+ if (typeof fn !== "function") {
+ fn._settlePromises();
+ } else {
+ var receiver = queue.shift();
+ var arg = queue.shift();
+ fn.call(receiver, arg);
+ }
+ }
+
+ Async.prototype._drainQueues = function () {
+ _drainQueue(this._normalQueue);
+
+ this._reset();
+
+ this._haveDrainedQueues = true;
+
+ _drainQueue(this._lateQueue);
+ };
+
+ Async.prototype._queueTick = function () {
+ if (!this._isTickUsed) {
+ this._isTickUsed = true;
+
+ this._schedule(this.drainQueues);
+ }
+ };
+
+ Async.prototype._reset = function () {
+ this._isTickUsed = false;
+ };
+
+ module.exports = Async;
+ module.exports.firstLineError = firstLineError;
+ }, {
+ "./queue": 26,
+ "./schedule": 29,
+ "./util": 36
+ }],
+ 3: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL, tryConvertToPromise, debug) {
+ var calledBind = false;
+
+ var rejectThis = function rejectThis(_, e) {
+ this._reject(e);
+ };
+
+ var targetRejected = function targetRejected(e, context) {
+ context.promiseRejectionQueued = true;
+
+ context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
+ };
+
+ var bindingResolved = function bindingResolved(thisArg, context) {
+ if ((this._bitField & 50397184) === 0) {
+ this._resolveCallback(context.target);
+ }
+ };
+
+ var bindingRejected = function bindingRejected(e, context) {
+ if (!context.promiseRejectionQueued) this._reject(e);
+ };
+
+ Promise.prototype.bind = function (thisArg) {
+ if (!calledBind) {
+ calledBind = true;
+ Promise.prototype._propagateFrom = debug.propagateFromFunction();
+ Promise.prototype._boundValue = debug.boundValueFunction();
+ }
+
+ var maybePromise = tryConvertToPromise(thisArg);
+ var ret = new Promise(INTERNAL);
+
+ ret._propagateFrom(this, 1);
+
+ var target = this._target();
+
+ ret._setBoundTo(maybePromise);
+
+ if (maybePromise instanceof Promise) {
+ var context = {
+ promiseRejectionQueued: false,
+ promise: ret,
+ target: target,
+ bindingPromise: maybePromise
+ };
+
+ target._then(INTERNAL, targetRejected, undefined, ret, context);
+
+ maybePromise._then(bindingResolved, bindingRejected, undefined, ret, context);
+
+ ret._setOnCancel(maybePromise);
+ } else {
+ ret._resolveCallback(target);
+ }
+
+ return ret;
+ };
+
+ Promise.prototype._setBoundTo = function (obj) {
+ if (obj !== undefined) {
+ this._bitField = this._bitField | 2097152;
+ this._boundTo = obj;
+ } else {
+ this._bitField = this._bitField & ~2097152;
+ }
+ };
+
+ Promise.prototype._isBound = function () {
+ return (this._bitField & 2097152) === 2097152;
+ };
+
+ Promise.bind = function (thisArg, value) {
+ return Promise.resolve(value).bind(thisArg);
+ };
+ };
+ }, {}],
+ 4: [function (_dereq_, module, exports) {
+ "use strict";
+
+ var old;
+ if (typeof Promise !== "undefined") old = Promise;
+
+ function noConflict() {
+ try {
+ if (Promise === bluebird) Promise = old;
+ } catch (e) {}
+
+ return bluebird;
+ }
+
+ var bluebird = _dereq_("./promise")();
+
+ bluebird.noConflict = noConflict;
+ module.exports = bluebird;
+ }, {
+ "./promise": 22
+ }],
+ 5: [function (_dereq_, module, exports) {
+ "use strict";
+
+ var cr = Object.create;
+
+ if (cr) {
+ var callerCache = cr(null);
+ var getterCache = cr(null);
+ callerCache[" size"] = getterCache[" size"] = 0;
+ }
+
+ module.exports = function (Promise) {
+ var util = _dereq_("./util");
+
+ var canEvaluate = util.canEvaluate;
+ var isIdentifier = util.isIdentifier;
+ var getMethodCaller;
+ var getGetter;
+
+ if (false) { var getCompiled, makeGetter, makeMethodCaller; }
+
+ function ensureMethod(obj, methodName) {
+ var fn;
+ if (obj != null) fn = obj[methodName];
+
+ if (typeof fn !== "function") {
+ var message = "Object " + util.classString(obj) + " has no method '" + util.toString(methodName) + "'";
+ throw new Promise.TypeError(message);
+ }
+
+ return fn;
+ }
+
+ function caller(obj) {
+ var methodName = this.pop();
+ var fn = ensureMethod(obj, methodName);
+ return fn.apply(obj, this);
+ }
+
+ Promise.prototype.call = function (methodName) {
+ var args = [].slice.call(arguments, 1);
+ ;
+
+ if (false) { var maybeCaller; }
+
+ args.push(methodName);
+ return this._then(caller, undefined, undefined, args, undefined);
+ };
+
+ function namedGetter(obj) {
+ return obj[this];
+ }
+
+ function indexedGetter(obj) {
+ var index = +this;
+ if (index < 0) index = Math.max(0, index + obj.length);
+ return obj[index];
+ }
+
+ Promise.prototype.get = function (propertyName) {
+ var isIndex = typeof propertyName === "number";
+ var getter;
+
+ if (!isIndex) {
+ if (canEvaluate) {
+ var maybeGetter = getGetter(propertyName);
+ getter = maybeGetter !== null ? maybeGetter : namedGetter;
+ } else {
+ getter = namedGetter;
+ }
+ } else {
+ getter = indexedGetter;
+ }
+
+ return this._then(getter, undefined, undefined, propertyName, undefined);
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 6: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, PromiseArray, apiRejection, debug) {
+ var util = _dereq_("./util");
+
+ var tryCatch = util.tryCatch;
+ var errorObj = util.errorObj;
+ var async = Promise._async;
+
+ Promise.prototype["break"] = Promise.prototype.cancel = function () {
+ if (!debug.cancellation()) return this._warn("cancellation is disabled");
+ var promise = this;
+ var child = promise;
+
+ while (promise._isCancellable()) {
+ if (!promise._cancelBy(child)) {
+ if (child._isFollowing()) {
+ child._followee().cancel();
+ } else {
+ child._cancelBranched();
+ }
+
+ break;
+ }
+
+ var parent = promise._cancellationParent;
+
+ if (parent == null || !parent._isCancellable()) {
+ if (promise._isFollowing()) {
+ promise._followee().cancel();
+ } else {
+ promise._cancelBranched();
+ }
+
+ break;
+ } else {
+ if (promise._isFollowing()) promise._followee().cancel();
+
+ promise._setWillBeCancelled();
+
+ child = promise;
+ promise = parent;
+ }
+ }
+ };
+
+ Promise.prototype._branchHasCancelled = function () {
+ this._branchesRemainingToCancel--;
+ };
+
+ Promise.prototype._enoughBranchesHaveCancelled = function () {
+ return this._branchesRemainingToCancel === undefined || this._branchesRemainingToCancel <= 0;
+ };
+
+ Promise.prototype._cancelBy = function (canceller) {
+ if (canceller === this) {
+ this._branchesRemainingToCancel = 0;
+
+ this._invokeOnCancel();
+
+ return true;
+ } else {
+ this._branchHasCancelled();
+
+ if (this._enoughBranchesHaveCancelled()) {
+ this._invokeOnCancel();
+
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ Promise.prototype._cancelBranched = function () {
+ if (this._enoughBranchesHaveCancelled()) {
+ this._cancel();
+ }
+ };
+
+ Promise.prototype._cancel = function () {
+ if (!this._isCancellable()) return;
+
+ this._setCancelled();
+
+ async.invoke(this._cancelPromises, this, undefined);
+ };
+
+ Promise.prototype._cancelPromises = function () {
+ if (this._length() > 0) this._settlePromises();
+ };
+
+ Promise.prototype._unsetOnCancel = function () {
+ this._onCancelField = undefined;
+ };
+
+ Promise.prototype._isCancellable = function () {
+ return this.isPending() && !this._isCancelled();
+ };
+
+ Promise.prototype.isCancellable = function () {
+ return this.isPending() && !this.isCancelled();
+ };
+
+ Promise.prototype._doInvokeOnCancel = function (onCancelCallback, internalOnly) {
+ if (util.isArray(onCancelCallback)) {
+ for (var i = 0; i < onCancelCallback.length; ++i) {
+ this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
+ }
+ } else if (onCancelCallback !== undefined) {
+ if (typeof onCancelCallback === "function") {
+ if (!internalOnly) {
+ var e = tryCatch(onCancelCallback).call(this._boundValue());
+
+ if (e === errorObj) {
+ this._attachExtraTrace(e.e);
+
+ async.throwLater(e.e);
+ }
+ }
+ } else {
+ onCancelCallback._resultCancelled(this);
+ }
+ }
+ };
+
+ Promise.prototype._invokeOnCancel = function () {
+ var onCancelCallback = this._onCancel();
+
+ this._unsetOnCancel();
+
+ async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
+ };
+
+ Promise.prototype._invokeInternalOnCancel = function () {
+ if (this._isCancellable()) {
+ this._doInvokeOnCancel(this._onCancel(), true);
+
+ this._unsetOnCancel();
+ }
+ };
+
+ Promise.prototype._resultCancelled = function () {
+ this.cancel();
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 7: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (NEXT_FILTER) {
+ var util = _dereq_("./util");
+
+ var getKeys = _dereq_("./es5").keys;
+
+ var tryCatch = util.tryCatch;
+ var errorObj = util.errorObj;
+
+ function catchFilter(instances, cb, promise) {
+ return function (e) {
+ var boundTo = promise._boundValue();
+
+ predicateLoop: for (var i = 0; i < instances.length; ++i) {
+ var item = instances[i];
+
+ if (item === Error || item != null && item.prototype instanceof Error) {
+ if (e instanceof item) {
+ return tryCatch(cb).call(boundTo, e);
+ }
+ } else if (typeof item === "function") {
+ var matchesPredicate = tryCatch(item).call(boundTo, e);
+
+ if (matchesPredicate === errorObj) {
+ return matchesPredicate;
+ } else if (matchesPredicate) {
+ return tryCatch(cb).call(boundTo, e);
+ }
+ } else if (util.isObject(e)) {
+ var keys = getKeys(item);
+
+ for (var j = 0; j < keys.length; ++j) {
+ var key = keys[j];
+
+ if (item[key] != e[key]) {
+ continue predicateLoop;
+ }
+ }
+
+ return tryCatch(cb).call(boundTo, e);
+ }
+ }
+
+ return NEXT_FILTER;
+ };
+ }
+
+ return catchFilter;
+ };
+ }, {
+ "./es5": 13,
+ "./util": 36
+ }],
+ 8: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise) {
+ var longStackTraces = false;
+ var contextStack = [];
+
+ Promise.prototype._promiseCreated = function () {};
+
+ Promise.prototype._pushContext = function () {};
+
+ Promise.prototype._popContext = function () {
+ return null;
+ };
+
+ Promise._peekContext = Promise.prototype._peekContext = function () {};
+
+ function Context() {
+ this._trace = new Context.CapturedTrace(peekContext());
+ }
+
+ Context.prototype._pushContext = function () {
+ if (this._trace !== undefined) {
+ this._trace._promiseCreated = null;
+ contextStack.push(this._trace);
+ }
+ };
+
+ Context.prototype._popContext = function () {
+ if (this._trace !== undefined) {
+ var trace = contextStack.pop();
+ var ret = trace._promiseCreated;
+ trace._promiseCreated = null;
+ return ret;
+ }
+
+ return null;
+ };
+
+ function createContext() {
+ if (longStackTraces) return new Context();
+ }
+
+ function peekContext() {
+ var lastIndex = contextStack.length - 1;
+
+ if (lastIndex >= 0) {
+ return contextStack[lastIndex];
+ }
+
+ return undefined;
+ }
+
+ Context.CapturedTrace = null;
+ Context.create = createContext;
+
+ Context.deactivateLongStackTraces = function () {};
+
+ Context.activateLongStackTraces = function () {
+ var Promise_pushContext = Promise.prototype._pushContext;
+ var Promise_popContext = Promise.prototype._popContext;
+ var Promise_PeekContext = Promise._peekContext;
+ var Promise_peekContext = Promise.prototype._peekContext;
+ var Promise_promiseCreated = Promise.prototype._promiseCreated;
+
+ Context.deactivateLongStackTraces = function () {
+ Promise.prototype._pushContext = Promise_pushContext;
+ Promise.prototype._popContext = Promise_popContext;
+ Promise._peekContext = Promise_PeekContext;
+ Promise.prototype._peekContext = Promise_peekContext;
+ Promise.prototype._promiseCreated = Promise_promiseCreated;
+ longStackTraces = false;
+ };
+
+ longStackTraces = true;
+ Promise.prototype._pushContext = Context.prototype._pushContext;
+ Promise.prototype._popContext = Context.prototype._popContext;
+ Promise._peekContext = Promise.prototype._peekContext = peekContext;
+
+ Promise.prototype._promiseCreated = function () {
+ var ctx = this._peekContext();
+
+ if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
+ };
+ };
+
+ return Context;
+ };
+ }, {}],
+ 9: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, Context) {
+ var getDomain = Promise._getDomain;
+ var async = Promise._async;
+
+ var Warning = _dereq_("./errors").Warning;
+
+ var util = _dereq_("./util");
+
+ var es5 = _dereq_("./es5");
+
+ var canAttachTrace = util.canAttachTrace;
+ var unhandledRejectionHandled;
+ var possiblyUnhandledRejection;
+ var bluebirdFramePattern = /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
+ var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
+ var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
+ var stackFramePattern = null;
+ var formatStack = null;
+ var indentStackFrames = false;
+ var printWarning;
+ var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && (true || util.env("BLUEBIRD_DEBUG") || util.env("NODE_ENV") === "development"));
+ var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && (debugging || util.env("BLUEBIRD_WARNINGS")));
+ var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));
+ var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));
+
+ Promise.prototype.suppressUnhandledRejections = function () {
+ var target = this._target();
+
+ target._bitField = target._bitField & ~1048576 | 524288;
+ };
+
+ Promise.prototype._ensurePossibleRejectionHandled = function () {
+ if ((this._bitField & 524288) !== 0) return;
+
+ this._setRejectionIsUnhandled();
+
+ var self = this;
+ setTimeout(function () {
+ self._notifyUnhandledRejection();
+ }, 1);
+ };
+
+ Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
+ fireRejectionEvent("rejectionHandled", unhandledRejectionHandled, undefined, this);
+ };
+
+ Promise.prototype._setReturnedNonUndefined = function () {
+ this._bitField = this._bitField | 268435456;
+ };
+
+ Promise.prototype._returnedNonUndefined = function () {
+ return (this._bitField & 268435456) !== 0;
+ };
+
+ Promise.prototype._notifyUnhandledRejection = function () {
+ if (this._isRejectionUnhandled()) {
+ var reason = this._settledValue();
+
+ this._setUnhandledRejectionIsNotified();
+
+ fireRejectionEvent("unhandledRejection", possiblyUnhandledRejection, reason, this);
+ }
+ };
+
+ Promise.prototype._setUnhandledRejectionIsNotified = function () {
+ this._bitField = this._bitField | 262144;
+ };
+
+ Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
+ this._bitField = this._bitField & ~262144;
+ };
+
+ Promise.prototype._isUnhandledRejectionNotified = function () {
+ return (this._bitField & 262144) > 0;
+ };
+
+ Promise.prototype._setRejectionIsUnhandled = function () {
+ this._bitField = this._bitField | 1048576;
+ };
+
+ Promise.prototype._unsetRejectionIsUnhandled = function () {
+ this._bitField = this._bitField & ~1048576;
+
+ if (this._isUnhandledRejectionNotified()) {
+ this._unsetUnhandledRejectionIsNotified();
+
+ this._notifyUnhandledRejectionIsHandled();
+ }
+ };
+
+ Promise.prototype._isRejectionUnhandled = function () {
+ return (this._bitField & 1048576) > 0;
+ };
+
+ Promise.prototype._warn = function (message, shouldUseOwnTrace, promise) {
+ return warn(message, shouldUseOwnTrace, promise || this);
+ };
+
+ Promise.onPossiblyUnhandledRejection = function (fn) {
+ var domain = getDomain();
+ possiblyUnhandledRejection = typeof fn === "function" ? domain === null ? fn : util.domainBind(domain, fn) : undefined;
+ };
+
+ Promise.onUnhandledRejectionHandled = function (fn) {
+ var domain = getDomain();
+ unhandledRejectionHandled = typeof fn === "function" ? domain === null ? fn : util.domainBind(domain, fn) : undefined;
+ };
+
+ var disableLongStackTraces = function disableLongStackTraces() {};
+
+ Promise.longStackTraces = function () {
+ if (async.haveItemsQueued() && !config.longStackTraces) {
+ throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ if (!config.longStackTraces && longStackTracesIsSupported()) {
+ var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
+ var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
+ var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
+ config.longStackTraces = true;
+
+ disableLongStackTraces = function disableLongStackTraces() {
+ if (async.haveItemsQueued() && !config.longStackTraces) {
+ throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ Promise.prototype._captureStackTrace = Promise_captureStackTrace;
+ Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
+ Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
+ Context.deactivateLongStackTraces();
+ async.enableTrampoline();
+ config.longStackTraces = false;
+ };
+
+ Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
+ Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
+ Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
+ Context.activateLongStackTraces();
+ async.disableTrampolineIfNecessary();
+ }
+ };
+
+ Promise.hasLongStackTraces = function () {
+ return config.longStackTraces && longStackTracesIsSupported();
+ };
+
+ var fireDomEvent = function () {
+ try {
+ if (typeof CustomEvent === "function") {
+ var event = new CustomEvent("CustomEvent");
+ util.global.dispatchEvent(event);
+ return function (name, event) {
+ var eventData = {
+ detail: event,
+ cancelable: true
+ };
+ es5.defineProperty(eventData, "promise", {
+ value: event.promise
+ });
+ es5.defineProperty(eventData, "reason", {
+ value: event.reason
+ });
+ var domEvent = new CustomEvent(name.toLowerCase(), eventData);
+ return !util.global.dispatchEvent(domEvent);
+ };
+ } else if (typeof Event === "function") {
+ var event = new Event("CustomEvent");
+ util.global.dispatchEvent(event);
+ return function (name, event) {
+ var domEvent = new Event(name.toLowerCase(), {
+ cancelable: true
+ });
+ domEvent.detail = event;
+ es5.defineProperty(domEvent, "promise", {
+ value: event.promise
+ });
+ es5.defineProperty(domEvent, "reason", {
+ value: event.reason
+ });
+ return !util.global.dispatchEvent(domEvent);
+ };
+ } else {
+ var event = document.createEvent("CustomEvent");
+ event.initCustomEvent("testingtheevent", false, true, {});
+ util.global.dispatchEvent(event);
+ return function (name, event) {
+ var domEvent = document.createEvent("CustomEvent");
+ domEvent.initCustomEvent(name.toLowerCase(), false, true, event);
+ return !util.global.dispatchEvent(domEvent);
+ };
+ }
+ } catch (e) {}
+
+ return function () {
+ return false;
+ };
+ }();
+
+ var fireGlobalEvent = function () {
+ if (util.isNode) {
+ return function () {
+ return process.emit.apply(process, arguments);
+ };
+ } else {
+ if (!util.global) {
+ return function () {
+ return false;
+ };
+ }
+
+ return function (name) {
+ var methodName = "on" + name.toLowerCase();
+ var method = util.global[methodName];
+ if (!method) return false;
+ method.apply(util.global, [].slice.call(arguments, 1));
+ return true;
+ };
+ }
+ }();
+
+ function generatePromiseLifecycleEventObject(name, promise) {
+ return {
+ promise: promise
+ };
+ }
+
+ var eventToObjectGenerator = {
+ promiseCreated: generatePromiseLifecycleEventObject,
+ promiseFulfilled: generatePromiseLifecycleEventObject,
+ promiseRejected: generatePromiseLifecycleEventObject,
+ promiseResolved: generatePromiseLifecycleEventObject,
+ promiseCancelled: generatePromiseLifecycleEventObject,
+ promiseChained: function promiseChained(name, promise, child) {
+ return {
+ promise: promise,
+ child: child
+ };
+ },
+ warning: function warning(name, _warning) {
+ return {
+ warning: _warning
+ };
+ },
+ unhandledRejection: function unhandledRejection(name, reason, promise) {
+ return {
+ reason: reason,
+ promise: promise
+ };
+ },
+ rejectionHandled: generatePromiseLifecycleEventObject
+ };
+
+ var activeFireEvent = function activeFireEvent(name) {
+ var globalEventFired = false;
+
+ try {
+ globalEventFired = fireGlobalEvent.apply(null, arguments);
+ } catch (e) {
+ async.throwLater(e);
+ globalEventFired = true;
+ }
+
+ var domEventFired = false;
+
+ try {
+ domEventFired = fireDomEvent(name, eventToObjectGenerator[name].apply(null, arguments));
+ } catch (e) {
+ async.throwLater(e);
+ domEventFired = true;
+ }
+
+ return domEventFired || globalEventFired;
+ };
+
+ Promise.config = function (opts) {
+ opts = Object(opts);
+
+ if ("longStackTraces" in opts) {
+ if (opts.longStackTraces) {
+ Promise.longStackTraces();
+ } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
+ disableLongStackTraces();
+ }
+ }
+
+ if ("warnings" in opts) {
+ var warningsOption = opts.warnings;
+ config.warnings = !!warningsOption;
+ wForgottenReturn = config.warnings;
+
+ if (util.isObject(warningsOption)) {
+ if ("wForgottenReturn" in warningsOption) {
+ wForgottenReturn = !!warningsOption.wForgottenReturn;
+ }
+ }
+ }
+
+ if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
+ if (async.haveItemsQueued()) {
+ throw new Error("cannot enable cancellation after promises are in use");
+ }
+
+ Promise.prototype._clearCancellationData = cancellationClearCancellationData;
+ Promise.prototype._propagateFrom = cancellationPropagateFrom;
+ Promise.prototype._onCancel = cancellationOnCancel;
+ Promise.prototype._setOnCancel = cancellationSetOnCancel;
+ Promise.prototype._attachCancellationCallback = cancellationAttachCancellationCallback;
+ Promise.prototype._execute = cancellationExecute;
+ _propagateFromFunction = cancellationPropagateFrom;
+ config.cancellation = true;
+ }
+
+ if ("monitoring" in opts) {
+ if (opts.monitoring && !config.monitoring) {
+ config.monitoring = true;
+ Promise.prototype._fireEvent = activeFireEvent;
+ } else if (!opts.monitoring && config.monitoring) {
+ config.monitoring = false;
+ Promise.prototype._fireEvent = defaultFireEvent;
+ }
+ }
+
+ return Promise;
+ };
+
+ function defaultFireEvent() {
+ return false;
+ }
+
+ Promise.prototype._fireEvent = defaultFireEvent;
+
+ Promise.prototype._execute = function (executor, resolve, reject) {
+ try {
+ executor(resolve, reject);
+ } catch (e) {
+ return e;
+ }
+ };
+
+ Promise.prototype._onCancel = function () {};
+
+ Promise.prototype._setOnCancel = function (handler) {
+ ;
+ };
+
+ Promise.prototype._attachCancellationCallback = function (onCancel) {
+ ;
+ };
+
+ Promise.prototype._captureStackTrace = function () {};
+
+ Promise.prototype._attachExtraTrace = function () {};
+
+ Promise.prototype._dereferenceTrace = function () {};
+
+ Promise.prototype._clearCancellationData = function () {};
+
+ Promise.prototype._propagateFrom = function (parent, flags) {
+ ;
+ ;
+ };
+
+ function cancellationExecute(executor, resolve, reject) {
+ var promise = this;
+
+ try {
+ executor(resolve, reject, function (onCancel) {
+ if (typeof onCancel !== "function") {
+ throw new TypeError("onCancel must be a function, got: " + util.toString(onCancel));
+ }
+
+ promise._attachCancellationCallback(onCancel);
+ });
+ } catch (e) {
+ return e;
+ }
+ }
+
+ function cancellationAttachCancellationCallback(onCancel) {
+ if (!this._isCancellable()) return this;
+
+ var previousOnCancel = this._onCancel();
+
+ if (previousOnCancel !== undefined) {
+ if (util.isArray(previousOnCancel)) {
+ previousOnCancel.push(onCancel);
+ } else {
+ this._setOnCancel([previousOnCancel, onCancel]);
+ }
+ } else {
+ this._setOnCancel(onCancel);
+ }
+ }
+
+ function cancellationOnCancel() {
+ return this._onCancelField;
+ }
+
+ function cancellationSetOnCancel(onCancel) {
+ this._onCancelField = onCancel;
+ }
+
+ function cancellationClearCancellationData() {
+ this._cancellationParent = undefined;
+ this._onCancelField = undefined;
+ }
+
+ function cancellationPropagateFrom(parent, flags) {
+ if ((flags & 1) !== 0) {
+ this._cancellationParent = parent;
+ var branchesRemainingToCancel = parent._branchesRemainingToCancel;
+
+ if (branchesRemainingToCancel === undefined) {
+ branchesRemainingToCancel = 0;
+ }
+
+ parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
+ }
+
+ if ((flags & 2) !== 0 && parent._isBound()) {
+ this._setBoundTo(parent._boundTo);
+ }
+ }
+
+ function bindingPropagateFrom(parent, flags) {
+ if ((flags & 2) !== 0 && parent._isBound()) {
+ this._setBoundTo(parent._boundTo);
+ }
+ }
+
+ var _propagateFromFunction = bindingPropagateFrom;
+
+ function _boundValueFunction() {
+ var ret = this._boundTo;
+
+ if (ret !== undefined) {
+ if (ret instanceof Promise) {
+ if (ret.isFulfilled()) {
+ return ret.value();
+ } else {
+ return undefined;
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ function longStackTracesCaptureStackTrace() {
+ this._trace = new CapturedTrace(this._peekContext());
+ }
+
+ function longStackTracesAttachExtraTrace(error, ignoreSelf) {
+ if (canAttachTrace(error)) {
+ var trace = this._trace;
+
+ if (trace !== undefined) {
+ if (ignoreSelf) trace = trace._parent;
+ }
+
+ if (trace !== undefined) {
+ trace.attachExtraTrace(error);
+ } else if (!error.__stackCleaned__) {
+ var parsed = parseStackAndMessage(error);
+ util.notEnumerableProp(error, "stack", parsed.message + "\n" + parsed.stack.join("\n"));
+ util.notEnumerableProp(error, "__stackCleaned__", true);
+ }
+ }
+ }
+
+ function longStackTracesDereferenceTrace() {
+ this._trace = undefined;
+ }
+
+ function checkForgottenReturns(returnValue, promiseCreated, name, promise, parent) {
+ if (returnValue === undefined && promiseCreated !== null && wForgottenReturn) {
+ if (parent !== undefined && parent._returnedNonUndefined()) return;
+ if ((promise._bitField & 65535) === 0) return;
+ if (name) name = name + " ";
+ var handlerLine = "";
+ var creatorLine = "";
+
+ if (promiseCreated._trace) {
+ var traceLines = promiseCreated._trace.stack.split("\n");
+
+ var stack = cleanStack(traceLines);
+
+ for (var i = stack.length - 1; i >= 0; --i) {
+ var line = stack[i];
+
+ if (!nodeFramePattern.test(line)) {
+ var lineMatches = line.match(parseLinePattern);
+
+ if (lineMatches) {
+ handlerLine = "at " + lineMatches[1] + ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
+ }
+
+ break;
+ }
+ }
+
+ if (stack.length > 0) {
+ var firstUserLine = stack[0];
+
+ for (var i = 0; i < traceLines.length; ++i) {
+ if (traceLines[i] === firstUserLine) {
+ if (i > 0) {
+ creatorLine = "\n" + traceLines[i - 1];
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ var msg = "a promise was created in a " + name + "handler " + handlerLine + "but was not returned from it, " + "see http://goo.gl/rRqMUw" + creatorLine;
+
+ promise._warn(msg, true, promiseCreated);
+ }
+ }
+
+ function deprecated(name, replacement) {
+ var message = name + " is deprecated and will be removed in a future version.";
+ if (replacement) message += " Use " + replacement + " instead.";
+ return warn(message);
+ }
+
+ function warn(message, shouldUseOwnTrace, promise) {
+ if (!config.warnings) return;
+ var warning = new Warning(message);
+ var ctx;
+
+ if (shouldUseOwnTrace) {
+ promise._attachExtraTrace(warning);
+ } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
+ ctx.attachExtraTrace(warning);
+ } else {
+ var parsed = parseStackAndMessage(warning);
+ warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
+ }
+
+ if (!activeFireEvent("warning", warning)) {
+ formatAndLogError(warning, "", true);
+ }
+ }
+
+ function reconstructStack(message, stacks) {
+ for (var i = 0; i < stacks.length - 1; ++i) {
+ stacks[i].push("From previous event:");
+ stacks[i] = stacks[i].join("\n");
+ }
+
+ if (i < stacks.length) {
+ stacks[i] = stacks[i].join("\n");
+ }
+
+ return message + "\n" + stacks.join("\n");
+ }
+
+ function removeDuplicateOrEmptyJumps(stacks) {
+ for (var i = 0; i < stacks.length; ++i) {
+ if (stacks[i].length === 0 || i + 1 < stacks.length && stacks[i][0] === stacks[i + 1][0]) {
+ stacks.splice(i, 1);
+ i--;
+ }
+ }
+ }
+
+ function removeCommonRoots(stacks) {
+ var current = stacks[0];
+
+ for (var i = 1; i < stacks.length; ++i) {
+ var prev = stacks[i];
+ var currentLastIndex = current.length - 1;
+ var currentLastLine = current[currentLastIndex];
+ var commonRootMeetPoint = -1;
+
+ for (var j = prev.length - 1; j >= 0; --j) {
+ if (prev[j] === currentLastLine) {
+ commonRootMeetPoint = j;
+ break;
+ }
+ }
+
+ for (var j = commonRootMeetPoint; j >= 0; --j) {
+ var line = prev[j];
+
+ if (current[currentLastIndex] === line) {
+ current.pop();
+ currentLastIndex--;
+ } else {
+ break;
+ }
+ }
+
+ current = prev;
+ }
+ }
+
+ function cleanStack(stack) {
+ var ret = [];
+
+ for (var i = 0; i < stack.length; ++i) {
+ var line = stack[i];
+ var isTraceLine = " (No stack trace)" === line || stackFramePattern.test(line);
+ var isInternalFrame = isTraceLine && shouldIgnore(line);
+
+ if (isTraceLine && !isInternalFrame) {
+ if (indentStackFrames && line.charAt(0) !== " ") {
+ line = " " + line;
+ }
+
+ ret.push(line);
+ }
+ }
+
+ return ret;
+ }
+
+ function stackFramesAsArray(error) {
+ var stack = error.stack.replace(/\s+$/g, "").split("\n");
+
+ for (var i = 0; i < stack.length; ++i) {
+ var line = stack[i];
+
+ if (" (No stack trace)" === line || stackFramePattern.test(line)) {
+ break;
+ }
+ }
+
+ if (i > 0 && error.name != "SyntaxError") {
+ stack = stack.slice(i);
+ }
+
+ return stack;
+ }
+
+ function parseStackAndMessage(error) {
+ var stack = error.stack;
+ var message = error.toString();
+ stack = typeof stack === "string" && stack.length > 0 ? stackFramesAsArray(error) : [" (No stack trace)"];
+ return {
+ message: message,
+ stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
+ };
+ }
+
+ function formatAndLogError(error, title, isSoft) {
+ if (typeof console !== "undefined") {
+ var message;
+
+ if (util.isObject(error)) {
+ var stack = error.stack;
+ message = title + formatStack(stack, error);
+ } else {
+ message = title + String(error);
+ }
+
+ if (typeof printWarning === "function") {
+ printWarning(message, isSoft);
+ } else if (typeof console.log === "function" || _typeof(console.log) === "object") {
+ console.log(message);
+ }
+ }
+ }
+
+ function fireRejectionEvent(name, localHandler, reason, promise) {
+ var localEventFired = false;
+
+ try {
+ if (typeof localHandler === "function") {
+ localEventFired = true;
+
+ if (name === "rejectionHandled") {
+ localHandler(promise);
+ } else {
+ localHandler(reason, promise);
+ }
+ }
+ } catch (e) {
+ async.throwLater(e);
+ }
+
+ if (name === "unhandledRejection") {
+ if (!activeFireEvent(name, reason, promise) && !localEventFired) {
+ formatAndLogError(reason, "Unhandled rejection ");
+ }
+ } else {
+ activeFireEvent(name, promise);
+ }
+ }
+
+ function formatNonError(obj) {
+ var str;
+
+ if (typeof obj === "function") {
+ str = "[function " + (obj.name || "anonymous") + "]";
+ } else {
+ str = obj && typeof obj.toString === "function" ? obj.toString() : util.toString(obj);
+ var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
+
+ if (ruselessToString.test(str)) {
+ try {
+ var newStr = JSON.stringify(obj);
+ str = newStr;
+ } catch (e) {}
+ }
+
+ if (str.length === 0) {
+ str = "(empty array)";
+ }
+ }
+
+ return "(<" + snip(str) + ">, no stack trace)";
+ }
+
+ function snip(str) {
+ var maxChars = 41;
+
+ if (str.length < maxChars) {
+ return str;
+ }
+
+ return str.substr(0, maxChars - 3) + "...";
+ }
+
+ function longStackTracesIsSupported() {
+ return typeof captureStackTrace === "function";
+ }
+
+ var shouldIgnore = function shouldIgnore() {
+ return false;
+ };
+
+ var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
+
+ function parseLineInfo(line) {
+ var matches = line.match(parseLineInfoRegex);
+
+ if (matches) {
+ return {
+ fileName: matches[1],
+ line: parseInt(matches[2], 10)
+ };
+ }
+ }
+
+ function setBounds(firstLineError, lastLineError) {
+ if (!longStackTracesIsSupported()) return;
+ var firstStackLines = firstLineError.stack.split("\n");
+ var lastStackLines = lastLineError.stack.split("\n");
+ var firstIndex = -1;
+ var lastIndex = -1;
+ var firstFileName;
+ var lastFileName;
+
+ for (var i = 0; i < firstStackLines.length; ++i) {
+ var result = parseLineInfo(firstStackLines[i]);
+
+ if (result) {
+ firstFileName = result.fileName;
+ firstIndex = result.line;
+ break;
+ }
+ }
+
+ for (var i = 0; i < lastStackLines.length; ++i) {
+ var result = parseLineInfo(lastStackLines[i]);
+
+ if (result) {
+ lastFileName = result.fileName;
+ lastIndex = result.line;
+ break;
+ }
+ }
+
+ if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || firstFileName !== lastFileName || firstIndex >= lastIndex) {
+ return;
+ }
+
+ shouldIgnore = function shouldIgnore(line) {
+ if (bluebirdFramePattern.test(line)) return true;
+ var info = parseLineInfo(line);
+
+ if (info) {
+ if (info.fileName === firstFileName && firstIndex <= info.line && info.line <= lastIndex) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+ }
+
+ function CapturedTrace(parent) {
+ this._parent = parent;
+ this._promisesCreated = 0;
+ var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
+ captureStackTrace(this, CapturedTrace);
+ if (length > 32) this.uncycle();
+ }
+
+ util.inherits(CapturedTrace, Error);
+ Context.CapturedTrace = CapturedTrace;
+
+ CapturedTrace.prototype.uncycle = function () {
+ var length = this._length;
+ if (length < 2) return;
+ var nodes = [];
+ var stackToIndex = {};
+
+ for (var i = 0, node = this; node !== undefined; ++i) {
+ nodes.push(node);
+ node = node._parent;
+ }
+
+ length = this._length = i;
+
+ for (var i = length - 1; i >= 0; --i) {
+ var stack = nodes[i].stack;
+
+ if (stackToIndex[stack] === undefined) {
+ stackToIndex[stack] = i;
+ }
+ }
+
+ for (var i = 0; i < length; ++i) {
+ var currentStack = nodes[i].stack;
+ var index = stackToIndex[currentStack];
+
+ if (index !== undefined && index !== i) {
+ if (index > 0) {
+ nodes[index - 1]._parent = undefined;
+ nodes[index - 1]._length = 1;
+ }
+
+ nodes[i]._parent = undefined;
+ nodes[i]._length = 1;
+ var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;
+
+ if (index < length - 1) {
+ cycleEdgeNode._parent = nodes[index + 1];
+
+ cycleEdgeNode._parent.uncycle();
+
+ cycleEdgeNode._length = cycleEdgeNode._parent._length + 1;
+ } else {
+ cycleEdgeNode._parent = undefined;
+ cycleEdgeNode._length = 1;
+ }
+
+ var currentChildLength = cycleEdgeNode._length + 1;
+
+ for (var j = i - 2; j >= 0; --j) {
+ nodes[j]._length = currentChildLength;
+ currentChildLength++;
+ }
+
+ return;
+ }
+ }
+ };
+
+ CapturedTrace.prototype.attachExtraTrace = function (error) {
+ if (error.__stackCleaned__) return;
+ this.uncycle();
+ var parsed = parseStackAndMessage(error);
+ var message = parsed.message;
+ var stacks = [parsed.stack];
+ var trace = this;
+
+ while (trace !== undefined) {
+ stacks.push(cleanStack(trace.stack.split("\n")));
+ trace = trace._parent;
+ }
+
+ removeCommonRoots(stacks);
+ removeDuplicateOrEmptyJumps(stacks);
+ util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
+ util.notEnumerableProp(error, "__stackCleaned__", true);
+ };
+
+ var captureStackTrace = function stackDetection() {
+ var v8stackFramePattern = /^\s*at\s*/;
+
+ var v8stackFormatter = function v8stackFormatter(stack, error) {
+ if (typeof stack === "string") return stack;
+
+ if (error.name !== undefined && error.message !== undefined) {
+ return error.toString();
+ }
+
+ return formatNonError(error);
+ };
+
+ if (typeof Error.stackTraceLimit === "number" && typeof Error.captureStackTrace === "function") {
+ Error.stackTraceLimit += 6;
+ stackFramePattern = v8stackFramePattern;
+ formatStack = v8stackFormatter;
+ var captureStackTrace = Error.captureStackTrace;
+
+ shouldIgnore = function shouldIgnore(line) {
+ return bluebirdFramePattern.test(line);
+ };
+
+ return function (receiver, ignoreUntil) {
+ Error.stackTraceLimit += 6;
+ captureStackTrace(receiver, ignoreUntil);
+ Error.stackTraceLimit -= 6;
+ };
+ }
+
+ var err = new Error();
+
+ if (typeof err.stack === "string" && err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
+ stackFramePattern = /@/;
+ formatStack = v8stackFormatter;
+ indentStackFrames = true;
+ return function captureStackTrace(o) {
+ o.stack = new Error().stack;
+ };
+ }
+
+ var hasStackAfterThrow;
+
+ try {
+ throw new Error();
+ } catch (e) {
+ hasStackAfterThrow = "stack" in e;
+ }
+
+ if (!("stack" in err) && hasStackAfterThrow && typeof Error.stackTraceLimit === "number") {
+ stackFramePattern = v8stackFramePattern;
+ formatStack = v8stackFormatter;
+ return function captureStackTrace(o) {
+ Error.stackTraceLimit += 6;
+
+ try {
+ throw new Error();
+ } catch (e) {
+ o.stack = e.stack;
+ }
+
+ Error.stackTraceLimit -= 6;
+ };
+ }
+
+ formatStack = function formatStack(stack, error) {
+ if (typeof stack === "string") return stack;
+
+ if ((_typeof(error) === "object" || typeof error === "function") && error.name !== undefined && error.message !== undefined) {
+ return error.toString();
+ }
+
+ return formatNonError(error);
+ };
+
+ return null;
+ }([]);
+
+ if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
+ printWarning = function printWarning(message) {
+ console.warn(message);
+ };
+
+ if (util.isNode && process.stderr.isTTY) {
+ printWarning = function printWarning(message, isSoft) {
+ var color = isSoft ? "\x1B[33m" : "\x1B[31m";
+ console.warn(color + message + "\x1B[0m\n");
+ };
+ } else if (!util.isNode && typeof new Error().stack === "string") {
+ printWarning = function printWarning(message, isSoft) {
+ console.warn("%c" + message, isSoft ? "color: darkorange" : "color: red");
+ };
+ }
+ }
+
+ var config = {
+ warnings: warnings,
+ longStackTraces: false,
+ cancellation: false,
+ monitoring: false
+ };
+ if (longStackTraces) Promise.longStackTraces();
+ return {
+ longStackTraces: function longStackTraces() {
+ return config.longStackTraces;
+ },
+ warnings: function warnings() {
+ return config.warnings;
+ },
+ cancellation: function cancellation() {
+ return config.cancellation;
+ },
+ monitoring: function monitoring() {
+ return config.monitoring;
+ },
+ propagateFromFunction: function propagateFromFunction() {
+ return _propagateFromFunction;
+ },
+ boundValueFunction: function boundValueFunction() {
+ return _boundValueFunction;
+ },
+ checkForgottenReturns: checkForgottenReturns,
+ setBounds: setBounds,
+ warn: warn,
+ deprecated: deprecated,
+ CapturedTrace: CapturedTrace,
+ fireDomEvent: fireDomEvent,
+ fireGlobalEvent: fireGlobalEvent
+ };
+ };
+ }, {
+ "./errors": 12,
+ "./es5": 13,
+ "./util": 36
+ }],
+ 10: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise) {
+ function returner() {
+ return this.value;
+ }
+
+ function thrower() {
+ throw this.reason;
+ }
+
+ Promise.prototype["return"] = Promise.prototype.thenReturn = function (value) {
+ if (value instanceof Promise) value.suppressUnhandledRejections();
+ return this._then(returner, undefined, undefined, {
+ value: value
+ }, undefined);
+ };
+
+ Promise.prototype["throw"] = Promise.prototype.thenThrow = function (reason) {
+ return this._then(thrower, undefined, undefined, {
+ reason: reason
+ }, undefined);
+ };
+
+ Promise.prototype.catchThrow = function (reason) {
+ if (arguments.length <= 1) {
+ return this._then(undefined, thrower, undefined, {
+ reason: reason
+ }, undefined);
+ } else {
+ var _reason = arguments[1];
+
+ var handler = function handler() {
+ throw _reason;
+ };
+
+ return this.caught(reason, handler);
+ }
+ };
+
+ Promise.prototype.catchReturn = function (value) {
+ if (arguments.length <= 1) {
+ if (value instanceof Promise) value.suppressUnhandledRejections();
+ return this._then(undefined, returner, undefined, {
+ value: value
+ }, undefined);
+ } else {
+ var _value = arguments[1];
+ if (_value instanceof Promise) _value.suppressUnhandledRejections();
+
+ var handler = function handler() {
+ return _value;
+ };
+
+ return this.caught(value, handler);
+ }
+ };
+ };
+ }, {}],
+ 11: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL) {
+ var PromiseReduce = Promise.reduce;
+ var PromiseAll = Promise.all;
+
+ function promiseAllThis() {
+ return PromiseAll(this);
+ }
+
+ function PromiseMapSeries(promises, fn) {
+ return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
+ }
+
+ Promise.prototype.each = function (fn) {
+ return PromiseReduce(this, fn, INTERNAL, 0)._then(promiseAllThis, undefined, undefined, this, undefined);
+ };
+
+ Promise.prototype.mapSeries = function (fn) {
+ return PromiseReduce(this, fn, INTERNAL, INTERNAL);
+ };
+
+ Promise.each = function (promises, fn) {
+ return PromiseReduce(promises, fn, INTERNAL, 0)._then(promiseAllThis, undefined, undefined, promises, undefined);
+ };
+
+ Promise.mapSeries = PromiseMapSeries;
+ };
+ }, {}],
+ 12: [function (_dereq_, module, exports) {
+ "use strict";
+
+ var es5 = _dereq_("./es5");
+
+ var Objectfreeze = es5.freeze;
+
+ var util = _dereq_("./util");
+
+ var inherits = util.inherits;
+ var notEnumerableProp = util.notEnumerableProp;
+
+ function subError(nameProperty, defaultMessage) {
+ function SubError(message) {
+ if (!(this instanceof SubError)) return new SubError(message);
+ notEnumerableProp(this, "message", typeof message === "string" ? message : defaultMessage);
+ notEnumerableProp(this, "name", nameProperty);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ } else {
+ Error.call(this);
+ }
+ }
+
+ inherits(SubError, Error);
+ return SubError;
+ }
+
+ var _TypeError, _RangeError;
+
+ var Warning = subError("Warning", "warning");
+ var CancellationError = subError("CancellationError", "cancellation error");
+ var TimeoutError = subError("TimeoutError", "timeout error");
+ var AggregateError = subError("AggregateError", "aggregate error");
+
+ try {
+ _TypeError = TypeError;
+ _RangeError = RangeError;
+ } catch (e) {
+ _TypeError = subError("TypeError", "type error");
+ _RangeError = subError("RangeError", "range error");
+ }
+
+ var methods = ("join pop push shift unshift slice filter forEach some " + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");
+
+ for (var i = 0; i < methods.length; ++i) {
+ if (typeof Array.prototype[methods[i]] === "function") {
+ AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
+ }
+ }
+
+ es5.defineProperty(AggregateError.prototype, "length", {
+ value: 0,
+ configurable: false,
+ writable: true,
+ enumerable: true
+ });
+ AggregateError.prototype["isOperational"] = true;
+ var level = 0;
+
+ AggregateError.prototype.toString = function () {
+ var indent = Array(level * 4 + 1).join(" ");
+ var ret = "\n" + indent + "AggregateError of:" + "\n";
+ level++;
+ indent = Array(level * 4 + 1).join(" ");
+
+ for (var i = 0; i < this.length; ++i) {
+ var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
+ var lines = str.split("\n");
+
+ for (var j = 0; j < lines.length; ++j) {
+ lines[j] = indent + lines[j];
+ }
+
+ str = lines.join("\n");
+ ret += str + "\n";
+ }
+
+ level--;
+ return ret;
+ };
+
+ function OperationalError(message) {
+ if (!(this instanceof OperationalError)) return new OperationalError(message);
+ notEnumerableProp(this, "name", "OperationalError");
+ notEnumerableProp(this, "message", message);
+ this.cause = message;
+ this["isOperational"] = true;
+
+ if (message instanceof Error) {
+ notEnumerableProp(this, "message", message.message);
+ notEnumerableProp(this, "stack", message.stack);
+ } else if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ }
+ }
+
+ inherits(OperationalError, Error);
+ var errorTypes = Error["__BluebirdErrorTypes__"];
+
+ if (!errorTypes) {
+ errorTypes = Objectfreeze({
+ CancellationError: CancellationError,
+ TimeoutError: TimeoutError,
+ OperationalError: OperationalError,
+ RejectionError: OperationalError,
+ AggregateError: AggregateError
+ });
+ es5.defineProperty(Error, "__BluebirdErrorTypes__", {
+ value: errorTypes,
+ writable: false,
+ enumerable: false,
+ configurable: false
+ });
+ }
+
+ module.exports = {
+ Error: Error,
+ TypeError: _TypeError,
+ RangeError: _RangeError,
+ CancellationError: errorTypes.CancellationError,
+ OperationalError: errorTypes.OperationalError,
+ TimeoutError: errorTypes.TimeoutError,
+ AggregateError: errorTypes.AggregateError,
+ Warning: Warning
+ };
+ }, {
+ "./es5": 13,
+ "./util": 36
+ }],
+ 13: [function (_dereq_, module, exports) {
+ var isES5 = function () {
+ "use strict";
+
+ return this === undefined;
+ }();
+
+ if (isES5) {
+ module.exports = {
+ freeze: Object.freeze,
+ defineProperty: Object.defineProperty,
+ getDescriptor: Object.getOwnPropertyDescriptor,
+ keys: Object.keys,
+ names: Object.getOwnPropertyNames,
+ getPrototypeOf: Object.getPrototypeOf,
+ isArray: Array.isArray,
+ isES5: isES5,
+ propertyIsWritable: function propertyIsWritable(obj, prop) {
+ var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
+ return !!(!descriptor || descriptor.writable || descriptor.set);
+ }
+ };
+ } else {
+ var has = {}.hasOwnProperty;
+ var str = {}.toString;
+ var proto = {}.constructor.prototype;
+
+ var ObjectKeys = function ObjectKeys(o) {
+ var ret = [];
+
+ for (var key in o) {
+ if (has.call(o, key)) {
+ ret.push(key);
+ }
+ }
+
+ return ret;
+ };
+
+ var ObjectGetDescriptor = function ObjectGetDescriptor(o, key) {
+ return {
+ value: o[key]
+ };
+ };
+
+ var ObjectDefineProperty = function ObjectDefineProperty(o, key, desc) {
+ o[key] = desc.value;
+ return o;
+ };
+
+ var ObjectFreeze = function ObjectFreeze(obj) {
+ return obj;
+ };
+
+ var ObjectGetPrototypeOf = function ObjectGetPrototypeOf(obj) {
+ try {
+ return Object(obj).constructor.prototype;
+ } catch (e) {
+ return proto;
+ }
+ };
+
+ var ArrayIsArray = function ArrayIsArray(obj) {
+ try {
+ return str.call(obj) === "[object Array]";
+ } catch (e) {
+ return false;
+ }
+ };
+
+ module.exports = {
+ isArray: ArrayIsArray,
+ keys: ObjectKeys,
+ names: ObjectKeys,
+ defineProperty: ObjectDefineProperty,
+ getDescriptor: ObjectGetDescriptor,
+ freeze: ObjectFreeze,
+ getPrototypeOf: ObjectGetPrototypeOf,
+ isES5: isES5,
+ propertyIsWritable: function propertyIsWritable() {
+ return true;
+ }
+ };
+ }
+ }, {}],
+ 14: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL) {
+ var PromiseMap = Promise.map;
+
+ Promise.prototype.filter = function (fn, options) {
+ return PromiseMap(this, fn, options, INTERNAL);
+ };
+
+ Promise.filter = function (promises, fn, options) {
+ return PromiseMap(promises, fn, options, INTERNAL);
+ };
+ };
+ }, {}],
+ 15: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, tryConvertToPromise, NEXT_FILTER) {
+ var util = _dereq_("./util");
+
+ var CancellationError = Promise.CancellationError;
+ var errorObj = util.errorObj;
+
+ var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
+
+ function PassThroughHandlerContext(promise, type, handler) {
+ this.promise = promise;
+ this.type = type;
+ this.handler = handler;
+ this.called = false;
+ this.cancelPromise = null;
+ }
+
+ PassThroughHandlerContext.prototype.isFinallyHandler = function () {
+ return this.type === 0;
+ };
+
+ function FinallyHandlerCancelReaction(finallyHandler) {
+ this.finallyHandler = finallyHandler;
+ }
+
+ FinallyHandlerCancelReaction.prototype._resultCancelled = function () {
+ checkCancel(this.finallyHandler);
+ };
+
+ function checkCancel(ctx, reason) {
+ if (ctx.cancelPromise != null) {
+ if (arguments.length > 1) {
+ ctx.cancelPromise._reject(reason);
+ } else {
+ ctx.cancelPromise._cancel();
+ }
+
+ ctx.cancelPromise = null;
+ return true;
+ }
+
+ return false;
+ }
+
+ function succeed() {
+ return finallyHandler.call(this, this.promise._target()._settledValue());
+ }
+
+ function fail(reason) {
+ if (checkCancel(this, reason)) return;
+ errorObj.e = reason;
+ return errorObj;
+ }
+
+ function finallyHandler(reasonOrValue) {
+ var promise = this.promise;
+ var handler = this.handler;
+
+ if (!this.called) {
+ this.called = true;
+ var ret = this.isFinallyHandler() ? handler.call(promise._boundValue()) : handler.call(promise._boundValue(), reasonOrValue);
+
+ if (ret === NEXT_FILTER) {
+ return ret;
+ } else if (ret !== undefined) {
+ promise._setReturnedNonUndefined();
+
+ var maybePromise = tryConvertToPromise(ret, promise);
+
+ if (maybePromise instanceof Promise) {
+ if (this.cancelPromise != null) {
+ if (maybePromise._isCancelled()) {
+ var reason = new CancellationError("late cancellation observer");
+
+ promise._attachExtraTrace(reason);
+
+ errorObj.e = reason;
+ return errorObj;
+ } else if (maybePromise.isPending()) {
+ maybePromise._attachCancellationCallback(new FinallyHandlerCancelReaction(this));
+ }
+ }
+
+ return maybePromise._then(succeed, fail, undefined, this, undefined);
+ }
+ }
+ }
+
+ if (promise.isRejected()) {
+ checkCancel(this);
+ errorObj.e = reasonOrValue;
+ return errorObj;
+ } else {
+ checkCancel(this);
+ return reasonOrValue;
+ }
+ }
+
+ Promise.prototype._passThrough = function (handler, type, success, fail) {
+ if (typeof handler !== "function") return this.then();
+ return this._then(success, fail, undefined, new PassThroughHandlerContext(this, type, handler), undefined);
+ };
+
+ Promise.prototype.lastly = Promise.prototype["finally"] = function (handler) {
+ return this._passThrough(handler, 0, finallyHandler, finallyHandler);
+ };
+
+ Promise.prototype.tap = function (handler) {
+ return this._passThrough(handler, 1, finallyHandler);
+ };
+
+ Promise.prototype.tapCatch = function (handlerOrPredicate) {
+ var len = arguments.length;
+
+ if (len === 1) {
+ return this._passThrough(handlerOrPredicate, 1, undefined, finallyHandler);
+ } else {
+ var catchInstances = new Array(len - 1),
+ j = 0,
+ i;
+
+ for (i = 0; i < len - 1; ++i) {
+ var item = arguments[i];
+
+ if (util.isObject(item)) {
+ catchInstances[j++] = item;
+ } else {
+ return Promise.reject(new TypeError("tapCatch statement predicate: " + "expecting an object but got " + util.classString(item)));
+ }
+ }
+
+ catchInstances.length = j;
+ var handler = arguments[i];
+ return this._passThrough(catchFilter(catchInstances, handler, this), 1, undefined, finallyHandler);
+ }
+ };
+
+ return PassThroughHandlerContext;
+ };
+ }, {
+ "./catch_filter": 7,
+ "./util": 36
+ }],
+ 16: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug) {
+ var errors = _dereq_("./errors");
+
+ var TypeError = errors.TypeError;
+
+ var util = _dereq_("./util");
+
+ var errorObj = util.errorObj;
+ var tryCatch = util.tryCatch;
+ var yieldHandlers = [];
+
+ function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
+ for (var i = 0; i < yieldHandlers.length; ++i) {
+ traceParent._pushContext();
+
+ var result = tryCatch(yieldHandlers[i])(value);
+
+ traceParent._popContext();
+
+ if (result === errorObj) {
+ traceParent._pushContext();
+
+ var ret = Promise.reject(errorObj.e);
+
+ traceParent._popContext();
+
+ return ret;
+ }
+
+ var maybePromise = tryConvertToPromise(result, traceParent);
+ if (maybePromise instanceof Promise) return maybePromise;
+ }
+
+ return null;
+ }
+
+ function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
+ if (debug.cancellation()) {
+ var internal = new Promise(INTERNAL);
+
+ var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
+
+ this._promise = internal.lastly(function () {
+ return _finallyPromise;
+ });
+
+ internal._captureStackTrace();
+
+ internal._setOnCancel(this);
+ } else {
+ var promise = this._promise = new Promise(INTERNAL);
+
+ promise._captureStackTrace();
+ }
+
+ this._stack = stack;
+ this._generatorFunction = generatorFunction;
+ this._receiver = receiver;
+ this._generator = undefined;
+ this._yieldHandlers = typeof yieldHandler === "function" ? [yieldHandler].concat(yieldHandlers) : yieldHandlers;
+ this._yieldedPromise = null;
+ this._cancellationPhase = false;
+ }
+
+ util.inherits(PromiseSpawn, Proxyable);
+
+ PromiseSpawn.prototype._isResolved = function () {
+ return this._promise === null;
+ };
+
+ PromiseSpawn.prototype._cleanup = function () {
+ this._promise = this._generator = null;
+
+ if (debug.cancellation() && this._finallyPromise !== null) {
+ this._finallyPromise._fulfill();
+
+ this._finallyPromise = null;
+ }
+ };
+
+ PromiseSpawn.prototype._promiseCancelled = function () {
+ if (this._isResolved()) return;
+ var implementsReturn = typeof this._generator["return"] !== "undefined";
+ var result;
+
+ if (!implementsReturn) {
+ var reason = new Promise.CancellationError("generator .return() sentinel");
+ Promise.coroutine.returnSentinel = reason;
+
+ this._promise._attachExtraTrace(reason);
+
+ this._promise._pushContext();
+
+ result = tryCatch(this._generator["throw"]).call(this._generator, reason);
+
+ this._promise._popContext();
+ } else {
+ this._promise._pushContext();
+
+ result = tryCatch(this._generator["return"]).call(this._generator, undefined);
+
+ this._promise._popContext();
+ }
+
+ this._cancellationPhase = true;
+ this._yieldedPromise = null;
+
+ this._continue(result);
+ };
+
+ PromiseSpawn.prototype._promiseFulfilled = function (value) {
+ this._yieldedPromise = null;
+
+ this._promise._pushContext();
+
+ var result = tryCatch(this._generator.next).call(this._generator, value);
+
+ this._promise._popContext();
+
+ this._continue(result);
+ };
+
+ PromiseSpawn.prototype._promiseRejected = function (reason) {
+ this._yieldedPromise = null;
+
+ this._promise._attachExtraTrace(reason);
+
+ this._promise._pushContext();
+
+ var result = tryCatch(this._generator["throw"]).call(this._generator, reason);
+
+ this._promise._popContext();
+
+ this._continue(result);
+ };
+
+ PromiseSpawn.prototype._resultCancelled = function () {
+ if (this._yieldedPromise instanceof Promise) {
+ var promise = this._yieldedPromise;
+ this._yieldedPromise = null;
+ promise.cancel();
+ }
+ };
+
+ PromiseSpawn.prototype.promise = function () {
+ return this._promise;
+ };
+
+ PromiseSpawn.prototype._run = function () {
+ this._generator = this._generatorFunction.call(this._receiver);
+ this._receiver = this._generatorFunction = undefined;
+
+ this._promiseFulfilled(undefined);
+ };
+
+ PromiseSpawn.prototype._continue = function (result) {
+ var promise = this._promise;
+
+ if (result === errorObj) {
+ this._cleanup();
+
+ if (this._cancellationPhase) {
+ return promise.cancel();
+ } else {
+ return promise._rejectCallback(result.e, false);
+ }
+ }
+
+ var value = result.value;
+
+ if (result.done === true) {
+ this._cleanup();
+
+ if (this._cancellationPhase) {
+ return promise.cancel();
+ } else {
+ return promise._resolveCallback(value);
+ }
+ } else {
+ var maybePromise = tryConvertToPromise(value, this._promise);
+
+ if (!(maybePromise instanceof Promise)) {
+ maybePromise = promiseFromYieldHandler(maybePromise, this._yieldHandlers, this._promise);
+
+ if (maybePromise === null) {
+ this._promiseRejected(new TypeError("A value %s was yielded that could not be treated as a promise\n\n See http://goo.gl/MqrFmX\n\n".replace("%s", String(value)) + "From coroutine:\n" + this._stack.split("\n").slice(1, -7).join("\n")));
+
+ return;
+ }
+ }
+
+ maybePromise = maybePromise._target();
+ var bitField = maybePromise._bitField;
+ ;
+
+ if ((bitField & 50397184) === 0) {
+ this._yieldedPromise = maybePromise;
+
+ maybePromise._proxy(this, null);
+ } else if ((bitField & 33554432) !== 0) {
+ Promise._async.invoke(this._promiseFulfilled, this, maybePromise._value());
+ } else if ((bitField & 16777216) !== 0) {
+ Promise._async.invoke(this._promiseRejected, this, maybePromise._reason());
+ } else {
+ this._promiseCancelled();
+ }
+ }
+ };
+
+ Promise.coroutine = function (generatorFunction, options) {
+ if (typeof generatorFunction !== "function") {
+ throw new TypeError("generatorFunction must be a function\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ var yieldHandler = Object(options).yieldHandler;
+ var PromiseSpawn$ = PromiseSpawn;
+ var stack = new Error().stack;
+ return function () {
+ var generator = generatorFunction.apply(this, arguments);
+ var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, stack);
+ var ret = spawn.promise();
+ spawn._generator = generator;
+
+ spawn._promiseFulfilled(undefined);
+
+ return ret;
+ };
+ };
+
+ Promise.coroutine.addYieldHandler = function (fn) {
+ if (typeof fn !== "function") {
+ throw new TypeError("expecting a function but got " + util.classString(fn));
+ }
+
+ yieldHandlers.push(fn);
+ };
+
+ Promise.spawn = function (generatorFunction) {
+ debug.deprecated("Promise.spawn()", "Promise.coroutine()");
+
+ if (typeof generatorFunction !== "function") {
+ return apiRejection("generatorFunction must be a function\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ var spawn = new PromiseSpawn(generatorFunction, this);
+ var ret = spawn.promise();
+
+ spawn._run(Promise.spawn);
+
+ return ret;
+ };
+ };
+ }, {
+ "./errors": 12,
+ "./util": 36
+ }],
+ 17: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain) {
+ var util = _dereq_("./util");
+
+ var canEvaluate = util.canEvaluate;
+ var tryCatch = util.tryCatch;
+ var errorObj = util.errorObj;
+ var reject;
+
+ if (false) { var i, promiseSetters, thenCallbacks, holderClasses, generateHolderClass, promiseSetter, thenCallback; }
+
+ Promise.join = function () {
+ var last = arguments.length - 1;
+ var fn;
+
+ if (last > 0 && typeof arguments[last] === "function") {
+ fn = arguments[last];
+
+ if (false) { var domain, bitField, maybePromise, i, callbacks, holder, HolderClass, ret; }
+ }
+
+ var args = [].slice.call(arguments);
+ ;
+ if (fn) args.pop();
+ var ret = new PromiseArray(args).promise();
+ return fn !== undefined ? ret.spread(fn) : ret;
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 18: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug) {
+ var getDomain = Promise._getDomain;
+
+ var util = _dereq_("./util");
+
+ var tryCatch = util.tryCatch;
+ var errorObj = util.errorObj;
+ var async = Promise._async;
+
+ function MappingPromiseArray(promises, fn, limit, _filter) {
+ this.constructor$(promises);
+
+ this._promise._captureStackTrace();
+
+ var domain = getDomain();
+ this._callback = domain === null ? fn : util.domainBind(domain, fn);
+ this._preservedValues = _filter === INTERNAL ? new Array(this.length()) : null;
+ this._limit = limit;
+ this._inFlight = 0;
+ this._queue = [];
+ async.invoke(this._asyncInit, this, undefined);
+ }
+
+ util.inherits(MappingPromiseArray, PromiseArray);
+
+ MappingPromiseArray.prototype._asyncInit = function () {
+ this._init$(undefined, -2);
+ };
+
+ MappingPromiseArray.prototype._init = function () {};
+
+ MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
+ var values = this._values;
+ var length = this.length();
+ var preservedValues = this._preservedValues;
+ var limit = this._limit;
+
+ if (index < 0) {
+ index = index * -1 - 1;
+ values[index] = value;
+
+ if (limit >= 1) {
+ this._inFlight--;
+
+ this._drainQueue();
+
+ if (this._isResolved()) return true;
+ }
+ } else {
+ if (limit >= 1 && this._inFlight >= limit) {
+ values[index] = value;
+
+ this._queue.push(index);
+
+ return false;
+ }
+
+ if (preservedValues !== null) preservedValues[index] = value;
+ var promise = this._promise;
+ var callback = this._callback;
+
+ var receiver = promise._boundValue();
+
+ promise._pushContext();
+
+ var ret = tryCatch(callback).call(receiver, value, index, length);
+
+ var promiseCreated = promise._popContext();
+
+ debug.checkForgottenReturns(ret, promiseCreated, preservedValues !== null ? "Promise.filter" : "Promise.map", promise);
+
+ if (ret === errorObj) {
+ this._reject(ret.e);
+
+ return true;
+ }
+
+ var maybePromise = tryConvertToPromise(ret, this._promise);
+
+ if (maybePromise instanceof Promise) {
+ maybePromise = maybePromise._target();
+ var bitField = maybePromise._bitField;
+ ;
+
+ if ((bitField & 50397184) === 0) {
+ if (limit >= 1) this._inFlight++;
+ values[index] = maybePromise;
+
+ maybePromise._proxy(this, (index + 1) * -1);
+
+ return false;
+ } else if ((bitField & 33554432) !== 0) {
+ ret = maybePromise._value();
+ } else if ((bitField & 16777216) !== 0) {
+ this._reject(maybePromise._reason());
+
+ return true;
+ } else {
+ this._cancel();
+
+ return true;
+ }
+ }
+
+ values[index] = ret;
+ }
+
+ var totalResolved = ++this._totalResolved;
+
+ if (totalResolved >= length) {
+ if (preservedValues !== null) {
+ this._filter(values, preservedValues);
+ } else {
+ this._resolve(values);
+ }
+
+ return true;
+ }
+
+ return false;
+ };
+
+ MappingPromiseArray.prototype._drainQueue = function () {
+ var queue = this._queue;
+ var limit = this._limit;
+ var values = this._values;
+
+ while (queue.length > 0 && this._inFlight < limit) {
+ if (this._isResolved()) return;
+ var index = queue.pop();
+
+ this._promiseFulfilled(values[index], index);
+ }
+ };
+
+ MappingPromiseArray.prototype._filter = function (booleans, values) {
+ var len = values.length;
+ var ret = new Array(len);
+ var j = 0;
+
+ for (var i = 0; i < len; ++i) {
+ if (booleans[i]) ret[j++] = values[i];
+ }
+
+ ret.length = j;
+
+ this._resolve(ret);
+ };
+
+ MappingPromiseArray.prototype.preservedValues = function () {
+ return this._preservedValues;
+ };
+
+ function map(promises, fn, options, _filter) {
+ if (typeof fn !== "function") {
+ return apiRejection("expecting a function but got " + util.classString(fn));
+ }
+
+ var limit = 0;
+
+ if (options !== undefined) {
+ if (_typeof(options) === "object" && options !== null) {
+ if (typeof options.concurrency !== "number") {
+ return Promise.reject(new TypeError("'concurrency' must be a number but it is " + util.classString(options.concurrency)));
+ }
+
+ limit = options.concurrency;
+ } else {
+ return Promise.reject(new TypeError("options argument must be an object but it is " + util.classString(options)));
+ }
+ }
+
+ limit = typeof limit === "number" && isFinite(limit) && limit >= 1 ? limit : 0;
+ return new MappingPromiseArray(promises, fn, limit, _filter).promise();
+ }
+
+ Promise.prototype.map = function (fn, options) {
+ return map(this, fn, options, null);
+ };
+
+ Promise.map = function (promises, fn, options, _filter) {
+ return map(promises, fn, options, _filter);
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 19: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
+ var util = _dereq_("./util");
+
+ var tryCatch = util.tryCatch;
+
+ Promise.method = function (fn) {
+ if (typeof fn !== "function") {
+ throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
+ }
+
+ return function () {
+ var ret = new Promise(INTERNAL);
+
+ ret._captureStackTrace();
+
+ ret._pushContext();
+
+ var value = tryCatch(fn).apply(this, arguments);
+
+ var promiseCreated = ret._popContext();
+
+ debug.checkForgottenReturns(value, promiseCreated, "Promise.method", ret);
+
+ ret._resolveFromSyncValue(value);
+
+ return ret;
+ };
+ };
+
+ Promise.attempt = Promise["try"] = function (fn) {
+ if (typeof fn !== "function") {
+ return apiRejection("expecting a function but got " + util.classString(fn));
+ }
+
+ var ret = new Promise(INTERNAL);
+
+ ret._captureStackTrace();
+
+ ret._pushContext();
+
+ var value;
+
+ if (arguments.length > 1) {
+ debug.deprecated("calling Promise.try with more than 1 argument");
+ var arg = arguments[1];
+ var ctx = arguments[2];
+ value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) : tryCatch(fn).call(ctx, arg);
+ } else {
+ value = tryCatch(fn)();
+ }
+
+ var promiseCreated = ret._popContext();
+
+ debug.checkForgottenReturns(value, promiseCreated, "Promise.try", ret);
+
+ ret._resolveFromSyncValue(value);
+
+ return ret;
+ };
+
+ Promise.prototype._resolveFromSyncValue = function (value) {
+ if (value === util.errorObj) {
+ this._rejectCallback(value.e, false);
+ } else {
+ this._resolveCallback(value, true);
+ }
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 20: [function (_dereq_, module, exports) {
+ "use strict";
+
+ var util = _dereq_("./util");
+
+ var maybeWrapAsError = util.maybeWrapAsError;
+
+ var errors = _dereq_("./errors");
+
+ var OperationalError = errors.OperationalError;
+
+ var es5 = _dereq_("./es5");
+
+ function isUntypedError(obj) {
+ return obj instanceof Error && es5.getPrototypeOf(obj) === Error.prototype;
+ }
+
+ var rErrorKey = /^(?:name|message|stack|cause)$/;
+
+ function wrapAsOperationalError(obj) {
+ var ret;
+
+ if (isUntypedError(obj)) {
+ ret = new OperationalError(obj);
+ ret.name = obj.name;
+ ret.message = obj.message;
+ ret.stack = obj.stack;
+ var keys = es5.keys(obj);
+
+ for (var i = 0; i < keys.length; ++i) {
+ var key = keys[i];
+
+ if (!rErrorKey.test(key)) {
+ ret[key] = obj[key];
+ }
+ }
+
+ return ret;
+ }
+
+ util.markAsOriginatingFromRejection(obj);
+ return obj;
+ }
+
+ function nodebackForPromise(promise, multiArgs) {
+ return function (err, value) {
+ if (promise === null) return;
+
+ if (err) {
+ var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
+
+ promise._attachExtraTrace(wrapped);
+
+ promise._reject(wrapped);
+ } else if (!multiArgs) {
+ promise._fulfill(value);
+ } else {
+ var args = [].slice.call(arguments, 1);
+ ;
+
+ promise._fulfill(args);
+ }
+
+ promise = null;
+ };
+ }
+
+ module.exports = nodebackForPromise;
+ }, {
+ "./errors": 12,
+ "./es5": 13,
+ "./util": 36
+ }],
+ 21: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise) {
+ var util = _dereq_("./util");
+
+ var async = Promise._async;
+ var tryCatch = util.tryCatch;
+ var errorObj = util.errorObj;
+
+ function spreadAdapter(val, nodeback) {
+ var promise = this;
+ if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
+ var ret = tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
+
+ if (ret === errorObj) {
+ async.throwLater(ret.e);
+ }
+ }
+
+ function successAdapter(val, nodeback) {
+ var promise = this;
+
+ var receiver = promise._boundValue();
+
+ var ret = val === undefined ? tryCatch(nodeback).call(receiver, null) : tryCatch(nodeback).call(receiver, null, val);
+
+ if (ret === errorObj) {
+ async.throwLater(ret.e);
+ }
+ }
+
+ function errorAdapter(reason, nodeback) {
+ var promise = this;
+
+ if (!reason) {
+ var newReason = new Error(reason + "");
+ newReason.cause = reason;
+ reason = newReason;
+ }
+
+ var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
+
+ if (ret === errorObj) {
+ async.throwLater(ret.e);
+ }
+ }
+
+ Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, options) {
+ if (typeof nodeback == "function") {
+ var adapter = successAdapter;
+
+ if (options !== undefined && Object(options).spread) {
+ adapter = spreadAdapter;
+ }
+
+ this._then(adapter, errorAdapter, undefined, this, nodeback);
+ }
+
+ return this;
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 22: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function () {
+ var makeSelfResolutionError = function makeSelfResolutionError() {
+ return new TypeError("circular promise resolution chain\n\n See http://goo.gl/MqrFmX\n");
+ };
+
+ var reflectHandler = function reflectHandler() {
+ return new Promise.PromiseInspection(this._target());
+ };
+
+ var apiRejection = function apiRejection(msg) {
+ return Promise.reject(new TypeError(msg));
+ };
+
+ function Proxyable() {}
+
+ var UNDEFINED_BINDING = {};
+
+ var util = _dereq_("./util");
+
+ var getDomain;
+
+ if (util.isNode) {
+ getDomain = function getDomain() {
+ var ret = process.domain;
+ if (ret === undefined) ret = null;
+ return ret;
+ };
+ } else {
+ getDomain = function getDomain() {
+ return null;
+ };
+ }
+
+ util.notEnumerableProp(Promise, "_getDomain", getDomain);
+
+ var es5 = _dereq_("./es5");
+
+ var Async = _dereq_("./async");
+
+ var async = new Async();
+ es5.defineProperty(Promise, "_async", {
+ value: async
+ });
+
+ var errors = _dereq_("./errors");
+
+ var TypeError = Promise.TypeError = errors.TypeError;
+ Promise.RangeError = errors.RangeError;
+ var CancellationError = Promise.CancellationError = errors.CancellationError;
+ Promise.TimeoutError = errors.TimeoutError;
+ Promise.OperationalError = errors.OperationalError;
+ Promise.RejectionError = errors.OperationalError;
+ Promise.AggregateError = errors.AggregateError;
+
+ var INTERNAL = function INTERNAL() {};
+
+ var APPLY = {};
+ var NEXT_FILTER = {};
+
+ var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL);
+
+ var PromiseArray = _dereq_("./promise_array")(Promise, INTERNAL, tryConvertToPromise, apiRejection, Proxyable);
+
+ var Context = _dereq_("./context")(Promise);
+ /*jshint unused:false*/
+
+
+ var createContext = Context.create;
+
+ var debug = _dereq_("./debuggability")(Promise, Context);
+
+ var CapturedTrace = debug.CapturedTrace;
+
+ var PassThroughHandlerContext = _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
+
+ var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
+
+ var nodebackForPromise = _dereq_("./nodeback");
+
+ var errorObj = util.errorObj;
+ var tryCatch = util.tryCatch;
+
+ function check(self, executor) {
+ if (self == null || self.constructor !== Promise) {
+ throw new TypeError("the promise constructor cannot be invoked directly\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ if (typeof executor !== "function") {
+ throw new TypeError("expecting a function but got " + util.classString(executor));
+ }
+ }
+
+ function Promise(executor) {
+ if (executor !== INTERNAL) {
+ check(this, executor);
+ }
+
+ this._bitField = 0;
+ this._fulfillmentHandler0 = undefined;
+ this._rejectionHandler0 = undefined;
+ this._promise0 = undefined;
+ this._receiver0 = undefined;
+
+ this._resolveFromExecutor(executor);
+
+ this._promiseCreated();
+
+ this._fireEvent("promiseCreated", this);
+ }
+
+ Promise.prototype.toString = function () {
+ return "[object Promise]";
+ };
+
+ Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
+ var len = arguments.length;
+
+ if (len > 1) {
+ var catchInstances = new Array(len - 1),
+ j = 0,
+ i;
+
+ for (i = 0; i < len - 1; ++i) {
+ var item = arguments[i];
+
+ if (util.isObject(item)) {
+ catchInstances[j++] = item;
+ } else {
+ return apiRejection("Catch statement predicate: " + "expecting an object but got " + util.classString(item));
+ }
+ }
+
+ catchInstances.length = j;
+ fn = arguments[i];
+ return this.then(undefined, catchFilter(catchInstances, fn, this));
+ }
+
+ return this.then(undefined, fn);
+ };
+
+ Promise.prototype.reflect = function () {
+ return this._then(reflectHandler, reflectHandler, undefined, this, undefined);
+ };
+
+ Promise.prototype.then = function (didFulfill, didReject) {
+ if (debug.warnings() && arguments.length > 0 && typeof didFulfill !== "function" && typeof didReject !== "function") {
+ var msg = ".then() only accepts functions but was passed: " + util.classString(didFulfill);
+
+ if (arguments.length > 1) {
+ msg += ", " + util.classString(didReject);
+ }
+
+ this._warn(msg);
+ }
+
+ return this._then(didFulfill, didReject, undefined, undefined, undefined);
+ };
+
+ Promise.prototype.done = function (didFulfill, didReject) {
+ var promise = this._then(didFulfill, didReject, undefined, undefined, undefined);
+
+ promise._setIsFinal();
+ };
+
+ Promise.prototype.spread = function (fn) {
+ if (typeof fn !== "function") {
+ return apiRejection("expecting a function but got " + util.classString(fn));
+ }
+
+ return this.all()._then(fn, undefined, undefined, APPLY, undefined);
+ };
+
+ Promise.prototype.toJSON = function () {
+ var ret = {
+ isFulfilled: false,
+ isRejected: false,
+ fulfillmentValue: undefined,
+ rejectionReason: undefined
+ };
+
+ if (this.isFulfilled()) {
+ ret.fulfillmentValue = this.value();
+ ret.isFulfilled = true;
+ } else if (this.isRejected()) {
+ ret.rejectionReason = this.reason();
+ ret.isRejected = true;
+ }
+
+ return ret;
+ };
+
+ Promise.prototype.all = function () {
+ if (arguments.length > 0) {
+ this._warn(".all() was passed arguments but it does not take any");
+ }
+
+ return new PromiseArray(this).promise();
+ };
+
+ Promise.prototype.error = function (fn) {
+ return this.caught(util.originatesFromRejection, fn);
+ };
+
+ Promise.getNewLibraryCopy = module.exports;
+
+ Promise.is = function (val) {
+ return val instanceof Promise;
+ };
+
+ Promise.fromNode = Promise.fromCallback = function (fn) {
+ var ret = new Promise(INTERNAL);
+
+ ret._captureStackTrace();
+
+ var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs : false;
+ var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
+
+ if (result === errorObj) {
+ ret._rejectCallback(result.e, true);
+ }
+
+ if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
+ return ret;
+ };
+
+ Promise.all = function (promises) {
+ return new PromiseArray(promises).promise();
+ };
+
+ Promise.cast = function (obj) {
+ var ret = tryConvertToPromise(obj);
+
+ if (!(ret instanceof Promise)) {
+ ret = new Promise(INTERNAL);
+
+ ret._captureStackTrace();
+
+ ret._setFulfilled();
+
+ ret._rejectionHandler0 = obj;
+ }
+
+ return ret;
+ };
+
+ Promise.resolve = Promise.fulfilled = Promise.cast;
+
+ Promise.reject = Promise.rejected = function (reason) {
+ var ret = new Promise(INTERNAL);
+
+ ret._captureStackTrace();
+
+ ret._rejectCallback(reason, true);
+
+ return ret;
+ };
+
+ Promise.setScheduler = function (fn) {
+ if (typeof fn !== "function") {
+ throw new TypeError("expecting a function but got " + util.classString(fn));
+ }
+
+ return async.setScheduler(fn);
+ };
+
+ Promise.prototype._then = function (didFulfill, didReject, _, receiver, internalData) {
+ var haveInternalData = internalData !== undefined;
+ var promise = haveInternalData ? internalData : new Promise(INTERNAL);
+
+ var target = this._target();
+
+ var bitField = target._bitField;
+
+ if (!haveInternalData) {
+ promise._propagateFrom(this, 3);
+
+ promise._captureStackTrace();
+
+ if (receiver === undefined && (this._bitField & 2097152) !== 0) {
+ if (!((bitField & 50397184) === 0)) {
+ receiver = this._boundValue();
+ } else {
+ receiver = target === this ? undefined : this._boundTo;
+ }
+ }
+
+ this._fireEvent("promiseChained", this, promise);
+ }
+
+ var domain = getDomain();
+
+ if (!((bitField & 50397184) === 0)) {
+ var handler,
+ value,
+ settler = target._settlePromiseCtx;
+
+ if ((bitField & 33554432) !== 0) {
+ value = target._rejectionHandler0;
+ handler = didFulfill;
+ } else if ((bitField & 16777216) !== 0) {
+ value = target._fulfillmentHandler0;
+ handler = didReject;
+
+ target._unsetRejectionIsUnhandled();
+ } else {
+ settler = target._settlePromiseLateCancellationObserver;
+ value = new CancellationError("late cancellation observer");
+
+ target._attachExtraTrace(value);
+
+ handler = didReject;
+ }
+
+ async.invoke(settler, target, {
+ handler: domain === null ? handler : typeof handler === "function" && util.domainBind(domain, handler),
+ promise: promise,
+ receiver: receiver,
+ value: value
+ });
+ } else {
+ target._addCallbacks(didFulfill, didReject, promise, receiver, domain);
+ }
+
+ return promise;
+ };
+
+ Promise.prototype._length = function () {
+ return this._bitField & 65535;
+ };
+
+ Promise.prototype._isFateSealed = function () {
+ return (this._bitField & 117506048) !== 0;
+ };
+
+ Promise.prototype._isFollowing = function () {
+ return (this._bitField & 67108864) === 67108864;
+ };
+
+ Promise.prototype._setLength = function (len) {
+ this._bitField = this._bitField & -65536 | len & 65535;
+ };
+
+ Promise.prototype._setFulfilled = function () {
+ this._bitField = this._bitField | 33554432;
+
+ this._fireEvent("promiseFulfilled", this);
+ };
+
+ Promise.prototype._setRejected = function () {
+ this._bitField = this._bitField | 16777216;
+
+ this._fireEvent("promiseRejected", this);
+ };
+
+ Promise.prototype._setFollowing = function () {
+ this._bitField = this._bitField | 67108864;
+
+ this._fireEvent("promiseResolved", this);
+ };
+
+ Promise.prototype._setIsFinal = function () {
+ this._bitField = this._bitField | 4194304;
+ };
+
+ Promise.prototype._isFinal = function () {
+ return (this._bitField & 4194304) > 0;
+ };
+
+ Promise.prototype._unsetCancelled = function () {
+ this._bitField = this._bitField & ~65536;
+ };
+
+ Promise.prototype._setCancelled = function () {
+ this._bitField = this._bitField | 65536;
+
+ this._fireEvent("promiseCancelled", this);
+ };
+
+ Promise.prototype._setWillBeCancelled = function () {
+ this._bitField = this._bitField | 8388608;
+ };
+
+ Promise.prototype._setAsyncGuaranteed = function () {
+ if (async.hasCustomScheduler()) return;
+ this._bitField = this._bitField | 134217728;
+ };
+
+ Promise.prototype._receiverAt = function (index) {
+ var ret = index === 0 ? this._receiver0 : this[index * 4 - 4 + 3];
+
+ if (ret === UNDEFINED_BINDING) {
+ return undefined;
+ } else if (ret === undefined && this._isBound()) {
+ return this._boundValue();
+ }
+
+ return ret;
+ };
+
+ Promise.prototype._promiseAt = function (index) {
+ return this[index * 4 - 4 + 2];
+ };
+
+ Promise.prototype._fulfillmentHandlerAt = function (index) {
+ return this[index * 4 - 4 + 0];
+ };
+
+ Promise.prototype._rejectionHandlerAt = function (index) {
+ return this[index * 4 - 4 + 1];
+ };
+
+ Promise.prototype._boundValue = function () {};
+
+ Promise.prototype._migrateCallback0 = function (follower) {
+ var bitField = follower._bitField;
+ var fulfill = follower._fulfillmentHandler0;
+ var reject = follower._rejectionHandler0;
+ var promise = follower._promise0;
+
+ var receiver = follower._receiverAt(0);
+
+ if (receiver === undefined) receiver = UNDEFINED_BINDING;
+
+ this._addCallbacks(fulfill, reject, promise, receiver, null);
+ };
+
+ Promise.prototype._migrateCallbackAt = function (follower, index) {
+ var fulfill = follower._fulfillmentHandlerAt(index);
+
+ var reject = follower._rejectionHandlerAt(index);
+
+ var promise = follower._promiseAt(index);
+
+ var receiver = follower._receiverAt(index);
+
+ if (receiver === undefined) receiver = UNDEFINED_BINDING;
+
+ this._addCallbacks(fulfill, reject, promise, receiver, null);
+ };
+
+ Promise.prototype._addCallbacks = function (fulfill, reject, promise, receiver, domain) {
+ var index = this._length();
+
+ if (index >= 65535 - 4) {
+ index = 0;
+
+ this._setLength(0);
+ }
+
+ if (index === 0) {
+ this._promise0 = promise;
+ this._receiver0 = receiver;
+
+ if (typeof fulfill === "function") {
+ this._fulfillmentHandler0 = domain === null ? fulfill : util.domainBind(domain, fulfill);
+ }
+
+ if (typeof reject === "function") {
+ this._rejectionHandler0 = domain === null ? reject : util.domainBind(domain, reject);
+ }
+ } else {
+ var base = index * 4 - 4;
+ this[base + 2] = promise;
+ this[base + 3] = receiver;
+
+ if (typeof fulfill === "function") {
+ this[base + 0] = domain === null ? fulfill : util.domainBind(domain, fulfill);
+ }
+
+ if (typeof reject === "function") {
+ this[base + 1] = domain === null ? reject : util.domainBind(domain, reject);
+ }
+ }
+
+ this._setLength(index + 1);
+
+ return index;
+ };
+
+ Promise.prototype._proxy = function (proxyable, arg) {
+ this._addCallbacks(undefined, undefined, arg, proxyable, null);
+ };
+
+ Promise.prototype._resolveCallback = function (value, shouldBind) {
+ if ((this._bitField & 117506048) !== 0) return;
+ if (value === this) return this._rejectCallback(makeSelfResolutionError(), false);
+ var maybePromise = tryConvertToPromise(value, this);
+ if (!(maybePromise instanceof Promise)) return this._fulfill(value);
+ if (shouldBind) this._propagateFrom(maybePromise, 2);
+
+ var promise = maybePromise._target();
+
+ if (promise === this) {
+ this._reject(makeSelfResolutionError());
+
+ return;
+ }
+
+ var bitField = promise._bitField;
+
+ if ((bitField & 50397184) === 0) {
+ var len = this._length();
+
+ if (len > 0) promise._migrateCallback0(this);
+
+ for (var i = 1; i < len; ++i) {
+ promise._migrateCallbackAt(this, i);
+ }
+
+ this._setFollowing();
+
+ this._setLength(0);
+
+ this._setFollowee(promise);
+ } else if ((bitField & 33554432) !== 0) {
+ this._fulfill(promise._value());
+ } else if ((bitField & 16777216) !== 0) {
+ this._reject(promise._reason());
+ } else {
+ var reason = new CancellationError("late cancellation observer");
+
+ promise._attachExtraTrace(reason);
+
+ this._reject(reason);
+ }
+ };
+
+ Promise.prototype._rejectCallback = function (reason, synchronous, ignoreNonErrorWarnings) {
+ var trace = util.ensureErrorObject(reason);
+ var hasStack = trace === reason;
+
+ if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
+ var message = "a promise was rejected with a non-error: " + util.classString(reason);
+
+ this._warn(message, true);
+ }
+
+ this._attachExtraTrace(trace, synchronous ? hasStack : false);
+
+ this._reject(reason);
+ };
+
+ Promise.prototype._resolveFromExecutor = function (executor) {
+ if (executor === INTERNAL) return;
+ var promise = this;
+
+ this._captureStackTrace();
+
+ this._pushContext();
+
+ var synchronous = true;
+
+ var r = this._execute(executor, function (value) {
+ promise._resolveCallback(value);
+ }, function (reason) {
+ promise._rejectCallback(reason, synchronous);
+ });
+
+ synchronous = false;
+
+ this._popContext();
+
+ if (r !== undefined) {
+ promise._rejectCallback(r, true);
+ }
+ };
+
+ Promise.prototype._settlePromiseFromHandler = function (handler, receiver, value, promise) {
+ var bitField = promise._bitField;
+ if ((bitField & 65536) !== 0) return;
+
+ promise._pushContext();
+
+ var x;
+
+ if (receiver === APPLY) {
+ if (!value || typeof value.length !== "number") {
+ x = errorObj;
+ x.e = new TypeError("cannot .spread() a non-array: " + util.classString(value));
+ } else {
+ x = tryCatch(handler).apply(this._boundValue(), value);
+ }
+ } else {
+ x = tryCatch(handler).call(receiver, value);
+ }
+
+ var promiseCreated = promise._popContext();
+
+ bitField = promise._bitField;
+ if ((bitField & 65536) !== 0) return;
+
+ if (x === NEXT_FILTER) {
+ promise._reject(value);
+ } else if (x === errorObj) {
+ promise._rejectCallback(x.e, false);
+ } else {
+ debug.checkForgottenReturns(x, promiseCreated, "", promise, this);
+
+ promise._resolveCallback(x);
+ }
+ };
+
+ Promise.prototype._target = function () {
+ var ret = this;
+
+ while (ret._isFollowing()) {
+ ret = ret._followee();
+ }
+
+ return ret;
+ };
+
+ Promise.prototype._followee = function () {
+ return this._rejectionHandler0;
+ };
+
+ Promise.prototype._setFollowee = function (promise) {
+ this._rejectionHandler0 = promise;
+ };
+
+ Promise.prototype._settlePromise = function (promise, handler, receiver, value) {
+ var isPromise = promise instanceof Promise;
+ var bitField = this._bitField;
+ var asyncGuaranteed = (bitField & 134217728) !== 0;
+
+ if ((bitField & 65536) !== 0) {
+ if (isPromise) promise._invokeInternalOnCancel();
+
+ if (receiver instanceof PassThroughHandlerContext && receiver.isFinallyHandler()) {
+ receiver.cancelPromise = promise;
+
+ if (tryCatch(handler).call(receiver, value) === errorObj) {
+ promise._reject(errorObj.e);
+ }
+ } else if (handler === reflectHandler) {
+ promise._fulfill(reflectHandler.call(receiver));
+ } else if (receiver instanceof Proxyable) {
+ receiver._promiseCancelled(promise);
+ } else if (isPromise || promise instanceof PromiseArray) {
+ promise._cancel();
+ } else {
+ receiver.cancel();
+ }
+ } else if (typeof handler === "function") {
+ if (!isPromise) {
+ handler.call(receiver, value, promise);
+ } else {
+ if (asyncGuaranteed) promise._setAsyncGuaranteed();
+
+ this._settlePromiseFromHandler(handler, receiver, value, promise);
+ }
+ } else if (receiver instanceof Proxyable) {
+ if (!receiver._isResolved()) {
+ if ((bitField & 33554432) !== 0) {
+ receiver._promiseFulfilled(value, promise);
+ } else {
+ receiver._promiseRejected(value, promise);
+ }
+ }
+ } else if (isPromise) {
+ if (asyncGuaranteed) promise._setAsyncGuaranteed();
+
+ if ((bitField & 33554432) !== 0) {
+ promise._fulfill(value);
+ } else {
+ promise._reject(value);
+ }
+ }
+ };
+
+ Promise.prototype._settlePromiseLateCancellationObserver = function (ctx) {
+ var handler = ctx.handler;
+ var promise = ctx.promise;
+ var receiver = ctx.receiver;
+ var value = ctx.value;
+
+ if (typeof handler === "function") {
+ if (!(promise instanceof Promise)) {
+ handler.call(receiver, value, promise);
+ } else {
+ this._settlePromiseFromHandler(handler, receiver, value, promise);
+ }
+ } else if (promise instanceof Promise) {
+ promise._reject(value);
+ }
+ };
+
+ Promise.prototype._settlePromiseCtx = function (ctx) {
+ this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
+ };
+
+ Promise.prototype._settlePromise0 = function (handler, value, bitField) {
+ var promise = this._promise0;
+
+ var receiver = this._receiverAt(0);
+
+ this._promise0 = undefined;
+ this._receiver0 = undefined;
+
+ this._settlePromise(promise, handler, receiver, value);
+ };
+
+ Promise.prototype._clearCallbackDataAtIndex = function (index) {
+ var base = index * 4 - 4;
+ this[base + 2] = this[base + 3] = this[base + 0] = this[base + 1] = undefined;
+ };
+
+ Promise.prototype._fulfill = function (value) {
+ var bitField = this._bitField;
+ if ((bitField & 117506048) >>> 16) return;
+
+ if (value === this) {
+ var err = makeSelfResolutionError();
+
+ this._attachExtraTrace(err);
+
+ return this._reject(err);
+ }
+
+ this._setFulfilled();
+
+ this._rejectionHandler0 = value;
+
+ if ((bitField & 65535) > 0) {
+ if ((bitField & 134217728) !== 0) {
+ this._settlePromises();
+ } else {
+ async.settlePromises(this);
+ }
+
+ this._dereferenceTrace();
+ }
+ };
+
+ Promise.prototype._reject = function (reason) {
+ var bitField = this._bitField;
+ if ((bitField & 117506048) >>> 16) return;
+
+ this._setRejected();
+
+ this._fulfillmentHandler0 = reason;
+
+ if (this._isFinal()) {
+ return async.fatalError(reason, util.isNode);
+ }
+
+ if ((bitField & 65535) > 0) {
+ async.settlePromises(this);
+ } else {
+ this._ensurePossibleRejectionHandled();
+ }
+ };
+
+ Promise.prototype._fulfillPromises = function (len, value) {
+ for (var i = 1; i < len; i++) {
+ var handler = this._fulfillmentHandlerAt(i);
+
+ var promise = this._promiseAt(i);
+
+ var receiver = this._receiverAt(i);
+
+ this._clearCallbackDataAtIndex(i);
+
+ this._settlePromise(promise, handler, receiver, value);
+ }
+ };
+
+ Promise.prototype._rejectPromises = function (len, reason) {
+ for (var i = 1; i < len; i++) {
+ var handler = this._rejectionHandlerAt(i);
+
+ var promise = this._promiseAt(i);
+
+ var receiver = this._receiverAt(i);
+
+ this._clearCallbackDataAtIndex(i);
+
+ this._settlePromise(promise, handler, receiver, reason);
+ }
+ };
+
+ Promise.prototype._settlePromises = function () {
+ var bitField = this._bitField;
+ var len = bitField & 65535;
+
+ if (len > 0) {
+ if ((bitField & 16842752) !== 0) {
+ var reason = this._fulfillmentHandler0;
+
+ this._settlePromise0(this._rejectionHandler0, reason, bitField);
+
+ this._rejectPromises(len, reason);
+ } else {
+ var value = this._rejectionHandler0;
+
+ this._settlePromise0(this._fulfillmentHandler0, value, bitField);
+
+ this._fulfillPromises(len, value);
+ }
+
+ this._setLength(0);
+ }
+
+ this._clearCancellationData();
+ };
+
+ Promise.prototype._settledValue = function () {
+ var bitField = this._bitField;
+
+ if ((bitField & 33554432) !== 0) {
+ return this._rejectionHandler0;
+ } else if ((bitField & 16777216) !== 0) {
+ return this._fulfillmentHandler0;
+ }
+ };
+
+ function deferResolve(v) {
+ this.promise._resolveCallback(v);
+ }
+
+ function deferReject(v) {
+ this.promise._rejectCallback(v, false);
+ }
+
+ Promise.defer = Promise.pending = function () {
+ debug.deprecated("Promise.defer", "new Promise");
+ var promise = new Promise(INTERNAL);
+ return {
+ promise: promise,
+ resolve: deferResolve,
+ reject: deferReject
+ };
+ };
+
+ util.notEnumerableProp(Promise, "_makeSelfResolutionError", makeSelfResolutionError);
+
+ _dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug);
+
+ _dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
+
+ _dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
+
+ _dereq_("./direct_resolve")(Promise);
+
+ _dereq_("./synchronous_inspection")(Promise);
+
+ _dereq_("./join")(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain);
+
+ Promise.Promise = Promise;
+ Promise.version = "3.5.4";
+
+ _dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
+
+ _dereq_('./call_get.js')(Promise);
+
+ _dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
+
+ _dereq_('./timers.js')(Promise, INTERNAL, debug);
+
+ _dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
+
+ _dereq_('./nodeify.js')(Promise);
+
+ _dereq_('./promisify.js')(Promise, INTERNAL);
+
+ _dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
+
+ _dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
+
+ _dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
+
+ _dereq_('./settle.js')(Promise, PromiseArray, debug);
+
+ _dereq_('./some.js')(Promise, PromiseArray, apiRejection);
+
+ _dereq_('./filter.js')(Promise, INTERNAL);
+
+ _dereq_('./each.js')(Promise, INTERNAL);
+
+ _dereq_('./any.js')(Promise);
+
+ util.toFastProperties(Promise);
+ util.toFastProperties(Promise.prototype);
+
+ function fillTypes(value) {
+ var p = new Promise(INTERNAL);
+ p._fulfillmentHandler0 = value;
+ p._rejectionHandler0 = value;
+ p._promise0 = value;
+ p._receiver0 = value;
+ } // Complete slack tracking, opt out of field-type tracking and
+ // stabilize map
+
+
+ fillTypes({
+ a: 1
+ });
+ fillTypes({
+ b: 2
+ });
+ fillTypes({
+ c: 3
+ });
+ fillTypes(1);
+ fillTypes(function () {});
+ fillTypes(undefined);
+ fillTypes(false);
+ fillTypes(new Promise(INTERNAL));
+ debug.setBounds(Async.firstLineError, util.lastLineError);
+ return Promise;
+ };
+ }, {
+ "./any.js": 1,
+ "./async": 2,
+ "./bind": 3,
+ "./call_get.js": 5,
+ "./cancel": 6,
+ "./catch_filter": 7,
+ "./context": 8,
+ "./debuggability": 9,
+ "./direct_resolve": 10,
+ "./each.js": 11,
+ "./errors": 12,
+ "./es5": 13,
+ "./filter.js": 14,
+ "./finally": 15,
+ "./generators.js": 16,
+ "./join": 17,
+ "./map.js": 18,
+ "./method": 19,
+ "./nodeback": 20,
+ "./nodeify.js": 21,
+ "./promise_array": 23,
+ "./promisify.js": 24,
+ "./props.js": 25,
+ "./race.js": 27,
+ "./reduce.js": 28,
+ "./settle.js": 30,
+ "./some.js": 31,
+ "./synchronous_inspection": 32,
+ "./thenables": 33,
+ "./timers.js": 34,
+ "./using.js": 35,
+ "./util": 36
+ }],
+ 23: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL, tryConvertToPromise, apiRejection, Proxyable) {
+ var util = _dereq_("./util");
+
+ var isArray = util.isArray;
+
+ function toResolutionValue(val) {
+ switch (val) {
+ case -2:
+ return [];
+
+ case -3:
+ return {};
+
+ case -6:
+ return new Map();
+ }
+ }
+
+ function PromiseArray(values) {
+ var promise = this._promise = new Promise(INTERNAL);
+
+ if (values instanceof Promise) {
+ promise._propagateFrom(values, 3);
+ }
+
+ promise._setOnCancel(this);
+
+ this._values = values;
+ this._length = 0;
+ this._totalResolved = 0;
+
+ this._init(undefined, -2);
+ }
+
+ util.inherits(PromiseArray, Proxyable);
+
+ PromiseArray.prototype.length = function () {
+ return this._length;
+ };
+
+ PromiseArray.prototype.promise = function () {
+ return this._promise;
+ };
+
+ PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
+ var values = tryConvertToPromise(this._values, this._promise);
+
+ if (values instanceof Promise) {
+ values = values._target();
+ var bitField = values._bitField;
+ ;
+ this._values = values;
+
+ if ((bitField & 50397184) === 0) {
+ this._promise._setAsyncGuaranteed();
+
+ return values._then(init, this._reject, undefined, this, resolveValueIfEmpty);
+ } else if ((bitField & 33554432) !== 0) {
+ values = values._value();
+ } else if ((bitField & 16777216) !== 0) {
+ return this._reject(values._reason());
+ } else {
+ return this._cancel();
+ }
+ }
+
+ values = util.asArray(values);
+
+ if (values === null) {
+ var err = apiRejection("expecting an array or an iterable object but got " + util.classString(values)).reason();
+
+ this._promise._rejectCallback(err, false);
+
+ return;
+ }
+
+ if (values.length === 0) {
+ if (resolveValueIfEmpty === -5) {
+ this._resolveEmptyArray();
+ } else {
+ this._resolve(toResolutionValue(resolveValueIfEmpty));
+ }
+
+ return;
+ }
+
+ this._iterate(values);
+ };
+
+ PromiseArray.prototype._iterate = function (values) {
+ var len = this.getActualLength(values.length);
+ this._length = len;
+ this._values = this.shouldCopyValues() ? new Array(len) : this._values;
+ var result = this._promise;
+ var isResolved = false;
+ var bitField = null;
+
+ for (var i = 0; i < len; ++i) {
+ var maybePromise = tryConvertToPromise(values[i], result);
+
+ if (maybePromise instanceof Promise) {
+ maybePromise = maybePromise._target();
+ bitField = maybePromise._bitField;
+ } else {
+ bitField = null;
+ }
+
+ if (isResolved) {
+ if (bitField !== null) {
+ maybePromise.suppressUnhandledRejections();
+ }
+ } else if (bitField !== null) {
+ if ((bitField & 50397184) === 0) {
+ maybePromise._proxy(this, i);
+
+ this._values[i] = maybePromise;
+ } else if ((bitField & 33554432) !== 0) {
+ isResolved = this._promiseFulfilled(maybePromise._value(), i);
+ } else if ((bitField & 16777216) !== 0) {
+ isResolved = this._promiseRejected(maybePromise._reason(), i);
+ } else {
+ isResolved = this._promiseCancelled(i);
+ }
+ } else {
+ isResolved = this._promiseFulfilled(maybePromise, i);
+ }
+ }
+
+ if (!isResolved) result._setAsyncGuaranteed();
+ };
+
+ PromiseArray.prototype._isResolved = function () {
+ return this._values === null;
+ };
+
+ PromiseArray.prototype._resolve = function (value) {
+ this._values = null;
+
+ this._promise._fulfill(value);
+ };
+
+ PromiseArray.prototype._cancel = function () {
+ if (this._isResolved() || !this._promise._isCancellable()) return;
+ this._values = null;
+
+ this._promise._cancel();
+ };
+
+ PromiseArray.prototype._reject = function (reason) {
+ this._values = null;
+
+ this._promise._rejectCallback(reason, false);
+ };
+
+ PromiseArray.prototype._promiseFulfilled = function (value, index) {
+ this._values[index] = value;
+ var totalResolved = ++this._totalResolved;
+
+ if (totalResolved >= this._length) {
+ this._resolve(this._values);
+
+ return true;
+ }
+
+ return false;
+ };
+
+ PromiseArray.prototype._promiseCancelled = function () {
+ this._cancel();
+
+ return true;
+ };
+
+ PromiseArray.prototype._promiseRejected = function (reason) {
+ this._totalResolved++;
+
+ this._reject(reason);
+
+ return true;
+ };
+
+ PromiseArray.prototype._resultCancelled = function () {
+ if (this._isResolved()) return;
+ var values = this._values;
+
+ this._cancel();
+
+ if (values instanceof Promise) {
+ values.cancel();
+ } else {
+ for (var i = 0; i < values.length; ++i) {
+ if (values[i] instanceof Promise) {
+ values[i].cancel();
+ }
+ }
+ }
+ };
+
+ PromiseArray.prototype.shouldCopyValues = function () {
+ return true;
+ };
+
+ PromiseArray.prototype.getActualLength = function (len) {
+ return len;
+ };
+
+ return PromiseArray;
+ };
+ }, {
+ "./util": 36
+ }],
+ 24: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL) {
+ var THIS = {};
+
+ var util = _dereq_("./util");
+
+ var nodebackForPromise = _dereq_("./nodeback");
+
+ var withAppended = util.withAppended;
+ var maybeWrapAsError = util.maybeWrapAsError;
+ var canEvaluate = util.canEvaluate;
+
+ var TypeError = _dereq_("./errors").TypeError;
+
+ var defaultSuffix = "Async";
+ var defaultPromisified = {
+ __isPromisified__: true
+ };
+ var noCopyProps = ["arity", "length", "name", "arguments", "caller", "callee", "prototype", "__isPromisified__"];
+ var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");
+
+ var defaultFilter = function defaultFilter(name) {
+ return util.isIdentifier(name) && name.charAt(0) !== "_" && name !== "constructor";
+ };
+
+ function propsFilter(key) {
+ return !noCopyPropsPattern.test(key);
+ }
+
+ function isPromisified(fn) {
+ try {
+ return fn.__isPromisified__ === true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function hasPromisified(obj, key, suffix) {
+ var val = util.getDataPropertyOrDefault(obj, key + suffix, defaultPromisified);
+ return val ? isPromisified(val) : false;
+ }
+
+ function checkValid(ret, suffix, suffixRegexp) {
+ for (var i = 0; i < ret.length; i += 2) {
+ var key = ret[i];
+
+ if (suffixRegexp.test(key)) {
+ var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
+
+ for (var j = 0; j < ret.length; j += 2) {
+ if (ret[j] === keyWithoutAsyncSuffix) {
+ throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\n\n See http://goo.gl/MqrFmX\n".replace("%s", suffix));
+ }
+ }
+ }
+ }
+ }
+
+ function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
+ var keys = util.inheritedDataKeys(obj);
+ var ret = [];
+
+ for (var i = 0; i < keys.length; ++i) {
+ var key = keys[i];
+ var value = obj[key];
+ var passesDefaultFilter = filter === defaultFilter ? true : defaultFilter(key, value, obj);
+
+ if (typeof value === "function" && !isPromisified(value) && !hasPromisified(obj, key, suffix) && filter(key, value, obj, passesDefaultFilter)) {
+ ret.push(key, value);
+ }
+ }
+
+ checkValid(ret, suffix, suffixRegexp);
+ return ret;
+ }
+
+ var escapeIdentRegex = function escapeIdentRegex(str) {
+ return str.replace(/([$])/, "\\$");
+ };
+
+ var makeNodePromisifiedEval;
+
+ if (false) { var parameterCount, parameterDeclaration, argumentSequence, switchCaseArgumentOrder; }
+
+ function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
+ var defaultThis = function () {
+ return this;
+ }();
+
+ var method = callback;
+
+ if (typeof method === "string") {
+ callback = fn;
+ }
+
+ function promisified() {
+ var _receiver = receiver;
+ if (receiver === THIS) _receiver = this;
+ var promise = new Promise(INTERNAL);
+
+ promise._captureStackTrace();
+
+ var cb = typeof method === "string" && this !== defaultThis ? this[method] : callback;
+ var fn = nodebackForPromise(promise, multiArgs);
+
+ try {
+ cb.apply(_receiver, withAppended(arguments, fn));
+ } catch (e) {
+ promise._rejectCallback(maybeWrapAsError(e), true, true);
+ }
+
+ if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
+ return promise;
+ }
+
+ util.notEnumerableProp(promisified, "__isPromisified__", true);
+ return promisified;
+ }
+
+ var makeNodePromisified = canEvaluate ? makeNodePromisifiedEval : makeNodePromisifiedClosure;
+
+ function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
+ var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
+ var methods = promisifiableMethods(obj, suffix, suffixRegexp, filter);
+
+ for (var i = 0, len = methods.length; i < len; i += 2) {
+ var key = methods[i];
+ var fn = methods[i + 1];
+ var promisifiedKey = key + suffix;
+
+ if (promisifier === makeNodePromisified) {
+ obj[promisifiedKey] = makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
+ } else {
+ var promisified = promisifier(fn, function () {
+ return makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
+ });
+ util.notEnumerableProp(promisified, "__isPromisified__", true);
+ obj[promisifiedKey] = promisified;
+ }
+ }
+
+ util.toFastProperties(obj);
+ return obj;
+ }
+
+ function promisify(callback, receiver, multiArgs) {
+ return makeNodePromisified(callback, receiver, undefined, callback, null, multiArgs);
+ }
+
+ Promise.promisify = function (fn, options) {
+ if (typeof fn !== "function") {
+ throw new TypeError("expecting a function but got " + util.classString(fn));
+ }
+
+ if (isPromisified(fn)) {
+ return fn;
+ }
+
+ options = Object(options);
+ var receiver = options.context === undefined ? THIS : options.context;
+ var multiArgs = !!options.multiArgs;
+ var ret = promisify(fn, receiver, multiArgs);
+ util.copyDescriptors(fn, ret, propsFilter);
+ return ret;
+ };
+
+ Promise.promisifyAll = function (target, options) {
+ if (typeof target !== "function" && _typeof(target) !== "object") {
+ throw new TypeError("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ options = Object(options);
+ var multiArgs = !!options.multiArgs;
+ var suffix = options.suffix;
+ if (typeof suffix !== "string") suffix = defaultSuffix;
+ var filter = options.filter;
+ if (typeof filter !== "function") filter = defaultFilter;
+ var promisifier = options.promisifier;
+ if (typeof promisifier !== "function") promisifier = makeNodePromisified;
+
+ if (!util.isIdentifier(suffix)) {
+ throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ var keys = util.inheritedDataKeys(target);
+
+ for (var i = 0; i < keys.length; ++i) {
+ var value = target[keys[i]];
+
+ if (keys[i] !== "constructor" && util.isClass(value)) {
+ promisifyAll(value.prototype, suffix, filter, promisifier, multiArgs);
+ promisifyAll(value, suffix, filter, promisifier, multiArgs);
+ }
+ }
+
+ return promisifyAll(target, suffix, filter, promisifier, multiArgs);
+ };
+ };
+ }, {
+ "./errors": 12,
+ "./nodeback": 20,
+ "./util": 36
+ }],
+ 25: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, PromiseArray, tryConvertToPromise, apiRejection) {
+ var util = _dereq_("./util");
+
+ var isObject = util.isObject;
+
+ var es5 = _dereq_("./es5");
+
+ var Es6Map;
+ if (typeof Map === "function") Es6Map = Map;
+
+ var mapToEntries = function () {
+ var index = 0;
+ var size = 0;
+
+ function extractEntry(value, key) {
+ this[index] = value;
+ this[index + size] = key;
+ index++;
+ }
+
+ return function mapToEntries(map) {
+ size = map.size;
+ index = 0;
+ var ret = new Array(map.size * 2);
+ map.forEach(extractEntry, ret);
+ return ret;
+ };
+ }();
+
+ var entriesToMap = function entriesToMap(entries) {
+ var ret = new Es6Map();
+ var length = entries.length / 2 | 0;
+
+ for (var i = 0; i < length; ++i) {
+ var key = entries[length + i];
+ var value = entries[i];
+ ret.set(key, value);
+ }
+
+ return ret;
+ };
+
+ function PropertiesPromiseArray(obj) {
+ var isMap = false;
+ var entries;
+
+ if (Es6Map !== undefined && obj instanceof Es6Map) {
+ entries = mapToEntries(obj);
+ isMap = true;
+ } else {
+ var keys = es5.keys(obj);
+ var len = keys.length;
+ entries = new Array(len * 2);
+
+ for (var i = 0; i < len; ++i) {
+ var key = keys[i];
+ entries[i] = obj[key];
+ entries[i + len] = key;
+ }
+ }
+
+ this.constructor$(entries);
+ this._isMap = isMap;
+
+ this._init$(undefined, isMap ? -6 : -3);
+ }
+
+ util.inherits(PropertiesPromiseArray, PromiseArray);
+
+ PropertiesPromiseArray.prototype._init = function () {};
+
+ PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
+ this._values[index] = value;
+ var totalResolved = ++this._totalResolved;
+
+ if (totalResolved >= this._length) {
+ var val;
+
+ if (this._isMap) {
+ val = entriesToMap(this._values);
+ } else {
+ val = {};
+ var keyOffset = this.length();
+
+ for (var i = 0, len = this.length(); i < len; ++i) {
+ val[this._values[i + keyOffset]] = this._values[i];
+ }
+ }
+
+ this._resolve(val);
+
+ return true;
+ }
+
+ return false;
+ };
+
+ PropertiesPromiseArray.prototype.shouldCopyValues = function () {
+ return false;
+ };
+
+ PropertiesPromiseArray.prototype.getActualLength = function (len) {
+ return len >> 1;
+ };
+
+ function props(promises) {
+ var ret;
+ var castValue = tryConvertToPromise(promises);
+
+ if (!isObject(castValue)) {
+ return apiRejection("cannot await properties of a non-object\n\n See http://goo.gl/MqrFmX\n");
+ } else if (castValue instanceof Promise) {
+ ret = castValue._then(Promise.props, undefined, undefined, undefined, undefined);
+ } else {
+ ret = new PropertiesPromiseArray(castValue).promise();
+ }
+
+ if (castValue instanceof Promise) {
+ ret._propagateFrom(castValue, 2);
+ }
+
+ return ret;
+ }
+
+ Promise.prototype.props = function () {
+ return props(this);
+ };
+
+ Promise.props = function (promises) {
+ return props(promises);
+ };
+ };
+ }, {
+ "./es5": 13,
+ "./util": 36
+ }],
+ 26: [function (_dereq_, module, exports) {
+ "use strict";
+
+ function arrayMove(src, srcIndex, dst, dstIndex, len) {
+ for (var j = 0; j < len; ++j) {
+ dst[j + dstIndex] = src[j + srcIndex];
+ src[j + srcIndex] = void 0;
+ }
+ }
+
+ function Queue(capacity) {
+ this._capacity = capacity;
+ this._length = 0;
+ this._front = 0;
+ }
+
+ Queue.prototype._willBeOverCapacity = function (size) {
+ return this._capacity < size;
+ };
+
+ Queue.prototype._pushOne = function (arg) {
+ var length = this.length();
+
+ this._checkCapacity(length + 1);
+
+ var i = this._front + length & this._capacity - 1;
+ this[i] = arg;
+ this._length = length + 1;
+ };
+
+ Queue.prototype.push = function (fn, receiver, arg) {
+ var length = this.length() + 3;
+
+ if (this._willBeOverCapacity(length)) {
+ this._pushOne(fn);
+
+ this._pushOne(receiver);
+
+ this._pushOne(arg);
+
+ return;
+ }
+
+ var j = this._front + length - 3;
+
+ this._checkCapacity(length);
+
+ var wrapMask = this._capacity - 1;
+ this[j + 0 & wrapMask] = fn;
+ this[j + 1 & wrapMask] = receiver;
+ this[j + 2 & wrapMask] = arg;
+ this._length = length;
+ };
+
+ Queue.prototype.shift = function () {
+ var front = this._front,
+ ret = this[front];
+ this[front] = undefined;
+ this._front = front + 1 & this._capacity - 1;
+ this._length--;
+ return ret;
+ };
+
+ Queue.prototype.length = function () {
+ return this._length;
+ };
+
+ Queue.prototype._checkCapacity = function (size) {
+ if (this._capacity < size) {
+ this._resizeTo(this._capacity << 1);
+ }
+ };
+
+ Queue.prototype._resizeTo = function (capacity) {
+ var oldCapacity = this._capacity;
+ this._capacity = capacity;
+ var front = this._front;
+ var length = this._length;
+ var moveItemsCount = front + length & oldCapacity - 1;
+ arrayMove(this, 0, this, oldCapacity, moveItemsCount);
+ };
+
+ module.exports = Queue;
+ }, {}],
+ 27: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL, tryConvertToPromise, apiRejection) {
+ var util = _dereq_("./util");
+
+ var raceLater = function raceLater(promise) {
+ return promise.then(function (array) {
+ return race(array, promise);
+ });
+ };
+
+ function race(promises, parent) {
+ var maybePromise = tryConvertToPromise(promises);
+
+ if (maybePromise instanceof Promise) {
+ return raceLater(maybePromise);
+ } else {
+ promises = util.asArray(promises);
+ if (promises === null) return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
+ }
+
+ var ret = new Promise(INTERNAL);
+
+ if (parent !== undefined) {
+ ret._propagateFrom(parent, 3);
+ }
+
+ var fulfill = ret._fulfill;
+ var reject = ret._reject;
+
+ for (var i = 0, len = promises.length; i < len; ++i) {
+ var val = promises[i];
+
+ if (val === undefined && !(i in promises)) {
+ continue;
+ }
+
+ Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
+ }
+
+ return ret;
+ }
+
+ Promise.race = function (promises) {
+ return race(promises, undefined);
+ };
+
+ Promise.prototype.race = function () {
+ return race(this, undefined);
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 28: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug) {
+ var getDomain = Promise._getDomain;
+
+ var util = _dereq_("./util");
+
+ var tryCatch = util.tryCatch;
+
+ function ReductionPromiseArray(promises, fn, initialValue, _each) {
+ this.constructor$(promises);
+ var domain = getDomain();
+ this._fn = domain === null ? fn : util.domainBind(domain, fn);
+
+ if (initialValue !== undefined) {
+ initialValue = Promise.resolve(initialValue);
+
+ initialValue._attachCancellationCallback(this);
+ }
+
+ this._initialValue = initialValue;
+ this._currentCancellable = null;
+
+ if (_each === INTERNAL) {
+ this._eachValues = Array(this._length);
+ } else if (_each === 0) {
+ this._eachValues = null;
+ } else {
+ this._eachValues = undefined;
+ }
+
+ this._promise._captureStackTrace();
+
+ this._init$(undefined, -5);
+ }
+
+ util.inherits(ReductionPromiseArray, PromiseArray);
+
+ ReductionPromiseArray.prototype._gotAccum = function (accum) {
+ if (this._eachValues !== undefined && this._eachValues !== null && accum !== INTERNAL) {
+ this._eachValues.push(accum);
+ }
+ };
+
+ ReductionPromiseArray.prototype._eachComplete = function (value) {
+ if (this._eachValues !== null) {
+ this._eachValues.push(value);
+ }
+
+ return this._eachValues;
+ };
+
+ ReductionPromiseArray.prototype._init = function () {};
+
+ ReductionPromiseArray.prototype._resolveEmptyArray = function () {
+ this._resolve(this._eachValues !== undefined ? this._eachValues : this._initialValue);
+ };
+
+ ReductionPromiseArray.prototype.shouldCopyValues = function () {
+ return false;
+ };
+
+ ReductionPromiseArray.prototype._resolve = function (value) {
+ this._promise._resolveCallback(value);
+
+ this._values = null;
+ };
+
+ ReductionPromiseArray.prototype._resultCancelled = function (sender) {
+ if (sender === this._initialValue) return this._cancel();
+ if (this._isResolved()) return;
+
+ this._resultCancelled$();
+
+ if (this._currentCancellable instanceof Promise) {
+ this._currentCancellable.cancel();
+ }
+
+ if (this._initialValue instanceof Promise) {
+ this._initialValue.cancel();
+ }
+ };
+
+ ReductionPromiseArray.prototype._iterate = function (values) {
+ this._values = values;
+ var value;
+ var i;
+ var length = values.length;
+
+ if (this._initialValue !== undefined) {
+ value = this._initialValue;
+ i = 0;
+ } else {
+ value = Promise.resolve(values[0]);
+ i = 1;
+ }
+
+ this._currentCancellable = value;
+
+ if (!value.isRejected()) {
+ for (; i < length; ++i) {
+ var ctx = {
+ accum: null,
+ value: values[i],
+ index: i,
+ length: length,
+ array: this
+ };
+ value = value._then(gotAccum, undefined, undefined, ctx, undefined);
+ }
+ }
+
+ if (this._eachValues !== undefined) {
+ value = value._then(this._eachComplete, undefined, undefined, this, undefined);
+ }
+
+ value._then(completed, completed, undefined, value, this);
+ };
+
+ Promise.prototype.reduce = function (fn, initialValue) {
+ return reduce(this, fn, initialValue, null);
+ };
+
+ Promise.reduce = function (promises, fn, initialValue, _each) {
+ return reduce(promises, fn, initialValue, _each);
+ };
+
+ function completed(valueOrReason, array) {
+ if (this.isFulfilled()) {
+ array._resolve(valueOrReason);
+ } else {
+ array._reject(valueOrReason);
+ }
+ }
+
+ function reduce(promises, fn, initialValue, _each) {
+ if (typeof fn !== "function") {
+ return apiRejection("expecting a function but got " + util.classString(fn));
+ }
+
+ var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
+ return array.promise();
+ }
+
+ function gotAccum(accum) {
+ this.accum = accum;
+
+ this.array._gotAccum(accum);
+
+ var value = tryConvertToPromise(this.value, this.array._promise);
+
+ if (value instanceof Promise) {
+ this.array._currentCancellable = value;
+ return value._then(gotValue, undefined, undefined, this, undefined);
+ } else {
+ return gotValue.call(this, value);
+ }
+ }
+
+ function gotValue(value) {
+ var array = this.array;
+ var promise = array._promise;
+ var fn = tryCatch(array._fn);
+
+ promise._pushContext();
+
+ var ret;
+
+ if (array._eachValues !== undefined) {
+ ret = fn.call(promise._boundValue(), value, this.index, this.length);
+ } else {
+ ret = fn.call(promise._boundValue(), this.accum, value, this.index, this.length);
+ }
+
+ if (ret instanceof Promise) {
+ array._currentCancellable = ret;
+ }
+
+ var promiseCreated = promise._popContext();
+
+ debug.checkForgottenReturns(ret, promiseCreated, array._eachValues !== undefined ? "Promise.each" : "Promise.reduce", promise);
+ return ret;
+ }
+ };
+ }, {
+ "./util": 36
+ }],
+ 29: [function (_dereq_, module, exports) {
+ "use strict";
+
+ var util = _dereq_("./util");
+
+ var schedule;
+
+ var noAsyncScheduler = function noAsyncScheduler() {
+ throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n");
+ };
+
+ var NativePromise = util.getNativePromise();
+
+ if (util.isNode && typeof MutationObserver === "undefined") {
+ var GlobalSetImmediate = global.setImmediate;
+ var ProcessNextTick = process.nextTick;
+ schedule = util.isRecentNode ? function (fn) {
+ GlobalSetImmediate.call(global, fn);
+ } : function (fn) {
+ ProcessNextTick.call(process, fn);
+ };
+ } else if (typeof NativePromise === "function" && typeof NativePromise.resolve === "function") {
+ var nativePromise = NativePromise.resolve();
+
+ schedule = function schedule(fn) {
+ nativePromise.then(fn);
+ };
+ } else if (typeof MutationObserver !== "undefined" && !(typeof window !== "undefined" && window.navigator && (window.navigator.standalone || window.cordova))) {
+ schedule = function () {
+ var div = document.createElement("div");
+ var opts = {
+ attributes: true
+ };
+ var toggleScheduled = false;
+ var div2 = document.createElement("div");
+ var o2 = new MutationObserver(function () {
+ div.classList.toggle("foo");
+ toggleScheduled = false;
+ });
+ o2.observe(div2, opts);
+
+ var scheduleToggle = function scheduleToggle() {
+ if (toggleScheduled) return;
+ toggleScheduled = true;
+ div2.classList.toggle("foo");
+ };
+
+ return function schedule(fn) {
+ var o = new MutationObserver(function () {
+ o.disconnect();
+ fn();
+ });
+ o.observe(div, opts);
+ scheduleToggle();
+ };
+ }();
+ } else if (typeof setImmediate !== "undefined") {
+ schedule = function schedule(fn) {
+ setImmediate(fn);
+ };
+ } else if (typeof setTimeout !== "undefined") {
+ schedule = function schedule(fn) {
+ setTimeout(fn, 0);
+ };
+ } else {
+ schedule = noAsyncScheduler;
+ }
+
+ module.exports = schedule;
+ }, {
+ "./util": 36
+ }],
+ 30: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, PromiseArray, debug) {
+ var PromiseInspection = Promise.PromiseInspection;
+
+ var util = _dereq_("./util");
+
+ function SettledPromiseArray(values) {
+ this.constructor$(values);
+ }
+
+ util.inherits(SettledPromiseArray, PromiseArray);
+
+ SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
+ this._values[index] = inspection;
+ var totalResolved = ++this._totalResolved;
+
+ if (totalResolved >= this._length) {
+ this._resolve(this._values);
+
+ return true;
+ }
+
+ return false;
+ };
+
+ SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
+ var ret = new PromiseInspection();
+ ret._bitField = 33554432;
+ ret._settledValueField = value;
+ return this._promiseResolved(index, ret);
+ };
+
+ SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
+ var ret = new PromiseInspection();
+ ret._bitField = 16777216;
+ ret._settledValueField = reason;
+ return this._promiseResolved(index, ret);
+ };
+
+ Promise.settle = function (promises) {
+ debug.deprecated(".settle()", ".reflect()");
+ return new SettledPromiseArray(promises).promise();
+ };
+
+ Promise.prototype.settle = function () {
+ return Promise.settle(this);
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 31: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, PromiseArray, apiRejection) {
+ var util = _dereq_("./util");
+
+ var RangeError = _dereq_("./errors").RangeError;
+
+ var AggregateError = _dereq_("./errors").AggregateError;
+
+ var isArray = util.isArray;
+ var CANCELLATION = {};
+
+ function SomePromiseArray(values) {
+ this.constructor$(values);
+ this._howMany = 0;
+ this._unwrap = false;
+ this._initialized = false;
+ }
+
+ util.inherits(SomePromiseArray, PromiseArray);
+
+ SomePromiseArray.prototype._init = function () {
+ if (!this._initialized) {
+ return;
+ }
+
+ if (this._howMany === 0) {
+ this._resolve([]);
+
+ return;
+ }
+
+ this._init$(undefined, -5);
+
+ var isArrayResolved = isArray(this._values);
+
+ if (!this._isResolved() && isArrayResolved && this._howMany > this._canPossiblyFulfill()) {
+ this._reject(this._getRangeError(this.length()));
+ }
+ };
+
+ SomePromiseArray.prototype.init = function () {
+ this._initialized = true;
+
+ this._init();
+ };
+
+ SomePromiseArray.prototype.setUnwrap = function () {
+ this._unwrap = true;
+ };
+
+ SomePromiseArray.prototype.howMany = function () {
+ return this._howMany;
+ };
+
+ SomePromiseArray.prototype.setHowMany = function (count) {
+ this._howMany = count;
+ };
+
+ SomePromiseArray.prototype._promiseFulfilled = function (value) {
+ this._addFulfilled(value);
+
+ if (this._fulfilled() === this.howMany()) {
+ this._values.length = this.howMany();
+
+ if (this.howMany() === 1 && this._unwrap) {
+ this._resolve(this._values[0]);
+ } else {
+ this._resolve(this._values);
+ }
+
+ return true;
+ }
+
+ return false;
+ };
+
+ SomePromiseArray.prototype._promiseRejected = function (reason) {
+ this._addRejected(reason);
+
+ return this._checkOutcome();
+ };
+
+ SomePromiseArray.prototype._promiseCancelled = function () {
+ if (this._values instanceof Promise || this._values == null) {
+ return this._cancel();
+ }
+
+ this._addRejected(CANCELLATION);
+
+ return this._checkOutcome();
+ };
+
+ SomePromiseArray.prototype._checkOutcome = function () {
+ if (this.howMany() > this._canPossiblyFulfill()) {
+ var e = new AggregateError();
+
+ for (var i = this.length(); i < this._values.length; ++i) {
+ if (this._values[i] !== CANCELLATION) {
+ e.push(this._values[i]);
+ }
+ }
+
+ if (e.length > 0) {
+ this._reject(e);
+ } else {
+ this._cancel();
+ }
+
+ return true;
+ }
+
+ return false;
+ };
+
+ SomePromiseArray.prototype._fulfilled = function () {
+ return this._totalResolved;
+ };
+
+ SomePromiseArray.prototype._rejected = function () {
+ return this._values.length - this.length();
+ };
+
+ SomePromiseArray.prototype._addRejected = function (reason) {
+ this._values.push(reason);
+ };
+
+ SomePromiseArray.prototype._addFulfilled = function (value) {
+ this._values[this._totalResolved++] = value;
+ };
+
+ SomePromiseArray.prototype._canPossiblyFulfill = function () {
+ return this.length() - this._rejected();
+ };
+
+ SomePromiseArray.prototype._getRangeError = function (count) {
+ var message = "Input array must contain at least " + this._howMany + " items but contains only " + count + " items";
+ return new RangeError(message);
+ };
+
+ SomePromiseArray.prototype._resolveEmptyArray = function () {
+ this._reject(this._getRangeError(0));
+ };
+
+ function some(promises, howMany) {
+ if ((howMany | 0) !== howMany || howMany < 0) {
+ return apiRejection("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ var ret = new SomePromiseArray(promises);
+ var promise = ret.promise();
+ ret.setHowMany(howMany);
+ ret.init();
+ return promise;
+ }
+
+ Promise.some = function (promises, howMany) {
+ return some(promises, howMany);
+ };
+
+ Promise.prototype.some = function (howMany) {
+ return some(this, howMany);
+ };
+
+ Promise._SomePromiseArray = SomePromiseArray;
+ };
+ }, {
+ "./errors": 12,
+ "./util": 36
+ }],
+ 32: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise) {
+ function PromiseInspection(promise) {
+ if (promise !== undefined) {
+ promise = promise._target();
+ this._bitField = promise._bitField;
+ this._settledValueField = promise._isFateSealed() ? promise._settledValue() : undefined;
+ } else {
+ this._bitField = 0;
+ this._settledValueField = undefined;
+ }
+ }
+
+ PromiseInspection.prototype._settledValue = function () {
+ return this._settledValueField;
+ };
+
+ var value = PromiseInspection.prototype.value = function () {
+ if (!this.isFulfilled()) {
+ throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ return this._settledValue();
+ };
+
+ var reason = PromiseInspection.prototype.error = PromiseInspection.prototype.reason = function () {
+ if (!this.isRejected()) {
+ throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");
+ }
+
+ return this._settledValue();
+ };
+
+ var isFulfilled = PromiseInspection.prototype.isFulfilled = function () {
+ return (this._bitField & 33554432) !== 0;
+ };
+
+ var isRejected = PromiseInspection.prototype.isRejected = function () {
+ return (this._bitField & 16777216) !== 0;
+ };
+
+ var isPending = PromiseInspection.prototype.isPending = function () {
+ return (this._bitField & 50397184) === 0;
+ };
+
+ var isResolved = PromiseInspection.prototype.isResolved = function () {
+ return (this._bitField & 50331648) !== 0;
+ };
+
+ PromiseInspection.prototype.isCancelled = function () {
+ return (this._bitField & 8454144) !== 0;
+ };
+
+ Promise.prototype.__isCancelled = function () {
+ return (this._bitField & 65536) === 65536;
+ };
+
+ Promise.prototype._isCancelled = function () {
+ return this._target().__isCancelled();
+ };
+
+ Promise.prototype.isCancelled = function () {
+ return (this._target()._bitField & 8454144) !== 0;
+ };
+
+ Promise.prototype.isPending = function () {
+ return isPending.call(this._target());
+ };
+
+ Promise.prototype.isRejected = function () {
+ return isRejected.call(this._target());
+ };
+
+ Promise.prototype.isFulfilled = function () {
+ return isFulfilled.call(this._target());
+ };
+
+ Promise.prototype.isResolved = function () {
+ return isResolved.call(this._target());
+ };
+
+ Promise.prototype.value = function () {
+ return value.call(this._target());
+ };
+
+ Promise.prototype.reason = function () {
+ var target = this._target();
+
+ target._unsetRejectionIsUnhandled();
+
+ return reason.call(target);
+ };
+
+ Promise.prototype._value = function () {
+ return this._settledValue();
+ };
+
+ Promise.prototype._reason = function () {
+ this._unsetRejectionIsUnhandled();
+
+ return this._settledValue();
+ };
+
+ Promise.PromiseInspection = PromiseInspection;
+ };
+ }, {}],
+ 33: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL) {
+ var util = _dereq_("./util");
+
+ var errorObj = util.errorObj;
+ var isObject = util.isObject;
+
+ function tryConvertToPromise(obj, context) {
+ if (isObject(obj)) {
+ if (obj instanceof Promise) return obj;
+ var then = getThen(obj);
+
+ if (then === errorObj) {
+ if (context) context._pushContext();
+ var ret = Promise.reject(then.e);
+ if (context) context._popContext();
+ return ret;
+ } else if (typeof then === "function") {
+ if (isAnyBluebirdPromise(obj)) {
+ var ret = new Promise(INTERNAL);
+
+ obj._then(ret._fulfill, ret._reject, undefined, ret, null);
+
+ return ret;
+ }
+
+ return doThenable(obj, then, context);
+ }
+ }
+
+ return obj;
+ }
+
+ function doGetThen(obj) {
+ return obj.then;
+ }
+
+ function getThen(obj) {
+ try {
+ return doGetThen(obj);
+ } catch (e) {
+ errorObj.e = e;
+ return errorObj;
+ }
+ }
+
+ var hasProp = {}.hasOwnProperty;
+
+ function isAnyBluebirdPromise(obj) {
+ try {
+ return hasProp.call(obj, "_promise0");
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function doThenable(x, then, context) {
+ var promise = new Promise(INTERNAL);
+ var ret = promise;
+ if (context) context._pushContext();
+
+ promise._captureStackTrace();
+
+ if (context) context._popContext();
+ var synchronous = true;
+ var result = util.tryCatch(then).call(x, resolve, reject);
+ synchronous = false;
+
+ if (promise && result === errorObj) {
+ promise._rejectCallback(result.e, true, true);
+
+ promise = null;
+ }
+
+ function resolve(value) {
+ if (!promise) return;
+
+ promise._resolveCallback(value);
+
+ promise = null;
+ }
+
+ function reject(reason) {
+ if (!promise) return;
+
+ promise._rejectCallback(reason, synchronous, true);
+
+ promise = null;
+ }
+
+ return ret;
+ }
+
+ return tryConvertToPromise;
+ };
+ }, {
+ "./util": 36
+ }],
+ 34: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, INTERNAL, debug) {
+ var util = _dereq_("./util");
+
+ var TimeoutError = Promise.TimeoutError;
+
+ function HandleWrapper(handle) {
+ this.handle = handle;
+ }
+
+ HandleWrapper.prototype._resultCancelled = function () {
+ clearTimeout(this.handle);
+ };
+
+ var afterValue = function afterValue(value) {
+ return delay(+this).thenReturn(value);
+ };
+
+ var delay = Promise.delay = function (ms, value) {
+ var ret;
+ var handle;
+
+ if (value !== undefined) {
+ ret = Promise.resolve(value)._then(afterValue, null, null, ms, undefined);
+
+ if (debug.cancellation() && value instanceof Promise) {
+ ret._setOnCancel(value);
+ }
+ } else {
+ ret = new Promise(INTERNAL);
+ handle = setTimeout(function () {
+ ret._fulfill();
+ }, +ms);
+
+ if (debug.cancellation()) {
+ ret._setOnCancel(new HandleWrapper(handle));
+ }
+
+ ret._captureStackTrace();
+ }
+
+ ret._setAsyncGuaranteed();
+
+ return ret;
+ };
+
+ Promise.prototype.delay = function (ms) {
+ return delay(ms, this);
+ };
+
+ var afterTimeout = function afterTimeout(promise, message, parent) {
+ var err;
+
+ if (typeof message !== "string") {
+ if (message instanceof Error) {
+ err = message;
+ } else {
+ err = new TimeoutError("operation timed out");
+ }
+ } else {
+ err = new TimeoutError(message);
+ }
+
+ util.markAsOriginatingFromRejection(err);
+
+ promise._attachExtraTrace(err);
+
+ promise._reject(err);
+
+ if (parent != null) {
+ parent.cancel();
+ }
+ };
+
+ function successClear(value) {
+ clearTimeout(this.handle);
+ return value;
+ }
+
+ function failureClear(reason) {
+ clearTimeout(this.handle);
+ throw reason;
+ }
+
+ Promise.prototype.timeout = function (ms, message) {
+ ms = +ms;
+ var ret, parent;
+ var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
+ if (ret.isPending()) {
+ afterTimeout(ret, message, parent);
+ }
+ }, ms));
+
+ if (debug.cancellation()) {
+ parent = this.then();
+ ret = parent._then(successClear, failureClear, undefined, handleWrapper, undefined);
+
+ ret._setOnCancel(handleWrapper);
+ } else {
+ ret = this._then(successClear, failureClear, undefined, handleWrapper, undefined);
+ }
+
+ return ret;
+ };
+ };
+ }, {
+ "./util": 36
+ }],
+ 35: [function (_dereq_, module, exports) {
+ "use strict";
+
+ module.exports = function (Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug) {
+ var util = _dereq_("./util");
+
+ var TypeError = _dereq_("./errors").TypeError;
+
+ var inherits = _dereq_("./util").inherits;
+
+ var errorObj = util.errorObj;
+ var tryCatch = util.tryCatch;
+ var NULL = {};
+
+ function thrower(e) {
+ setTimeout(function () {
+ throw e;
+ }, 0);
+ }
+
+ function castPreservingDisposable(thenable) {
+ var maybePromise = tryConvertToPromise(thenable);
+
+ if (maybePromise !== thenable && typeof thenable._isDisposable === "function" && typeof thenable._getDisposer === "function" && thenable._isDisposable()) {
+ maybePromise._setDisposable(thenable._getDisposer());
+ }
+
+ return maybePromise;
+ }
+
+ function dispose(resources, inspection) {
+ var i = 0;
+ var len = resources.length;
+ var ret = new Promise(INTERNAL);
+
+ function iterator() {
+ if (i >= len) return ret._fulfill();
+ var maybePromise = castPreservingDisposable(resources[i++]);
+
+ if (maybePromise instanceof Promise && maybePromise._isDisposable()) {
+ try {
+ maybePromise = tryConvertToPromise(maybePromise._getDisposer().tryDispose(inspection), resources.promise);
+ } catch (e) {
+ return thrower(e);
+ }
+
+ if (maybePromise instanceof Promise) {
+ return maybePromise._then(iterator, thrower, null, null, null);
+ }
+ }
+
+ iterator();
+ }
+
+ iterator();
+ return ret;
+ }
+
+ function Disposer(data, promise, context) {
+ this._data = data;
+ this._promise = promise;
+ this._context = context;
+ }
+
+ Disposer.prototype.data = function () {
+ return this._data;
+ };
+
+ Disposer.prototype.promise = function () {
+ return this._promise;
+ };
+
+ Disposer.prototype.resource = function () {
+ if (this.promise().isFulfilled()) {
+ return this.promise().value();
+ }
+
+ return NULL;
+ };
+
+ Disposer.prototype.tryDispose = function (inspection) {
+ var resource = this.resource();
+ var context = this._context;
+ if (context !== undefined) context._pushContext();
+ var ret = resource !== NULL ? this.doDispose(resource, inspection) : null;
+ if (context !== undefined) context._popContext();
+
+ this._promise._unsetDisposable();
+
+ this._data = null;
+ return ret;
+ };
+
+ Disposer.isDisposer = function (d) {
+ return d != null && typeof d.resource === "function" && typeof d.tryDispose === "function";
+ };
+
+ function FunctionDisposer(fn, promise, context) {
+ this.constructor$(fn, promise, context);
+ }
+
+ inherits(FunctionDisposer, Disposer);
+
+ FunctionDisposer.prototype.doDispose = function (resource, inspection) {
+ var fn = this.data();
+ return fn.call(resource, resource, inspection);
+ };
+
+ function maybeUnwrapDisposer(value) {
+ if (Disposer.isDisposer(value)) {
+ this.resources[this.index]._setDisposable(value);
+
+ return value.promise();
+ }
+
+ return value;
+ }
+
+ function ResourceList(length) {
+ this.length = length;
+ this.promise = null;
+ this[length - 1] = null;
+ }
+
+ ResourceList.prototype._resultCancelled = function () {
+ var len = this.length;
+
+ for (var i = 0; i < len; ++i) {
+ var item = this[i];
+
+ if (item instanceof Promise) {
+ item.cancel();
+ }
+ }
+ };
+
+ Promise.using = function () {
+ var len = arguments.length;
+ if (len < 2) return apiRejection("you must pass at least 2 arguments to Promise.using");
+ var fn = arguments[len - 1];
+
+ if (typeof fn !== "function") {
+ return apiRejection("expecting a function but got " + util.classString(fn));
+ }
+
+ var input;
+ var spreadArgs = true;
+
+ if (len === 2 && Array.isArray(arguments[0])) {
+ input = arguments[0];
+ len = input.length;
+ spreadArgs = false;
+ } else {
+ input = arguments;
+ len--;
+ }
+
+ var resources = new ResourceList(len);
+
+ for (var i = 0; i < len; ++i) {
+ var resource = input[i];
+
+ if (Disposer.isDisposer(resource)) {
+ var disposer = resource;
+ resource = resource.promise();
+
+ resource._setDisposable(disposer);
+ } else {
+ var maybePromise = tryConvertToPromise(resource);
+
+ if (maybePromise instanceof Promise) {
+ resource = maybePromise._then(maybeUnwrapDisposer, null, null, {
+ resources: resources,
+ index: i
+ }, undefined);
+ }
+ }
+
+ resources[i] = resource;
+ }
+
+ var reflectedResources = new Array(resources.length);
+
+ for (var i = 0; i < reflectedResources.length; ++i) {
+ reflectedResources[i] = Promise.resolve(resources[i]).reflect();
+ }
+
+ var resultPromise = Promise.all(reflectedResources).then(function (inspections) {
+ for (var i = 0; i < inspections.length; ++i) {
+ var inspection = inspections[i];
+
+ if (inspection.isRejected()) {
+ errorObj.e = inspection.error();
+ return errorObj;
+ } else if (!inspection.isFulfilled()) {
+ resultPromise.cancel();
+ return;
+ }
+
+ inspections[i] = inspection.value();
+ }
+
+ promise._pushContext();
+
+ fn = tryCatch(fn);
+ var ret = spreadArgs ? fn.apply(undefined, inspections) : fn(inspections);
+
+ var promiseCreated = promise._popContext();
+
+ debug.checkForgottenReturns(ret, promiseCreated, "Promise.using", promise);
+ return ret;
+ });
+ var promise = resultPromise.lastly(function () {
+ var inspection = new Promise.PromiseInspection(resultPromise);
+ return dispose(resources, inspection);
+ });
+ resources.promise = promise;
+
+ promise._setOnCancel(resources);
+
+ return promise;
+ };
+
+ Promise.prototype._setDisposable = function (disposer) {
+ this._bitField = this._bitField | 131072;
+ this._disposer = disposer;
+ };
+
+ Promise.prototype._isDisposable = function () {
+ return (this._bitField & 131072) > 0;
+ };
+
+ Promise.prototype._getDisposer = function () {
+ return this._disposer;
+ };
+
+ Promise.prototype._unsetDisposable = function () {
+ this._bitField = this._bitField & ~131072;
+ this._disposer = undefined;
+ };
+
+ Promise.prototype.disposer = function (fn) {
+ if (typeof fn === "function") {
+ return new FunctionDisposer(fn, this, createContext());
+ }
+
+ throw new TypeError();
+ };
+ };
+ }, {
+ "./errors": 12,
+ "./util": 36
+ }],
+ 36: [function (_dereq_, module, exports) {
+ "use strict";
+
+ var es5 = _dereq_("./es5");
+
+ var canEvaluate = typeof navigator == "undefined";
+ var errorObj = {
+ e: {}
+ };
+ var tryCatchTarget;
+ var globalObject = typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : this !== undefined ? this : null;
+
+ function tryCatcher() {
+ try {
+ var target = tryCatchTarget;
+ tryCatchTarget = null;
+ return target.apply(this, arguments);
+ } catch (e) {
+ errorObj.e = e;
+ return errorObj;
+ }
+ }
+
+ function tryCatch(fn) {
+ tryCatchTarget = fn;
+ return tryCatcher;
+ }
+
+ var inherits = function inherits(Child, Parent) {
+ var hasProp = {}.hasOwnProperty;
+
+ function T() {
+ this.constructor = Child;
+ this.constructor$ = Parent;
+
+ for (var propertyName in Parent.prototype) {
+ if (hasProp.call(Parent.prototype, propertyName) && propertyName.charAt(propertyName.length - 1) !== "$") {
+ this[propertyName + "$"] = Parent.prototype[propertyName];
+ }
+ }
+ }
+
+ T.prototype = Parent.prototype;
+ Child.prototype = new T();
+ return Child.prototype;
+ };
+
+ function isPrimitive(val) {
+ return val == null || val === true || val === false || typeof val === "string" || typeof val === "number";
+ }
+
+ function isObject(value) {
+ return typeof value === "function" || _typeof(value) === "object" && value !== null;
+ }
+
+ function maybeWrapAsError(maybeError) {
+ if (!isPrimitive(maybeError)) return maybeError;
+ return new Error(safeToString(maybeError));
+ }
+
+ function withAppended(target, appendee) {
+ var len = target.length;
+ var ret = new Array(len + 1);
+ var i;
+
+ for (i = 0; i < len; ++i) {
+ ret[i] = target[i];
+ }
+
+ ret[i] = appendee;
+ return ret;
+ }
+
+ function getDataPropertyOrDefault(obj, key, defaultValue) {
+ if (es5.isES5) {
+ var desc = Object.getOwnPropertyDescriptor(obj, key);
+
+ if (desc != null) {
+ return desc.get == null && desc.set == null ? desc.value : defaultValue;
+ }
+ } else {
+ return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
+ }
+ }
+
+ function notEnumerableProp(obj, name, value) {
+ if (isPrimitive(obj)) return obj;
+ var descriptor = {
+ value: value,
+ configurable: true,
+ enumerable: false,
+ writable: true
+ };
+ es5.defineProperty(obj, name, descriptor);
+ return obj;
+ }
+
+ function thrower(r) {
+ throw r;
+ }
+
+ var inheritedDataKeys = function () {
+ var excludedPrototypes = [Array.prototype, Object.prototype, Function.prototype];
+
+ var isExcludedProto = function isExcludedProto(val) {
+ for (var i = 0; i < excludedPrototypes.length; ++i) {
+ if (excludedPrototypes[i] === val) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ if (es5.isES5) {
+ var getKeys = Object.getOwnPropertyNames;
+ return function (obj) {
+ var ret = [];
+ var visitedKeys = Object.create(null);
+
+ while (obj != null && !isExcludedProto(obj)) {
+ var keys;
+
+ try {
+ keys = getKeys(obj);
+ } catch (e) {
+ return ret;
+ }
+
+ for (var i = 0; i < keys.length; ++i) {
+ var key = keys[i];
+ if (visitedKeys[key]) continue;
+ visitedKeys[key] = true;
+ var desc = Object.getOwnPropertyDescriptor(obj, key);
+
+ if (desc != null && desc.get == null && desc.set == null) {
+ ret.push(key);
+ }
+ }
+
+ obj = es5.getPrototypeOf(obj);
+ }
+
+ return ret;
+ };
+ } else {
+ var hasProp = {}.hasOwnProperty;
+ return function (obj) {
+ if (isExcludedProto(obj)) return [];
+ var ret = [];
+ /*jshint forin:false */
+
+ enumeration: for (var key in obj) {
+ if (hasProp.call(obj, key)) {
+ ret.push(key);
+ } else {
+ for (var i = 0; i < excludedPrototypes.length; ++i) {
+ if (hasProp.call(excludedPrototypes[i], key)) {
+ continue enumeration;
+ }
+ }
+
+ ret.push(key);
+ }
+ }
+
+ return ret;
+ };
+ }
+ }();
+
+ var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
+
+ function isClass(fn) {
+ try {
+ if (typeof fn === "function") {
+ var keys = es5.names(fn.prototype);
+ var hasMethods = es5.isES5 && keys.length > 1;
+ var hasMethodsOtherThanConstructor = keys.length > 0 && !(keys.length === 1 && keys[0] === "constructor");
+ var hasThisAssignmentAndStaticMethods = thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;
+
+ if (hasMethods || hasMethodsOtherThanConstructor || hasThisAssignmentAndStaticMethods) {
+ return true;
+ }
+ }
+
+ return false;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function toFastProperties(obj) {
+ /*jshint -W027,-W055,-W031*/
+ function FakeConstructor() {}
+
+ FakeConstructor.prototype = obj;
+ var receiver = new FakeConstructor();
+
+ function ic() {
+ return _typeof(receiver.foo);
+ }
+
+ ic();
+ ic();
+ return obj;
+ eval(obj);
+ }
+
+ var rident = /^[a-z$_][a-z$_0-9]*$/i;
+
+ function isIdentifier(str) {
+ return rident.test(str);
+ }
+
+ function filledRange(count, prefix, suffix) {
+ var ret = new Array(count);
+
+ for (var i = 0; i < count; ++i) {
+ ret[i] = prefix + i + suffix;
+ }
+
+ return ret;
+ }
+
+ function safeToString(obj) {
+ try {
+ return obj + "";
+ } catch (e) {
+ return "[no string representation]";
+ }
+ }
+
+ function isError(obj) {
+ return obj instanceof Error || obj !== null && _typeof(obj) === "object" && typeof obj.message === "string" && typeof obj.name === "string";
+ }
+
+ function markAsOriginatingFromRejection(e) {
+ try {
+ notEnumerableProp(e, "isOperational", true);
+ } catch (ignore) {}
+ }
+
+ function originatesFromRejection(e) {
+ if (e == null) return false;
+ return e instanceof Error["__BluebirdErrorTypes__"].OperationalError || e["isOperational"] === true;
+ }
+
+ function canAttachTrace(obj) {
+ return isError(obj) && es5.propertyIsWritable(obj, "stack");
+ }
+
+ var ensureErrorObject = function () {
+ if (!("stack" in new Error())) {
+ return function (value) {
+ if (canAttachTrace(value)) return value;
+
+ try {
+ throw new Error(safeToString(value));
+ } catch (err) {
+ return err;
+ }
+ };
+ } else {
+ return function (value) {
+ if (canAttachTrace(value)) return value;
+ return new Error(safeToString(value));
+ };
+ }
+ }();
+
+ function classString(obj) {
+ return {}.toString.call(obj);
+ }
+
+ function copyDescriptors(from, to, filter) {
+ var keys = es5.names(from);
+
+ for (var i = 0; i < keys.length; ++i) {
+ var key = keys[i];
+
+ if (filter(key)) {
+ try {
+ es5.defineProperty(to, key, es5.getDescriptor(from, key));
+ } catch (ignore) {}
+ }
+ }
+ }
+
+ var asArray = function asArray(v) {
+ if (es5.isArray(v)) {
+ return v;
+ }
+
+ return null;
+ };
+
+ if (typeof Symbol !== "undefined" && Symbol.iterator) {
+ var ArrayFrom = typeof Array.from === "function" ? function (v) {
+ return Array.from(v);
+ } : function (v) {
+ var ret = [];
+ var it = v[Symbol.iterator]();
+ var itResult;
+
+ while (!(itResult = it.next()).done) {
+ ret.push(itResult.value);
+ }
+
+ return ret;
+ };
+
+ asArray = function asArray(v) {
+ if (es5.isArray(v)) {
+ return v;
+ } else if (v != null && typeof v[Symbol.iterator] === "function") {
+ return ArrayFrom(v);
+ }
+
+ return null;
+ };
+ }
+
+ var isNode = typeof process !== "undefined" && classString(process).toLowerCase() === "[object process]";
+ var hasEnvVariables = typeof process !== "undefined" && typeof process.env !== "undefined";
+
+ function env(key) {
+ return hasEnvVariables ? process.env[key] : undefined;
+ }
+
+ function getNativePromise() {
+ if (typeof Promise === "function") {
+ try {
+ var promise = new Promise(function () {});
+
+ if ({}.toString.call(promise) === "[object Promise]") {
+ return Promise;
+ }
+ } catch (e) {}
+ }
+ }
+
+ function domainBind(self, cb) {
+ return self.bind(cb);
+ }
+
+ var ret = {
+ isClass: isClass,
+ isIdentifier: isIdentifier,
+ inheritedDataKeys: inheritedDataKeys,
+ getDataPropertyOrDefault: getDataPropertyOrDefault,
+ thrower: thrower,
+ isArray: es5.isArray,
+ asArray: asArray,
+ notEnumerableProp: notEnumerableProp,
+ isPrimitive: isPrimitive,
+ isObject: isObject,
+ isError: isError,
+ canEvaluate: canEvaluate,
+ errorObj: errorObj,
+ tryCatch: tryCatch,
+ inherits: inherits,
+ withAppended: withAppended,
+ maybeWrapAsError: maybeWrapAsError,
+ toFastProperties: toFastProperties,
+ filledRange: filledRange,
+ toString: safeToString,
+ canAttachTrace: canAttachTrace,
+ ensureErrorObject: ensureErrorObject,
+ originatesFromRejection: originatesFromRejection,
+ markAsOriginatingFromRejection: markAsOriginatingFromRejection,
+ classString: classString,
+ copyDescriptors: copyDescriptors,
+ hasDevTools: typeof chrome !== "undefined" && chrome && typeof chrome.loadTimes === "function",
+ isNode: isNode,
+ hasEnvVariables: hasEnvVariables,
+ env: env,
+ global: globalObject,
+ getNativePromise: getNativePromise,
+ domainBind: domainBind
+ };
+
+ ret.isRecentNode = ret.isNode && function () {
+ var version;
+
+ if (process.versions && process.versions.node) {
+ version = process.versions.node.split(".").map(Number);
+ } else if (process.version) {
+ version = process.version.split(".").map(Number);
+ }
+
+ return version[0] === 0 && version[1] > 10 || version[0] > 0;
+ }();
+
+ if (ret.isNode) ret.toFastProperties(process);
+
+ try {
+ throw new Error();
+ } catch (e) {
+ ret.lastLineError = e;
+ }
+
+ module.exports = ret;
+ }, {
+ "./es5": 13
+ }]
+ }, {}, [4])(4);
+});
+;
+
+if (typeof window !== 'undefined' && window !== null) {
+ window.P = window.Promise;
+} else if (typeof self !== 'undefined' && self !== null) {
+ self.P = self.Promise;
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate))
+
+/***/ }),
+
+/***/ "./node_modules/buffer/index.js":
+/*!**************************************!*\
+ !*** ./node_modules/buffer/index.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+
+/* eslint-disable no-proto */
+
+
+var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js");
+
+var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js");
+
+var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js");
+
+exports.Buffer = Buffer;
+exports.SlowBuffer = SlowBuffer;
+exports.INSPECT_MAX_BYTES = 50;
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ * incorrect length in some situations.
+
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+
+Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport();
+/*
+ * Export kMaxLength after typed array support is determined.
+ */
+
+exports.kMaxLength = kMaxLength();
+
+function typedArraySupport() {
+ try {
+ var arr = new Uint8Array(1);
+ arr.__proto__ = {
+ __proto__: Uint8Array.prototype,
+ foo: function foo() {
+ return 42;
+ }
+ };
+ return arr.foo() === 42 && // typed array instances can be augmented
+ typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
+ arr.subarray(1, 1).byteLength === 0; // ie10 has broken `subarray`
+ } catch (e) {
+ return false;
+ }
+}
+
+function kMaxLength() {
+ return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff;
+}
+
+function createBuffer(that, length) {
+ if (kMaxLength() < length) {
+ throw new RangeError('Invalid typed array length');
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = new Uint8Array(length);
+ that.__proto__ = Buffer.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ if (that === null) {
+ that = new Buffer(length);
+ }
+
+ that.length = length;
+ }
+
+ return that;
+}
+/**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+
+function Buffer(arg, encodingOrOffset, length) {
+ if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
+ return new Buffer(arg, encodingOrOffset, length);
+ } // Common case.
+
+
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new Error('If encoding is specified then the first argument must be a string');
+ }
+
+ return allocUnsafe(this, arg);
+ }
+
+ return from(this, arg, encodingOrOffset, length);
+}
+
+Buffer.poolSize = 8192; // not used by this implementation
+// TODO: Legacy, not needed anymore. Remove in next major version.
+
+Buffer._augment = function (arr) {
+ arr.__proto__ = Buffer.prototype;
+ return arr;
+};
+
+function from(that, value, encodingOrOffset, length) {
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number');
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ return fromArrayBuffer(that, value, encodingOrOffset, length);
+ }
+
+ if (typeof value === 'string') {
+ return fromString(that, value, encodingOrOffset);
+ }
+
+ return fromObject(that, value);
+}
+/**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+
+
+Buffer.from = function (value, encodingOrOffset, length) {
+ return from(null, value, encodingOrOffset, length);
+};
+
+if (Buffer.TYPED_ARRAY_SUPPORT) {
+ Buffer.prototype.__proto__ = Uint8Array.prototype;
+ Buffer.__proto__ = Uint8Array;
+
+ if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) {
+ // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
+ Object.defineProperty(Buffer, Symbol.species, {
+ value: null,
+ configurable: true
+ });
+ }
+}
+
+function assertSize(size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be a number');
+ } else if (size < 0) {
+ throw new RangeError('"size" argument must not be negative');
+ }
+}
+
+function alloc(that, size, fill, encoding) {
+ assertSize(size);
+
+ if (size <= 0) {
+ return createBuffer(that, size);
+ }
+
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill);
+ }
+
+ return createBuffer(that, size);
+}
+/**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+
+
+Buffer.alloc = function (size, fill, encoding) {
+ return alloc(null, size, fill, encoding);
+};
+
+function allocUnsafe(that, size) {
+ assertSize(size);
+ that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);
+
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
+ for (var i = 0; i < size; ++i) {
+ that[i] = 0;
+ }
+ }
+
+ return that;
+}
+/**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+
+
+Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(null, size);
+};
+/**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+
+
+Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(null, size);
+};
+
+function fromString(that, string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8';
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('"encoding" must be a valid string encoding');
+ }
+
+ var length = byteLength(string, encoding) | 0;
+ that = createBuffer(that, length);
+ var actual = that.write(string, encoding);
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ that = that.slice(0, actual);
+ }
+
+ return that;
+}
+
+function fromArrayLike(that, array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0;
+ that = createBuffer(that, length);
+
+ for (var i = 0; i < length; i += 1) {
+ that[i] = array[i] & 255;
+ }
+
+ return that;
+}
+
+function fromArrayBuffer(that, array, byteOffset, length) {
+ array.byteLength; // this throws if `array` is not a valid ArrayBuffer
+
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('\'offset\' is out of bounds');
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('\'length\' is out of bounds');
+ }
+
+ if (byteOffset === undefined && length === undefined) {
+ array = new Uint8Array(array);
+ } else if (length === undefined) {
+ array = new Uint8Array(array, byteOffset);
+ } else {
+ array = new Uint8Array(array, byteOffset, length);
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = array;
+ that.__proto__ = Buffer.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ that = fromArrayLike(that, array);
+ }
+
+ return that;
+}
+
+function fromObject(that, obj) {
+ if (Buffer.isBuffer(obj)) {
+ var len = checked(obj.length) | 0;
+ that = createBuffer(that, len);
+
+ if (that.length === 0) {
+ return that;
+ }
+
+ obj.copy(that, 0, 0, len);
+ return that;
+ }
+
+ if (obj) {
+ if (typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer || 'length' in obj) {
+ if (typeof obj.length !== 'number' || isnan(obj.length)) {
+ return createBuffer(that, 0);
+ }
+
+ return fromArrayLike(that, obj);
+ }
+
+ if (obj.type === 'Buffer' && isArray(obj.data)) {
+ return fromArrayLike(that, obj.data);
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.');
+}
+
+function checked(length) {
+ // Note: cannot use `length < kMaxLength()` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= kMaxLength()) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes');
+ }
+
+ return length | 0;
+}
+
+function SlowBuffer(length) {
+ if (+length != length) {
+ // eslint-disable-line eqeqeq
+ length = 0;
+ }
+
+ return Buffer.alloc(+length);
+}
+
+Buffer.isBuffer = function isBuffer(b) {
+ return !!(b != null && b._isBuffer);
+};
+
+Buffer.compare = function compare(a, b) {
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+ throw new TypeError('Arguments must be Buffers');
+ }
+
+ if (a === b) return 0;
+ var x = a.length;
+ var y = b.length;
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i];
+ y = b[i];
+ break;
+ }
+ }
+
+ if (x < y) return -1;
+ if (y < x) return 1;
+ return 0;
+};
+
+Buffer.isEncoding = function isEncoding(encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true;
+
+ default:
+ return false;
+ }
+};
+
+Buffer.concat = function concat(list, length) {
+ if (!isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers');
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0);
+ }
+
+ var i;
+
+ if (length === undefined) {
+ length = 0;
+
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length;
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length);
+ var pos = 0;
+
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i];
+
+ if (!Buffer.isBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers');
+ }
+
+ buf.copy(buffer, pos);
+ pos += buf.length;
+ }
+
+ return buffer;
+};
+
+function byteLength(string, encoding) {
+ if (Buffer.isBuffer(string)) {
+ return string.length;
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+ return string.byteLength;
+ }
+
+ if (typeof string !== 'string') {
+ string = '' + string;
+ }
+
+ var len = string.length;
+ if (len === 0) return 0; // Use a for loop to avoid recursion
+
+ var loweredCase = false;
+
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len;
+
+ case 'utf8':
+ case 'utf-8':
+ case undefined:
+ return utf8ToBytes(string).length;
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2;
+
+ case 'hex':
+ return len >>> 1;
+
+ case 'base64':
+ return base64ToBytes(string).length;
+
+ default:
+ if (loweredCase) return utf8ToBytes(string).length; // assume utf8
+
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+}
+
+Buffer.byteLength = byteLength;
+
+function slowToString(encoding, start, end) {
+ var loweredCase = false; // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+
+ if (start === undefined || start < 0) {
+ start = 0;
+ } // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+
+
+ if (start > this.length) {
+ return '';
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length;
+ }
+
+ if (end <= 0) {
+ return '';
+ } // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+
+
+ end >>>= 0;
+ start >>>= 0;
+
+ if (end <= start) {
+ return '';
+ }
+
+ if (!encoding) encoding = 'utf8';
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end);
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end);
+
+ case 'ascii':
+ return asciiSlice(this, start, end);
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end);
+
+ case 'base64':
+ return base64Slice(this, start, end);
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end);
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
+ encoding = (encoding + '').toLowerCase();
+ loweredCase = true;
+ }
+ }
+} // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
+// Buffer instances.
+
+
+Buffer.prototype._isBuffer = true;
+
+function swap(b, n, m) {
+ var i = b[n];
+ b[n] = b[m];
+ b[m] = i;
+}
+
+Buffer.prototype.swap16 = function swap16() {
+ var len = this.length;
+
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits');
+ }
+
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1);
+ }
+
+ return this;
+};
+
+Buffer.prototype.swap32 = function swap32() {
+ var len = this.length;
+
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits');
+ }
+
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3);
+ swap(this, i + 1, i + 2);
+ }
+
+ return this;
+};
+
+Buffer.prototype.swap64 = function swap64() {
+ var len = this.length;
+
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits');
+ }
+
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7);
+ swap(this, i + 1, i + 6);
+ swap(this, i + 2, i + 5);
+ swap(this, i + 3, i + 4);
+ }
+
+ return this;
+};
+
+Buffer.prototype.toString = function toString() {
+ var length = this.length | 0;
+ if (length === 0) return '';
+ if (arguments.length === 0) return utf8Slice(this, 0, length);
+ return slowToString.apply(this, arguments);
+};
+
+Buffer.prototype.equals = function equals(b) {
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer');
+ if (this === b) return true;
+ return Buffer.compare(this, b) === 0;
+};
+
+Buffer.prototype.inspect = function inspect() {
+ var str = '';
+ var max = exports.INSPECT_MAX_BYTES;
+
+ if (this.length > 0) {
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
+ if (this.length > max) str += ' ... ';
+ }
+
+ return '<Buffer ' + str + '>';
+};
+
+Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {
+ if (!Buffer.isBuffer(target)) {
+ throw new TypeError('Argument must be a Buffer');
+ }
+
+ if (start === undefined) {
+ start = 0;
+ }
+
+ if (end === undefined) {
+ end = target ? target.length : 0;
+ }
+
+ if (thisStart === undefined) {
+ thisStart = 0;
+ }
+
+ if (thisEnd === undefined) {
+ thisEnd = this.length;
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index');
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0;
+ }
+
+ if (thisStart >= thisEnd) {
+ return -1;
+ }
+
+ if (start >= end) {
+ return 1;
+ }
+
+ start >>>= 0;
+ end >>>= 0;
+ thisStart >>>= 0;
+ thisEnd >>>= 0;
+ if (this === target) return 0;
+ var x = thisEnd - thisStart;
+ var y = end - start;
+ var len = Math.min(x, y);
+ var thisCopy = this.slice(thisStart, thisEnd);
+ var targetCopy = target.slice(start, end);
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i];
+ y = targetCopy[i];
+ break;
+ }
+ }
+
+ if (x < y) return -1;
+ if (y < x) return 1;
+ return 0;
+}; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+//
+// Arguments:
+// - buffer - a Buffer to search
+// - val - a string, Buffer, or number
+// - byteOffset - an index into `buffer`; will be clamped to an int32
+// - encoding - an optional encoding, relevant is val is a string
+// - dir - true for indexOf, false for lastIndexOf
+
+
+function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1; // Normalize byteOffset
+
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset;
+ byteOffset = 0;
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff;
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000;
+ }
+
+ byteOffset = +byteOffset; // Coerce to Number.
+
+ if (isNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : buffer.length - 1;
+ } // Normalize byteOffset: negative offsets start from the end of the buffer
+
+
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
+
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1;else byteOffset = buffer.length - 1;
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0;else return -1;
+ } // Normalize val
+
+
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding);
+ } // Finally, search either indexOf (if dir is true) or lastIndexOf
+
+
+ if (Buffer.isBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1;
+ }
+
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir);
+ } else if (typeof val === 'number') {
+ val = val & 0xFF; // Search for a byte value [0-255]
+
+ if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);
+ }
+ }
+
+ return arrayIndexOf(buffer, [val], byteOffset, encoding, dir);
+ }
+
+ throw new TypeError('val must be string, number or Buffer');
+}
+
+function arrayIndexOf(arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1;
+ var arrLength = arr.length;
+ var valLength = val.length;
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase();
+
+ if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1;
+ }
+
+ indexSize = 2;
+ arrLength /= 2;
+ valLength /= 2;
+ byteOffset /= 2;
+ }
+ }
+
+ function read(buf, i) {
+ if (indexSize === 1) {
+ return buf[i];
+ } else {
+ return buf.readUInt16BE(i * indexSize);
+ }
+ }
+
+ var i;
+
+ if (dir) {
+ var foundIndex = -1;
+
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i;
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize;
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex;
+ foundIndex = -1;
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
+
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true;
+
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false;
+ break;
+ }
+ }
+
+ if (found) return i;
+ }
+ }
+
+ return -1;
+}
+
+Buffer.prototype.includes = function includes(val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1;
+};
+
+Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true);
+};
+
+Buffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false);
+};
+
+function hexWrite(buf, string, offset, length) {
+ offset = Number(offset) || 0;
+ var remaining = buf.length - offset;
+
+ if (!length) {
+ length = remaining;
+ } else {
+ length = Number(length);
+
+ if (length > remaining) {
+ length = remaining;
+ }
+ } // must be an even number of digits
+
+
+ var strLen = string.length;
+ if (strLen % 2 !== 0) throw new TypeError('Invalid hex string');
+
+ if (length > strLen / 2) {
+ length = strLen / 2;
+ }
+
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16);
+ if (isNaN(parsed)) return i;
+ buf[offset + i] = parsed;
+ }
+
+ return i;
+}
+
+function utf8Write(buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);
+}
+
+function asciiWrite(buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length);
+}
+
+function latin1Write(buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length);
+}
+
+function base64Write(buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length);
+}
+
+function ucs2Write(buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);
+}
+
+Buffer.prototype.write = function write(string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8';
+ length = this.length;
+ offset = 0; // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset;
+ length = this.length;
+ offset = 0; // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset | 0;
+
+ if (isFinite(length)) {
+ length = length | 0;
+ if (encoding === undefined) encoding = 'utf8';
+ } else {
+ encoding = length;
+ length = undefined;
+ } // legacy write(string, encoding, offset, length) - remove in v0.13
+
+ } else {
+ throw new Error('Buffer.write(string, encoding, offset[, length]) is no longer supported');
+ }
+
+ var remaining = this.length - offset;
+ if (length === undefined || length > remaining) length = remaining;
+
+ if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds');
+ }
+
+ if (!encoding) encoding = 'utf8';
+ var loweredCase = false;
+
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length);
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length);
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length);
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length);
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length);
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length);
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+};
+
+Buffer.prototype.toJSON = function toJSON() {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ };
+};
+
+function base64Slice(buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return base64.fromByteArray(buf);
+ } else {
+ return base64.fromByteArray(buf.slice(start, end));
+ }
+}
+
+function utf8Slice(buf, start, end) {
+ end = Math.min(buf.length, end);
+ var res = [];
+ var i = start;
+
+ while (i < end) {
+ var firstByte = buf[i];
+ var codePoint = null;
+ var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint;
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte;
+ }
+
+ break;
+
+ case 2:
+ secondByte = buf[i + 1];
+
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;
+
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ break;
+
+ case 3:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;
+
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ break;
+
+ case 4:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+ fourthByte = buf[i + 3];
+
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;
+
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD;
+ bytesPerSequence = 1;
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000;
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800);
+ codePoint = 0xDC00 | codePoint & 0x3FF;
+ }
+
+ res.push(codePoint);
+ i += bytesPerSequence;
+ }
+
+ return decodeCodePointsArray(res);
+} // Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+
+
+var MAX_ARGUMENTS_LENGTH = 0x1000;
+
+function decodeCodePointsArray(codePoints) {
+ var len = codePoints.length;
+
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints); // avoid extra slice()
+ } // Decode in chunks to avoid "call stack size exceeded".
+
+
+ var res = '';
+ var i = 0;
+
+ while (i < len) {
+ res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));
+ }
+
+ return res;
+}
+
+function asciiSlice(buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F);
+ }
+
+ return ret;
+}
+
+function latin1Slice(buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i]);
+ }
+
+ return ret;
+}
+
+function hexSlice(buf, start, end) {
+ var len = buf.length;
+ if (!start || start < 0) start = 0;
+ if (!end || end < 0 || end > len) end = len;
+ var out = '';
+
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i]);
+ }
+
+ return out;
+}
+
+function utf16leSlice(buf, start, end) {
+ var bytes = buf.slice(start, end);
+ var res = '';
+
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
+ }
+
+ return res;
+}
+
+Buffer.prototype.slice = function slice(start, end) {
+ var len = this.length;
+ start = ~~start;
+ end = end === undefined ? len : ~~end;
+
+ if (start < 0) {
+ start += len;
+ if (start < 0) start = 0;
+ } else if (start > len) {
+ start = len;
+ }
+
+ if (end < 0) {
+ end += len;
+ if (end < 0) end = 0;
+ } else if (end > len) {
+ end = len;
+ }
+
+ if (end < start) end = start;
+ var newBuf;
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ newBuf = this.subarray(start, end);
+ newBuf.__proto__ = Buffer.prototype;
+ } else {
+ var sliceLen = end - start;
+ newBuf = new Buffer(sliceLen, undefined);
+
+ for (var i = 0; i < sliceLen; ++i) {
+ newBuf[i] = this[i + start];
+ }
+ }
+
+ return newBuf;
+};
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+
+
+function checkOffset(offset, ext, length) {
+ if (offset % 1 !== 0 || offset < 0) throw new RangeError('offset is not uint');
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length');
+}
+
+Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+
+ return val;
+};
+
+Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length);
+ }
+
+ var val = this[offset + --byteLength];
+ var mul = 1;
+
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul;
+ }
+
+ return val;
+};
+
+Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length);
+ return this[offset];
+};
+
+Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ return this[offset] | this[offset + 1] << 8;
+};
+
+Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ return this[offset] << 8 | this[offset + 1];
+};
+
+Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;
+};
+
+Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);
+};
+
+Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+
+ mul *= 0x80;
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+ return val;
+};
+
+Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+ var i = byteLength;
+ var mul = 1;
+ var val = this[offset + --i];
+
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul;
+ }
+
+ mul *= 0x80;
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+ return val;
+};
+
+Buffer.prototype.readInt8 = function readInt8(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length);
+ if (!(this[offset] & 0x80)) return this[offset];
+ return (0xff - this[offset] + 1) * -1;
+};
+
+Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ var val = this[offset] | this[offset + 1] << 8;
+ return val & 0x8000 ? val | 0xFFFF0000 : val;
+};
+
+Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ var val = this[offset + 1] | this[offset] << 8;
+ return val & 0x8000 ? val | 0xFFFF0000 : val;
+};
+
+Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;
+};
+
+Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];
+};
+
+Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return ieee754.read(this, offset, true, 23, 4);
+};
+
+Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return ieee754.read(this, offset, false, 23, 4);
+};
+
+Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length);
+ return ieee754.read(this, offset, true, 52, 8);
+};
+
+Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length);
+ return ieee754.read(this, offset, false, 52, 8);
+};
+
+function checkInt(buf, value, offset, ext, max, min) {
+ if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance');
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds');
+ if (offset + ext > buf.length) throw new RangeError('Index out of range');
+}
+
+Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var mul = 1;
+ var i = 0;
+ this[offset] = value & 0xFF;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = value / mul & 0xFF;
+ }
+
+ return offset + byteLength;
+};
+
+Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ this[offset + i] = value & 0xFF;
+
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = value / mul & 0xFF;
+ }
+
+ return offset + byteLength;
+};
+
+Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ this[offset] = value & 0xff;
+ return offset + 1;
+};
+
+function objectWriteUInt16(buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffff + value + 1;
+
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
+ buf[offset + i] = (value & 0xff << 8 * (littleEndian ? i : 1 - i)) >>> (littleEndian ? i : 1 - i) * 8;
+ }
+}
+
+Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ } else {
+ objectWriteUInt16(this, value, offset, true);
+ }
+
+ return offset + 2;
+};
+
+Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 8;
+ this[offset + 1] = value & 0xff;
+ } else {
+ objectWriteUInt16(this, value, offset, false);
+ }
+
+ return offset + 2;
+};
+
+function objectWriteUInt32(buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffffffff + value + 1;
+
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
+ buf[offset + i] = value >>> (littleEndian ? i : 3 - i) * 8 & 0xff;
+ }
+}
+
+Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset + 3] = value >>> 24;
+ this[offset + 2] = value >>> 16;
+ this[offset + 1] = value >>> 8;
+ this[offset] = value & 0xff;
+ } else {
+ objectWriteUInt32(this, value, offset, true);
+ }
+
+ return offset + 4;
+};
+
+Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 24;
+ this[offset + 1] = value >>> 16;
+ this[offset + 2] = value >>> 8;
+ this[offset + 3] = value & 0xff;
+ } else {
+ objectWriteUInt32(this, value, offset, false);
+ }
+
+ return offset + 4;
+};
+
+Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+ checkInt(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = 0;
+ var mul = 1;
+ var sub = 0;
+ this[offset] = value & 0xFF;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1;
+ }
+
+ this[offset + i] = (value / mul >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength;
+};
+
+Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+ checkInt(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ var sub = 0;
+ this[offset + i] = value & 0xFF;
+
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1;
+ }
+
+ this[offset + i] = (value / mul >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength;
+};
+
+Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ if (value < 0) value = 0xff + value + 1;
+ this[offset] = value & 0xff;
+ return offset + 1;
+};
+
+Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ } else {
+ objectWriteUInt16(this, value, offset, true);
+ }
+
+ return offset + 2;
+};
+
+Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 8;
+ this[offset + 1] = value & 0xff;
+ } else {
+ objectWriteUInt16(this, value, offset, false);
+ }
+
+ return offset + 2;
+};
+
+Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ this[offset + 2] = value >>> 16;
+ this[offset + 3] = value >>> 24;
+ } else {
+ objectWriteUInt32(this, value, offset, true);
+ }
+
+ return offset + 4;
+};
+
+Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
+ if (value < 0) value = 0xffffffff + value + 1;
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 24;
+ this[offset + 1] = value >>> 16;
+ this[offset + 2] = value >>> 8;
+ this[offset + 3] = value & 0xff;
+ } else {
+ objectWriteUInt32(this, value, offset, false);
+ }
+
+ return offset + 4;
+};
+
+function checkIEEE754(buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range');
+ if (offset < 0) throw new RangeError('Index out of range');
+}
+
+function writeFloat(buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38);
+ }
+
+ ieee754.write(buf, value, offset, littleEndian, 23, 4);
+ return offset + 4;
+}
+
+Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert);
+};
+
+Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert);
+};
+
+function writeDouble(buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308);
+ }
+
+ ieee754.write(buf, value, offset, littleEndian, 52, 8);
+ return offset + 8;
+}
+
+Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert);
+};
+
+Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert);
+}; // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+
+
+Buffer.prototype.copy = function copy(target, targetStart, start, end) {
+ if (!start) start = 0;
+ if (!end && end !== 0) end = this.length;
+ if (targetStart >= target.length) targetStart = target.length;
+ if (!targetStart) targetStart = 0;
+ if (end > 0 && end < start) end = start; // Copy 0 bytes; we're done
+
+ if (end === start) return 0;
+ if (target.length === 0 || this.length === 0) return 0; // Fatal error conditions
+
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds');
+ }
+
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds');
+ if (end < 0) throw new RangeError('sourceEnd out of bounds'); // Are we oob?
+
+ if (end > this.length) end = this.length;
+
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start;
+ }
+
+ var len = end - start;
+ var i;
+
+ if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+ // ascending copy from start
+ for (i = 0; i < len; ++i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else {
+ Uint8Array.prototype.set.call(target, this.subarray(start, start + len), targetStart);
+ }
+
+ return len;
+}; // Usage:
+// buffer.fill(number[, offset[, end]])
+// buffer.fill(buffer[, offset[, end]])
+// buffer.fill(string[, offset[, end]][, encoding])
+
+
+Buffer.prototype.fill = function fill(val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start;
+ start = 0;
+ end = this.length;
+ } else if (typeof end === 'string') {
+ encoding = end;
+ end = this.length;
+ }
+
+ if (val.length === 1) {
+ var code = val.charCodeAt(0);
+
+ if (code < 256) {
+ val = code;
+ }
+ }
+
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string');
+ }
+
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding);
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255;
+ } // Invalid ranges are not set to a default, so can range check early.
+
+
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index');
+ }
+
+ if (end <= start) {
+ return this;
+ }
+
+ start = start >>> 0;
+ end = end === undefined ? this.length : end >>> 0;
+ if (!val) val = 0;
+ var i;
+
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val;
+ }
+ } else {
+ var bytes = Buffer.isBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString());
+ var len = bytes.length;
+
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len];
+ }
+ }
+
+ return this;
+}; // HELPER FUNCTIONS
+// ================
+
+
+var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g;
+
+function base64clean(str) {
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = stringtrim(str).replace(INVALID_BASE64_RE, ''); // Node converts strings with length < 2 to ''
+
+ if (str.length < 2) return ''; // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+
+ while (str.length % 4 !== 0) {
+ str = str + '=';
+ }
+
+ return str;
+}
+
+function stringtrim(str) {
+ if (str.trim) return str.trim();
+ return str.replace(/^\s+|\s+$/g, '');
+}
+
+function toHex(n) {
+ if (n < 16) return '0' + n.toString(16);
+ return n.toString(16);
+}
+
+function utf8ToBytes(string, units) {
+ units = units || Infinity;
+ var codePoint;
+ var length = string.length;
+ var leadSurrogate = null;
+ var bytes = [];
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i); // is surrogate component
+
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue;
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue;
+ } // valid lead
+
+
+ leadSurrogate = codePoint;
+ continue;
+ } // 2 leads in a row
+
+
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ leadSurrogate = codePoint;
+ continue;
+ } // valid surrogate pair
+
+
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ }
+
+ leadSurrogate = null; // encode utf8
+
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break;
+ bytes.push(codePoint);
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break;
+ bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break;
+ bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break;
+ bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
+ } else {
+ throw new Error('Invalid code point');
+ }
+ }
+
+ return bytes;
+}
+
+function asciiToBytes(str) {
+ var byteArray = [];
+
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF);
+ }
+
+ return byteArray;
+}
+
+function utf16leToBytes(str, units) {
+ var c, hi, lo;
+ var byteArray = [];
+
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break;
+ c = str.charCodeAt(i);
+ hi = c >> 8;
+ lo = c % 256;
+ byteArray.push(lo);
+ byteArray.push(hi);
+ }
+
+ return byteArray;
+}
+
+function base64ToBytes(str) {
+ return base64.toByteArray(base64clean(str));
+}
+
+function blitBuffer(src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if (i + offset >= dst.length || i >= src.length) break;
+ dst[i + offset] = src[i];
+ }
+
+ return i;
+}
+
+function isnan(val) {
+ return val !== val; // eslint-disable-line no-self-compare
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/builtin-status-codes/browser.js":
+/*!******************************************************!*\
+ !*** ./node_modules/builtin-status-codes/browser.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "100": "Continue",
+ "101": "Switching Protocols",
+ "102": "Processing",
+ "200": "OK",
+ "201": "Created",
+ "202": "Accepted",
+ "203": "Non-Authoritative Information",
+ "204": "No Content",
+ "205": "Reset Content",
+ "206": "Partial Content",
+ "207": "Multi-Status",
+ "208": "Already Reported",
+ "226": "IM Used",
+ "300": "Multiple Choices",
+ "301": "Moved Permanently",
+ "302": "Found",
+ "303": "See Other",
+ "304": "Not Modified",
+ "305": "Use Proxy",
+ "307": "Temporary Redirect",
+ "308": "Permanent Redirect",
+ "400": "Bad Request",
+ "401": "Unauthorized",
+ "402": "Payment Required",
+ "403": "Forbidden",
+ "404": "Not Found",
+ "405": "Method Not Allowed",
+ "406": "Not Acceptable",
+ "407": "Proxy Authentication Required",
+ "408": "Request Timeout",
+ "409": "Conflict",
+ "410": "Gone",
+ "411": "Length Required",
+ "412": "Precondition Failed",
+ "413": "Payload Too Large",
+ "414": "URI Too Long",
+ "415": "Unsupported Media Type",
+ "416": "Range Not Satisfiable",
+ "417": "Expectation Failed",
+ "418": "I'm a teapot",
+ "421": "Misdirected Request",
+ "422": "Unprocessable Entity",
+ "423": "Locked",
+ "424": "Failed Dependency",
+ "425": "Unordered Collection",
+ "426": "Upgrade Required",
+ "428": "Precondition Required",
+ "429": "Too Many Requests",
+ "431": "Request Header Fields Too Large",
+ "451": "Unavailable For Legal Reasons",
+ "500": "Internal Server Error",
+ "501": "Not Implemented",
+ "502": "Bad Gateway",
+ "503": "Service Unavailable",
+ "504": "Gateway Timeout",
+ "505": "HTTP Version Not Supported",
+ "506": "Variant Also Negotiates",
+ "507": "Insufficient Storage",
+ "508": "Loop Detected",
+ "509": "Bandwidth Limit Exceeded",
+ "510": "Not Extended",
+ "511": "Network Authentication Required"
+};
+
+/***/ }),
+
+/***/ "./node_modules/core-util-is/lib/util.js":
+/*!***********************************************!*\
+ !*** ./node_modules/core-util-is/lib/util.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(Buffer) {function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(arg) {
+ if (Array.isArray) {
+ return Array.isArray(arg);
+ }
+
+ return objectToString(arg) === '[object Array]';
+}
+
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return _typeof(arg) === 'symbol';
+}
+
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return objectToString(re) === '[object RegExp]';
+}
+
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return _typeof(arg) === 'object' && arg !== null;
+}
+
+exports.isObject = isObject;
+
+function isDate(d) {
+ return objectToString(d) === '[object Date]';
+}
+
+exports.isDate = isDate;
+
+function isError(e) {
+ return objectToString(e) === '[object Error]' || e instanceof Error;
+}
+
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || _typeof(arg) === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+
+exports.isPrimitive = isPrimitive;
+exports.isBuffer = Buffer.isBuffer;
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./node_modules/events/events.js":
+/*!***************************************!*\
+ !*** ./node_modules/events/events.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+function EventEmitter() {
+ this._events = this._events || {};
+ this._maxListeners = this._maxListeners || undefined;
+}
+
+module.exports = EventEmitter; // Backwards-compat with node 0.10.x
+
+EventEmitter.EventEmitter = EventEmitter;
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+
+EventEmitter.defaultMaxListeners = 10; // Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+
+EventEmitter.prototype.setMaxListeners = function (n) {
+ if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError('n must be a positive number');
+ this._maxListeners = n;
+ return this;
+};
+
+EventEmitter.prototype.emit = function (type) {
+ var er, handler, len, args, i, listeners;
+ if (!this._events) this._events = {}; // If there is no 'error' event listener then throw.
+
+ if (type === 'error') {
+ if (!this._events.error || isObject(this._events.error) && !this._events.error.length) {
+ er = arguments[1];
+
+ if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ } else {
+ // At least give some kind of context to the user
+ var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
+ err.context = er;
+ throw err;
+ }
+ }
+ }
+
+ handler = this._events[type];
+ if (isUndefined(handler)) return false;
+
+ if (isFunction(handler)) {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+
+ default:
+ args = Array.prototype.slice.call(arguments, 1);
+ handler.apply(this, args);
+ }
+ } else if (isObject(handler)) {
+ args = Array.prototype.slice.call(arguments, 1);
+ listeners = handler.slice();
+ len = listeners.length;
+
+ for (i = 0; i < len; i++) {
+ listeners[i].apply(this, args);
+ }
+ }
+
+ return true;
+};
+
+EventEmitter.prototype.addListener = function (type, listener) {
+ var m;
+ if (!isFunction(listener)) throw TypeError('listener must be a function');
+ if (!this._events) this._events = {}; // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+
+ if (this._events.newListener) this.emit('newListener', type, isFunction(listener.listener) ? listener.listener : listener);
+ if (!this._events[type]) // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;else if (isObject(this._events[type])) // If we've already got an array, just append.
+ this._events[type].push(listener);else // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener]; // Check for listener leak
+
+ if (isObject(this._events[type]) && !this._events[type].warned) {
+ if (!isUndefined(this._maxListeners)) {
+ m = this._maxListeners;
+ } else {
+ m = EventEmitter.defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length);
+
+ if (typeof console.trace === 'function') {
+ // not supported in IE 10
+ console.trace();
+ }
+ }
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function (type, listener) {
+ if (!isFunction(listener)) throw TypeError('listener must be a function');
+ var fired = false;
+
+ function g() {
+ this.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(this, arguments);
+ }
+ }
+
+ g.listener = listener;
+ this.on(type, g);
+ return this;
+}; // emits a 'removeListener' event iff the listener was removed
+
+
+EventEmitter.prototype.removeListener = function (type, listener) {
+ var list, position, length, i;
+ if (!isFunction(listener)) throw TypeError('listener must be a function');
+ if (!this._events || !this._events[type]) return this;
+ list = this._events[type];
+ length = list.length;
+ position = -1;
+
+ if (list === listener || isFunction(list.listener) && list.listener === listener) {
+ delete this._events[type];
+ if (this._events.removeListener) this.emit('removeListener', type, listener);
+ } else if (isObject(list)) {
+ for (i = length; i-- > 0;) {
+ if (list[i] === listener || list[i].listener && list[i].listener === listener) {
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0) return this;
+
+ if (list.length === 1) {
+ list.length = 0;
+ delete this._events[type];
+ } else {
+ list.splice(position, 1);
+ }
+
+ if (this._events.removeListener) this.emit('removeListener', type, listener);
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function (type) {
+ var key, listeners;
+ if (!this._events) return this; // not listening for removeListener, no need to emit
+
+ if (!this._events.removeListener) {
+ if (arguments.length === 0) this._events = {};else if (this._events[type]) delete this._events[type];
+ return this;
+ } // emit removeListener for all listeners on all events
+
+
+ if (arguments.length === 0) {
+ for (key in this._events) {
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+
+ this.removeAllListeners('removeListener');
+ this._events = {};
+ return this;
+ }
+
+ listeners = this._events[type];
+
+ if (isFunction(listeners)) {
+ this.removeListener(type, listeners);
+ } else if (listeners) {
+ // LIFO order
+ while (listeners.length) {
+ this.removeListener(type, listeners[listeners.length - 1]);
+ }
+ }
+
+ delete this._events[type];
+ return this;
+};
+
+EventEmitter.prototype.listeners = function (type) {
+ var ret;
+ if (!this._events || !this._events[type]) ret = [];else if (isFunction(this._events[type])) ret = [this._events[type]];else ret = this._events[type].slice();
+ return ret;
+};
+
+EventEmitter.prototype.listenerCount = function (type) {
+ if (this._events) {
+ var evlistener = this._events[type];
+ if (isFunction(evlistener)) return 1;else if (evlistener) return evlistener.length;
+ }
+
+ return 0;
+};
+
+EventEmitter.listenerCount = function (emitter, type) {
+ return emitter.listenerCount(type);
+};
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+
+function isObject(arg) {
+ return _typeof(arg) === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+
+/***/ }),
+
+/***/ "./node_modules/form-data/lib/browser.js":
+/*!***********************************************!*\
+ !*** ./node_modules/form-data/lib/browser.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+/* eslint-env browser */
+module.exports = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' ? self.FormData : window.FormData;
+
+/***/ }),
+
+/***/ "./node_modules/https-browserify/index.js":
+/*!************************************************!*\
+ !*** ./node_modules/https-browserify/index.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var http = __webpack_require__(/*! http */ "./node_modules/stream-http/index.js");
+
+var url = __webpack_require__(/*! url */ "./node_modules/url/url.js");
+
+var https = module.exports;
+
+for (var key in http) {
+ if (http.hasOwnProperty(key)) https[key] = http[key];
+}
+
+https.request = function (params, cb) {
+ params = validateParams(params);
+ return http.request.call(this, params, cb);
+};
+
+https.get = function (params, cb) {
+ params = validateParams(params);
+ return http.get.call(this, params, cb);
+};
+
+function validateParams(params) {
+ if (typeof params === 'string') {
+ params = url.parse(params);
+ }
+
+ if (!params.protocol) {
+ params.protocol = 'https:';
+ }
+
+ if (params.protocol !== 'https:') {
+ throw new Error('Protocol "' + params.protocol + '" not supported. Expected "https:"');
+ }
+
+ return params;
+}
+
+/***/ }),
+
+/***/ "./node_modules/ieee754/index.js":
+/*!***************************************!*\
+ !*** ./node_modules/ieee754/index.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+ var e, m;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var nBits = -7;
+ var i = isLE ? nBytes - 1 : 0;
+ var d = isLE ? -1 : 1;
+ var s = buffer[offset + i];
+ i += d;
+ e = s & (1 << -nBits) - 1;
+ s >>= -nBits;
+ nBits += eLen;
+
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & (1 << -nBits) - 1;
+ e >>= -nBits;
+ nBits += mLen;
+
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : (s ? -1 : 1) * Infinity;
+ } else {
+ m = m + Math.pow(2, mLen);
+ e = e - eBias;
+ }
+
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
+};
+
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
+ var i = isLE ? 0 : nBytes - 1;
+ var d = isLE ? 1 : -1;
+ var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
+ value = Math.abs(value);
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0;
+ e = eMax;
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2);
+
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * Math.pow(2, 1 - eBias);
+ }
+
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+ e = 0;
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = e << mLen | m;
+ eLen += mLen;
+
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128;
+};
+
+/***/ }),
+
+/***/ "./node_modules/inherits/inherits_browser.js":
+/*!***************************************************!*\
+ !*** ./node_modules/inherits/inherits_browser.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor;
+
+ var TempCtor = function TempCtor() {};
+
+ TempCtor.prototype = superCtor.prototype;
+ ctor.prototype = new TempCtor();
+ ctor.prototype.constructor = ctor;
+ };
+}
+
+/***/ }),
+
+/***/ "./node_modules/isarray/index.js":
+/*!***************************************!*\
+ !*** ./node_modules/isarray/index.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = Array.isArray || function (arr) {
+ return toString.call(arr) == '[object Array]';
+};
+
+/***/ }),
+
+/***/ "./node_modules/process-nextick-args/index.js":
+/*!****************************************************!*\
+ !*** ./node_modules/process-nextick-args/index.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {
+
+if (!process.version || process.version.indexOf('v0.') === 0 || process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+ module.exports = {
+ nextTick: nextTick
+ };
+} else {
+ module.exports = process;
+}
+
+function nextTick(fn, arg1, arg2, arg3) {
+ if (typeof fn !== 'function') {
+ throw new TypeError('"callback" argument must be a function');
+ }
+
+ var len = arguments.length;
+ var args, i;
+
+ switch (len) {
+ case 0:
+ case 1:
+ return process.nextTick(fn);
+
+ case 2:
+ return process.nextTick(function afterTickOne() {
+ fn.call(null, arg1);
+ });
+
+ case 3:
+ return process.nextTick(function afterTickTwo() {
+ fn.call(null, arg1, arg2);
+ });
+
+ case 4:
+ return process.nextTick(function afterTickThree() {
+ fn.call(null, arg1, arg2, arg3);
+ });
+
+ default:
+ args = new Array(len - 1);
+ i = 0;
+
+ while (i < args.length) {
+ args[i++] = arguments[i];
+ }
+
+ return process.nextTick(function afterTick() {
+ fn.apply(null, args);
+ });
+ }
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/process/browser.js":
+/*!*****************************************!*\
+ !*** ./node_modules/process/browser.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+
+function defaultClearTimeout() {
+ throw new Error('clearTimeout has not been defined');
+}
+
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+})();
+
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ } // if setTimeout wasn't available but was latter defined
+
+
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+}
+
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ } // if clearTimeout wasn't available but was latter defined
+
+
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+}
+
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+
+ draining = false;
+
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+ var len = queue.length;
+
+ while (len) {
+ currentQueue = queue;
+ queue = [];
+
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+
+ queueIndex = -1;
+ len = queue.length;
+ }
+
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+
+ queue.push(new Item(fun, args));
+
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+}; // v8 likes predictible objects
+
+
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) {
+ return [];
+};
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () {
+ return '/';
+};
+
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+
+process.umask = function () {
+ return 0;
+};
+
+/***/ }),
+
+/***/ "./node_modules/punycode/punycode.js":
+/*!*******************************************!*\
+ !*** ./node_modules/punycode/punycode.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+/*! https://mths.be/punycode v1.4.1 by @mathias */
+;
+
+(function (root) {
+ /** Detect free variables */
+ var freeExports = ( false ? undefined : _typeof(exports)) == 'object' && exports && !exports.nodeType && exports;
+ var freeModule = ( false ? undefined : _typeof(module)) == 'object' && module && !module.nodeType && module;
+ var freeGlobal = (typeof global === "undefined" ? "undefined" : _typeof(global)) == 'object' && global;
+
+ if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) {
+ root = freeGlobal;
+ }
+ /**
+ * The `punycode` object.
+ * @name punycode
+ * @type Object
+ */
+
+
+ var punycode,
+
+ /** Highest positive signed 32-bit float value */
+ maxInt = 2147483647,
+ // aka. 0x7FFFFFFF or 2^31-1
+
+ /** Bootstring parameters */
+ base = 36,
+ tMin = 1,
+ tMax = 26,
+ skew = 38,
+ damp = 700,
+ initialBias = 72,
+ initialN = 128,
+ // 0x80
+ delimiter = '-',
+ // '\x2D'
+
+ /** Regular expressions */
+ regexPunycode = /^xn--/,
+ regexNonASCII = /[^\x20-\x7E]/,
+ // unprintable ASCII chars + non-ASCII chars
+ regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g,
+ // RFC 3490 separators
+
+ /** Error messages */
+ errors = {
+ 'overflow': 'Overflow: input needs wider integers to process',
+ 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
+ 'invalid-input': 'Invalid input'
+ },
+
+ /** Convenience shortcuts */
+ baseMinusTMin = base - tMin,
+ floor = Math.floor,
+ stringFromCharCode = String.fromCharCode,
+
+ /** Temporary variable */
+ key;
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * A generic error utility function.
+ * @private
+ * @param {String} type The error type.
+ * @returns {Error} Throws a `RangeError` with the applicable error message.
+ */
+
+ function error(type) {
+ throw new RangeError(errors[type]);
+ }
+ /**
+ * A generic `Array#map` utility function.
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} callback The function that gets called for every array
+ * item.
+ * @returns {Array} A new array of values returned by the callback function.
+ */
+
+
+ function map(array, fn) {
+ var length = array.length;
+ var result = [];
+
+ while (length--) {
+ result[length] = fn(array[length]);
+ }
+
+ return result;
+ }
+ /**
+ * A simple `Array#map`-like wrapper to work with domain name strings or email
+ * addresses.
+ * @private
+ * @param {String} domain The domain name or email address.
+ * @param {Function} callback The function that gets called for every
+ * character.
+ * @returns {Array} A new string of characters returned by the callback
+ * function.
+ */
+
+
+ function mapDomain(string, fn) {
+ var parts = string.split('@');
+ var result = '';
+
+ if (parts.length > 1) {
+ // In email addresses, only the domain name should be punycoded. Leave
+ // the local part (i.e. everything up to `@`) intact.
+ result = parts[0] + '@';
+ string = parts[1];
+ } // Avoid `split(regex)` for IE8 compatibility. See #17.
+
+
+ string = string.replace(regexSeparators, '\x2E');
+ var labels = string.split('.');
+ var encoded = map(labels, fn).join('.');
+ return result + encoded;
+ }
+ /**
+ * Creates an array containing the numeric code points of each Unicode
+ * character in the string. While JavaScript uses UCS-2 internally,
+ * this function will convert a pair of surrogate halves (each of which
+ * UCS-2 exposes as separate characters) into a single code point,
+ * matching UTF-16.
+ * @see `punycode.ucs2.encode`
+ * @see <https://mathiasbynens.be/notes/javascript-encoding>
+ * @memberOf punycode.ucs2
+ * @name decode
+ * @param {String} string The Unicode input string (UCS-2).
+ * @returns {Array} The new array of code points.
+ */
+
+
+ function ucs2decode(string) {
+ var output = [],
+ counter = 0,
+ length = string.length,
+ value,
+ extra;
+
+ while (counter < length) {
+ value = string.charCodeAt(counter++);
+
+ if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
+ // high surrogate, and there is a next character
+ extra = string.charCodeAt(counter++);
+
+ if ((extra & 0xFC00) == 0xDC00) {
+ // low surrogate
+ output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
+ } else {
+ // unmatched surrogate; only append this code unit, in case the next
+ // code unit is the high surrogate of a surrogate pair
+ output.push(value);
+ counter--;
+ }
+ } else {
+ output.push(value);
+ }
+ }
+
+ return output;
+ }
+ /**
+ * Creates a string based on an array of numeric code points.
+ * @see `punycode.ucs2.decode`
+ * @memberOf punycode.ucs2
+ * @name encode
+ * @param {Array} codePoints The array of numeric code points.
+ * @returns {String} The new Unicode string (UCS-2).
+ */
+
+
+ function ucs2encode(array) {
+ return map(array, function (value) {
+ var output = '';
+
+ if (value > 0xFFFF) {
+ value -= 0x10000;
+ output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
+ value = 0xDC00 | value & 0x3FF;
+ }
+
+ output += stringFromCharCode(value);
+ return output;
+ }).join('');
+ }
+ /**
+ * Converts a basic code point into a digit/integer.
+ * @see `digitToBasic()`
+ * @private
+ * @param {Number} codePoint The basic numeric code point value.
+ * @returns {Number} The numeric value of a basic code point (for use in
+ * representing integers) in the range `0` to `base - 1`, or `base` if
+ * the code point does not represent a value.
+ */
+
+
+ function basicToDigit(codePoint) {
+ if (codePoint - 48 < 10) {
+ return codePoint - 22;
+ }
+
+ if (codePoint - 65 < 26) {
+ return codePoint - 65;
+ }
+
+ if (codePoint - 97 < 26) {
+ return codePoint - 97;
+ }
+
+ return base;
+ }
+ /**
+ * Converts a digit/integer into a basic code point.
+ * @see `basicToDigit()`
+ * @private
+ * @param {Number} digit The numeric value of a basic code point.
+ * @returns {Number} The basic code point whose value (when used for
+ * representing integers) is `digit`, which needs to be in the range
+ * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+ * used; else, the lowercase form is used. The behavior is undefined
+ * if `flag` is non-zero and `digit` has no uppercase form.
+ */
+
+
+ function digitToBasic(digit, flag) {
+ // 0..25 map to ASCII a..z or A..Z
+ // 26..35 map to ASCII 0..9
+ return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
+ }
+ /**
+ * Bias adaptation function as per section 3.4 of RFC 3492.
+ * https://tools.ietf.org/html/rfc3492#section-3.4
+ * @private
+ */
+
+
+ function adapt(delta, numPoints, firstTime) {
+ var k = 0;
+ delta = firstTime ? floor(delta / damp) : delta >> 1;
+ delta += floor(delta / numPoints);
+
+ for (;
+ /* no initialization */
+ delta > baseMinusTMin * tMax >> 1; k += base) {
+ delta = floor(delta / baseMinusTMin);
+ }
+
+ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+ }
+ /**
+ * Converts a Punycode string of ASCII-only symbols to a string of Unicode
+ * symbols.
+ * @memberOf punycode
+ * @param {String} input The Punycode string of ASCII-only symbols.
+ * @returns {String} The resulting string of Unicode symbols.
+ */
+
+
+ function decode(input) {
+ // Don't use UCS-2
+ var output = [],
+ inputLength = input.length,
+ out,
+ i = 0,
+ n = initialN,
+ bias = initialBias,
+ basic,
+ j,
+ index,
+ oldi,
+ w,
+ k,
+ digit,
+ t,
+
+ /** Cached calculation results */
+ baseMinusT; // Handle the basic code points: let `basic` be the number of input code
+ // points before the last delimiter, or `0` if there is none, then copy
+ // the first basic code points to the output.
+
+ basic = input.lastIndexOf(delimiter);
+
+ if (basic < 0) {
+ basic = 0;
+ }
+
+ for (j = 0; j < basic; ++j) {
+ // if it's not a basic code point
+ if (input.charCodeAt(j) >= 0x80) {
+ error('not-basic');
+ }
+
+ output.push(input.charCodeAt(j));
+ } // Main decoding loop: start just after the last delimiter if any basic code
+ // points were copied; start at the beginning otherwise.
+
+
+ for (index = basic > 0 ? basic + 1 : 0; index < inputLength;)
+ /* no final expression */
+ {
+ // `index` is the index of the next character to be consumed.
+ // Decode a generalized variable-length integer into `delta`,
+ // which gets added to `i`. The overflow checking is easier
+ // if we increase `i` as we go, then subtract off its starting
+ // value at the end to obtain `delta`.
+ for (oldi = i, w = 1, k = base;;
+ /* no condition */
+ k += base) {
+ if (index >= inputLength) {
+ error('invalid-input');
+ }
+
+ digit = basicToDigit(input.charCodeAt(index++));
+
+ if (digit >= base || digit > floor((maxInt - i) / w)) {
+ error('overflow');
+ }
+
+ i += digit * w;
+ t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
+
+ if (digit < t) {
+ break;
+ }
+
+ baseMinusT = base - t;
+
+ if (w > floor(maxInt / baseMinusT)) {
+ error('overflow');
+ }
+
+ w *= baseMinusT;
+ }
+
+ out = output.length + 1;
+ bias = adapt(i - oldi, out, oldi == 0); // `i` was supposed to wrap around from `out` to `0`,
+ // incrementing `n` each time, so we'll fix that now:
+
+ if (floor(i / out) > maxInt - n) {
+ error('overflow');
+ }
+
+ n += floor(i / out);
+ i %= out; // Insert `n` at position `i` of the output
+
+ output.splice(i++, 0, n);
+ }
+
+ return ucs2encode(output);
+ }
+ /**
+ * Converts a string of Unicode symbols (e.g. a domain name label) to a
+ * Punycode string of ASCII-only symbols.
+ * @memberOf punycode
+ * @param {String} input The string of Unicode symbols.
+ * @returns {String} The resulting Punycode string of ASCII-only symbols.
+ */
+
+
+ function encode(input) {
+ var n,
+ delta,
+ handledCPCount,
+ basicLength,
+ bias,
+ j,
+ m,
+ q,
+ k,
+ t,
+ currentValue,
+ output = [],
+
+ /** `inputLength` will hold the number of code points in `input`. */
+ inputLength,
+
+ /** Cached calculation results */
+ handledCPCountPlusOne,
+ baseMinusT,
+ qMinusT; // Convert the input in UCS-2 to Unicode
+
+ input = ucs2decode(input); // Cache the length
+
+ inputLength = input.length; // Initialize the state
+
+ n = initialN;
+ delta = 0;
+ bias = initialBias; // Handle the basic code points
+
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+
+ if (currentValue < 0x80) {
+ output.push(stringFromCharCode(currentValue));
+ }
+ }
+
+ handledCPCount = basicLength = output.length; // `handledCPCount` is the number of code points that have been handled;
+ // `basicLength` is the number of basic code points.
+ // Finish the basic string - if it is not empty - with a delimiter
+
+ if (basicLength) {
+ output.push(delimiter);
+ } // Main encoding loop:
+
+
+ while (handledCPCount < inputLength) {
+ // All non-basic code points < n have been handled already. Find the next
+ // larger one:
+ for (m = maxInt, j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+
+ if (currentValue >= n && currentValue < m) {
+ m = currentValue;
+ }
+ } // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
+ // but guard against overflow
+
+
+ handledCPCountPlusOne = handledCPCount + 1;
+
+ if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+ error('overflow');
+ }
+
+ delta += (m - n) * handledCPCountPlusOne;
+ n = m;
+
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+
+ if (currentValue < n && ++delta > maxInt) {
+ error('overflow');
+ }
+
+ if (currentValue == n) {
+ // Represent delta as a generalized variable-length integer
+ for (q = delta, k = base;;
+ /* no condition */
+ k += base) {
+ t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
+
+ if (q < t) {
+ break;
+ }
+
+ qMinusT = q - t;
+ baseMinusT = base - t;
+ output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
+ q = floor(qMinusT / baseMinusT);
+ }
+
+ output.push(stringFromCharCode(digitToBasic(q, 0)));
+ bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
+ delta = 0;
+ ++handledCPCount;
+ }
+ }
+
+ ++delta;
+ ++n;
+ }
+
+ return output.join('');
+ }
+ /**
+ * Converts a Punycode string representing a domain name or an email address
+ * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
+ * it doesn't matter if you call it on a string that has already been
+ * converted to Unicode.
+ * @memberOf punycode
+ * @param {String} input The Punycoded domain name or email address to
+ * convert to Unicode.
+ * @returns {String} The Unicode representation of the given Punycode
+ * string.
+ */
+
+
+ function toUnicode(input) {
+ return mapDomain(input, function (string) {
+ return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
+ });
+ }
+ /**
+ * Converts a Unicode string representing a domain name or an email address to
+ * Punycode. Only the non-ASCII parts of the domain name will be converted,
+ * i.e. it doesn't matter if you call it with a domain that's already in
+ * ASCII.
+ * @memberOf punycode
+ * @param {String} input The domain name or email address to convert, as a
+ * Unicode string.
+ * @returns {String} The Punycode representation of the given domain name or
+ * email address.
+ */
+
+
+ function toASCII(input) {
+ return mapDomain(input, function (string) {
+ return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
+ });
+ }
+ /*--------------------------------------------------------------------------*/
+
+ /** Define the public API */
+
+
+ punycode = {
+ /**
+ * A string representing the current Punycode.js version number.
+ * @memberOf punycode
+ * @type String
+ */
+ 'version': '1.4.1',
+
+ /**
+ * An object of methods to convert from JavaScript's internal character
+ * representation (UCS-2) to Unicode code points, and back.
+ * @see <https://mathiasbynens.be/notes/javascript-encoding>
+ * @memberOf punycode
+ * @type Object
+ */
+ 'ucs2': {
+ 'decode': ucs2decode,
+ 'encode': ucs2encode
+ },
+ 'decode': decode,
+ 'encode': encode,
+ 'toASCII': toASCII,
+ 'toUnicode': toUnicode
+ };
+ /** Expose `punycode` */
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
+ // like the following:
+
+ if ("function" == 'function' && _typeof(__webpack_require__(/*! !webpack amd options */ "./node_modules/webpack/buildin/amd-options.js")) == 'object' && __webpack_require__(/*! !webpack amd options */ "./node_modules/webpack/buildin/amd-options.js")) {
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
+ return punycode;
+ }).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ } else if (freeExports && freeModule) {
+ if (module.exports == freeExports) {
+ // in Node.js, io.js, or RingoJS v0.8.0+
+ freeModule.exports = punycode;
+ } else {
+ // in Narwhal or RingoJS v0.7.0-
+ for (key in punycode) {
+ punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
+ }
+ }
+ } else {
+ // in Rhino or a web browser
+ root.punycode = punycode;
+ }
+})(this);
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module), __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/querystring-es3/decode.js":
+/*!************************************************!*\
+ !*** ./node_modules/querystring-es3/decode.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ // If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+module.exports = function (qs, sep, eq, options) {
+ sep = sep || '&';
+ eq = eq || '=';
+ var obj = {};
+
+ if (typeof qs !== 'string' || qs.length === 0) {
+ return obj;
+ }
+
+ var regexp = /\+/g;
+ qs = qs.split(sep);
+ var maxKeys = 1000;
+
+ if (options && typeof options.maxKeys === 'number') {
+ maxKeys = options.maxKeys;
+ }
+
+ var len = qs.length; // maxKeys <= 0 means that we should not limit keys count
+
+ if (maxKeys > 0 && len > maxKeys) {
+ len = maxKeys;
+ }
+
+ for (var i = 0; i < len; ++i) {
+ var x = qs[i].replace(regexp, '%20'),
+ idx = x.indexOf(eq),
+ kstr,
+ vstr,
+ k,
+ v;
+
+ if (idx >= 0) {
+ kstr = x.substr(0, idx);
+ vstr = x.substr(idx + 1);
+ } else {
+ kstr = x;
+ vstr = '';
+ }
+
+ k = decodeURIComponent(kstr);
+ v = decodeURIComponent(vstr);
+
+ if (!hasOwnProperty(obj, k)) {
+ obj[k] = v;
+ } else if (isArray(obj[k])) {
+ obj[k].push(v);
+ } else {
+ obj[k] = [obj[k], v];
+ }
+ }
+
+ return obj;
+};
+
+var isArray = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+/***/ }),
+
+/***/ "./node_modules/querystring-es3/encode.js":
+/*!************************************************!*\
+ !*** ./node_modules/querystring-es3/encode.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var stringifyPrimitive = function stringifyPrimitive(v) {
+ switch (_typeof(v)) {
+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+};
+
+module.exports = function (obj, sep, eq, name) {
+ sep = sep || '&';
+ eq = eq || '=';
+
+ if (obj === null) {
+ obj = undefined;
+ }
+
+ if (_typeof(obj) === 'object') {
+ return map(objectKeys(obj), function (k) {
+ var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+
+ if (isArray(obj[k])) {
+ return map(obj[k], function (v) {
+ return ks + encodeURIComponent(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+ }
+
+ if (!name) return '';
+ return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));
+};
+
+var isArray = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+function map(xs, f) {
+ if (xs.map) return xs.map(f);
+ var res = [];
+
+ for (var i = 0; i < xs.length; i++) {
+ res.push(f(xs[i], i));
+ }
+
+ return res;
+}
+
+var objectKeys = Object.keys || function (obj) {
+ var res = [];
+
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+ }
+
+ return res;
+};
+
+/***/ }),
+
+/***/ "./node_modules/querystring-es3/index.js":
+/*!***********************************************!*\
+ !*** ./node_modules/querystring-es3/index.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.decode = exports.parse = __webpack_require__(/*! ./decode */ "./node_modules/querystring-es3/decode.js");
+exports.encode = exports.stringify = __webpack_require__(/*! ./encode */ "./node_modules/querystring-es3/encode.js");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_duplex.js":
+/*!************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_duplex.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+
+ for (var key in obj) {
+ keys.push(key);
+ }
+
+ return keys;
+};
+/*</replacement>*/
+
+
+module.exports = Duplex;
+/*<replacement>*/
+
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+var Readable = __webpack_require__(/*! ./_stream_readable */ "./node_modules/readable-stream/lib/_stream_readable.js");
+
+var Writable = __webpack_require__(/*! ./_stream_writable */ "./node_modules/readable-stream/lib/_stream_writable.js");
+
+util.inherits(Duplex, Readable);
+{
+ // avoid scope creep, the keys array can then be collected
+ var keys = objectKeys(Writable.prototype);
+
+ for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+ }
+}
+
+function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+ Readable.call(this, options);
+ Writable.call(this, options);
+ if (options && options.readable === false) this.readable = false;
+ if (options && options.writable === false) this.writable = false;
+ this.allowHalfOpen = true;
+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+ this.once('end', onend);
+}
+
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.highWaterMark;
+ }
+}); // the no-half-open enforcer
+
+function onend() {
+ // if we allow half-open state, or if the writable side ended,
+ // then we're ok.
+ if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written.
+ // But allow more writes to happen in this tick.
+
+ pna.nextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+ self.end();
+}
+
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+ get: function get() {
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return false;
+ }
+
+ return this._readableState.destroyed && this._writableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return;
+ } // backward compatibility, the user is explicitly
+ // managing destroyed
+
+
+ this._readableState.destroyed = value;
+ this._writableState.destroyed = value;
+ }
+});
+
+Duplex.prototype._destroy = function (err, cb) {
+ this.push(null);
+ this.end();
+ pna.nextTick(cb, err);
+};
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_passthrough.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_passthrough.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+
+module.exports = PassThrough;
+
+var Transform = __webpack_require__(/*! ./_stream_transform */ "./node_modules/readable-stream/lib/_stream_transform.js");
+/*<replacement>*/
+
+
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+ Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+};
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_readable.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_readable.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+
+
+module.exports = Readable;
+/*<replacement>*/
+
+var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var Duplex;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+/*<replacement>*/
+
+var EE = __webpack_require__(/*! events */ "./node_modules/events/events.js").EventEmitter;
+
+var EElistenerCount = function EElistenerCount(emitter, type) {
+ return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var Stream = __webpack_require__(/*! ./internal/streams/stream */ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+
+var OurUint8Array = global.Uint8Array || function () {};
+
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+var debugUtil = __webpack_require__(/*! util */ 7);
+
+var debug = void 0;
+
+if (debugUtil && debugUtil.debuglog) {
+ debug = debugUtil.debuglog('stream');
+} else {
+ debug = function debug() {};
+}
+/*</replacement>*/
+
+
+var BufferList = __webpack_require__(/*! ./internal/streams/BufferList */ "./node_modules/readable-stream/lib/internal/streams/BufferList.js");
+
+var destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js");
+
+var StringDecoder;
+util.inherits(Readable, Stream);
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+
+function ReadableState(options, stream) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+ options = options || {}; // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+
+ var isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+
+ this.objectMode = !!options.objectMode;
+ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+
+ var hwm = options.highWaterMark;
+ var readableHwm = options.readableHighWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; // cast to ints.
+
+ this.highWaterMark = Math.floor(this.highWaterMark); // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted
+ // immediately, or on a later tick. We set this to true at first, because
+ // any actions that shouldn't happen until "later" should generally also
+ // not happen before the first read call.
+
+ this.sync = true; // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false; // has it been destroyed
+
+ this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+
+ this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s
+
+ this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled
+
+ this.readingMore = false;
+ this.decoder = null;
+ this.encoding = null;
+
+ if (options.encoding) {
+ if (!StringDecoder) StringDecoder = __webpack_require__(/*! string_decoder/ */ "./node_modules/string_decoder/lib/string_decoder.js").StringDecoder;
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+}
+
+function Readable(options) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+ if (!(this instanceof Readable)) return new Readable(options);
+ this._readableState = new ReadableState(options, this); // legacy
+
+ this.readable = true;
+
+ if (options) {
+ if (typeof options.read === 'function') this._read = options.read;
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ }
+
+ Stream.call(this);
+}
+
+Object.defineProperty(Readable.prototype, 'destroyed', {
+ get: function get() {
+ if (this._readableState === undefined) {
+ return false;
+ }
+
+ return this._readableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._readableState) {
+ return;
+ } // backward compatibility, the user is explicitly
+ // managing destroyed
+
+
+ this._readableState.destroyed = value;
+ }
+});
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+
+Readable.prototype._destroy = function (err, cb) {
+ this.push(null);
+ cb(err);
+}; // Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+
+
+Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+ var skipChunkCheck;
+
+ if (!state.objectMode) {
+ if (typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+
+ if (encoding !== state.encoding) {
+ chunk = Buffer.from(chunk, encoding);
+ encoding = '';
+ }
+
+ skipChunkCheck = true;
+ }
+ } else {
+ skipChunkCheck = true;
+ }
+
+ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+}; // Unshift should *always* be something directly out of read()
+
+
+Readable.prototype.unshift = function (chunk) {
+ return readableAddChunk(this, chunk, null, true, false);
+};
+
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+ var state = stream._readableState;
+
+ if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else {
+ var er;
+ if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+
+ if (er) {
+ stream.emit('error', er);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+
+ if (addToFront) {
+ if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
+ } else if (state.ended) {
+ stream.emit('error', new Error('stream.push() after EOF'));
+ } else {
+ state.reading = false;
+
+ if (state.decoder && !encoding) {
+ chunk = state.decoder.write(chunk);
+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+ } else {
+ addChunk(stream, state, chunk, false);
+ }
+ }
+ } else if (!addToFront) {
+ state.reading = false;
+ }
+ }
+
+ return needMoreData(state);
+}
+
+function addChunk(stream, state, chunk, addToFront) {
+ if (state.flowing && state.length === 0 && !state.sync) {
+ stream.emit('data', chunk);
+ stream.read(0);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+ if (state.needReadable) emitReadable(stream);
+ }
+
+ maybeReadMore(stream, state);
+}
+
+function chunkInvalid(state, chunk) {
+ var er;
+
+ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+
+ return er;
+} // if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes. This is to work around cases where hwm=0,
+// such as the repl. Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+
+
+function needMoreData(state) {
+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+}
+
+Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+}; // backwards compatibility.
+
+
+Readable.prototype.setEncoding = function (enc) {
+ if (!StringDecoder) StringDecoder = __webpack_require__(/*! string_decoder/ */ "./node_modules/string_decoder/lib/string_decoder.js").StringDecoder;
+ this._readableState.decoder = new StringDecoder(enc);
+ this._readableState.encoding = enc;
+ return this;
+}; // Don't raise the hwm > 8MB
+
+
+var MAX_HWM = 0x800000;
+
+function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ n = MAX_HWM;
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
+ }
+
+ return n;
+} // This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+
+function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+ } // If we're asking for more than the current hwm, then raise the hwm.
+
+
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n; // Don't have enough
+
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+
+ return state.length;
+} // you can override either this method, or the async _read(n) below.
+
+
+Readable.prototype.read = function (n) {
+ debug('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+ if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+
+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+ debug('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
+ }
+
+ n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.
+
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
+ } // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+ // if we need a readable event, then we need to do some reading.
+
+
+ var doRead = state.needReadable;
+ debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some
+
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug('length less than watermark', doRead);
+ } // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+
+
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug('reading or ended', doRead);
+ } else if (doRead) {
+ debug('do read');
+ state.reading = true;
+ state.sync = true; // if the length is currently zero, then we *need* a readable event.
+
+ if (state.length === 0) state.needReadable = true; // call internal read method
+
+ this._read(state.highWaterMark);
+
+ state.sync = false; // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+
+ if (ret === null) {
+ state.needReadable = true;
+ n = 0;
+ } else {
+ state.length -= n;
+ }
+
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.
+
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+
+ if (ret !== null) this.emit('data', ret);
+ return ret;
+};
+
+function onEofChunk(stream, state) {
+ if (state.ended) return;
+
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
+ }
+ }
+
+ state.ended = true; // emit 'readable' now to make sure it gets picked up.
+
+ emitReadable(stream);
+} // Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow. This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+
+
+function emitReadable(stream) {
+ var state = stream._readableState;
+ state.needReadable = false;
+
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
+ }
+}
+
+function emitReadable_(stream) {
+ debug('emit readable');
+ stream.emit('readable');
+ flow(stream);
+} // at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data. that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+
+
+function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ pna.nextTick(maybeReadMore_, stream, state);
+ }
+}
+
+function maybeReadMore_(stream, state) {
+ var len = state.length;
+
+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+ debug('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length) // didn't get any data, stop spinning.
+ break;else len = state.length;
+ }
+
+ state.readingMore = false;
+} // abstract method. to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+
+
+Readable.prototype._read = function (n) {
+ this.emit('error', new Error('_read() is not implemented'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+
+ state.pipesCount += 1;
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+ var endFn = doEnd ? onend : unpipe;
+ if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
+ dest.on('unpipe', onunpipe);
+
+ function onunpipe(readable, unpipeInfo) {
+ debug('onunpipe');
+
+ if (readable === src) {
+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+ unpipeInfo.hasUnpiped = true;
+ cleanup();
+ }
+ }
+ }
+
+ function onend() {
+ debug('onend');
+ dest.end();
+ } // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+
+
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+ var cleanedUp = false;
+
+ function cleanup() {
+ debug('cleanup'); // cleanup event handlers once the pipe is broken
+
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', unpipe);
+ src.removeListener('data', ondata);
+ cleanedUp = true; // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ } // If the user pushes more data while we're writing to dest then we'll end up
+ // in ondata again. However, we only want to increase awaitDrain once because
+ // dest will only emit one 'drain' event for the multiple writes.
+ // => Introduce a guard on increasing awaitDrain.
+
+
+ var increasedAwaitDrain = false;
+ src.on('data', ondata);
+
+ function ondata(chunk) {
+ debug('ondata');
+ increasedAwaitDrain = false;
+ var ret = dest.write(chunk);
+
+ if (false === ret && !increasedAwaitDrain) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug('false write response, pause', src._readableState.awaitDrain);
+ src._readableState.awaitDrain++;
+ increasedAwaitDrain = true;
+ }
+
+ src.pause();
+ }
+ } // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+
+
+ function onerror(er) {
+ debug('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+ } // Make sure our error handler is attached before userland ones.
+
+
+ prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.
+
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+
+ dest.once('close', onclose);
+
+ function onfinish() {
+ debug('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+
+ dest.once('finish', onfinish);
+
+ function unpipe() {
+ debug('unpipe');
+ src.unpipe(dest);
+ } // tell the dest that it's being piped to
+
+
+ dest.emit('pipe', src); // start the flow if it hasn't been started already.
+
+ if (!state.flowing) {
+ debug('pipe resume');
+ src.resume();
+ }
+
+ return dest;
+};
+
+function pipeOnDrain(src) {
+ return function () {
+ var state = src._readableState;
+ debug('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+ state.flowing = true;
+ flow(src);
+ }
+ };
+}
+
+Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState;
+ var unpipeInfo = {
+ hasUnpiped: false
+ }; // if we're not piping anywhere, then do nothing.
+
+ if (state.pipesCount === 0) return this; // just one destination. most common case.
+
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+ if (!dest) dest = state.pipes; // got a match.
+
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this, unpipeInfo);
+ return this;
+ } // slow case. multiple pipe destinations.
+
+
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+
+ for (var i = 0; i < len; i++) {
+ dests[i].emit('unpipe', this, unpipeInfo);
+ }
+
+ return this;
+ } // try to find the right one.
+
+
+ var index = indexOf(state.pipes, dest);
+ if (index === -1) return this;
+ state.pipes.splice(index, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+ dest.emit('unpipe', this, unpipeInfo);
+ return this;
+}; // set up data events if they are asked for
+// Ensure readable listeners eventually get something
+
+
+Readable.prototype.on = function (ev, fn) {
+ var res = Stream.prototype.on.call(this, ev, fn);
+
+ if (ev === 'data') {
+ // Start flowing on next tick if stream isn't explicitly paused
+ if (this._readableState.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ var state = this._readableState;
+
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.emittedReadable = false;
+
+ if (!state.reading) {
+ pna.nextTick(nReadingNextTick, this);
+ } else if (state.length) {
+ emitReadable(this);
+ }
+ }
+ }
+
+ return res;
+};
+
+Readable.prototype.addListener = Readable.prototype.on;
+
+function nReadingNextTick(self) {
+ debug('readable nexttick read 0');
+ self.read(0);
+} // pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+
+
+Readable.prototype.resume = function () {
+ var state = this._readableState;
+
+ if (!state.flowing) {
+ debug('resume');
+ state.flowing = true;
+ resume(this, state);
+ }
+
+ return this;
+};
+
+function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ pna.nextTick(resume_, stream, state);
+ }
+}
+
+function resume_(stream, state) {
+ if (!state.reading) {
+ debug('resume read 0');
+ stream.read(0);
+ }
+
+ state.resumeScheduled = false;
+ state.awaitDrain = 0;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing);
+
+ if (false !== this._readableState.flowing) {
+ debug('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+
+ return this;
+};
+
+function flow(stream) {
+ var state = stream._readableState;
+ debug('flow', state.flowing);
+
+ while (state.flowing && stream.read() !== null) {}
+} // wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+
+
+Readable.prototype.wrap = function (stream) {
+ var _this = this;
+
+ var state = this._readableState;
+ var paused = false;
+ stream.on('end', function () {
+ debug('wrapped end');
+
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) _this.push(chunk);
+ }
+
+ _this.push(null);
+ });
+ stream.on('data', function (chunk) {
+ debug('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode
+
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+ var ret = _this.push(chunk);
+
+ if (!ret) {
+ paused = true;
+ stream.pause();
+ }
+ }); // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function (method) {
+ return function () {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
+ }
+ } // proxy certain important events.
+
+
+ for (var n = 0; n < kProxyEvents.length; n++) {
+ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+ } // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+
+
+ this._read = function (n) {
+ debug('wrapped _read', n);
+
+ if (paused) {
+ paused = false;
+ stream.resume();
+ }
+ };
+
+ return this;
+};
+
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState.highWaterMark;
+ }
+}); // exposed for testing purposes only.
+
+Readable._fromList = fromList; // Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = fromListPartial(n, state.buffer, state.decoder);
+ }
+ return ret;
+} // Extracts only enough buffered data to satisfy the amount requested.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+
+function fromListPartial(n, list, hasStrings) {
+ var ret;
+
+ if (n < list.head.data.length) {
+ // slice is the same for buffers and strings
+ ret = list.head.data.slice(0, n);
+ list.head.data = list.head.data.slice(n);
+ } else if (n === list.head.data.length) {
+ // first chunk is a perfect match
+ ret = list.shift();
+ } else {
+ // result spans more than one buffer
+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+ }
+
+ return ret;
+} // Copies a specified amount of characters from the list of buffered data
+// chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+
+function copyFromBufferString(n, list) {
+ var p = list.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = str.slice(nb);
+ }
+
+ break;
+ }
+
+ ++c;
+ }
+
+ list.length -= c;
+ return ret;
+} // Copies a specified amount of bytes from the list of buffered data chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+
+function copyFromBuffer(n, list) {
+ var ret = Buffer.allocUnsafe(n);
+ var p = list.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = buf.slice(nb);
+ }
+
+ break;
+ }
+
+ ++c;
+ }
+
+ list.length -= c;
+ return ret;
+}
+
+function endReadable(stream) {
+ var state = stream._readableState; // If we get here before consuming all the bytes, then that is a
+ // bug in node. Should never happen.
+
+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+ if (!state.endEmitted) {
+ state.ended = true;
+ pna.nextTick(endReadableNT, state, stream);
+ }
+}
+
+function endReadableNT(state, stream) {
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ }
+}
+
+function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+
+ return -1;
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_transform.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_transform.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+// a transform stream is a readable/writable stream where you do
+// something with the data. Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored. (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation. For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes. When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up. When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer. When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks. If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk. However,
+// a pathological inflate type of transform can cause excessive buffering
+// here. For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output. In this case, you could write a very small
+// amount of input, and end up with a very large amount of output. In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform. A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+
+module.exports = Transform;
+
+var Duplex = __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+/*<replacement>*/
+
+
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+util.inherits(Transform, Duplex);
+
+function afterTransform(er, data) {
+ var ts = this._transformState;
+ ts.transforming = false;
+ var cb = ts.writecb;
+
+ if (!cb) {
+ return this.emit('error', new Error('write callback called multiple times'));
+ }
+
+ ts.writechunk = null;
+ ts.writecb = null;
+ if (data != null) // single equals check for both `null` and `undefined`
+ this.push(data);
+ cb(er);
+ var rs = this._readableState;
+ rs.reading = false;
+
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ this._read(rs.highWaterMark);
+ }
+}
+
+function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+ Duplex.call(this, options);
+ this._transformState = {
+ afterTransform: afterTransform.bind(this),
+ needTransform: false,
+ transforming: false,
+ writecb: null,
+ writechunk: null,
+ writeencoding: null
+ }; // start out asking for a readable event once data is transformed.
+
+ this._readableState.needReadable = true; // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+
+ this._readableState.sync = false;
+
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ } // When the writable side finishes, then flush out anything remaining.
+
+
+ this.on('prefinish', prefinish);
+}
+
+function prefinish() {
+ var _this = this;
+
+ if (typeof this._flush === 'function') {
+ this._flush(function (er, data) {
+ done(_this, er, data);
+ });
+ } else {
+ done(this, null, null);
+ }
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+}; // This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side. You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk. If you pass
+// an error, then that'll put the hurt on the whole operation. If you
+// never call cb(), then you'll never get another chunk.
+
+
+Transform.prototype._transform = function (chunk, encoding, cb) {
+ throw new Error('_transform() is not implemented');
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+}; // Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+
+
+Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+
+ if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+ ts.transforming = true;
+
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+};
+
+Transform.prototype._destroy = function (err, cb) {
+ var _this2 = this;
+
+ Duplex.prototype._destroy.call(this, err, function (err2) {
+ cb(err2);
+
+ _this2.emit('close');
+ });
+};
+
+function done(stream, er, data) {
+ if (er) return stream.emit('error', er);
+ if (data != null) // single equals check for both `null` and `undefined`
+ stream.push(data); // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+
+ if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
+ if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
+ return stream.push(null);
+}
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_writable.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_writable.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process, setImmediate, global) {// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+
+
+module.exports = Writable;
+/* <replacement> */
+
+function WriteReq(chunk, encoding, cb) {
+ this.chunk = chunk;
+ this.encoding = encoding;
+ this.callback = cb;
+ this.next = null;
+} // It seems a linked list but it is not
+// there will be only 2 of these for each stream
+
+
+function CorkedRequest(state) {
+ var _this = this;
+
+ this.next = null;
+ this.entry = null;
+
+ this.finish = function () {
+ onCorkedFinish(_this, state);
+ };
+}
+/* </replacement> */
+
+/*<replacement>*/
+
+
+var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Duplex;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+/*<replacement>*/
+
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+var internalUtil = {
+ deprecate: __webpack_require__(/*! util-deprecate */ "./node_modules/util-deprecate/browser.js")
+};
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Stream = __webpack_require__(/*! ./internal/streams/stream */ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+
+var OurUint8Array = global.Uint8Array || function () {};
+
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+/*</replacement>*/
+
+
+var destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js");
+
+util.inherits(Writable, Stream);
+
+function nop() {}
+
+function WritableState(options, stream) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+ options = options || {}; // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+
+ var isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+
+ this.objectMode = !!options.objectMode;
+ if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+
+ var hwm = options.highWaterMark;
+ var writableHwm = options.writableHighWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; // cast to ints.
+
+ this.highWaterMark = Math.floor(this.highWaterMark); // if _final has been called
+
+ this.finalCalled = false; // drain event flag.
+
+ this.needDrain = false; // at the start of calling end()
+
+ this.ending = false; // when end() has been called, and returned
+
+ this.ended = false; // when 'finish' is emitted
+
+ this.finished = false; // has it been destroyed
+
+ this.destroyed = false; // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+
+ this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+
+ this.length = 0; // a flag to see when we're in the middle of a write.
+
+ this.writing = false; // when true all writes will be buffered until .uncork() call
+
+ this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+
+ this.sync = true; // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+
+ this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)
+
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ }; // the callback that the user supplies to write(chunk,encoding,cb)
+
+
+ this.writecb = null; // the amount that is being written when _write is called.
+
+ this.writelen = 0;
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null; // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+
+ this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+
+ this.prefinished = false; // True if the error was already emitted and should not be thrown again
+
+ this.errorEmitted = false; // count buffered requests
+
+ this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+
+ this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+
+ return out;
+};
+
+(function () {
+ try {
+ Object.defineProperty(WritableState.prototype, 'buffer', {
+ get: internalUtil.deprecate(function () {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+ });
+ } catch (_) {}
+})(); // Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+
+
+var realHasInstance;
+
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+ realHasInstance = Function.prototype[Symbol.hasInstance];
+ Object.defineProperty(Writable, Symbol.hasInstance, {
+ value: function value(object) {
+ if (realHasInstance.call(this, object)) return true;
+ if (this !== Writable) return false;
+ return object && object._writableState instanceof WritableState;
+ }
+ });
+} else {
+ realHasInstance = function realHasInstance(object) {
+ return object instanceof this;
+ };
+}
+
+function Writable(options) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js"); // Writable ctor is applied to Duplexes, too.
+ // `realHasInstance` is necessary because using plain `instanceof`
+ // would return false, as no `_writableState` property is attached.
+ // Trying to use the custom `instanceof` for Writable here will also break the
+ // Node.js LazyTransform implementation, which has a non-trivial getter for
+ // `_writableState` that would lead to infinite recursion.
+
+ if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
+ return new Writable(options);
+ }
+
+ this._writableState = new WritableState(options, this); // legacy.
+
+ this.writable = true;
+
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+ if (typeof options.writev === 'function') this._writev = options.writev;
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ if (typeof options["final"] === 'function') this._final = options["final"];
+ }
+
+ Stream.call(this);
+} // Otherwise people can pipe Writable streams, which is just wrong.
+
+
+Writable.prototype.pipe = function () {
+ this.emit('error', new Error('Cannot pipe, not readable'));
+};
+
+function writeAfterEnd(stream, cb) {
+ var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb
+
+ stream.emit('error', er);
+ pna.nextTick(cb, er);
+} // Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+
+
+function validChunk(stream, state, chunk, cb) {
+ var valid = true;
+ var er = false;
+
+ if (chunk === null) {
+ er = new TypeError('May not write null values to stream');
+ } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+
+ if (er) {
+ stream.emit('error', er);
+ pna.nextTick(cb, er);
+ valid = false;
+ }
+
+ return valid;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+
+ var isBuf = !state.objectMode && _isUint8Array(chunk);
+
+ if (isBuf && !Buffer.isBuffer(chunk)) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+ if (typeof cb !== 'function') cb = nop;
+ if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+ }
+ return ret;
+};
+
+Writable.prototype.cork = function () {
+ var state = this._writableState;
+ state.corked++;
+};
+
+Writable.prototype.uncork = function () {
+ var state = this._writableState;
+
+ if (state.corked) {
+ state.corked--;
+ if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+};
+
+function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, encoding);
+ }
+
+ return chunk;
+}
+
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.highWaterMark;
+ }
+}); // if we're already writing something, then just put this
+// in the queue, and wait our turn. Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+ if (!isBuf) {
+ var newChunk = decodeChunk(state, chunk, encoding);
+
+ if (chunk !== newChunk) {
+ isBuf = true;
+ encoding = 'buffer';
+ chunk = newChunk;
+ }
+ }
+
+ var len = state.objectMode ? 1 : chunk.length;
+ state.length += len;
+ var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.
+
+ if (!ret) state.needDrain = true;
+
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = {
+ chunk: chunk,
+ encoding: encoding,
+ isBuf: isBuf,
+ callback: cb,
+ next: null
+ };
+
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+
+ return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+
+ if (sync) {
+ // defer the callback if we are being called synchronously
+ // to avoid piling up things on the stack
+ pna.nextTick(cb, er); // this can emit finish, and it will always happen
+ // after error
+
+ pna.nextTick(finishMaybe, stream, state);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ } else {
+ // the caller expect this to happen before if
+ // it is async
+ cb(er);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er); // this can emit finish, but finish must
+ // always follow error
+
+ finishMaybe(stream, state);
+ }
+}
+
+function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+ onwriteStateUpdate(state);
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state);
+
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+
+ if (sync) {
+ /*<replacement>*/
+ asyncWrite(afterWrite, stream, state, finished, cb);
+ /*</replacement>*/
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+}
+
+function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+} // Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+
+
+function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+} // if there's something in the buffer waiting, then process it
+
+
+function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+ var count = 0;
+ var allBuffers = true;
+
+ while (entry) {
+ buffer[count] = entry;
+ if (!entry.isBuf) allBuffers = false;
+ entry = entry.next;
+ count += 1;
+ }
+
+ buffer.allBuffers = allBuffers;
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+
+ state.bufferedRequestCount = 0;
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next;
+ state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+
+ if (state.writing) {
+ break;
+ }
+ }
+
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new Error('_write() is not implemented'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks
+
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ } // ignore unnecessary end() calls.
+
+
+ if (!state.ending && !state.finished) endWritable(this, state, cb);
+};
+
+function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+
+function callFinal(stream, state) {
+ stream._final(function (err) {
+ state.pendingcb--;
+
+ if (err) {
+ stream.emit('error', err);
+ }
+
+ state.prefinished = true;
+ stream.emit('prefinish');
+ finishMaybe(stream, state);
+ });
+}
+
+function prefinish(stream, state) {
+ if (!state.prefinished && !state.finalCalled) {
+ if (typeof stream._final === 'function') {
+ state.pendingcb++;
+ state.finalCalled = true;
+ pna.nextTick(callFinal, stream, state);
+ } else {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+ }
+}
+
+function finishMaybe(stream, state) {
+ var need = needFinish(state);
+
+ if (need) {
+ prefinish(stream, state);
+
+ if (state.pendingcb === 0) {
+ state.finished = true;
+ stream.emit('finish');
+ }
+ }
+
+ return need;
+}
+
+function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+
+ if (cb) {
+ if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
+ }
+
+ state.ended = true;
+ stream.writable = false;
+}
+
+function onCorkedFinish(corkReq, state, err) {
+ var entry = corkReq.entry;
+ corkReq.entry = null;
+
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+
+ if (state.corkedRequestsFree) {
+ state.corkedRequestsFree.next = corkReq;
+ } else {
+ state.corkedRequestsFree = corkReq;
+ }
+}
+
+Object.defineProperty(Writable.prototype, 'destroyed', {
+ get: function get() {
+ if (this._writableState === undefined) {
+ return false;
+ }
+
+ return this._writableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._writableState) {
+ return;
+ } // backward compatibility, the user is explicitly
+ // managing destroyed
+
+
+ this._writableState.destroyed = value;
+ }
+});
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+
+Writable.prototype._destroy = function (err, cb) {
+ this.end();
+ cb(err);
+};
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/BufferList.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/BufferList.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+}
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+
+var util = __webpack_require__(/*! util */ 8);
+
+function copyBuffer(src, target, offset) {
+ src.copy(target, offset);
+}
+
+module.exports = function () {
+ function BufferList() {
+ _classCallCheck(this, BufferList);
+
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+ }
+
+ BufferList.prototype.push = function push(v) {
+ var entry = {
+ data: v,
+ next: null
+ };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.unshift = function unshift(v) {
+ var entry = {
+ data: v,
+ next: this.head
+ };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.shift = function shift() {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+ };
+
+ BufferList.prototype.clear = function clear() {
+ this.head = this.tail = null;
+ this.length = 0;
+ };
+
+ BufferList.prototype.join = function join(s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+
+ while (p = p.next) {
+ ret += s + p.data;
+ }
+
+ return ret;
+ };
+
+ BufferList.prototype.concat = function concat(n) {
+ if (this.length === 0) return Buffer.alloc(0);
+ if (this.length === 1) return this.head.data;
+ var ret = Buffer.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+
+ while (p) {
+ copyBuffer(p.data, ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+
+ return ret;
+ };
+
+ return BufferList;
+}();
+
+if (util && util.inspect && util.inspect.custom) {
+ module.exports.prototype[util.inspect.custom] = function () {
+ var obj = util.inspect({
+ length: this.length
+ });
+ return this.constructor.name + ' ' + obj;
+ };
+}
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/destroy.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/destroy.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+// undocumented cb() API, needed for core, not for public API
+
+
+function destroy(err, cb) {
+ var _this = this;
+
+ var readableDestroyed = this._readableState && this._readableState.destroyed;
+ var writableDestroyed = this._writableState && this._writableState.destroyed;
+
+ if (readableDestroyed || writableDestroyed) {
+ if (cb) {
+ cb(err);
+ } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
+ pna.nextTick(emitErrorNT, this, err);
+ }
+
+ return this;
+ } // we set destroyed to true before firing error callbacks in order
+ // to make it re-entrance safe in case destroy() is called within callbacks
+
+
+ if (this._readableState) {
+ this._readableState.destroyed = true;
+ } // if this is a duplex stream mark the writable part as destroyed as well
+
+
+ if (this._writableState) {
+ this._writableState.destroyed = true;
+ }
+
+ this._destroy(err || null, function (err) {
+ if (!cb && err) {
+ pna.nextTick(emitErrorNT, _this, err);
+
+ if (_this._writableState) {
+ _this._writableState.errorEmitted = true;
+ }
+ } else if (cb) {
+ cb(err);
+ }
+ });
+
+ return this;
+}
+
+function undestroy() {
+ if (this._readableState) {
+ this._readableState.destroyed = false;
+ this._readableState.reading = false;
+ this._readableState.ended = false;
+ this._readableState.endEmitted = false;
+ }
+
+ if (this._writableState) {
+ this._writableState.destroyed = false;
+ this._writableState.ended = false;
+ this._writableState.ending = false;
+ this._writableState.finished = false;
+ this._writableState.errorEmitted = false;
+ }
+}
+
+function emitErrorNT(self, err) {
+ self.emit('error', err);
+}
+
+module.exports = {
+ destroy: destroy,
+ undestroy: undestroy
+};
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/stream-browser.js ***!
+ \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! events */ "./node_modules/events/events.js").EventEmitter;
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/readable-browser.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/readable-stream/readable-browser.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports = module.exports = __webpack_require__(/*! ./lib/_stream_readable.js */ "./node_modules/readable-stream/lib/_stream_readable.js");
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = __webpack_require__(/*! ./lib/_stream_writable.js */ "./node_modules/readable-stream/lib/_stream_writable.js");
+exports.Duplex = __webpack_require__(/*! ./lib/_stream_duplex.js */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+exports.Transform = __webpack_require__(/*! ./lib/_stream_transform.js */ "./node_modules/readable-stream/lib/_stream_transform.js");
+exports.PassThrough = __webpack_require__(/*! ./lib/_stream_passthrough.js */ "./node_modules/readable-stream/lib/_stream_passthrough.js");
+
+/***/ }),
+
+/***/ "./node_modules/remote-client/dist/remote.es6.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/remote-client/dist/remote.es6.js ***!
+ \*******************************************************/
+/*! exports provided: Client */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Client", function() { return t; });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+var t = /*#__PURE__*/function () {
+ function t(_t) {
+ _classCallCheck(this, t);
+
+ var e = _t.url,
+ s = _t.token;
+ this._url = e, this._token = s, this._mode = 1, this._seed = 1, this._queue = [], this.data = {}, this.api = {}, this._events = {};
+ }
+
+ _createClass(t, [{
+ key: "headers",
+ value: function headers() {
+ return {
+ Accept: "application/json",
+ "Content-Type": "application/json",
+ "Remote-Token": this._token
+ };
+ }
+ }, {
+ key: "fetch",
+ value: function (_fetch) {
+ function fetch(_x, _x2) {
+ return _fetch.apply(this, arguments);
+ }
+
+ fetch.toString = function () {
+ return _fetch.toString();
+ };
+
+ return fetch;
+ }(function (_t2, e) {
+ var s = {
+ credentials: "include",
+ headers: this.headers()
+ };
+ return e && (s.method = "POST", s.body = e), fetch(_t2, s).then(function (_t3) {
+ return _t3.json();
+ });
+ })
+ }, {
+ key: "load",
+ value: function load(_t4) {
+ var _this = this;
+
+ return _t4 && (this._url = _t4), this.fetch(this._url).then(function (_t5) {
+ return _this.parse(_t5);
+ });
+ }
+ }, {
+ key: "parse",
+ value: function parse(_t6) {
+ var e = _t6.key,
+ s = _t6.websocket;
+ e && (this._token = _t6.key);
+
+ for (var _e in _t6.data) {
+ this.data[_e] = _t6.data[_e];
+ }
+
+ for (var _e2 in _t6.api) {
+ var _s = this.api[_e2] = {},
+ i = _t6.api[_e2];
+
+ for (var _t29 in i) {
+ _s[_t29] = this._wrapper(_e2 + "." + _t29);
+ }
+ }
+
+ return s && this.connect(), this;
+ }
+ }, {
+ key: "connect",
+ value: function connect() {
+ var _this2 = this;
+
+ var _t8 = this._socket;
+ _t8 && (this._socket = null, _t8.onclose = function () {}, _t8.close()), this._mode = 2, this._socket = function (t, e, s, i) {
+ var n = e;
+ "/" === n[0] && (n = document.location.protocol + "//" + document.location.host + e);
+ n = n.replace(/^http(s|):/, "ws$1:");
+ var o = -1 != n.indexOf("?") ? "&" : "?";
+ n = "".concat(n).concat(o, "token=").concat(s, "&ws=1");
+ var r = new WebSocket(n);
+ return r.onclose = function () {
+ return setTimeout(function () {
+ return t.connect();
+ }, 2e3);
+ }, r.onmessage = function (e) {
+ var s = JSON.parse(e.data);
+
+ switch (s.action) {
+ case "result":
+ t.result(s.body, []);
+ break;
+
+ case "event":
+ t.fire(s.body.name, s.body.value);
+ break;
+
+ case "start":
+ i();
+ break;
+
+ default:
+ t.onError(s.data);
+ }
+ }, r;
+ }(this, this._url, this._token, function () {
+ return _this2._mode = 3, _this2._send(), _this2._resubscribe(), _this2;
+ });
+ }
+ }, {
+ key: "_wrapper",
+ value: function _wrapper(_t9) {
+ return function () {
+ var _this3 = this;
+
+ var e = [].slice.call(arguments);
+ var s = null;
+ var i = new Promise(function (i, n) {
+ s = {
+ data: {
+ id: _this3._uid(),
+ name: _t9,
+ args: e
+ },
+ status: 1,
+ resolve: i,
+ reject: n
+ }, _this3._queue.push(s);
+ });
+ return this.onCall(s, i), 3 === this._mode ? this._send(s) : setTimeout(function () {
+ return _this3._send();
+ }, 1), i;
+ }.bind(this);
+ }
+ }, {
+ key: "_uid",
+ value: function _uid() {
+ return (this._seed++).toString();
+ }
+ }, {
+ key: "_send",
+ value: function _send(_t10) {
+ var _this4 = this;
+
+ if (2 == this._mode) return void setTimeout(function () {
+ return _this4._send();
+ }, 100);
+ var e = _t10 ? [_t10] : this._queue.filter(function (_t11) {
+ return 1 === _t11.status;
+ });
+ if (!e.length) return;
+ var s = e.map(function (_t12) {
+ return _t12.status = 2, _t12.data;
+ });
+ 3 !== this._mode ? this.fetch(this._url, JSON.stringify(s))["catch"](function (_t13) {
+ return _this4.onError(_t13);
+ }).then(function (_t14) {
+ return _this4.result(_t14, s);
+ }) : this._socket.send(JSON.stringify({
+ action: "call",
+ body: s
+ }));
+ }
+ }, {
+ key: "result",
+ value: function result(_t15, e) {
+ var s = {};
+ if (_t15) for (var _e3 = 0; _e3 < _t15.length; _e3++) {
+ s[_t15[_e3].id] = _t15[_e3];
+ } else for (var _t30 = 0; _t30 < e.length; _t30++) {
+ s[e[_t30].id] = {
+ id: e[_t30].id,
+ error: "Network Error",
+ data: null
+ };
+ }
+
+ for (var _t31 = this._queue.length - 1; _t31 >= 0; _t31--) {
+ var _e4 = this._queue[_t31],
+ i = s[_e4.data.id];
+ i && (this.onResponse(_e4, i), i.error ? _e4.reject(i.error) : _e4.resolve(i.data), this._queue.splice(_t31, 1));
+ }
+ }
+ }, {
+ key: "on",
+ value: function on(_t18, e) {
+ var s = this._uid();
+
+ var i = this._events[_t18];
+ var n = !!i;
+ return n || (i = this._events[_t18] = []), i.push({
+ id: s,
+ handler: e
+ }), n || 3 != this._mode || this._socket.send(JSON.stringify({
+ action: "subscribe",
+ name: _t18
+ })), {
+ name: _t18,
+ id: s
+ };
+ }
+ }, {
+ key: "_resubscribe",
+ value: function _resubscribe() {
+ if (3 == this._mode) for (var _t32 in this._events) {
+ this._socket.send(JSON.stringify({
+ action: "subscribe",
+ name: _t32
+ }));
+ }
+ }
+ }, {
+ key: "detach",
+ value: function detach(_t20) {
+ if (!_t20) {
+ if (3 == this._mode) for (var _t33 in this._events) {
+ this._socket.send(JSON.stringify({
+ action: "unsubscribe",
+ key: _t33
+ }));
+ }
+ return void (this._events = {});
+ }
+
+ var e = _t20.id,
+ s = _t20.name,
+ i = this._events[s];
+
+ if (i) {
+ var _t34 = i.filter(function (_t23) {
+ return _t23.id != e;
+ });
+
+ _t34.length ? this._events[s] = _t34 : (delete this._events[s], 3 == this._mode && this._socket.send(JSON.stringify({
+ action: "unsubscribe",
+ name: s
+ })));
+ }
+ }
+ }, {
+ key: "fire",
+ value: function fire(_t24, e) {
+ var s = this._events[_t24];
+ if (s) for (var _t35 = 0; _t35 < s.length; _t35++) {
+ s[_t35].handler(e);
+ }
+ }
+ }, {
+ key: "onError",
+ value: function onError(_t26) {
+ return null;
+ }
+ }, {
+ key: "onCall",
+ value: function onCall(_t27, e) {}
+ }, {
+ key: "onResponse",
+ value: function onResponse(_t28, e) {}
+ }]);
+
+ return t;
+}();
+
+
+
+/***/ }),
+
+/***/ "./node_modules/safe-buffer/index.js":
+/*!*******************************************!*\
+ !*** ./node_modules/safe-buffer/index.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable node/no-deprecated-api */
+var buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js");
+
+var Buffer = buffer.Buffer; // alternative to using Object.keys for old browsers
+
+function copyProps(src, dst) {
+ for (var key in src) {
+ dst[key] = src[key];
+ }
+}
+
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer;
+} else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports);
+ exports.Buffer = SafeBuffer;
+}
+
+function SafeBuffer(arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length);
+} // Copy static methods from Buffer
+
+
+copyProps(Buffer, SafeBuffer);
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number');
+ }
+
+ return Buffer(arg, encodingOrOffset, length);
+};
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number');
+ }
+
+ var buf = Buffer(size);
+
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding);
+ } else {
+ buf.fill(fill);
+ }
+ } else {
+ buf.fill(0);
+ }
+
+ return buf;
+};
+
+SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number');
+ }
+
+ return Buffer(size);
+};
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number');
+ }
+
+ return buffer.SlowBuffer(size);
+};
+
+/***/ }),
+
+/***/ "./node_modules/setimmediate/setImmediate.js":
+/*!***************************************************!*\
+ !*** ./node_modules/setimmediate/setImmediate.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
+ "use strict";
+
+ if (global.setImmediate) {
+ return;
+ }
+
+ var nextHandle = 1; // Spec says greater than zero
+
+ var tasksByHandle = {};
+ var currentlyRunningATask = false;
+ var doc = global.document;
+ var registerImmediate;
+
+ function setImmediate(callback) {
+ // Callback can either be a function or a string
+ if (typeof callback !== "function") {
+ callback = new Function("" + callback);
+ } // Copy function arguments
+
+
+ var args = new Array(arguments.length - 1);
+
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i + 1];
+ } // Store and register the task
+
+
+ var task = {
+ callback: callback,
+ args: args
+ };
+ tasksByHandle[nextHandle] = task;
+ registerImmediate(nextHandle);
+ return nextHandle++;
+ }
+
+ function clearImmediate(handle) {
+ delete tasksByHandle[handle];
+ }
+
+ function run(task) {
+ var callback = task.callback;
+ var args = task.args;
+
+ switch (args.length) {
+ case 0:
+ callback();
+ break;
+
+ case 1:
+ callback(args[0]);
+ break;
+
+ case 2:
+ callback(args[0], args[1]);
+ break;
+
+ case 3:
+ callback(args[0], args[1], args[2]);
+ break;
+
+ default:
+ callback.apply(undefined, args);
+ break;
+ }
+ }
+
+ function runIfPresent(handle) {
+ // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
+ // So if we're currently running a task, we'll need to delay this invocation.
+ if (currentlyRunningATask) {
+ // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
+ // "too much recursion" error.
+ setTimeout(runIfPresent, 0, handle);
+ } else {
+ var task = tasksByHandle[handle];
+
+ if (task) {
+ currentlyRunningATask = true;
+
+ try {
+ run(task);
+ } finally {
+ clearImmediate(handle);
+ currentlyRunningATask = false;
+ }
+ }
+ }
+ }
+
+ function installNextTickImplementation() {
+ registerImmediate = function registerImmediate(handle) {
+ process.nextTick(function () {
+ runIfPresent(handle);
+ });
+ };
+ }
+
+ function canUsePostMessage() {
+ // The test against `importScripts` prevents this implementation from being installed inside a web worker,
+ // where `global.postMessage` means something completely different and can't be used for this purpose.
+ if (global.postMessage && !global.importScripts) {
+ var postMessageIsAsynchronous = true;
+ var oldOnMessage = global.onmessage;
+
+ global.onmessage = function () {
+ postMessageIsAsynchronous = false;
+ };
+
+ global.postMessage("", "*");
+ global.onmessage = oldOnMessage;
+ return postMessageIsAsynchronous;
+ }
+ }
+
+ function installPostMessageImplementation() {
+ // Installs an event handler on `global` for the `message` event: see
+ // * https://developer.mozilla.org/en/DOM/window.postMessage
+ // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
+ var messagePrefix = "setImmediate$" + Math.random() + "$";
+
+ var onGlobalMessage = function onGlobalMessage(event) {
+ if (event.source === global && typeof event.data === "string" && event.data.indexOf(messagePrefix) === 0) {
+ runIfPresent(+event.data.slice(messagePrefix.length));
+ }
+ };
+
+ if (global.addEventListener) {
+ global.addEventListener("message", onGlobalMessage, false);
+ } else {
+ global.attachEvent("onmessage", onGlobalMessage);
+ }
+
+ registerImmediate = function registerImmediate(handle) {
+ global.postMessage(messagePrefix + handle, "*");
+ };
+ }
+
+ function installMessageChannelImplementation() {
+ var channel = new MessageChannel();
+
+ channel.port1.onmessage = function (event) {
+ var handle = event.data;
+ runIfPresent(handle);
+ };
+
+ registerImmediate = function registerImmediate(handle) {
+ channel.port2.postMessage(handle);
+ };
+ }
+
+ function installReadyStateChangeImplementation() {
+ var html = doc.documentElement;
+
+ registerImmediate = function registerImmediate(handle) {
+ // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
+ // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
+ var script = doc.createElement("script");
+
+ script.onreadystatechange = function () {
+ runIfPresent(handle);
+ script.onreadystatechange = null;
+ html.removeChild(script);
+ script = null;
+ };
+
+ html.appendChild(script);
+ };
+ }
+
+ function installSetTimeoutImplementation() {
+ registerImmediate = function registerImmediate(handle) {
+ setTimeout(runIfPresent, 0, handle);
+ };
+ } // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
+
+
+ var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
+ attachTo = attachTo && attachTo.setTimeout ? attachTo : global; // Don't get fooled by e.g. browserify environments.
+
+ if ({}.toString.call(global.process) === "[object process]") {
+ // For Node.js before 0.9
+ installNextTickImplementation();
+ } else if (canUsePostMessage()) {
+ // For non-IE10 modern browsers
+ installPostMessageImplementation();
+ } else if (global.MessageChannel) {
+ // For web workers, where supported
+ installMessageChannelImplementation();
+ } else if (doc && "onreadystatechange" in doc.createElement("script")) {
+ // For IE 6鈥�8
+ installReadyStateChangeImplementation();
+ } else {
+ // For older browsers
+ installSetTimeoutImplementation();
+ }
+
+ attachTo.setImmediate = setImmediate;
+ attachTo.clearImmediate = clearImmediate;
+})(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self);
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/index.js":
+/*!*******************************************!*\
+ !*** ./node_modules/stream-http/index.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {var ClientRequest = __webpack_require__(/*! ./lib/request */ "./node_modules/stream-http/lib/request.js");
+
+var response = __webpack_require__(/*! ./lib/response */ "./node_modules/stream-http/lib/response.js");
+
+var extend = __webpack_require__(/*! xtend */ "./node_modules/xtend/immutable.js");
+
+var statusCodes = __webpack_require__(/*! builtin-status-codes */ "./node_modules/builtin-status-codes/browser.js");
+
+var url = __webpack_require__(/*! url */ "./node_modules/url/url.js");
+
+var http = exports;
+
+http.request = function (opts, cb) {
+ if (typeof opts === 'string') opts = url.parse(opts);else opts = extend(opts); // Normally, the page is loaded from http or https, so not specifying a protocol
+ // will result in a (valid) protocol-relative url. However, this won't work if
+ // the protocol is something else, like 'file:'
+
+ var defaultProtocol = global.location.protocol.search(/^https?:$/) === -1 ? 'http:' : '';
+ var protocol = opts.protocol || defaultProtocol;
+ var host = opts.hostname || opts.host;
+ var port = opts.port;
+ var path = opts.path || '/'; // Necessary for IPv6 addresses
+
+ if (host && host.indexOf(':') !== -1) host = '[' + host + ']'; // This may be a relative url. The browser should always be able to interpret it correctly.
+
+ opts.url = (host ? protocol + '//' + host : '') + (port ? ':' + port : '') + path;
+ opts.method = (opts.method || 'GET').toUpperCase();
+ opts.headers = opts.headers || {}; // Also valid opts.auth, opts.mode
+
+ var req = new ClientRequest(opts);
+ if (cb) req.on('response', cb);
+ return req;
+};
+
+http.get = function get(opts, cb) {
+ var req = http.request(opts, cb);
+ req.end();
+ return req;
+};
+
+http.ClientRequest = ClientRequest;
+http.IncomingMessage = response.IncomingMessage;
+
+http.Agent = function () {};
+
+http.Agent.defaultMaxSockets = 4;
+http.globalAgent = new http.Agent();
+http.STATUS_CODES = statusCodes;
+http.METHODS = ['CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD', 'LOCK', 'M-SEARCH', 'MERGE', 'MKACTIVITY', 'MKCOL', 'MOVE', 'NOTIFY', 'OPTIONS', 'PATCH', 'POST', 'PROPFIND', 'PROPPATCH', 'PURGE', 'PUT', 'REPORT', 'SEARCH', 'SUBSCRIBE', 'TRACE', 'UNLOCK', 'UNSUBSCRIBE'];
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/lib/capability.js":
+/*!****************************************************!*\
+ !*** ./node_modules/stream-http/lib/capability.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream);
+exports.writableStream = isFunction(global.WritableStream);
+exports.abortController = isFunction(global.AbortController);
+exports.blobConstructor = false;
+
+try {
+ new Blob([new ArrayBuffer(1)]);
+ exports.blobConstructor = true;
+} catch (e) {} // The xhr request to example.com may violate some restrictive CSP configurations,
+// so if we're running in a browser that supports `fetch`, avoid calling getXHR()
+// and assume support for certain features below.
+
+
+var xhr;
+
+function getXHR() {
+ // Cache the xhr value
+ if (xhr !== undefined) return xhr;
+
+ if (global.XMLHttpRequest) {
+ xhr = new global.XMLHttpRequest(); // If XDomainRequest is available (ie only, where xhr might not work
+ // cross domain), use the page location. Otherwise use example.com
+ // Note: this doesn't actually make an http request.
+
+ try {
+ xhr.open('GET', global.XDomainRequest ? '/' : 'https://example.com');
+ } catch (e) {
+ xhr = null;
+ }
+ } else {
+ // Service workers don't have XHR
+ xhr = null;
+ }
+
+ return xhr;
+}
+
+function checkTypeSupport(type) {
+ var xhr = getXHR();
+ if (!xhr) return false;
+
+ try {
+ xhr.responseType = type;
+ return xhr.responseType === type;
+ } catch (e) {}
+
+ return false;
+} // For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'.
+// Safari 7.1 appears to have fixed this bug.
+
+
+var haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined';
+var haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice); // If fetch is supported, then arraybuffer will be supported too. Skip calling
+// checkTypeSupport(), since that calls getXHR().
+
+exports.arraybuffer = exports.fetch || haveArrayBuffer && checkTypeSupport('arraybuffer'); // These next two tests unavoidably show warnings in Chrome. Since fetch will always
+// be used if it's available, just return false for these to avoid the warnings.
+
+exports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream');
+exports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer && checkTypeSupport('moz-chunked-arraybuffer'); // If fetch is supported, then overrideMimeType will be supported too. Skip calling
+// getXHR().
+
+exports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false);
+exports.vbArray = isFunction(global.VBArray);
+
+function isFunction(value) {
+ return typeof value === 'function';
+}
+
+xhr = null; // Help gc
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/lib/request.js":
+/*!*************************************************!*\
+ !*** ./node_modules/stream-http/lib/request.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(Buffer, global, process) {var capability = __webpack_require__(/*! ./capability */ "./node_modules/stream-http/lib/capability.js");
+
+var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+
+var response = __webpack_require__(/*! ./response */ "./node_modules/stream-http/lib/response.js");
+
+var stream = __webpack_require__(/*! readable-stream */ "./node_modules/readable-stream/readable-browser.js");
+
+var toArrayBuffer = __webpack_require__(/*! to-arraybuffer */ "./node_modules/to-arraybuffer/index.js");
+
+var IncomingMessage = response.IncomingMessage;
+var rStates = response.readyStates;
+
+function decideMode(preferBinary, useFetch) {
+ if (capability.fetch && useFetch) {
+ return 'fetch';
+ } else if (capability.mozchunkedarraybuffer) {
+ return 'moz-chunked-arraybuffer';
+ } else if (capability.msstream) {
+ return 'ms-stream';
+ } else if (capability.arraybuffer && preferBinary) {
+ return 'arraybuffer';
+ } else if (capability.vbArray && preferBinary) {
+ return 'text:vbarray';
+ } else {
+ return 'text';
+ }
+}
+
+var ClientRequest = module.exports = function (opts) {
+ var self = this;
+ stream.Writable.call(self);
+ self._opts = opts;
+ self._body = [];
+ self._headers = {};
+ if (opts.auth) self.setHeader('Authorization', 'Basic ' + new Buffer(opts.auth).toString('base64'));
+ Object.keys(opts.headers).forEach(function (name) {
+ self.setHeader(name, opts.headers[name]);
+ });
+ var preferBinary;
+ var useFetch = true;
+
+ if (opts.mode === 'disable-fetch' || 'requestTimeout' in opts && !capability.abortController) {
+ // If the use of XHR should be preferred. Not typically needed.
+ useFetch = false;
+ preferBinary = true;
+ } else if (opts.mode === 'prefer-streaming') {
+ // If streaming is a high priority but binary compatibility and
+ // the accuracy of the 'content-type' header aren't
+ preferBinary = false;
+ } else if (opts.mode === 'allow-wrong-content-type') {
+ // If streaming is more important than preserving the 'content-type' header
+ preferBinary = !capability.overrideMimeType;
+ } else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') {
+ // Use binary if text streaming may corrupt data or the content-type header, or for speed
+ preferBinary = true;
+ } else {
+ throw new Error('Invalid value for opts.mode');
+ }
+
+ self._mode = decideMode(preferBinary, useFetch);
+ self._fetchTimer = null;
+ self.on('finish', function () {
+ self._onFinish();
+ });
+};
+
+inherits(ClientRequest, stream.Writable);
+
+ClientRequest.prototype.setHeader = function (name, value) {
+ var self = this;
+ var lowerName = name.toLowerCase(); // This check is not necessary, but it prevents warnings from browsers about setting unsafe
+ // headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but
+ // http-browserify did it, so I will too.
+
+ if (unsafeHeaders.indexOf(lowerName) !== -1) return;
+ self._headers[lowerName] = {
+ name: name,
+ value: value
+ };
+};
+
+ClientRequest.prototype.getHeader = function (name) {
+ var header = this._headers[name.toLowerCase()];
+
+ if (header) return header.value;
+ return null;
+};
+
+ClientRequest.prototype.removeHeader = function (name) {
+ var self = this;
+ delete self._headers[name.toLowerCase()];
+};
+
+ClientRequest.prototype._onFinish = function () {
+ var self = this;
+ if (self._destroyed) return;
+ var opts = self._opts;
+ var headersObj = self._headers;
+ var body = null;
+
+ if (opts.method !== 'GET' && opts.method !== 'HEAD') {
+ if (capability.arraybuffer) {
+ body = toArrayBuffer(Buffer.concat(self._body));
+ } else if (capability.blobConstructor) {
+ body = new global.Blob(self._body.map(function (buffer) {
+ return toArrayBuffer(buffer);
+ }), {
+ type: (headersObj['content-type'] || {}).value || ''
+ });
+ } else {
+ // get utf8 string
+ body = Buffer.concat(self._body).toString();
+ }
+ } // create flattened list of headers
+
+
+ var headersList = [];
+ Object.keys(headersObj).forEach(function (keyName) {
+ var name = headersObj[keyName].name;
+ var value = headersObj[keyName].value;
+
+ if (Array.isArray(value)) {
+ value.forEach(function (v) {
+ headersList.push([name, v]);
+ });
+ } else {
+ headersList.push([name, value]);
+ }
+ });
+
+ if (self._mode === 'fetch') {
+ var signal = null;
+ var fetchTimer = null;
+
+ if (capability.abortController) {
+ var controller = new AbortController();
+ signal = controller.signal;
+ self._fetchAbortController = controller;
+
+ if ('requestTimeout' in opts && opts.requestTimeout !== 0) {
+ self._fetchTimer = global.setTimeout(function () {
+ self.emit('requestTimeout');
+ if (self._fetchAbortController) self._fetchAbortController.abort();
+ }, opts.requestTimeout);
+ }
+ }
+
+ global.fetch(self._opts.url, {
+ method: self._opts.method,
+ headers: headersList,
+ body: body || undefined,
+ mode: 'cors',
+ credentials: opts.withCredentials ? 'include' : 'same-origin',
+ signal: signal
+ }).then(function (response) {
+ self._fetchResponse = response;
+
+ self._connect();
+ }, function (reason) {
+ global.clearTimeout(self._fetchTimer);
+ if (!self._destroyed) self.emit('error', reason);
+ });
+ } else {
+ var xhr = self._xhr = new global.XMLHttpRequest();
+
+ try {
+ xhr.open(self._opts.method, self._opts.url, true);
+ } catch (err) {
+ process.nextTick(function () {
+ self.emit('error', err);
+ });
+ return;
+ } // Can't set responseType on really old browsers
+
+
+ if ('responseType' in xhr) xhr.responseType = self._mode.split(':')[0];
+ if ('withCredentials' in xhr) xhr.withCredentials = !!opts.withCredentials;
+ if (self._mode === 'text' && 'overrideMimeType' in xhr) xhr.overrideMimeType('text/plain; charset=x-user-defined');
+
+ if ('requestTimeout' in opts) {
+ xhr.timeout = opts.requestTimeout;
+
+ xhr.ontimeout = function () {
+ self.emit('requestTimeout');
+ };
+ }
+
+ headersList.forEach(function (header) {
+ xhr.setRequestHeader(header[0], header[1]);
+ });
+ self._response = null;
+
+ xhr.onreadystatechange = function () {
+ switch (xhr.readyState) {
+ case rStates.LOADING:
+ case rStates.DONE:
+ self._onXHRProgress();
+
+ break;
+ }
+ }; // Necessary for streaming in Firefox, since xhr.response is ONLY defined
+ // in onprogress, not in onreadystatechange with xhr.readyState = 3
+
+
+ if (self._mode === 'moz-chunked-arraybuffer') {
+ xhr.onprogress = function () {
+ self._onXHRProgress();
+ };
+ }
+
+ xhr.onerror = function () {
+ if (self._destroyed) return;
+ self.emit('error', new Error('XHR error'));
+ };
+
+ try {
+ xhr.send(body);
+ } catch (err) {
+ process.nextTick(function () {
+ self.emit('error', err);
+ });
+ return;
+ }
+ }
+};
+/**
+ * Checks if xhr.status is readable and non-zero, indicating no error.
+ * Even though the spec says it should be available in readyState 3,
+ * accessing it throws an exception in IE8
+ */
+
+
+function statusValid(xhr) {
+ try {
+ var status = xhr.status;
+ return status !== null && status !== 0;
+ } catch (e) {
+ return false;
+ }
+}
+
+ClientRequest.prototype._onXHRProgress = function () {
+ var self = this;
+ if (!statusValid(self._xhr) || self._destroyed) return;
+ if (!self._response) self._connect();
+
+ self._response._onXHRProgress();
+};
+
+ClientRequest.prototype._connect = function () {
+ var self = this;
+ if (self._destroyed) return;
+ self._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode, self._fetchTimer);
+
+ self._response.on('error', function (err) {
+ self.emit('error', err);
+ });
+
+ self.emit('response', self._response);
+};
+
+ClientRequest.prototype._write = function (chunk, encoding, cb) {
+ var self = this;
+
+ self._body.push(chunk);
+
+ cb();
+};
+
+ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function () {
+ var self = this;
+ self._destroyed = true;
+ global.clearTimeout(self._fetchTimer);
+ if (self._response) self._response._destroyed = true;
+ if (self._xhr) self._xhr.abort();else if (self._fetchAbortController) self._fetchAbortController.abort();
+};
+
+ClientRequest.prototype.end = function (data, encoding, cb) {
+ var self = this;
+
+ if (typeof data === 'function') {
+ cb = data;
+ data = undefined;
+ }
+
+ stream.Writable.prototype.end.call(self, data, encoding, cb);
+};
+
+ClientRequest.prototype.flushHeaders = function () {};
+
+ClientRequest.prototype.setTimeout = function () {};
+
+ClientRequest.prototype.setNoDelay = function () {};
+
+ClientRequest.prototype.setSocketKeepAlive = function () {}; // Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method
+
+
+var unsafeHeaders = ['accept-charset', 'accept-encoding', 'access-control-request-headers', 'access-control-request-method', 'connection', 'content-length', 'cookie', 'cookie2', 'date', 'dnt', 'expect', 'host', 'keep-alive', 'origin', 'referer', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'via'];
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/lib/response.js":
+/*!**************************************************!*\
+ !*** ./node_modules/stream-http/lib/response.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, global, Buffer) {var capability = __webpack_require__(/*! ./capability */ "./node_modules/stream-http/lib/capability.js");
+
+var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+
+var stream = __webpack_require__(/*! readable-stream */ "./node_modules/readable-stream/readable-browser.js");
+
+var rStates = exports.readyStates = {
+ UNSENT: 0,
+ OPENED: 1,
+ HEADERS_RECEIVED: 2,
+ LOADING: 3,
+ DONE: 4
+};
+
+var IncomingMessage = exports.IncomingMessage = function (xhr, response, mode, fetchTimer) {
+ var self = this;
+ stream.Readable.call(self);
+ self._mode = mode;
+ self.headers = {};
+ self.rawHeaders = [];
+ self.trailers = {};
+ self.rawTrailers = []; // Fake the 'close' event, but only once 'end' fires
+
+ self.on('end', function () {
+ // The nextTick is necessary to prevent the 'request' module from causing an infinite loop
+ process.nextTick(function () {
+ self.emit('close');
+ });
+ });
+
+ if (mode === 'fetch') {
+ var read = function read() {
+ reader.read().then(function (result) {
+ if (self._destroyed) return;
+
+ if (result.done) {
+ global.clearTimeout(fetchTimer);
+ self.push(null);
+ return;
+ }
+
+ self.push(new Buffer(result.value));
+ read();
+ })["catch"](function (err) {
+ global.clearTimeout(fetchTimer);
+ if (!self._destroyed) self.emit('error', err);
+ });
+ };
+
+ self._fetchResponse = response;
+ self.url = response.url;
+ self.statusCode = response.status;
+ self.statusMessage = response.statusText;
+ response.headers.forEach(function (header, key) {
+ self.headers[key.toLowerCase()] = header;
+ self.rawHeaders.push(key, header);
+ });
+
+ if (capability.writableStream) {
+ var writable = new WritableStream({
+ write: function write(chunk) {
+ return new Promise(function (resolve, reject) {
+ if (self._destroyed) {
+ reject();
+ } else if (self.push(new Buffer(chunk))) {
+ resolve();
+ } else {
+ self._resumeFetch = resolve;
+ }
+ });
+ },
+ close: function close() {
+ global.clearTimeout(fetchTimer);
+ if (!self._destroyed) self.push(null);
+ },
+ abort: function abort(err) {
+ if (!self._destroyed) self.emit('error', err);
+ }
+ });
+
+ try {
+ response.body.pipeTo(writable)["catch"](function (err) {
+ global.clearTimeout(fetchTimer);
+ if (!self._destroyed) self.emit('error', err);
+ });
+ return;
+ } catch (e) {} // pipeTo method isn't defined. Can't find a better way to feature test this
+
+ } // fallback for when writableStream or pipeTo aren't available
+
+
+ var reader = response.body.getReader();
+ read();
+ } else {
+ self._xhr = xhr;
+ self._pos = 0;
+ self.url = xhr.responseURL;
+ self.statusCode = xhr.status;
+ self.statusMessage = xhr.statusText;
+ var headers = xhr.getAllResponseHeaders().split(/\r?\n/);
+ headers.forEach(function (header) {
+ var matches = header.match(/^([^:]+):\s*(.*)/);
+
+ if (matches) {
+ var key = matches[1].toLowerCase();
+
+ if (key === 'set-cookie') {
+ if (self.headers[key] === undefined) {
+ self.headers[key] = [];
+ }
+
+ self.headers[key].push(matches[2]);
+ } else if (self.headers[key] !== undefined) {
+ self.headers[key] += ', ' + matches[2];
+ } else {
+ self.headers[key] = matches[2];
+ }
+
+ self.rawHeaders.push(matches[1], matches[2]);
+ }
+ });
+ self._charset = 'x-user-defined';
+
+ if (!capability.overrideMimeType) {
+ var mimeType = self.rawHeaders['mime-type'];
+
+ if (mimeType) {
+ var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/);
+
+ if (charsetMatch) {
+ self._charset = charsetMatch[1].toLowerCase();
+ }
+ }
+
+ if (!self._charset) self._charset = 'utf-8'; // best guess
+ }
+ }
+};
+
+inherits(IncomingMessage, stream.Readable);
+
+IncomingMessage.prototype._read = function () {
+ var self = this;
+ var resolve = self._resumeFetch;
+
+ if (resolve) {
+ self._resumeFetch = null;
+ resolve();
+ }
+};
+
+IncomingMessage.prototype._onXHRProgress = function () {
+ var self = this;
+ var xhr = self._xhr;
+ var response = null;
+
+ switch (self._mode) {
+ case 'text:vbarray':
+ // For IE9
+ if (xhr.readyState !== rStates.DONE) break;
+
+ try {
+ // This fails in IE8
+ response = new global.VBArray(xhr.responseBody).toArray();
+ } catch (e) {}
+
+ if (response !== null) {
+ self.push(new Buffer(response));
+ break;
+ }
+
+ // Falls through in IE8
+
+ case 'text':
+ try {
+ // This will fail when readyState = 3 in IE9. Switch mode and wait for readyState = 4
+ response = xhr.responseText;
+ } catch (e) {
+ self._mode = 'text:vbarray';
+ break;
+ }
+
+ if (response.length > self._pos) {
+ var newData = response.substr(self._pos);
+
+ if (self._charset === 'x-user-defined') {
+ var buffer = new Buffer(newData.length);
+
+ for (var i = 0; i < newData.length; i++) {
+ buffer[i] = newData.charCodeAt(i) & 0xff;
+ }
+
+ self.push(buffer);
+ } else {
+ self.push(newData, self._charset);
+ }
+
+ self._pos = response.length;
+ }
+
+ break;
+
+ case 'arraybuffer':
+ if (xhr.readyState !== rStates.DONE || !xhr.response) break;
+ response = xhr.response;
+ self.push(new Buffer(new Uint8Array(response)));
+ break;
+
+ case 'moz-chunked-arraybuffer':
+ // take whole
+ response = xhr.response;
+ if (xhr.readyState !== rStates.LOADING || !response) break;
+ self.push(new Buffer(new Uint8Array(response)));
+ break;
+
+ case 'ms-stream':
+ response = xhr.response;
+ if (xhr.readyState !== rStates.LOADING) break;
+ var reader = new global.MSStreamReader();
+
+ reader.onprogress = function () {
+ if (reader.result.byteLength > self._pos) {
+ self.push(new Buffer(new Uint8Array(reader.result.slice(self._pos))));
+ self._pos = reader.result.byteLength;
+ }
+ };
+
+ reader.onload = function () {
+ self.push(null);
+ }; // reader.onerror = ??? // TODO: this
+
+
+ reader.readAsArrayBuffer(response);
+ break;
+ } // The ms-stream case handles end separately in reader.onload()
+
+
+ if (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') {
+ self.push(null);
+ }
+};
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./node_modules/string_decoder/lib/string_decoder.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/string_decoder/lib/string_decoder.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+/*<replacement>*/
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+/*</replacement>*/
+
+
+var isEncoding = Buffer.isEncoding || function (encoding) {
+ encoding = '' + encoding;
+
+ switch (encoding && encoding.toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ case 'raw':
+ return true;
+
+ default:
+ return false;
+ }
+};
+
+function _normalizeEncoding(enc) {
+ if (!enc) return 'utf8';
+ var retried;
+
+ while (true) {
+ switch (enc) {
+ case 'utf8':
+ case 'utf-8':
+ return 'utf8';
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return 'utf16le';
+
+ case 'latin1':
+ case 'binary':
+ return 'latin1';
+
+ case 'base64':
+ case 'ascii':
+ case 'hex':
+ return enc;
+
+ default:
+ if (retried) return; // undefined
+
+ enc = ('' + enc).toLowerCase();
+ retried = true;
+ }
+ }
+}
+
+; // Do not cache `Buffer.isEncoding` when checking encoding names as some
+// modules monkey-patch it to support additional encodings
+
+function normalizeEncoding(enc) {
+ var nenc = _normalizeEncoding(enc);
+
+ if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+ return nenc || enc;
+} // StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters.
+
+
+exports.StringDecoder = StringDecoder;
+
+function StringDecoder(encoding) {
+ this.encoding = normalizeEncoding(encoding);
+ var nb;
+
+ switch (this.encoding) {
+ case 'utf16le':
+ this.text = utf16Text;
+ this.end = utf16End;
+ nb = 4;
+ break;
+
+ case 'utf8':
+ this.fillLast = utf8FillLast;
+ nb = 4;
+ break;
+
+ case 'base64':
+ this.text = base64Text;
+ this.end = base64End;
+ nb = 3;
+ break;
+
+ default:
+ this.write = simpleWrite;
+ this.end = simpleEnd;
+ return;
+ }
+
+ this.lastNeed = 0;
+ this.lastTotal = 0;
+ this.lastChar = Buffer.allocUnsafe(nb);
+}
+
+StringDecoder.prototype.write = function (buf) {
+ if (buf.length === 0) return '';
+ var r;
+ var i;
+
+ if (this.lastNeed) {
+ r = this.fillLast(buf);
+ if (r === undefined) return '';
+ i = this.lastNeed;
+ this.lastNeed = 0;
+ } else {
+ i = 0;
+ }
+
+ if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+ return r || '';
+};
+
+StringDecoder.prototype.end = utf8End; // Returns only complete characters in a Buffer
+
+StringDecoder.prototype.text = utf8Text; // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+
+StringDecoder.prototype.fillLast = function (buf) {
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+ this.lastNeed -= buf.length;
+}; // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte. If an invalid byte is detected, -2 is returned.
+
+
+function utf8CheckByte(_byte) {
+ if (_byte <= 0x7F) return 0;else if (_byte >> 5 === 0x06) return 2;else if (_byte >> 4 === 0x0E) return 3;else if (_byte >> 3 === 0x1E) return 4;
+ return _byte >> 6 === 0x02 ? -1 : -2;
+} // Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+
+
+function utf8CheckIncomplete(self, buf, i) {
+ var j = buf.length - 1;
+ if (j < i) return 0;
+ var nb = utf8CheckByte(buf[j]);
+
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 1;
+ return nb;
+ }
+
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 2;
+ return nb;
+ }
+
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+
+ if (nb >= 0) {
+ if (nb > 0) {
+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ }
+
+ return nb;
+ }
+
+ return 0;
+} // Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+
+
+function utf8CheckExtraBytes(self, buf, p) {
+ if ((buf[0] & 0xC0) !== 0x80) {
+ self.lastNeed = 0;
+ return "\uFFFD";
+ }
+
+ if (self.lastNeed > 1 && buf.length > 1) {
+ if ((buf[1] & 0xC0) !== 0x80) {
+ self.lastNeed = 1;
+ return "\uFFFD";
+ }
+
+ if (self.lastNeed > 2 && buf.length > 2) {
+ if ((buf[2] & 0xC0) !== 0x80) {
+ self.lastNeed = 2;
+ return "\uFFFD";
+ }
+ }
+ }
+} // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+
+
+function utf8FillLast(buf) {
+ var p = this.lastTotal - this.lastNeed;
+ var r = utf8CheckExtraBytes(this, buf, p);
+ if (r !== undefined) return r;
+
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, p, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+
+ buf.copy(this.lastChar, p, 0, buf.length);
+ this.lastNeed -= buf.length;
+} // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+
+
+function utf8Text(buf, i) {
+ var total = utf8CheckIncomplete(this, buf, i);
+ if (!this.lastNeed) return buf.toString('utf8', i);
+ this.lastTotal = total;
+ var end = buf.length - (total - this.lastNeed);
+ buf.copy(this.lastChar, 0, end);
+ return buf.toString('utf8', i, end);
+} // For UTF-8, a replacement character is added when ending on a partial
+// character.
+
+
+function utf8End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + "\uFFFD";
+ return r;
+} // UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+
+
+function utf16Text(buf, i) {
+ if ((buf.length - i) % 2 === 0) {
+ var r = buf.toString('utf16le', i);
+
+ if (r) {
+ var c = r.charCodeAt(r.length - 1);
+
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ this.lastNeed = 2;
+ this.lastTotal = 4;
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ return r.slice(0, -1);
+ }
+ }
+
+ return r;
+ }
+
+ this.lastNeed = 1;
+ this.lastTotal = 2;
+ this.lastChar[0] = buf[buf.length - 1];
+ return buf.toString('utf16le', i, buf.length - 1);
+} // For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+
+
+function utf16End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+
+ if (this.lastNeed) {
+ var end = this.lastTotal - this.lastNeed;
+ return r + this.lastChar.toString('utf16le', 0, end);
+ }
+
+ return r;
+}
+
+function base64Text(buf, i) {
+ var n = (buf.length - i) % 3;
+ if (n === 0) return buf.toString('base64', i);
+ this.lastNeed = 3 - n;
+ this.lastTotal = 3;
+
+ if (n === 1) {
+ this.lastChar[0] = buf[buf.length - 1];
+ } else {
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ }
+
+ return buf.toString('base64', i, buf.length - n);
+}
+
+function base64End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+ return r;
+} // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+
+
+function simpleWrite(buf) {
+ return buf.toString(this.encoding);
+}
+
+function simpleEnd(buf) {
+ return buf && buf.length ? this.write(buf) : '';
+}
+
+/***/ }),
+
+/***/ "./node_modules/timers-browserify/main.js":
+/*!************************************************!*\
+ !*** ./node_modules/timers-browserify/main.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {var scope = typeof global !== "undefined" && global || typeof self !== "undefined" && self || window;
+var apply = Function.prototype.apply; // DOM APIs, for completeness
+
+exports.setTimeout = function () {
+ return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
+};
+
+exports.setInterval = function () {
+ return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
+};
+
+exports.clearTimeout = exports.clearInterval = function (timeout) {
+ if (timeout) {
+ timeout.close();
+ }
+};
+
+function Timeout(id, clearFn) {
+ this._id = id;
+ this._clearFn = clearFn;
+}
+
+Timeout.prototype.unref = Timeout.prototype.ref = function () {};
+
+Timeout.prototype.close = function () {
+ this._clearFn.call(scope, this._id);
+}; // Does not start the time, just sets up the members needed.
+
+
+exports.enroll = function (item, msecs) {
+ clearTimeout(item._idleTimeoutId);
+ item._idleTimeout = msecs;
+};
+
+exports.unenroll = function (item) {
+ clearTimeout(item._idleTimeoutId);
+ item._idleTimeout = -1;
+};
+
+exports._unrefActive = exports.active = function (item) {
+ clearTimeout(item._idleTimeoutId);
+ var msecs = item._idleTimeout;
+
+ if (msecs >= 0) {
+ item._idleTimeoutId = setTimeout(function onTimeout() {
+ if (item._onTimeout) item._onTimeout();
+ }, msecs);
+ }
+}; // setimmediate attaches itself to the global object
+
+
+__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js"); // On some exotic environments, it's not clear which object `setimmediate` was
+// able to install onto. Search each possibility in the same order as the
+// `setimmediate` library.
+
+
+exports.setImmediate = typeof self !== "undefined" && self.setImmediate || typeof global !== "undefined" && global.setImmediate || this && this.setImmediate;
+exports.clearImmediate = typeof self !== "undefined" && self.clearImmediate || typeof global !== "undefined" && global.clearImmediate || this && this.clearImmediate;
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/to-arraybuffer/index.js":
+/*!**********************************************!*\
+ !*** ./node_modules/to-arraybuffer/index.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js").Buffer;
+
+module.exports = function (buf) {
+ // If the buffer is backed by a Uint8Array, a faster version will work
+ if (buf instanceof Uint8Array) {
+ // If the buffer isn't a subarray, return the underlying ArrayBuffer
+ if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
+ return buf.buffer;
+ } else if (typeof buf.buffer.slice === 'function') {
+ // Otherwise we need to get a proper copy
+ return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+ }
+ }
+
+ if (Buffer.isBuffer(buf)) {
+ // This is the slow version that will work with any Buffer
+ // implementation (even in old browsers)
+ var arrayCopy = new Uint8Array(buf.length);
+ var len = buf.length;
+
+ for (var i = 0; i < len; i++) {
+ arrayCopy[i] = buf[i];
+ }
+
+ return arrayCopy.buffer;
+ } else {
+ throw new Error('Argument must be a Buffer');
+ }
+};
+
+/***/ }),
+
+/***/ "./node_modules/url/url.js":
+/*!*********************************!*\
+ !*** ./node_modules/url/url.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var punycode = __webpack_require__(/*! punycode */ "./node_modules/punycode/punycode.js");
+
+var util = __webpack_require__(/*! ./util */ "./node_modules/url/util.js");
+
+exports.parse = urlParse;
+exports.resolve = urlResolve;
+exports.resolveObject = urlResolveObject;
+exports.format = urlFormat;
+exports.Url = Url;
+
+function Url() {
+ this.protocol = null;
+ this.slashes = null;
+ this.auth = null;
+ this.host = null;
+ this.port = null;
+ this.hostname = null;
+ this.hash = null;
+ this.search = null;
+ this.query = null;
+ this.pathname = null;
+ this.path = null;
+ this.href = null;
+} // Reference: RFC 3986, RFC 1808, RFC 2396
+// define these here so at least they only have to be
+// compiled once on the first module load.
+
+
+var protocolPattern = /^([a-z0-9.+-]+:)/i,
+ portPattern = /:[0-9]*$/,
+ // Special case for a simple path URL
+simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
+ // RFC 2396: characters reserved for delimiting URLs.
+// We actually just auto-escape these.
+delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
+ // RFC 2396: characters not allowed for various reasons.
+unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
+ // Allowed by RFCs, but cause of XSS attacks. Always escape these.
+autoEscape = ['\''].concat(unwise),
+ // Characters that are never ever allowed in a hostname.
+// Note that any invalid chars are also handled, but these
+// are the ones that are *expected* to be seen, so we fast-path
+// them.
+nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
+ hostEndingChars = ['/', '?', '#'],
+ hostnameMaxLen = 255,
+ hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
+ hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
+ // protocols that can allow "unsafe" and "unwise" chars.
+unsafeProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+},
+ // protocols that never have a hostname.
+hostlessProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+},
+ // protocols that always contain a // bit.
+slashedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'https:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+},
+ querystring = __webpack_require__(/*! querystring */ "./node_modules/querystring-es3/index.js");
+
+function urlParse(url, parseQueryString, slashesDenoteHost) {
+ if (url && util.isObject(url) && url instanceof Url) return url;
+ var u = new Url();
+ u.parse(url, parseQueryString, slashesDenoteHost);
+ return u;
+}
+
+Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
+ if (!util.isString(url)) {
+ throw new TypeError("Parameter 'url' must be a string, not " + _typeof(url));
+ } // Copy chrome, IE, opera backslash-handling behavior.
+ // Back slashes before the query string get converted to forward slashes
+ // See: https://code.google.com/p/chromium/issues/detail?id=25916
+
+
+ var queryIndex = url.indexOf('?'),
+ splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#',
+ uSplit = url.split(splitter),
+ slashRegex = /\\/g;
+ uSplit[0] = uSplit[0].replace(slashRegex, '/');
+ url = uSplit.join(splitter);
+ var rest = url; // trim before proceeding.
+ // This is to support parse stuff like " http://foo.com \n"
+
+ rest = rest.trim();
+
+ if (!slashesDenoteHost && url.split('#').length === 1) {
+ // Try fast path regexp
+ var simplePath = simplePathPattern.exec(rest);
+
+ if (simplePath) {
+ this.path = rest;
+ this.href = rest;
+ this.pathname = simplePath[1];
+
+ if (simplePath[2]) {
+ this.search = simplePath[2];
+
+ if (parseQueryString) {
+ this.query = querystring.parse(this.search.substr(1));
+ } else {
+ this.query = this.search.substr(1);
+ }
+ } else if (parseQueryString) {
+ this.search = '';
+ this.query = {};
+ }
+
+ return this;
+ }
+ }
+
+ var proto = protocolPattern.exec(rest);
+
+ if (proto) {
+ proto = proto[0];
+ var lowerProto = proto.toLowerCase();
+ this.protocol = lowerProto;
+ rest = rest.substr(proto.length);
+ } // figure out if it's got a host
+ // user@server is *always* interpreted as a hostname, and url
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
+ // how the browser resolves relative URLs.
+
+
+ if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+ var slashes = rest.substr(0, 2) === '//';
+
+ if (slashes && !(proto && hostlessProtocol[proto])) {
+ rest = rest.substr(2);
+ this.slashes = true;
+ }
+ }
+
+ if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {
+ // there's a hostname.
+ // the first instance of /, ?, ;, or # ends the host.
+ //
+ // If there is an @ in the hostname, then non-host chars *are* allowed
+ // to the left of the last @ sign, unless some host-ending character
+ // comes *before* the @-sign.
+ // URLs are obnoxious.
+ //
+ // ex:
+ // http://a@b@c/ => user:a@b host:c
+ // http://a@b?@c => user:a host:c path:/?@c
+ // v0.12 TODO(isaacs): This is not quite how Chrome does things.
+ // Review our test case against browsers more comprehensively.
+ // find the first instance of any hostEndingChars
+ var hostEnd = -1;
+
+ for (var i = 0; i < hostEndingChars.length; i++) {
+ var hec = rest.indexOf(hostEndingChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;
+ } // at this point, either we have an explicit point where the
+ // auth portion cannot go past, or the last @ char is the decider.
+
+
+ var auth, atSign;
+
+ if (hostEnd === -1) {
+ // atSign can be anywhere.
+ atSign = rest.lastIndexOf('@');
+ } else {
+ // atSign must be in auth portion.
+ // http://a@b/c@d => host:b auth:a path:/c@d
+ atSign = rest.lastIndexOf('@', hostEnd);
+ } // Now we have a portion which is definitely the auth.
+ // Pull that off.
+
+
+ if (atSign !== -1) {
+ auth = rest.slice(0, atSign);
+ rest = rest.slice(atSign + 1);
+ this.auth = decodeURIComponent(auth);
+ } // the host is the remaining to the left of the first non-host char
+
+
+ hostEnd = -1;
+
+ for (var i = 0; i < nonHostChars.length; i++) {
+ var hec = rest.indexOf(nonHostChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;
+ } // if we still have not hit it, then the entire thing is a host.
+
+
+ if (hostEnd === -1) hostEnd = rest.length;
+ this.host = rest.slice(0, hostEnd);
+ rest = rest.slice(hostEnd); // pull out port.
+
+ this.parseHost(); // we've indicated that there is a hostname,
+ // so even if it's empty, it has to be present.
+
+ this.hostname = this.hostname || ''; // if hostname begins with [ and ends with ]
+ // assume that it's an IPv6 address.
+
+ var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; // validate a little.
+
+ if (!ipv6Hostname) {
+ var hostparts = this.hostname.split(/\./);
+
+ for (var i = 0, l = hostparts.length; i < l; i++) {
+ var part = hostparts[i];
+ if (!part) continue;
+
+ if (!part.match(hostnamePartPattern)) {
+ var newpart = '';
+
+ for (var j = 0, k = part.length; j < k; j++) {
+ if (part.charCodeAt(j) > 127) {
+ // we replace non-ASCII char with a temporary placeholder
+ // we need this to make sure size of hostname is not
+ // broken by replacing non-ASCII by nothing
+ newpart += 'x';
+ } else {
+ newpart += part[j];
+ }
+ } // we test again with ASCII char only
+
+
+ if (!newpart.match(hostnamePartPattern)) {
+ var validParts = hostparts.slice(0, i);
+ var notHost = hostparts.slice(i + 1);
+ var bit = part.match(hostnamePartStart);
+
+ if (bit) {
+ validParts.push(bit[1]);
+ notHost.unshift(bit[2]);
+ }
+
+ if (notHost.length) {
+ rest = '/' + notHost.join('.') + rest;
+ }
+
+ this.hostname = validParts.join('.');
+ break;
+ }
+ }
+ }
+ }
+
+ if (this.hostname.length > hostnameMaxLen) {
+ this.hostname = '';
+ } else {
+ // hostnames are always lower case.
+ this.hostname = this.hostname.toLowerCase();
+ }
+
+ if (!ipv6Hostname) {
+ // IDNA Support: Returns a punycoded representation of "domain".
+ // It only converts parts of the domain name that
+ // have non-ASCII characters, i.e. it doesn't matter if
+ // you call it with a domain that already is ASCII-only.
+ this.hostname = punycode.toASCII(this.hostname);
+ }
+
+ var p = this.port ? ':' + this.port : '';
+ var h = this.hostname || '';
+ this.host = h + p;
+ this.href += this.host; // strip [ and ] from the hostname
+ // the host field still retains them, though
+
+ if (ipv6Hostname) {
+ this.hostname = this.hostname.substr(1, this.hostname.length - 2);
+
+ if (rest[0] !== '/') {
+ rest = '/' + rest;
+ }
+ }
+ } // now rest is set to the post-host stuff.
+ // chop off any delim chars.
+
+
+ if (!unsafeProtocol[lowerProto]) {
+ // First, make 100% sure that any "autoEscape" chars get
+ // escaped, even if encodeURIComponent doesn't think they
+ // need to be.
+ for (var i = 0, l = autoEscape.length; i < l; i++) {
+ var ae = autoEscape[i];
+ if (rest.indexOf(ae) === -1) continue;
+ var esc = encodeURIComponent(ae);
+
+ if (esc === ae) {
+ esc = escape(ae);
+ }
+
+ rest = rest.split(ae).join(esc);
+ }
+ } // chop off from the tail first.
+
+
+ var hash = rest.indexOf('#');
+
+ if (hash !== -1) {
+ // got a fragment string.
+ this.hash = rest.substr(hash);
+ rest = rest.slice(0, hash);
+ }
+
+ var qm = rest.indexOf('?');
+
+ if (qm !== -1) {
+ this.search = rest.substr(qm);
+ this.query = rest.substr(qm + 1);
+
+ if (parseQueryString) {
+ this.query = querystring.parse(this.query);
+ }
+
+ rest = rest.slice(0, qm);
+ } else if (parseQueryString) {
+ // no query string, but parseQueryString still requested
+ this.search = '';
+ this.query = {};
+ }
+
+ if (rest) this.pathname = rest;
+
+ if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {
+ this.pathname = '/';
+ } //to support http.request
+
+
+ if (this.pathname || this.search) {
+ var p = this.pathname || '';
+ var s = this.search || '';
+ this.path = p + s;
+ } // finally, reconstruct the href based on what has been validated.
+
+
+ this.href = this.format();
+ return this;
+}; // format a parsed object into a url string
+
+
+function urlFormat(obj) {
+ // ensure it's an object, and not a string url.
+ // If it's an obj, this is a no-op.
+ // this way, you can call url_format() on strings
+ // to clean up potentially wonky urls.
+ if (util.isString(obj)) obj = urlParse(obj);
+ if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
+ return obj.format();
+}
+
+Url.prototype.format = function () {
+ var auth = this.auth || '';
+
+ if (auth) {
+ auth = encodeURIComponent(auth);
+ auth = auth.replace(/%3A/i, ':');
+ auth += '@';
+ }
+
+ var protocol = this.protocol || '',
+ pathname = this.pathname || '',
+ hash = this.hash || '',
+ host = false,
+ query = '';
+
+ if (this.host) {
+ host = auth + this.host;
+ } else if (this.hostname) {
+ host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');
+
+ if (this.port) {
+ host += ':' + this.port;
+ }
+ }
+
+ if (this.query && util.isObject(this.query) && Object.keys(this.query).length) {
+ query = querystring.stringify(this.query);
+ }
+
+ var search = this.search || query && '?' + query || '';
+ if (protocol && protocol.substr(-1) !== ':') protocol += ':'; // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
+ // unless they had them to begin with.
+
+ if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {
+ host = '//' + (host || '');
+ if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
+ } else if (!host) {
+ host = '';
+ }
+
+ if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
+ if (search && search.charAt(0) !== '?') search = '?' + search;
+ pathname = pathname.replace(/[?#]/g, function (match) {
+ return encodeURIComponent(match);
+ });
+ search = search.replace('#', '%23');
+ return protocol + host + pathname + search + hash;
+};
+
+function urlResolve(source, relative) {
+ return urlParse(source, false, true).resolve(relative);
+}
+
+Url.prototype.resolve = function (relative) {
+ return this.resolveObject(urlParse(relative, false, true)).format();
+};
+
+function urlResolveObject(source, relative) {
+ if (!source) return relative;
+ return urlParse(source, false, true).resolveObject(relative);
+}
+
+Url.prototype.resolveObject = function (relative) {
+ if (util.isString(relative)) {
+ var rel = new Url();
+ rel.parse(relative, false, true);
+ relative = rel;
+ }
+
+ var result = new Url();
+ var tkeys = Object.keys(this);
+
+ for (var tk = 0; tk < tkeys.length; tk++) {
+ var tkey = tkeys[tk];
+ result[tkey] = this[tkey];
+ } // hash is always overridden, no matter what.
+ // even href="" will remove it.
+
+
+ result.hash = relative.hash; // if the relative url is empty, then there's nothing left to do here.
+
+ if (relative.href === '') {
+ result.href = result.format();
+ return result;
+ } // hrefs like //foo/bar always cut to the protocol.
+
+
+ if (relative.slashes && !relative.protocol) {
+ // take everything except the protocol from relative
+ var rkeys = Object.keys(relative);
+
+ for (var rk = 0; rk < rkeys.length; rk++) {
+ var rkey = rkeys[rk];
+ if (rkey !== 'protocol') result[rkey] = relative[rkey];
+ } //urlParse appends trailing / to urls like http://www.example.com
+
+
+ if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {
+ result.path = result.pathname = '/';
+ }
+
+ result.href = result.format();
+ return result;
+ }
+
+ if (relative.protocol && relative.protocol !== result.protocol) {
+ // if it's a known url protocol, then changing
+ // the protocol does weird things
+ // first, if it's not file:, then we MUST have a host,
+ // and if there was a path
+ // to begin with, then we MUST have a path.
+ // if it is file:, then the host is dropped,
+ // because that's known to be hostless.
+ // anything else is assumed to be absolute.
+ if (!slashedProtocol[relative.protocol]) {
+ var keys = Object.keys(relative);
+
+ for (var v = 0; v < keys.length; v++) {
+ var k = keys[v];
+ result[k] = relative[k];
+ }
+
+ result.href = result.format();
+ return result;
+ }
+
+ result.protocol = relative.protocol;
+
+ if (!relative.host && !hostlessProtocol[relative.protocol]) {
+ var relPath = (relative.pathname || '').split('/');
+
+ while (relPath.length && !(relative.host = relPath.shift())) {
+ ;
+ }
+
+ if (!relative.host) relative.host = '';
+ if (!relative.hostname) relative.hostname = '';
+ if (relPath[0] !== '') relPath.unshift('');
+ if (relPath.length < 2) relPath.unshift('');
+ result.pathname = relPath.join('/');
+ } else {
+ result.pathname = relative.pathname;
+ }
+
+ result.search = relative.search;
+ result.query = relative.query;
+ result.host = relative.host || '';
+ result.auth = relative.auth;
+ result.hostname = relative.hostname || relative.host;
+ result.port = relative.port; // to support http.request
+
+ if (result.pathname || result.search) {
+ var p = result.pathname || '';
+ var s = result.search || '';
+ result.path = p + s;
+ }
+
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+ }
+
+ var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/',
+ isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/',
+ mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname,
+ removeAllDots = mustEndAbs,
+ srcPath = result.pathname && result.pathname.split('/') || [],
+ relPath = relative.pathname && relative.pathname.split('/') || [],
+ psychotic = result.protocol && !slashedProtocol[result.protocol]; // if the url is a non-slashed url, then relative
+ // links like ../.. should be able
+ // to crawl up to the hostname, as well. This is strange.
+ // result.protocol has already been set by now.
+ // Later on, put the first path part into the host field.
+
+ if (psychotic) {
+ result.hostname = '';
+ result.port = null;
+
+ if (result.host) {
+ if (srcPath[0] === '') srcPath[0] = result.host;else srcPath.unshift(result.host);
+ }
+
+ result.host = '';
+
+ if (relative.protocol) {
+ relative.hostname = null;
+ relative.port = null;
+
+ if (relative.host) {
+ if (relPath[0] === '') relPath[0] = relative.host;else relPath.unshift(relative.host);
+ }
+
+ relative.host = null;
+ }
+
+ mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
+ }
+
+ if (isRelAbs) {
+ // it's absolute.
+ result.host = relative.host || relative.host === '' ? relative.host : result.host;
+ result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname;
+ result.search = relative.search;
+ result.query = relative.query;
+ srcPath = relPath; // fall through to the dot-handling below.
+ } else if (relPath.length) {
+ // it's relative
+ // throw away the existing file, and take the new path instead.
+ if (!srcPath) srcPath = [];
+ srcPath.pop();
+ srcPath = srcPath.concat(relPath);
+ result.search = relative.search;
+ result.query = relative.query;
+ } else if (!util.isNullOrUndefined(relative.search)) {
+ // just pull out the search.
+ // like href='?foo'.
+ // Put this after the other two cases because it simplifies the booleans
+ if (psychotic) {
+ result.hostname = result.host = srcPath.shift(); //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+
+ var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;
+
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+
+ result.search = relative.search;
+ result.query = relative.query; //to support http.request
+
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
+ }
+
+ result.href = result.format();
+ return result;
+ }
+
+ if (!srcPath.length) {
+ // no path at all. easy.
+ // we've already handled the other stuff above.
+ result.pathname = null; //to support http.request
+
+ if (result.search) {
+ result.path = '/' + result.search;
+ } else {
+ result.path = null;
+ }
+
+ result.href = result.format();
+ return result;
+ } // if a url ENDs in . or .., then it must get a trailing slash.
+ // however, if it ends in anything else non-slashy,
+ // then it must NOT get a trailing slash.
+
+
+ var last = srcPath.slice(-1)[0];
+ var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === ''; // strip single dots, resolve double dots to parent dir
+ // if the path tries to go above the root, `up` ends up > 0
+
+ var up = 0;
+
+ for (var i = srcPath.length; i >= 0; i--) {
+ last = srcPath[i];
+
+ if (last === '.') {
+ srcPath.splice(i, 1);
+ } else if (last === '..') {
+ srcPath.splice(i, 1);
+ up++;
+ } else if (up) {
+ srcPath.splice(i, 1);
+ up--;
+ }
+ } // if the path is allowed to go above the root, restore leading ..s
+
+
+ if (!mustEndAbs && !removeAllDots) {
+ for (; up--; up) {
+ srcPath.unshift('..');
+ }
+ }
+
+ if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
+ srcPath.unshift('');
+ }
+
+ if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {
+ srcPath.push('');
+ }
+
+ var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/'; // put the host back
+
+ if (psychotic) {
+ result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : ''; //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+
+ var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;
+
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+
+ mustEndAbs = mustEndAbs || result.host && srcPath.length;
+
+ if (mustEndAbs && !isAbsolute) {
+ srcPath.unshift('');
+ }
+
+ if (!srcPath.length) {
+ result.pathname = null;
+ result.path = null;
+ } else {
+ result.pathname = srcPath.join('/');
+ } //to support request.http
+
+
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
+ }
+
+ result.auth = relative.auth || result.auth;
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+};
+
+Url.prototype.parseHost = function () {
+ var host = this.host;
+ var port = portPattern.exec(host);
+
+ if (port) {
+ port = port[0];
+
+ if (port !== ':') {
+ this.port = port.substr(1);
+ }
+
+ host = host.substr(0, host.length - port.length);
+ }
+
+ if (host) this.hostname = host;
+};
+
+/***/ }),
+
+/***/ "./node_modules/url/util.js":
+/*!**********************************!*\
+ !*** ./node_modules/url/util.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+module.exports = {
+ isString: function isString(arg) {
+ return typeof arg === 'string';
+ },
+ isObject: function isObject(arg) {
+ return _typeof(arg) === 'object' && arg !== null;
+ },
+ isNull: function isNull(arg) {
+ return arg === null;
+ },
+ isNullOrUndefined: function isNullOrUndefined(arg) {
+ return arg == null;
+ }
+};
+
+/***/ }),
+
+/***/ "./node_modules/util-deprecate/browser.js":
+/*!************************************************!*\
+ !*** ./node_modules/util-deprecate/browser.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {/**
+ * Module exports.
+ */
+module.exports = deprecate;
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+
+function deprecate(fn, msg) {
+ if (config('noDeprecation')) {
+ return fn;
+ }
+
+ var warned = false;
+
+ function deprecated() {
+ if (!warned) {
+ if (config('throwDeprecation')) {
+ throw new Error(msg);
+ } else if (config('traceDeprecation')) {
+ console.trace(msg);
+ } else {
+ console.warn(msg);
+ }
+
+ warned = true;
+ }
+
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+}
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+
+
+function config(name) {
+ // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+ try {
+ if (!global.localStorage) return false;
+ } catch (_) {
+ return false;
+ }
+
+ var val = global.localStorage[name];
+ if (null == val) return false;
+ return String(val).toLowerCase() === 'true';
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/amd-options.js":
+/*!****************************************!*\
+ !*** (webpack)/buildin/amd-options.js ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */
+module.exports = __webpack_amd_options__;
+
+/* WEBPACK VAR INJECTION */}.call(this, {}))
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/global.js":
+/*!***********************************!*\
+ !*** (webpack)/buildin/global.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var g; // This works in non-strict mode
+
+g = function () {
+ return this;
+}();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1, eval)("this");
+} catch (e) {
+ // This works if the window reference is available
+ if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window;
+} // g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+
+module.exports = g;
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/module.js":
+/*!***********************************!*\
+ !*** (webpack)/buildin/module.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (module) {
+ if (!module.webpackPolyfill) {
+ module.deprecate = function () {};
+
+ module.paths = []; // module.parent = undefined by default
+
+ if (!module.children) module.children = [];
+ Object.defineProperty(module, "loaded", {
+ enumerable: true,
+ get: function get() {
+ return module.l;
+ }
+ });
+ Object.defineProperty(module, "id", {
+ enumerable: true,
+ get: function get() {
+ return module.i;
+ }
+ });
+ module.webpackPolyfill = 1;
+ }
+
+ return module;
+};
+
+/***/ }),
+
+/***/ "./node_modules/xtend/immutable.js":
+/*!*****************************************!*\
+ !*** ./node_modules/xtend/immutable.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = extend;
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function extend() {
+ var target = {};
+
+ for (var i = 0; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+}
+
+/***/ }),
+
+/***/ "./sources/constants/index.js":
+/*!************************************!*\
+ !*** ./sources/constants/index.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ KEY_CODES: {
+ UP: 38,
+ DOWN: 40,
+ LEFT: 37,
+ RIGHT: 39,
+ SPACE: 32,
+ ENTER: 13,
+ DELETE: 46,
+ ESC: 27,
+ TAB: 9
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/cached_functions.js":
+/*!******************************************!*\
+ !*** ./sources/core/cached_functions.js ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/*
+ reuse results of functions that can be recalculated during rendering
+ greatly increases the rendering speed when critical path enabled
+ Sample - 94_dev/critical_path.html
+
+ */
+module.exports = function (gantt) {
+ gantt._cached_functions = {
+ cache: {},
+ mode: false,
+ critical_path_mode: false,
+ wrap_methods: function wrap_methods(methods, object) {
+ if (object._prefetch_originals) {
+ for (var i in object._prefetch_originals) {
+ object[i] = object._prefetch_originals[i];
+ }
+ }
+
+ object._prefetch_originals = {};
+
+ for (var i = 0; i < methods.length; i++) {
+ this.prefetch(methods[i], object);
+ }
+ },
+ prefetch: function prefetch(methodname, host) {
+ var original = host[methodname];
+
+ if (original) {
+ var optimizer = this;
+ host._prefetch_originals[methodname] = original;
+
+ host[methodname] = function get_prefetched_value() {
+ var argumentsArray = new Array(arguments.length);
+
+ for (var i = 0, l = arguments.length; i < l; i++) {
+ argumentsArray[i] = arguments[i];
+ }
+
+ if (optimizer.active) {
+ var args = optimizer.get_arguments_hash(Array.prototype.slice.call(argumentsArray));
+
+ if (!optimizer.cache[methodname]) {
+ optimizer.cache[methodname] = {};
+ }
+
+ var cached_values = optimizer.cache[methodname];
+
+ if (optimizer.has_cached_value(cached_values, args)) {
+ return optimizer.get_cached_value(cached_values, args);
+ } else {
+ var value = original.apply(this, argumentsArray);
+ optimizer.cache_value(cached_values, args, value);
+ return value;
+ }
+ }
+
+ return original.apply(this, argumentsArray);
+ };
+ }
+
+ return original;
+ },
+ cache_value: function cache_value(cache, arguments_hash, value) {
+ if (this.is_date(value)) value = new Date(value);
+ cache[arguments_hash] = value;
+ },
+ has_cached_value: function has_cached_value(cache, arguments_hash) {
+ return cache.hasOwnProperty(arguments_hash);
+ },
+ get_cached_value: function get_cached_value(cache, arguments_hash) {
+ var data = cache[arguments_hash]; //for cached dates - return copy
+
+ if (this.is_date(data)) {
+ data = new Date(data);
+ }
+
+ return data;
+ },
+ is_date: function is_date(value) {
+ return value && value.getUTCDate;
+ },
+ get_arguments_hash: function get_arguments_hash(args) {
+ var values = [];
+
+ for (var i = 0; i < args.length; i++) {
+ values.push(this.stringify_argument(args[i]));
+ }
+
+ return "(" + values.join(";") + ")";
+ },
+ stringify_argument: function stringify_argument(value) {
+ //expecting task or link, or any other data entries, dates and primitive values
+ var ret = "";
+
+ if (value.id) {
+ ret = value.id;
+ } else if (this.is_date(value)) {
+ ret = value.valueOf();
+ } else {
+ ret = value;
+ }
+
+ return ret + "";
+ },
+ activate: function activate() {
+ this.clear();
+ this.active = true;
+ },
+ deactivate: function deactivate() {
+ this.clear();
+ this.active = false;
+ },
+ clear: function clear() {
+ this.cache = {};
+ },
+ setup: function setup(gantt) {
+ var override_gantt = [];
+ var gantt_methods = ['_isProjectEnd', '_getProjectEnd', '_getSlack'];
+
+ if (this.mode == 'auto') {
+ if (gantt.config.highlight_critical_path) {
+ override_gantt = gantt_methods;
+ }
+ } else if (this.mode === true) {
+ override_gantt = gantt_methods;
+ }
+
+ this.wrap_methods(override_gantt, gantt);
+ },
+ update_if_changed: function update_if_changed(gantt) {
+ var changed = this.critical_path_mode != gantt.config.highlight_critical_path || this.mode !== gantt.config.optimize_render;
+
+ if (changed) {
+ this.critical_path_mode = gantt.config.highlight_critical_path;
+ this.mode = gantt.config.optimize_render;
+ this.setup(gantt);
+ }
+ }
+ };
+
+ function activate() {
+ gantt._cached_functions.update_if_changed(gantt);
+
+ if (!gantt._cached_functions.active) {
+ gantt._cached_functions.activate();
+ }
+
+ return true;
+ }
+
+ gantt.attachEvent("onBeforeGanttRender", activate);
+ gantt.attachEvent("onBeforeDataRender", activate);
+ gantt.attachEvent("onBeforeSmartRender", function () {
+ activate();
+ });
+ gantt.attachEvent("onBeforeParse", activate);
+ gantt.attachEvent("onDataRender", function () {
+ gantt._cached_functions.deactivate();
+ });
+ var deactivTimeout = null;
+ gantt.attachEvent("onSmartRender", function () {
+ if (deactivTimeout) clearTimeout(deactivTimeout);
+ deactivTimeout = setTimeout(function () {
+ gantt._cached_functions.deactivate();
+ }, 1000);
+ });
+ gantt.attachEvent("onBeforeGanttReady", function () {
+ gantt._cached_functions.update_if_changed(gantt);
+
+ return true;
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/common/ajax.js":
+/*!*************************************!*\
+ !*** ./sources/core/common/ajax.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var env = __webpack_require__(/*! ../../utils/env */ "./sources/utils/env.js");
+
+var global = __webpack_require__(/*! ../../utils/global */ "./sources/utils/global.js");
+
+var serialize = __webpack_require__(/*! ./serialize */ "./sources/core/common/serialize.ts")["default"];
+
+function createConfig(method, args) {
+ var result = {
+ method: method
+ };
+
+ if (args.length === 0) {
+ throw new Error("Arguments list of query is wrong.");
+ }
+
+ if (args.length === 1) {
+ if (typeof args[0] === "string") {
+ result.url = args[0];
+ result.async = true;
+ } else {
+ result.url = args[0].url;
+ result.async = args[0].async || true;
+ result.callback = args[0].callback;
+ result.headers = args[0].headers;
+ }
+
+ if (method === "POST" || "PUT") {
+ if (args[0].data) {
+ if (typeof args[0].data !== "string") {
+ result.data = serialize(args[0].data);
+ } else {
+ result.data = args[0].data;
+ }
+ } else {
+ result.data = "";
+ }
+ }
+
+ return result;
+ }
+
+ result.url = args[0];
+
+ switch (method) {
+ case "GET":
+ case "DELETE":
+ result.callback = args[1];
+ result.headers = args[2];
+ break;
+
+ case "POST":
+ case "PUT":
+ if (args[1]) {
+ if (typeof args[1] !== "string") {
+ result.data = serialize(args[1]);
+ } else {
+ result.data = args[1];
+ }
+ } else {
+ result.data = "";
+ }
+
+ result.callback = args[2];
+ result.headers = args[3];
+ break;
+ }
+
+ return result;
+}
+
+module.exports = function (gantt) {
+ return {
+ // if false - dhxr param will added to prevent caching on client side (default),
+ // if true - do not add extra params
+ cache: true,
+ // default method for load/loadStruct, post/get allowed
+ // get - since 4.1.1, this should fix 412 error for macos safari
+ method: "get",
+ parse: function parse(data) {
+ if (typeof data !== "string") return data;
+ var obj;
+ data = data.replace(/^[\s]+/, "");
+
+ if (typeof DOMParser !== "undefined" && !env.isIE) {
+ // ff,ie9
+ obj = new DOMParser().parseFromString(data, "text/xml");
+ } else if (typeof global.ActiveXObject !== "undefined") {
+ obj = new global.ActiveXObject("Microsoft.XMLDOM");
+ obj.async = "false";
+ obj.loadXML(data);
+ }
+
+ return obj;
+ },
+ xmltop: function xmltop(tagname, xhr, obj) {
+ if (typeof xhr.status == "undefined" || xhr.status < 400) {
+ var xml = !xhr.responseXML ? this.parse(xhr.responseText || xhr) : xhr.responseXML || xhr;
+
+ if (xml && xml.documentElement !== null && !xml.getElementsByTagName("parsererror").length) {
+ return xml.getElementsByTagName(tagname)[0];
+ }
+ }
+
+ if (obj !== -1) gantt.callEvent("onLoadXMLError", ["Incorrect XML", arguments[1], obj]);
+ return document.createElement("DIV");
+ },
+ xpath: function xpath(xpathExp, docObj) {
+ if (!docObj.nodeName) docObj = docObj.responseXML || docObj;
+
+ if (env.isIE) {
+ return docObj.selectNodes(xpathExp) || [];
+ } else {
+ var rows = [];
+ var first;
+ var col = (docObj.ownerDocument || docObj).evaluate(xpathExp, docObj, null, XPathResult.ANY_TYPE, null);
+
+ while (true) {
+ first = col.iterateNext();
+
+ if (first) {
+ rows.push(first);
+ } else {
+ break;
+ }
+ }
+
+ return rows;
+ }
+ },
+ query: function query(config) {
+ return this._call(config.method || "GET", config.url, config.data || "", config.async || true, config.callback, config.headers);
+ },
+ get: function get(url, onLoad, headers) {
+ var config = createConfig("GET", arguments);
+ return this.query(config);
+ },
+ getSync: function getSync(url, headers) {
+ var config = createConfig("GET", arguments);
+ config.async = false;
+ return this.query(config);
+ },
+ put: function put(url, postData, onLoad, headers) {
+ var config = createConfig("PUT", arguments);
+ return this.query(config);
+ },
+ del: function del(url, onLoad, headers) {
+ /**
+ * https://tools.ietf.org/html/rfc7231#section-4.3.5
+ * A payload within a DELETE request message has no defined semantics;
+ * sending a payload body on a DELETE request might cause some existing
+ * implementations to reject the request.
+ */
+ var config = createConfig("DELETE", arguments);
+ return this.query(config);
+ },
+ post: function post(url, postData, onLoad, headers) {
+ if (arguments.length == 1) {
+ postData = "";
+ } else if (arguments.length == 2 && typeof postData == "function") {
+ onLoad = postData;
+ postData = "";
+ }
+
+ var config = createConfig("POST", arguments);
+ return this.query(config);
+ },
+ postSync: function postSync(url, postData, headers) {
+ postData = postData === null ? "" : String(postData);
+ var config = createConfig("POST", arguments);
+ config.async = false;
+ return this.query(config);
+ },
+ _call: function _call(method, url, postData, async, onLoad, headers) {
+ return new gantt.Promise(function (resolve, reject) {
+ var t = (typeof XMLHttpRequest === "undefined" ? "undefined" : _typeof(XMLHttpRequest)) !== undefined ? new XMLHttpRequest() : new global.ActiveXObject("Microsoft.XMLHTTP");
+ var isQt = navigator.userAgent.match(/AppleWebKit/) !== null && navigator.userAgent.match(/Qt/) !== null && navigator.userAgent.match(/Safari/) !== null;
+
+ if (!!async) {
+ t.onreadystatechange = function () {
+ if (t.readyState == 4 || isQt && t.readyState == 3) {
+ // what for long response and status 404?
+ if (t.status != 200 || t.responseText === "") if (!gantt.callEvent("onAjaxError", [t])) return;
+ setTimeout(function () {
+ if (typeof onLoad == "function") {
+ onLoad.apply(global, [{
+ xmlDoc: t,
+ filePath: url
+ }]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText
+ }
+
+ resolve(t);
+
+ if (typeof onLoad == "function") {
+ onLoad = null;
+ t = null;
+ }
+ }, 0);
+ }
+ };
+ }
+
+ var noCache = !this || !this.cache;
+
+ if (method == "GET" && noCache) {
+ url += (url.indexOf("?") >= 0 ? "&" : "?") + "dhxr" + new Date().getTime() + "=1";
+ }
+
+ t.open(method, url, async);
+
+ if (headers) {
+ for (var key in headers) {
+ t.setRequestHeader(key, headers[key]);
+ }
+ } else if (method.toUpperCase() == "POST" || method == "PUT" || method == "DELETE") {
+ t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+ } else if (method == "GET") {
+ postData = null;
+ }
+
+ t.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ t.send(postData);
+ if (!async) return {
+ xmlDoc: t,
+ filePath: url
+ }; // dhtmlx-compat, response.xmlDoc.responseXML/responseText
+ });
+ },
+ urlSeparator: function urlSeparator(str) {
+ if (str.indexOf("?") != -1) return "&";else return "?";
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/common/assert.js":
+/*!***************************************!*\
+ !*** ./sources/core/common/assert.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/*
+ asserts will be removed in final code, so you can place them anythere
+ without caring about performance impacts
+*/
+module.exports = function (gantt) {
+ return function assert(check, message) {
+ if (!check) {
+ if (gantt.config.show_errors && gantt.callEvent("onError", [message]) !== false) {
+ if (gantt.message) {
+ gantt.message({
+ type: "error",
+ text: message,
+ expire: -1
+ });
+ } else {
+ // eslint-disable-next-line
+ console.log(message);
+ } // eslint-disable-next-line no-debugger
+
+
+ debugger;
+ }
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/common/config.ts":
+/*!***************************************!*\
+ !*** ./sources/core/common/config.ts ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+module.exports = function () {
+ var result = {
+ layout: {
+ css: "gantt_container",
+ rows: [
+ {
+ cols: [
+ { view: "grid", scrollX: "scrollHor", scrollY: "scrollVer" },
+ { resizer: true, width: 1 },
+ { view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer" },
+ { view: "scrollbar", id: "scrollVer" }
+ ]
+ },
+ { view: "scrollbar", id: "scrollHor", height: 20 }
+ ]
+ },
+ links: {
+ finish_to_start: "0",
+ start_to_start: "1",
+ finish_to_finish: "2",
+ start_to_finish: "3"
+ },
+ types: {
+ task: "task",
+ project: "project",
+ milestone: "milestone"
+ },
+ auto_types: false,
+ duration_unit: "day",
+ work_time: false,
+ correct_work_time: false,
+ skip_off_time: false,
+ cascade_delete: true,
+ autosize: false,
+ autosize_min_width: 0,
+ autoscroll: true,
+ autoscroll_speed: 30,
+ deepcopy_on_parse: false,
+ show_links: true,
+ show_task_cells: true,
+ // replace backgroung of the task area with a canvas img
+ static_background: false,
+ static_background_cells: true,
+ branch_loading: false,
+ branch_loading_property: "$has_child",
+ show_loading: false,
+ show_chart: true,
+ show_grid: true,
+ min_duration: 60 * 60 * 1000,
+ date_format: "%d-%m-%Y %H:%i",
+ xml_date: undefined,
+ start_on_monday: true,
+ server_utc: false,
+ show_progress: true,
+ fit_tasks: false,
+ select_task: true,
+ scroll_on_click: true,
+ smart_rendering: true,
+ preserve_scroll: true,
+ readonly: false,
+ container_resize_timeout: 20,
+ /*grid */
+ date_grid: "%Y-%m-%d",
+ drag_links: true,
+ drag_progress: true,
+ drag_resize: true,
+ drag_project: false,
+ drag_move: true,
+ drag_mode: {
+ resize: "resize",
+ progress: "progress",
+ move: "move",
+ ignore: "ignore"
+ },
+ round_dnd_dates: true,
+ link_wrapper_width: 20,
+ root_id: 0,
+ autofit: false,
+ columns: [
+ { name: "text", tree: true, width: "*", resize: true },
+ { name: "start_date", align: "center", resize: true },
+ { name: "duration", align: "center" },
+ { name: "add", width: 44 }
+ ],
+ /*scale*/
+ scale_offset_minimal: true,
+ inherit_scale_class: false,
+ scales: [
+ {
+ unit: "day",
+ step: 1,
+ date: "%d %M"
+ }
+ ],
+ // date_scale: "%d %M",
+ time_step: 60,
+ duration_step: 1,
+ task_date: "%d %F %Y",
+ time_picker: "%H:%i",
+ task_attribute: "data-task-id",
+ link_attribute: "data-link-id",
+ layer_attribute: "data-layer",
+ buttons_left: [
+ "gantt_save_btn",
+ "gantt_cancel_btn"
+ ],
+ _migrate_buttons: {
+ dhx_save_btn: "gantt_save_btn",
+ dhx_cancel_btn: "gantt_cancel_btn",
+ dhx_delete_btn: "gantt_delete_btn"
+ },
+ buttons_right: [
+ "gantt_delete_btn"
+ ],
+ lightbox: {
+ sections: [
+ { name: "description", height: 70, map_to: "text", type: "textarea", focus: true },
+ { name: "time", type: "duration", map_to: "auto" }
+ ],
+ project_sections: [
+ { name: "description", height: 70, map_to: "text", type: "textarea", focus: true },
+ { name: "type", type: "typeselect", map_to: "type" },
+ { name: "time", type: "duration", readonly: true, map_to: "auto" }
+ ],
+ milestone_sections: [
+ { name: "description", height: 70, map_to: "text", type: "textarea", focus: true },
+ { name: "type", type: "typeselect", map_to: "type" },
+ { name: "time", type: "duration", single_date: true, map_to: "auto" }
+ ]
+ },
+ drag_lightbox: true,
+ sort: false,
+ details_on_create: true,
+ details_on_dblclick: true,
+ initial_scroll: true,
+ task_scroll_offset: 100,
+ order_branch: false,
+ order_branch_free: false,
+ // task height is deprecated, use 'bar_height' instead
+ task_height: undefined,
+ bar_height: "full",
+ min_column_width: 70,
+ // min width for grid column (when resizing)
+ min_grid_column_width: 70,
+ // name of the attribute with column index for resize element
+ grid_resizer_column_attribute: "data-column-index",
+ // name of the attribute with column index for resize element
+ // grid_resizer_attribute: "grid_resizer", // - usage of this parameter is not found in code
+ // grid width can be increased after the column has been resized
+ keep_grid_width: false,
+ // grid width can be adjusted
+ grid_resize: false,
+ grid_elastic_columns: false,
+ show_tasks_outside_timescale: false,
+ show_unscheduled: true,
+ resize_rows: false,
+ // name of the attribute with row index for resize element
+ task_grid_row_resizer_attribute: "data-row-index",
+ // min height for row (when resizing)
+ min_task_grid_row_height: 30,
+ //
+ readonly_property: "readonly",
+ editable_property: "editable",
+ calendar_property: "calendar_id",
+ resource_calendars: {},
+ dynamic_resource_calendars: false,
+ inherit_calendar: false,
+ type_renderers: {},
+ open_tree_initially: false,
+ optimize_render: true,
+ prevent_default_scroll: false,
+ show_errors: true,
+ wai_aria_attributes: true,
+ smart_scales: true,
+ rtl: false,
+ placeholder_task: false,
+ horizontal_scroll_key: "shiftKey",
+ drag_timeline: {
+ useKey: undefined,
+ ignore: ".gantt_task_line, .gantt_task_link"
+ },
+ drag_multiple: true,
+ csp: "auto"
+ };
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./sources/core/common/date.js":
+/*!*************************************!*\
+ !*** ./sources/core/common/date.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/*
+ %d - the day as a number with a leading zero ( 01 to 31 );
+ %j - the day as a number without a leading zero ( 1 to 31 );
+ %D - the day as an abbreviation ( Sun to Sat );
+ %l - the day as a full name ( Sunday to Saturday );
+ %W - the ISO-8601 week number of the year. Weeks start on Monday; 1)
+ %m - the month as a number without a leading zero ( 1 to 12 );
+ %n - the month as a number with a leading zero ( 01 to 12);
+ %M - the month as an abbreviation ( Jan to Dec );
+ %F - the month as a full name ( January to December );
+ %y - the year as a two-digit number ( 00 to 99 );
+ %Y - the year as a four-digit number ( 1900鈥�9999 );
+ %h - the hour based on the 12-hour clock ( 00 to 11 );
+ %H - the hour based on the 24-hour clock ( 00 to 23 );
+ %i - the minute as a number with a leading zero ( 00 to 59 );
+ %s - the second as a number without a leading zero ( 00 to 59 ); 2)
+ %a - displays am (for times from midnight until noon) and pm (for times from noon until midnight);
+ %A - displays AM (for times from midnight until noon) and PM (for times from noon until midnight).
+*/
+var fastVersion = __webpack_require__(/*! ./date_parsers/fast_version */ "./sources/core/common/date_parsers/fast_version.ts")["default"];
+
+var cspCompliantVersion = __webpack_require__(/*! ./date_parsers/csp_compliant_version */ "./sources/core/common/date_parsers/csp_compliant_version.ts")["default"];
+
+module.exports = function (gantt) {
+ var canUseCsp = null;
+
+ function cspAutoCheck() {
+ try {
+ new Function("canUseCsp = false;");
+ } catch (e) {
+ canUseCsp = true;
+ }
+ }
+
+ function useCsp() {
+ var result = false;
+
+ if (gantt.config.csp === "auto") {
+ if (canUseCsp === null) {
+ cspAutoCheck();
+ }
+
+ result = canUseCsp;
+ } else {
+ result = gantt.config.csp;
+ }
+
+ return result;
+ }
+
+ var dateHelper = {
+ init: function init() {
+ var locale = gantt.locale;
+ var s = locale.date.month_short;
+ var t = locale.date.month_short_hash = {};
+
+ for (var i = 0; i < s.length; i++) {
+ t[s[i]] = i;
+ }
+
+ var s = locale.date.month_full;
+ var t = locale.date.month_full_hash = {};
+
+ for (var i = 0; i < s.length; i++) {
+ t[s[i]] = i;
+ }
+ },
+ date_part: function date_part(date) {
+ var old = new Date(date);
+ date.setHours(0);
+ this.hour_start(date);
+ if (date.getHours() && ( //shift to yesterday on dst
+ date.getDate() < old.getDate() || date.getMonth() < old.getMonth() || date.getFullYear() < old.getFullYear())) date.setTime(date.getTime() + 60 * 60 * 1000 * (24 - date.getHours()));
+ return date;
+ },
+ time_part: function time_part(date) {
+ return (date.valueOf() / 1000 - date.getTimezoneOffset() * 60) % 86400;
+ },
+ week_start: function week_start(date) {
+ var shift = date.getDay();
+
+ if (gantt.config.start_on_monday) {
+ if (shift === 0) shift = 6;else shift--;
+ }
+
+ return this.date_part(this.add(date, -1 * shift, "day"));
+ },
+ month_start: function month_start(date) {
+ date.setDate(1);
+ return this.date_part(date);
+ },
+ quarter_start: function quarter_start(date) {
+ this.month_start(date);
+ var m = date.getMonth(),
+ res_month;
+
+ if (m >= 9) {
+ res_month = 9;
+ } else if (m >= 6) {
+ res_month = 6;
+ } else if (m >= 3) {
+ res_month = 3;
+ } else {
+ res_month = 0;
+ }
+
+ date.setMonth(res_month);
+ return date;
+ },
+ year_start: function year_start(date) {
+ date.setMonth(0);
+ return this.month_start(date);
+ },
+ day_start: function day_start(date) {
+ return this.date_part(date);
+ },
+ hour_start: function hour_start(date) {
+ if (date.getMinutes()) date.setMinutes(0);
+ this.minute_start(date);
+ return date;
+ },
+ minute_start: function minute_start(date) {
+ if (date.getSeconds()) date.setSeconds(0);
+ if (date.getMilliseconds()) date.setMilliseconds(0);
+ return date;
+ },
+ _add_days: function _add_days(modifiedDate, inc, originalDate) {
+ modifiedDate.setDate(modifiedDate.getDate() + inc);
+ var incCondition = inc >= 0;
+ var getHoursCondition = !originalDate.getHours() && modifiedDate.getHours(); //shift to yesterday on dst
+
+ var getDateCondition = modifiedDate.getDate() <= originalDate.getDate() || modifiedDate.getMonth() < originalDate.getMonth() || modifiedDate.getFullYear() < originalDate.getFullYear();
+
+ if (incCondition && getHoursCondition && getDateCondition) {
+ modifiedDate.setTime(modifiedDate.getTime() + 60 * 60 * 1000 * (24 - modifiedDate.getHours()));
+ }
+
+ var worktimeCalculation = inc > 1;
+
+ if (worktimeCalculation && getHoursCondition) {
+ // try to shift the modified Date to 00:00
+ modifiedDate.setHours(0);
+ }
+
+ return modifiedDate;
+ },
+ add: function add(date, inc, mode) {
+ /*jsl:ignore*/
+ var ndate = new Date(date.valueOf());
+
+ switch (mode) {
+ case "day":
+ ndate = this._add_days(ndate, inc, date);
+ break;
+
+ case "week":
+ ndate = this._add_days(ndate, inc * 7, date);
+ break;
+
+ case "month":
+ ndate.setMonth(ndate.getMonth() + inc);
+ break;
+
+ case "year":
+ ndate.setYear(ndate.getFullYear() + inc);
+ break;
+
+ case "hour":
+ /*
+ adding hours/minutes via setHour(getHour() + inc) gives weird result when
+ adding one hour to the time before switch to a Daylight Saving time
+ example: //Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time)
+ new Date(2014, 02, 30, 1).setHours(2)
+ >>Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time)
+ setTime seems working as expected
+ */
+ ndate.setTime(ndate.getTime() + inc * 60 * 60 * 1000);
+ break;
+
+ case "minute":
+ ndate.setTime(ndate.getTime() + inc * 60 * 1000);
+ break;
+
+ default:
+ return this["add_" + mode](date, inc, mode);
+ }
+
+ return ndate;
+ /*jsl:end*/
+ },
+ add_quarter: function add_quarter(date, inc) {
+ return this.add(date, inc * 3, "month");
+ },
+ to_fixed: function to_fixed(num) {
+ if (num < 10) return "0" + num;
+ return num;
+ },
+ copy: function copy(date) {
+ return new Date(date.valueOf());
+ },
+ date_to_str: function date_to_str(format, utc) {
+ var result = fastVersion;
+
+ if (useCsp()) {
+ result = cspCompliantVersion;
+ }
+
+ return result.date_to_str(format, utc, gantt);
+ },
+ str_to_date: function str_to_date(format, utc) {
+ var result = fastVersion;
+
+ if (useCsp()) {
+ result = cspCompliantVersion;
+ }
+
+ return result.str_to_date(format, utc, gantt);
+ },
+ getISOWeek: function getISOWeek(ndate) {
+ return gantt.date._getWeekNumber(ndate, true);
+ },
+ _getWeekNumber: function _getWeekNumber(ndate, isoWeek) {
+ if (!ndate) return false;
+ var nday = ndate.getDay();
+
+ if (isoWeek) {
+ if (nday === 0) {
+ nday = 7;
+ }
+ }
+
+ var first_thursday = new Date(ndate.valueOf());
+ first_thursday.setDate(ndate.getDate() + (4 - nday));
+ var year_number = first_thursday.getFullYear(); // year of the first Thursday
+
+ var ordinal_date = Math.round((first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date)
+
+ var week_number = 1 + Math.floor(ordinal_date / 7);
+ return week_number;
+ },
+ getWeek: function getWeek(ndate) {
+ return gantt.date._getWeekNumber(ndate, gantt.config.start_on_monday);
+ },
+ getUTCISOWeek: function getUTCISOWeek(ndate) {
+ return gantt.date.getISOWeek(ndate);
+ },
+ convert_to_utc: function convert_to_utc(date) {
+ return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
+ },
+ parseDate: function parseDate(date, format) {
+ // raw date may be of type string, number (timestamp) or something else
+ // do not check for instanceof Date explicitly, since we may swap native date with different date implementation at some point
+ if (date && !date.getFullYear) {
+ if (typeof format !== "function") {
+ if (typeof format === "string") {
+ if (format === "parse_date" || format === "xml_date") {
+ format = gantt.defined(gantt.templates.xml_date) ? gantt.templates.xml_date : gantt.templates.parse_date;
+ } else {
+ format = gantt.defined(gantt.templates[format]) ? gantt.templates[format] : gantt.date.str_to_date(format);
+ }
+ } else {
+ format = gantt.defined(gantt.templates.xml_date) ? gantt.templates.xml_date : gantt.templates.parse_date;
+ }
+ }
+
+ if (date) {
+ date = format(date);
+ } else {
+ date = null;
+ }
+ }
+
+ return date;
+ }
+ };
+ return dateHelper;
+};
+
+/***/ }),
+
+/***/ "./sources/core/common/date_parsers/csp_compliant_version.ts":
+/*!*******************************************************************!*\
+ !*** ./sources/core/common/date_parsers/csp_compliant_version.ts ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var dateToStr = function (format, utc, gantt) {
+ return function (date) {
+ return format.replace(/%[a-zA-Z]/g, function (a) {
+ switch (a) {
+ case "%d": return utc ? gantt.date.to_fixed(date.getUTCDate()) : gantt.date.to_fixed(date.getDate());
+ case "%m": return utc ? gantt.date.to_fixed((date.getUTCMonth() + 1)) : gantt.date.to_fixed((date.getMonth() + 1));
+ case "%j": return utc ? date.getUTCDate() : date.getDate();
+ case "%n": return utc ? (date.getUTCMonth() + 1) : (date.getMonth() + 1);
+ case "%y": return utc ? gantt.date.to_fixed(date.getUTCFullYear() % 100) : gantt.date.to_fixed(date.getFullYear() % 100);
+ case "%Y": return utc ? date.getUTCFullYear() : date.getFullYear();
+ case "%D": return utc ? gantt.locale.date.day_short[date.getUTCDay()] : gantt.locale.date.day_short[date.getDay()];
+ case "%l": return utc ? gantt.locale.date.day_full[date.getUTCDay()] : gantt.locale.date.day_full[date.getDay()];
+ case "%M": return utc ? gantt.locale.date.month_short[date.getUTCMonth()] : gantt.locale.date.month_short[date.getMonth()];
+ case "%F": return utc ? gantt.locale.date.month_full[date.getUTCMonth()] : gantt.locale.date.month_full[date.getMonth()];
+ case "%h": return utc ? gantt.date.to_fixed((date.getUTCHours() + 11) % 12 + 1) : gantt.date.to_fixed((date.getHours() + 11) % 12 + 1);
+ case "%g": return utc ? ((date.getUTCHours() + 11) % 12 + 1) : ((date.getHours() + 11) % 12 + 1);
+ case "%G": return utc ? date.getUTCHours() : date.getHours();
+ case "%H": return utc ? gantt.date.to_fixed(date.getUTCHours()) : gantt.date.to_fixed(date.getHours());
+ case "%i": return utc ? gantt.date.to_fixed(date.getUTCMinutes()) : gantt.date.to_fixed(date.getMinutes());
+ case "%a": return utc ? (date.getUTCHours() > 11 ? "pm" : "am") : (date.getHours() > 11 ? "pm" : "am");
+ case "%A": return utc ? (date.getUTCHours() > 11 ? "PM" : "AM") : (date.getHours() > 11 ? "PM" : "AM");
+ case "%s": return utc ? gantt.date.to_fixed(date.getUTCSeconds()) : gantt.date.to_fixed(date.getSeconds());
+ case "%W": return utc ? gantt.date.to_fixed(gantt.date.getUTCISOWeek(date)) : gantt.date.to_fixed(gantt.date.getISOWeek(date));
+ default: return a;
+ }
+ });
+ };
+};
+var strToDate = function (format, utc, gantt) {
+ return function (date) {
+ var set = [0, 0, 1, 0, 0, 0];
+ var temp = date.match(/[a-zA-Z]+|[0-9]+/g);
+ var mask = format.match(/%[a-zA-Z]/g);
+ for (var i = 0; i < mask.length; i++) {
+ switch (mask[i]) {
+ case "%j":
+ case "%d":
+ set[2] = temp[i] || 1;
+ break;
+ case "%n":
+ case "%m":
+ set[1] = (temp[i] || 1) - 1;
+ break;
+ case "%y":
+ set[0] = temp[i] * 1 + (temp[i] > 50 ? 1900 : 2000);
+ break;
+ case "%g":
+ case "%G":
+ case "%h":
+ case "%H":
+ set[3] = temp[i] || 0;
+ break;
+ case "%i":
+ set[4] = temp[i] || 0;
+ break;
+ case "%Y":
+ set[0] = temp[i] || 0;
+ break;
+ case "%a":
+ case "%A":
+ set[3] = set[3] % 12 + ((temp[i] || "").toLowerCase() === "am" ? 0 : 12);
+ break;
+ case "%s":
+ set[5] = temp[i] || 0;
+ break;
+ case "%M":
+ set[1] = gantt.locale.date.month_short_hash[temp[i]] || 0;
+ break;
+ case "%F":
+ set[1] = gantt.locale.date.month_full_hash[temp[i]] || 0;
+ break;
+ default:
+ break;
+ }
+ }
+ if (utc) {
+ return new Date(Date.UTC(set[0], set[1], set[2], set[3], set[4], set[5]));
+ }
+ return new Date(set[0], set[1], set[2], set[3], set[4], set[5]);
+ };
+};
+var cspVersion = {
+ date_to_str: dateToStr,
+ str_to_date: strToDate
+};
+exports.default = cspVersion;
+
+
+/***/ }),
+
+/***/ "./sources/core/common/date_parsers/fast_version.ts":
+/*!**********************************************************!*\
+ !*** ./sources/core/common/date_parsers/fast_version.ts ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var dateToStr = function (format, utc, gantt) {
+ format = format.replace(/%[a-zA-Z]/g, function (a) {
+ switch (a) {
+ case "%d":
+ return "\"+to_fixed(date.get" + (utc ? "UTC" : "") + "Date())+\"";
+ case "%m":
+ return "\"+to_fixed((date.get" + (utc ? "UTC" : "") + "Month()+1))+\"";
+ case "%j":
+ return "\"+date.get" + (utc ? "UTC" : "") + "Date()+\"";
+ case "%n":
+ return "\"+(date.get" + (utc ? "UTC" : "") + "Month()+1)+\"";
+ case "%y":
+ return "\"+to_fixed(date.get" + (utc ? "UTC" : "") + "FullYear()%100)+\"";
+ case "%Y":
+ return "\"+date.get" + (utc ? "UTC" : "") + "FullYear()+\"";
+ case "%D":
+ return "\"+locale.date.day_short[date.get" + (utc ? "UTC" : "") + "Day()]+\"";
+ case "%l":
+ return "\"+locale.date.day_full[date.get" + (utc ? "UTC" : "") + "Day()]+\"";
+ case "%M":
+ return "\"+locale.date.month_short[date.get" + (utc ? "UTC" : "") + "Month()]+\"";
+ case "%F":
+ return "\"+locale.date.month_full[date.get" + (utc ? "UTC" : "") + "Month()]+\"";
+ case "%h":
+ return "\"+to_fixed((date.get" + (utc ? "UTC" : "") + "Hours()+11)%12+1)+\"";
+ case "%g":
+ return "\"+((date.get" + (utc ? "UTC" : "") + "Hours()+11)%12+1)+\"";
+ case "%G":
+ return "\"+date.get" + (utc ? "UTC" : "") + "Hours()+\"";
+ case "%H":
+ return "\"+to_fixed(date.get" + (utc ? "UTC" : "") + "Hours())+\"";
+ case "%i":
+ return "\"+to_fixed(date.get" + (utc ? "UTC" : "") + "Minutes())+\"";
+ case "%a":
+ return "\"+(date.get" + (utc ? "UTC" : "") + "Hours()>11?\"pm\":\"am\")+\"";
+ case "%A":
+ return "\"+(date.get" + (utc ? "UTC" : "") + "Hours()>11?\"PM\":\"AM\")+\"";
+ case "%s":
+ return "\"+to_fixed(date.get" + (utc ? "UTC" : "") + "Seconds())+\"";
+ case "%W":
+ return "\"+to_fixed(getISOWeek(date))+\"";
+ case "%w":
+ return "\"+to_fixed(getWeek(date))+\"";
+ default:
+ return a;
+ }
+ });
+ // tslint:disable-next-line: function-constructor
+ var dateToStrFn = new Function("date", "to_fixed", "locale", "getISOWeek", "getWeek", "return \"" + format + "\";");
+ return function (date) {
+ return dateToStrFn(date, gantt.date.to_fixed, gantt.locale, gantt.date.getISOWeek, gantt.date.getWeek);
+ };
+};
+var strToDate = function (format, utc, gantt) {
+ var splt = "var temp=date.match(/[a-zA-Z]+|[0-9]+/g);";
+ var mask = format.match(/%[a-zA-Z]/g);
+ for (var i = 0; i < mask.length; i++) {
+ switch (mask[i]) {
+ case "%j":
+ case "%d":
+ splt += "set[2]=temp[" + i + "]||1;";
+ break;
+ case "%n":
+ case "%m":
+ splt += "set[1]=(temp[" + i + "]||1)-1;";
+ break;
+ case "%y":
+ splt += "set[0]=temp[" + i + "]*1+(temp[" + i + "]>50?1900:2000);";
+ break;
+ case "%g":
+ case "%G":
+ case "%h":
+ case "%H":
+ splt += "set[3]=temp[" + i + "]||0;";
+ break;
+ case "%i":
+ splt += "set[4]=temp[" + i + "]||0;";
+ break;
+ case "%Y":
+ splt += "set[0]=temp[" + i + "]||0;";
+ break;
+ case "%a":
+ case "%A":
+ splt += "set[3]=set[3]%12+((temp[" + i + "]||'').toLowerCase()=='am'?0:12);";
+ break;
+ case "%s":
+ splt += "set[5]=temp[" + i + "]||0;";
+ break;
+ case "%M":
+ splt += "set[1]=locale.date.month_short_hash[temp[" + i + "]]||0;";
+ break;
+ case "%F":
+ splt += "set[1]=locale.date.month_full_hash[temp[" + i + "]]||0;";
+ break;
+ default:
+ break;
+ }
+ }
+ var code = "set[0],set[1],set[2],set[3],set[4],set[5]";
+ if (utc) {
+ code = " Date.UTC(" + code + ")";
+ }
+ // tslint:disable-next-line: function-constructor
+ var strToDateFn = new Function("date", "locale", "var set=[0,0,1,0,0,0]; " + splt + " return new Date(" + code + ");");
+ return function (dateString) {
+ return strToDateFn(dateString, gantt.locale);
+ };
+};
+var fastVersion = {
+ date_to_str: dateToStr,
+ str_to_date: strToDate
+};
+exports.default = fastVersion;
+
+
+/***/ }),
+
+/***/ "./sources/core/common/dnd.js":
+/*!************************************!*\
+ !*** ./sources/core/common/dnd.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var eventable = __webpack_require__(/*! ../../utils/eventable */ "./sources/utils/eventable.js");
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var timeout = __webpack_require__(/*! ../../utils/timeout */ "./sources/utils/timeout.js");
+
+var global = __webpack_require__(/*! ../../utils/global */ "./sources/utils/global.js");
+
+var domHelpers = __webpack_require__(/*! ../ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+module.exports = function (gantt) {
+ function copyDomEvent(e) {
+ return {
+ target: e.target || e.srcElement,
+ pageX: e.pageX,
+ pageY: e.pageY,
+ clientX: e.clientX,
+ clientY: e.clientY,
+ metaKey: e.metaKey,
+ shiftKey: e.shiftKey,
+ ctrlKey: e.ctrlKey,
+ altKey: e.altKey
+ };
+ }
+
+ function DnD(obj, config) {
+ this._obj = obj;
+ this._settings = config || {};
+ eventable(this);
+ var inputMethods = this.getInputMethods();
+ this._drag_start_timer = null;
+ gantt.attachEvent("onGanttScroll", utils.bind(function (left, top) {
+ this.clearDragTimer();
+ }, this));
+ var lastDown = 0;
+ var eventParams = {
+ passive: false
+ };
+
+ for (var i = 0; i < inputMethods.length; i++) {
+ utils.bind(function (input) {
+ gantt.event(obj, input.down, utils.bind(function (e) {
+ if (!input.accessor(e)) {
+ return;
+ }
+
+ if (config.preventDefault && config.selector && domHelpers.closest(e.target, config.selector)) {
+ e.preventDefault();
+ }
+
+ if (gantt.config.touch && e.timeStamp && e.timeStamp - lastDown < 300) {
+ return;
+ }
+
+ this._settings.original_target = copyDomEvent(e);
+
+ if (gantt.config.touch) {
+ this.clearDragTimer();
+ this._drag_start_timer = setTimeout(utils.bind(function () {
+ if (gantt.getState().lightbox) {
+ return;
+ }
+
+ this.dragStart(obj, e, input);
+ }, this), gantt.config.touch_drag);
+ } else {
+ this.dragStart(obj, e, input);
+ }
+ }, this), eventParams);
+ var eventElement = document.body;
+ gantt.event(eventElement, input.up, utils.bind(function (e) {
+ if (!input.accessor(e)) {
+ return;
+ }
+
+ this.clearDragTimer();
+ }, this), eventParams);
+ }, this)(inputMethods[i]);
+ }
+ }
+
+ DnD.prototype = {
+ traceDragEvents: function traceDragEvents(domElement, inputMethod) {
+ var mousemove = utils.bind(function (e) {
+ return this.dragMove(domElement, e, inputMethod.accessor);
+ }, this);
+ utils.bind(function (e) {
+ return this.dragScroll(domElement, e);
+ }, this);
+ var limited_mousemove = utils.bind(function (e) {
+ if (this.config.started && utils.defined(this.config.updates_per_second)) {
+ if (!timeout(this, this.config.updates_per_second)) return;
+ }
+
+ var dndActive = mousemove(e);
+
+ if (dndActive) {
+ try {
+ if (e && e.preventDefault && e.cancelable) {
+ //e.cancelable condition - because navigator.vibrate is blocked by Chrome
+ e.preventDefault(); //Cancel default action on DND
+ } //Cancel default action on DND
+
+ } catch (e) {// just suppress the exception, nothing needed to be done here
+ } //e.cancelBubble = true;
+
+ }
+
+ return dndActive;
+ }, this);
+ var eventElement = domHelpers.getRootNode(gantt.$root);
+ var mousemoveContainer = this.config.mousemoveContainer || domHelpers.getRootNode(gantt.$root);
+ var eventParams = {
+ passive: false
+ };
+ var mouseup = utils.bind(function (e) {
+ gantt.eventRemove(mousemoveContainer, inputMethod.move, limited_mousemove);
+ gantt.eventRemove(eventElement, inputMethod.up, mouseup, eventParams);
+ return this.dragEnd(domElement);
+ }, this);
+ gantt.event(mousemoveContainer, inputMethod.move, limited_mousemove, eventParams);
+ gantt.event(eventElement, inputMethod.up, mouseup, eventParams);
+ },
+ checkPositionChange: function checkPositionChange(pos) {
+ var diff_x = pos.x - this.config.pos.x;
+ var diff_y = pos.y - this.config.pos.y;
+ var distance = Math.sqrt(Math.pow(Math.abs(diff_x), 2) + Math.pow(Math.abs(diff_y), 2));
+
+ if (distance > this.config.sensitivity) {
+ return true;
+ } else {
+ return false;
+ }
+ },
+ initDnDMarker: function initDnDMarker() {
+ // create dnd placeholder and put it in dom
+ var marker = this.config.marker = document.createElement("div");
+ marker.className = "gantt_drag_marker"; // GS-1333: don't show any message when we resize grid columns
+
+ marker.innerHTML = "";
+ document.body.appendChild(marker);
+ },
+ backupEventTarget: function backupEventTarget(domEvent, getEvent) {
+ if (!gantt.config.touch) {
+ return;
+ } // keep original event target in DOM in order to keep dnd on touchmove event
+
+
+ var e = getEvent(domEvent);
+ var el = e.target || e.srcElement;
+ var copy = el.cloneNode(true); //this.config.target.target = copy;
+
+ this.config.original_target = copyDomEvent(e);
+ this.config.original_target.target = copy;
+ this.config.backup_element = el;
+ el.parentNode.appendChild(copy);
+ el.style.display = "none";
+ var mousemoveContainer = this.config.mousemoveContainer || document.body;
+ mousemoveContainer.appendChild(el);
+ },
+ getInputMethods: function getInputMethods() {
+ // bind actions to browser events
+ var inputMethods = [];
+ inputMethods.push({
+ "move": "mousemove",
+ "down": "mousedown",
+ "up": "mouseup",
+ "accessor": function accessor(e) {
+ return e;
+ }
+ });
+
+ if (gantt.config.touch) {
+ var touchEventsSupported = true;
+
+ try {
+ document.createEvent("TouchEvent");
+ } catch (e) {
+ touchEventsSupported = false;
+ }
+
+ if (touchEventsSupported) {
+ inputMethods.push({
+ "move": "touchmove",
+ "down": "touchstart",
+ "up": "touchend",
+ "accessor": function accessor(ev) {
+ if (ev.touches && ev.touches.length > 1) return null;
+ if (ev.touches[0]) return {
+ target: document.elementFromPoint(ev.touches[0].clientX, ev.touches[0].clientY),
+ pageX: ev.touches[0].pageX,
+ pageY: ev.touches[0].pageY,
+ clientX: ev.touches[0].clientX,
+ clientY: ev.touches[0].clientY
+ };else return ev;
+ }
+ });
+ } else if (global.navigator.pointerEnabled) {
+ inputMethods.push({
+ "move": "pointermove",
+ "down": "pointerdown",
+ "up": "pointerup",
+ "accessor": function accessor(ev) {
+ if (ev.pointerType == "mouse") return null;
+ return ev;
+ }
+ });
+ } else if (global.navigator.msPointerEnabled) {
+ inputMethods.push({
+ "move": "MSPointerMove",
+ "down": "MSPointerDown",
+ "up": "MSPointerUp",
+ "accessor": function accessor(ev) {
+ if (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE) return null;
+ return ev;
+ }
+ });
+ }
+ }
+
+ return inputMethods;
+ },
+ clearDragTimer: function clearDragTimer() {
+ if (this._drag_start_timer) {
+ clearTimeout(this._drag_start_timer);
+ this._drag_start_timer = null;
+ }
+ },
+ dragStart: function dragStart(obj, e, inputMethod) {
+ if (this.config && this.config.started) {
+ return;
+ }
+
+ this.config = {
+ obj: obj,
+ marker: null,
+ started: false,
+ pos: this.getPosition(e),
+ sensitivity: 4
+ };
+ if (this._settings) utils.mixin(this.config, this._settings, true);
+ this.traceDragEvents(obj, inputMethod);
+ gantt._prevent_touch_scroll = true;
+ document.body.className += " gantt_noselect";
+
+ if (gantt.config.touch) {
+ this.dragMove(obj, e, inputMethod.accessor);
+ }
+ },
+ dragMove: function dragMove(obj, e, getEvent) {
+ var source = getEvent(e);
+ if (!source) return false;
+
+ if (!this.config.marker && !this.config.started) {
+ var pos = this.getPosition(source);
+
+ if (gantt.config.touch || this.checkPositionChange(pos)) {
+ // real drag starts here,
+ // when user moves mouse at first time after onmousedown
+ this.config.started = true;
+ this.config.ignore = false;
+
+ if (this.callEvent("onBeforeDragStart", [obj, this.config.original_target]) === false) {
+ this.config.ignore = true;
+ return false;
+ }
+
+ this.backupEventTarget(e, getEvent);
+ this.initDnDMarker();
+
+ gantt._touch_feedback();
+
+ this.callEvent("onAfterDragStart", [obj, this.config.original_target]);
+ } else {
+ this.config.ignore = true;
+ }
+ }
+
+ if (!this.config.ignore) {
+ // GS-1279 Gantt crashes on Mobile Firefox after starting to create a link and moving finger outisde the page.
+ if (e.targetTouches && !source.target) return;
+ source.pos = this.getPosition(source);
+ this.config.marker.style.left = source.pos.x + "px";
+ this.config.marker.style.top = source.pos.y + "px";
+ this.callEvent("onDragMove", [obj, source]);
+ return true;
+ }
+
+ return false;
+ },
+ dragEnd: function dragEnd(obj) {
+ var target = this.config.backup_element;
+
+ if (target && target.parentNode) {
+ target.parentNode.removeChild(target);
+ }
+
+ gantt._prevent_touch_scroll = false;
+
+ if (this.config.marker) {
+ this.config.marker.parentNode.removeChild(this.config.marker);
+ this.config.marker = null;
+ this.callEvent("onDragEnd", []);
+ }
+
+ this.config.started = false;
+ document.body.className = document.body.className.replace(" gantt_noselect", "");
+ },
+ getPosition: function getPosition(e) {
+ var x = 0,
+ y = 0;
+
+ if (e.pageX || e.pageY) {
+ x = e.pageX;
+ y = e.pageY;
+ } else if (e.clientX || e.clientY) {
+ x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
+ y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
+ }
+
+ return {
+ x: x,
+ y: y
+ };
+ }
+ };
+ return DnD;
+};
+
+/***/ }),
+
+/***/ "./sources/core/common/duration_formatter_numeric.ts":
+/*!***********************************************************!*\
+ !*** ./sources/core/common/duration_formatter_numeric.ts ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var DurationFormatterNumeric = /** @class */ (function () {
+ function DurationFormatterNumeric() {
+ var _this = this;
+ this.canParse = function (value) {
+ return !isNaN(_this.parse(value));
+ };
+ this.format = function (value) {
+ return String(value);
+ };
+ this.parse = function (value) {
+ return parseInt(value, 10);
+ };
+ }
+ DurationFormatterNumeric.create = function (settings) {
+ if (settings === void 0) { settings = null; }
+ return new DurationFormatterNumeric();
+ };
+ return DurationFormatterNumeric;
+}());
+exports.default = DurationFormatterNumeric;
+
+
+/***/ }),
+
+/***/ "./sources/core/common/link_formatter_simple.ts":
+/*!******************************************************!*\
+ !*** ./sources/core/common/link_formatter_simple.ts ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var LinkFormatterSimple = /** @class */ (function () {
+ function LinkFormatterSimple(gantt) {
+ var _this = this;
+ this.format = function (link) {
+ var wbs = _this._getWBSCode(link.source);
+ return wbs;
+ };
+ this.canParse = function (value) {
+ return _this._linkReg.test(value);
+ };
+ this.parse = function (value) {
+ if (!_this.canParse(value)) {
+ return null;
+ }
+ var linkPart = _this._linkReg.exec(value)[0].trim();
+ var source = _this._findSource(linkPart) || null;
+ return {
+ id: undefined,
+ source: source,
+ target: null,
+ type: _this._gantt.config.links.finish_to_start,
+ lag: 0
+ };
+ };
+ this._getWBSCode = function (source) {
+ var pred = _this._gantt.getTask(source);
+ return _this._gantt.getWBSCode(pred);
+ };
+ this._findSource = function (value) {
+ var reqTemplate = new RegExp("^[0-9\.]+", "i");
+ if (reqTemplate.exec(value)) {
+ var wbs = reqTemplate.exec(value)[0];
+ var task = _this._gantt.getTaskByWBSCode(wbs);
+ if (task) {
+ return task.id;
+ }
+ }
+ return null;
+ };
+ this._linkReg = /^[0-9\.]+/;
+ this._gantt = gantt;
+ }
+ LinkFormatterSimple.create = function (settings, gantt) {
+ if (settings === void 0) { settings = null; }
+ return new LinkFormatterSimple(gantt);
+ };
+ return LinkFormatterSimple;
+}());
+exports.default = LinkFormatterSimple;
+
+
+/***/ }),
+
+/***/ "./sources/core/common/serialize.ts":
+/*!******************************************!*\
+ !*** ./sources/core/common/serialize.ts ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function serialize(data) {
+ if (typeof data === "string" || typeof data === "number") {
+ return data;
+ }
+ var result = "";
+ for (var key in data) {
+ var serialized = "";
+ if (data.hasOwnProperty(key)) {
+ if (typeof data[key] === "string") {
+ serialized = encodeURIComponent(data[key]);
+ }
+ else if (typeof data[key] === "number") {
+ serialized = data[key];
+ }
+ else {
+ serialized = encodeURIComponent(JSON.stringify(data[key]));
+ }
+ serialized = key + "=" + serialized;
+ if (result.length) {
+ serialized = "&" + serialized;
+ }
+ result += serialized;
+ }
+ }
+ return result;
+}
+exports.default = serialize;
+
+
+/***/ }),
+
+/***/ "./sources/core/common/services.js":
+/*!*****************************************!*\
+ !*** ./sources/core/common/services.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function () {
+ var services = {};
+
+ function register(name, getter) {
+ services[name] = getter;
+ }
+
+ function getService(name) {
+ if (!services[name]) {
+ return null;
+ }
+
+ return services[name]();
+ }
+
+ function dropService(name) {
+ if (services[name]) {
+ delete services[name];
+ }
+ }
+
+ var servicesEnum = {};
+ return {
+ services: servicesEnum,
+ setService: register,
+ getService: getService,
+ dropService: dropService,
+ destructor: function destructor() {
+ for (var i in services) {
+ if (services[i]) {
+ var service = services[i];
+
+ if (service && service.destructor) {
+ service.destructor();
+ }
+ }
+ }
+
+ services = null;
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/common/state.js":
+/*!**************************************!*\
+ !*** ./sources/core/common/state.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var StateService = function StateService() {
+ var stateProviders = {};
+
+ function getState(name) {
+ var provider = stateProviders[name];
+
+ if (provider) {
+ return stateProviders[name].method();
+ } else {
+ var res = {};
+
+ for (var i in stateProviders) {
+ if (!stateProviders[i].internal) utils.mixin(res, stateProviders[i].method(), true);
+ }
+
+ return res;
+ }
+ }
+
+ function registerProvider(name, provider, internal) {
+ stateProviders[name] = {
+ method: provider,
+ internal: internal
+ };
+ }
+
+ function unregisterProvider(name) {
+ delete stateProviders[name];
+ }
+
+ return {
+ getState: getState,
+ registerProvider: registerProvider,
+ unregisterProvider: unregisterProvider
+ };
+};
+
+module.exports = StateService;
+
+/***/ }),
+
+/***/ "./sources/core/common/templates.js":
+/*!******************************************!*\
+ !*** ./sources/core/common/templates.js ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ var regTemplates = {};
+
+ function initTemplate(name, initial, template_name) {
+ template_name = template_name || name;
+ var config = gantt.config,
+ templates = gantt.templates;
+
+ if (gantt.config[name] && regTemplates[template_name] != config[name]) {
+ if (!(initial && templates[template_name])) {
+ templates[template_name] = gantt.date.date_to_str(config[name]);
+ regTemplates[template_name] = config[name];
+ }
+ }
+ }
+
+ function initTemplates() {
+ var labels = gantt.locale.labels;
+ labels.gantt_save_btn = labels.icon_save;
+ labels.gantt_cancel_btn = labels.icon_cancel;
+ labels.gantt_delete_btn = labels.icon_delete;
+ var date = gantt.date; //build configuration based templates
+
+ var d = date.date_to_str;
+ var c = gantt.config;
+ var format_date = d(c.xml_date || c.date_format, c.server_utc);
+ var parse_date = date.str_to_date(c.xml_date || c.date_format, c.server_utc);
+ initTemplate("date_scale", true, undefined, gantt.config, gantt.templates);
+ initTemplate("date_grid", true, "grid_date_format", gantt.config, gantt.templates);
+ initTemplate("task_date", true, undefined, gantt.config, gantt.templates);
+ gantt.mixin(gantt.templates, {
+ xml_format: undefined,
+ // deprecated
+ format_date: format_date,
+ xml_date: undefined,
+ // deprecated
+ parse_date: parse_date,
+ progress_text: function progress_text(start, end, task) {
+ return "";
+ },
+ grid_header_class: function grid_header_class(column, config) {
+ return "";
+ },
+ task_text: function task_text(start, end, task) {
+ return task.text;
+ },
+ task_class: function task_class(start, end, task) {
+ return "";
+ },
+ task_end_date: function task_end_date(date) {
+ return gantt.templates.task_date(date);
+ },
+ grid_row_class: function grid_row_class(start, end, task) {
+ return "";
+ },
+ task_row_class: function task_row_class(start, end, task) {
+ return "";
+ },
+ timeline_cell_class: function timeline_cell_class(item, date) {
+ return "";
+ },
+ timeline_cell_content: function timeline_cell_content(item, date) {
+ return "";
+ },
+ scale_cell_class: function scale_cell_class(date) {
+ return "";
+ },
+ scale_row_class: function scale_row_class(date) {
+ return "";
+ },
+ grid_indent: function grid_indent(item) {
+ return "<div class='gantt_tree_indent'></div>";
+ },
+ grid_folder: function grid_folder(item) {
+ return "<div class='gantt_tree_icon gantt_folder_" + (item.$open ? "open" : "closed") + "'></div>";
+ },
+ grid_file: function grid_file(item) {
+ return "<div class='gantt_tree_icon gantt_file'></div>";
+ },
+ grid_open: function grid_open(item) {
+ return "<div class='gantt_tree_icon gantt_" + (item.$open ? "close" : "open") + "'></div>";
+ },
+ grid_blank: function grid_blank(item) {
+ return "<div class='gantt_tree_icon gantt_blank'></div>";
+ },
+ date_grid: function date_grid(date, item, column) {
+ if (item && gantt.isUnscheduledTask(item) && gantt.config.show_unscheduled) {
+ return gantt.templates.task_unscheduled_time(item);
+ } else {
+ return gantt.templates.grid_date_format(date, column);
+ }
+ },
+ task_time: function task_time(start, end, ev) {
+ if (gantt.isUnscheduledTask(ev) && gantt.config.show_unscheduled) {
+ return gantt.templates.task_unscheduled_time(ev);
+ } else {
+ return gantt.templates.task_date(start) + " - " + gantt.templates.task_end_date(end);
+ }
+ },
+ task_unscheduled_time: function task_unscheduled_time(task) {
+ return "";
+ },
+ time_picker: d(c.time_picker),
+ link_class: function link_class(link) {
+ return "";
+ },
+ link_description: function link_description(link) {
+ var from = gantt.getTask(link.source),
+ to = gantt.getTask(link.target);
+ return "<b>" + from.text + "</b> – <b>" + to.text + "</b>";
+ },
+ drag_link: function drag_link(from, from_start, to, to_start) {
+ from = gantt.getTask(from);
+ var labels = gantt.locale.labels;
+ var text = "<b>" + from.text + "</b> " + (from_start ? labels.link_start : labels.link_end) + "<br/>";
+
+ if (to) {
+ to = gantt.getTask(to);
+ text += "<b> " + to.text + "</b> " + (to_start ? labels.link_start : labels.link_end) + "<br/>";
+ }
+
+ return text;
+ },
+ drag_link_class: function drag_link_class(from, from_start, to, to_start) {
+ var add = "";
+
+ if (from && to) {
+ var allowed = gantt.isLinkAllowed(from, to, from_start, to_start);
+ add = " " + (allowed ? "gantt_link_allow" : "gantt_link_deny");
+ }
+
+ return "gantt_link_tooltip" + add;
+ },
+
+ /* used for aria-labels of bar elements and for tooltip.js */
+ tooltip_date_format: date.date_to_str("%Y-%m-%d"),
+ tooltip_text: function tooltip_text(start, end, event) {
+ return "<b>Task:</b> " + event.text + "<br/><b>Start date:</b> " + gantt.templates.tooltip_date_format(start) + "<br/><b>End date:</b> " + gantt.templates.tooltip_date_format(end);
+ // return "<b>浠诲姟:</b> " + event.text + "<br/><b>寮�濮嬫椂闂�:</b> " + gantt.templates.tooltip_date_format(start) + "<br/><b>缁撴潫鏃堕棿:</b> " + gantt.templates.tooltip_date_format(end);
+ }
+ });
+ }
+
+ return {
+ initTemplates: initTemplates,
+ initTemplate: initTemplate
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/data.js":
+/*!******************************!*\
+ !*** ./sources/core/data.js ***!
+ \******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var helpers = __webpack_require__(/*! ../utils/helpers */ "./sources/utils/helpers.js");
+
+module.exports = function (gantt) {
+ gantt.isUnscheduledTask = function (task) {
+ gantt.assert(task && task instanceof Object, "Invalid argument <b>task</b>=" + task + " of gantt.isUnscheduledTask. Task object was expected");
+ return !!task.unscheduled || !task.start_date;
+ };
+
+ gantt._isAllowedUnscheduledTask = function (task) {
+ return !!(task.unscheduled && gantt.config.show_unscheduled);
+ };
+
+ gantt._isTaskInTimelineLimits = function (task) {
+ var taskStart = task.start_date ? task.start_date.valueOf() : null;
+ var taskEnd = task.end_date ? task.end_date.valueOf() : null;
+ return !!(taskStart && taskEnd && taskStart <= this._max_date.valueOf() && taskEnd >= this._min_date.valueOf());
+ };
+
+ gantt.isTaskVisible = function (id) {
+ if (!this.isTaskExists(id)) {
+ return false;
+ }
+
+ var task = this.getTask(id);
+
+ if (!(this._isAllowedUnscheduledTask(task) || this._isTaskInTimelineLimits(task))) {
+ return false;
+ }
+
+ return !!(this.getGlobalTaskIndex(id) >= 0);
+ };
+
+ gantt._getProjectEnd = function () {
+ if (gantt.config.project_end) {
+ return gantt.config.project_end;
+ } else {
+ var tasks = gantt.getTaskByTime();
+ tasks = tasks.sort(function (a, b) {
+ return +a.end_date > +b.end_date ? 1 : -1;
+ });
+ return tasks.length ? tasks[tasks.length - 1].end_date : null;
+ }
+ };
+
+ gantt._getProjectStart = function () {
+ if (gantt.config.project_start) {
+ return gantt.config.project_start;
+ } // use timeline start if project start is not specified
+
+
+ if (gantt.config.start_date) {
+ return gantt.config.start_date;
+ }
+
+ if (gantt.getState().min_date) {
+ return gantt.getState().min_date;
+ } // earliest task start if neither project start nor timeline are specified
+
+
+ var tasks = gantt.getTaskByTime();
+ tasks = tasks.sort(function (a, b) {
+ return +a.start_date > +b.start_date ? 1 : -1;
+ });
+ return tasks.length ? tasks[0].start_date : null;
+ };
+
+ var getDefaultTaskDate = function getDefaultTaskDate(item, parent_id) {
+ var parentExists = parent_id && parent_id != gantt.config.root_id && gantt.isTaskExists(parent_id);
+ var parent = parentExists ? gantt.getTask(parent_id) : false,
+ startDate = null;
+
+ if (parent) {
+ if (gantt.config.schedule_from_end) {
+ startDate = gantt.calculateEndDate({
+ start_date: parent.end_date,
+ duration: -gantt.config.duration_step,
+ task: item
+ });
+ } else {
+ startDate = parent.start_date;
+ }
+ } else if (gantt.config.schedule_from_end) {
+ startDate = gantt.calculateEndDate({
+ start_date: gantt._getProjectEnd(),
+ duration: -gantt.config.duration_step,
+ task: item
+ });
+ } else {
+ var first = gantt.getTaskByIndex(0);
+ startDate = first ? first.start_date ? first.start_date : first.end_date ? gantt.calculateEndDate({
+ start_date: first.end_date,
+ duration: -gantt.config.duration_step,
+ task: item
+ }) : null : gantt.config.start_date || gantt.getState().min_date;
+ }
+
+ gantt.assert(startDate, "Invalid dates");
+ return new Date(startDate);
+ };
+
+ gantt._set_default_task_timing = function (task) {
+ task.start_date = task.start_date || getDefaultTaskDate(task, gantt.getParent(task));
+ task.duration = task.duration || gantt.config.duration_step;
+ task.end_date = task.end_date || gantt.calculateEndDate(task);
+ };
+
+ gantt.createTask = function (item, parent, index) {
+ item = item || {};
+ if (!gantt.defined(item.id)) item.id = gantt.uid();
+
+ if (!item.start_date) {
+ item.start_date = getDefaultTaskDate(item, parent);
+ }
+
+ if (item.text === undefined) {
+ item.text = gantt.locale.labels.new_task;
+ }
+
+ if (item.duration === undefined) {
+ item.duration = 1;
+ }
+
+ if (this.isTaskExists(parent)) {
+ this.setParent(item, parent, true);
+ var parentObj = this.getTask(parent);
+ parentObj.$open = true;
+ }
+
+ if (!this.callEvent("onTaskCreated", [item])) {
+ return null;
+ }
+
+ if (this.config.details_on_create) {
+ //GS-761: assert unique ID
+ if (gantt.isTaskExists(item.id)) {
+ var task = gantt.getTask(item.id);
+
+ if (task.$index != item.$index) {
+ // Someone may try to mistakenly add a task with the same ID, and most likely
+ // use the string format for the dates. Gantt shouldn't break in this scenario
+ if (item.start_date && typeof item.start_date === "string") {
+ item.start_date = this.date.parseDate(item.start_date, "parse_date");
+ }
+
+ if (item.end_date && typeof item.end_date === "string") {
+ item.end_date = this.date.parseDate(item.end_date, "parse_date");
+ }
+
+ this.$data.tasksStore.updateItem(item.id, item);
+ }
+ } else {
+ item.$new = true;
+ this.silent(function () {
+ gantt.$data.tasksStore.addItem(item, index);
+ });
+ }
+
+ this.selectTask(item.id);
+ this.refreshData();
+ this.showLightbox(item.id);
+ } else {
+ if (this.addTask(item, parent, index)) {
+ this.showTask(item.id);
+ this.selectTask(item.id);
+ }
+ }
+
+ return item.id;
+ };
+
+ gantt._update_flags = function (oldid, newid) {
+ // TODO: need a proper way to update all possible flags
+ var store = gantt.$data.tasksStore;
+
+ if (oldid === undefined) {
+ this._lightbox_id = null;
+ store.silent(function () {
+ store.unselect();
+ }); // GS-1522. If we have multiselect, unselect all previously selected tasks
+
+ if (this.getSelectedTasks) {
+ this._multiselect.reset();
+ }
+
+ if (this._tasks_dnd && this._tasks_dnd.drag) {
+ this._tasks_dnd.drag.id = null;
+ }
+ } else {
+ if (this._lightbox_id == oldid) this._lightbox_id = newid; // TODO: probably can be removed
+
+ if (store.getSelectedId() == oldid) {
+ store.silent(function () {
+ store.unselect(oldid);
+ store.select(newid);
+ });
+ }
+
+ if (this._tasks_dnd && this._tasks_dnd.drag && this._tasks_dnd.drag.id == oldid) {
+ this._tasks_dnd.drag.id = newid;
+ }
+ }
+ };
+
+ var getTaskTimingMode = function getTaskTimingMode(task, force) {
+ var task_type = gantt.getTaskType(task.type);
+ var state = {
+ type: task_type,
+ $no_start: false,
+ $no_end: false
+ };
+
+ if (!force && task_type == task.$rendered_type) {
+ state.$no_start = task.$no_start;
+ state.$no_end = task.$no_end;
+ return state;
+ }
+
+ if (task_type == gantt.config.types.project) {
+ //project duration is always defined by children duration
+ state.$no_end = state.$no_start = true;
+ } else if (task_type != gantt.config.types.milestone) {
+ //tasks can have fixed duration, children duration(as projects), or one date fixed, and other defined by nested items
+ state.$no_end = !(task.end_date || task.duration);
+ state.$no_start = !task.start_date;
+
+ if (gantt._isAllowedUnscheduledTask(task)) {
+ state.$no_end = state.$no_start = false;
+ }
+ }
+
+ return state;
+ };
+
+ gantt._init_task_timing = function (task) {
+ var task_mode = getTaskTimingMode(task, true);
+ var dirty = task.$rendered_type != task_mode.type;
+ var task_type = task_mode.type;
+
+ if (dirty) {
+ task.$no_start = task_mode.$no_start;
+ task.$no_end = task_mode.$no_end;
+ task.$rendered_type = task_mode.type;
+ }
+
+ if (dirty && task_type != this.config.types.milestone) {
+ if (task_type == this.config.types.project) {
+ //project duration is always defined by children duration
+ this._set_default_task_timing(task);
+
+ task.$calculate_duration = false; // do not recalculate duration below
+ }
+ }
+
+ if (task_type == this.config.types.milestone) {
+ task.end_date = task.start_date;
+ }
+
+ if (task.start_date && task.end_date && task.$calculate_duration !== false) {
+ task.duration = this.calculateDuration(task);
+ }
+
+ if (!task.$calculate_duration) {
+ task.$calculate_duration = true;
+ }
+
+ if (!task.end_date) {
+ task.end_date = task.start_date;
+ }
+
+ task.duration = task.duration || 0; // GS-1145. We should let tasks to have 0 duration if user wants it
+
+ if (this.config.min_duration === 0 && task.duration === 0) {
+ task.$no_end = false;
+ } // work calendar of task has changed
+
+
+ var effectiveCalendar = this.getTaskCalendar(task);
+
+ if (task.$effective_calendar && task.$effective_calendar !== effectiveCalendar.id) {
+ updateTaskTiming(task);
+
+ if (this.config.inherit_calendar && this.isSummaryTask(task)) {
+ this.eachTask(function (child) {
+ updateTaskTiming(child);
+ }, task.id);
+ }
+ }
+
+ task.$effective_calendar = effectiveCalendar.id;
+ };
+
+ function updateTaskTiming(task) {
+ task.$effective_calendar = gantt.getTaskCalendar(task).id;
+ task.start_date = gantt.getClosestWorkTime({
+ dir: "future",
+ date: task.start_date,
+ unit: gantt.config.duration_unit,
+ task: task
+ });
+ task.end_date = gantt.calculateEndDate(task);
+ }
+
+ gantt.isSummaryTask = function (task) {
+ gantt.assert(task && task instanceof Object, "Invalid argument <b>task</b>=" + task + " of gantt.isSummaryTask. Task object was expected");
+ var mode = getTaskTimingMode(task);
+ return !!(mode.$no_end || mode.$no_start);
+ }; // downward calculation of project duration
+
+
+ gantt.resetProjectDates = function (task) {
+ var taskMode = getTaskTimingMode(task);
+
+ if (taskMode.$no_end || taskMode.$no_start) {
+ var info = getSubtaskInfo(task.id);
+ assignProjectDates.call(this, task, taskMode, info.start_date, info.end_date);
+ task.$rollup = info.rollup;
+ }
+ };
+
+ function assignProjectDates(task, taskTiming, from, to) {
+ if (taskTiming.$no_start) {
+ if (from) {
+ task.start_date = new Date(from);
+ } else {
+ task.start_date = getDefaultTaskDate(task, this.getParent(task));
+ }
+ }
+
+ if (taskTiming.$no_end) {
+ if (to) {
+ task.end_date = new Date(to);
+ } else {
+ task.end_date = this.calculateEndDate({
+ start_date: task.start_date,
+ duration: this.config.duration_step,
+ task: task
+ });
+ }
+ }
+
+ if (taskTiming.$no_start || taskTiming.$no_end) {
+ this._init_task_timing(task);
+ }
+ }
+
+ gantt.getSubtaskDuration = function (taskId) {
+ var res = 0,
+ root = taskId !== undefined ? taskId : gantt.config.root_id;
+ this.eachTask(function (child) {
+ if (this.getTaskType(child.type) == gantt.config.types.project || this.isUnscheduledTask(child)) return;
+ res += child.duration;
+ }, root);
+ return res;
+ };
+
+ function getSubtaskInfo(taskId) {
+ var min = null,
+ max = null,
+ root = taskId !== undefined ? taskId : gantt.config.root_id,
+ rollup = [];
+ gantt.eachTask(function (child) {
+ if (gantt.getTaskType(child.type) == gantt.config.types.project || gantt.isUnscheduledTask(child)) return;
+
+ if (child.rollup) {
+ rollup.push(child.id);
+ }
+
+ if (child.start_date && !child.$no_start && (!min || min > child.start_date.valueOf())) min = child.start_date.valueOf();
+ if (child.end_date && !child.$no_end && (!max || max < child.end_date.valueOf())) max = child.end_date.valueOf();
+ }, root);
+ return {
+ start_date: min ? new Date(min) : null,
+ end_date: max ? new Date(max) : null,
+ rollup: rollup
+ };
+ }
+
+ gantt.getSubtaskDates = function (task_id) {
+ var info = getSubtaskInfo(task_id);
+ return {
+ start_date: info.start_date,
+ end_date: info.end_date
+ };
+ }; // upward calculation of project duration
+
+
+ gantt._update_parents = function (taskId, silent, updateAll) {
+ if (!taskId) return;
+ var task = this.getTask(taskId);
+
+ if (task.rollup) {
+ updateAll = true;
+ }
+
+ var pid = this.getParent(task);
+ var taskTiming = getTaskTimingMode(task);
+ var has_changed = true; // GS-761 the dates check is necessary for adding empty tasks: gantt.addTask({id:"2"})
+
+ if (updateAll || task.start_date && task.end_date && (taskTiming.$no_start || taskTiming.$no_end)) {
+ var oldStart = task.start_date.valueOf(),
+ oldEnd = task.end_date.valueOf();
+ gantt.resetProjectDates(task); // not refresh parent projects if dates hasn't changed
+
+ if (!updateAll && oldStart == task.start_date.valueOf() && oldEnd == task.end_date.valueOf()) {
+ has_changed = false;
+ }
+
+ if (has_changed && !silent) {
+ this.refreshTask(task.id, true);
+ }
+ }
+
+ if (has_changed && pid && this.isTaskExists(pid)) {
+ this._update_parents(pid, silent, updateAll);
+ }
+ };
+
+ gantt.roundDate = function (config) {
+ var scale = gantt.getScale();
+
+ if (helpers.isDate(config)) {
+ config = {
+ date: config,
+ unit: scale ? scale.unit : gantt.config.duration_unit,
+ step: scale ? scale.step : gantt.config.duration_step
+ };
+ }
+
+ var date = config.date,
+ steps = config.step,
+ unit = config.unit;
+
+ if (!scale) {
+ return date;
+ }
+
+ var upper, lower, colIndex;
+
+ if (unit == scale.unit && steps == scale.step && +date >= +scale.min_date && +date <= +scale.max_date) {
+ //find date in time scale config
+ colIndex = Math.floor(gantt.columnIndexByDate(date));
+
+ if (!scale.trace_x[colIndex]) {
+ colIndex -= 1; // end of time scale
+
+ if (scale.rtl) {
+ colIndex = 0;
+ }
+ }
+
+ lower = new Date(scale.trace_x[colIndex]);
+ upper = gantt.date.add(lower, steps, unit);
+ } else {
+ colIndex = Math.floor(gantt.columnIndexByDate(date));
+ upper = gantt.date[unit + "_start"](new Date(scale.min_date));
+
+ if (scale.trace_x[colIndex]) {
+ upper = gantt.date[unit + "_start"](scale.trace_x[colIndex]); // end of time scale
+ }
+
+ while (+upper < +date) {
+ upper = gantt.date[unit + "_start"](gantt.date.add(upper, steps, unit));
+ var tzOffset = upper.getTimezoneOffset();
+ upper = gantt._correct_dst_change(upper, tzOffset, upper, unit);
+ if (gantt.date[unit + '_start']) upper = gantt.date[unit + '_start'](upper);
+ }
+
+ lower = gantt.date.add(upper, -1 * steps, unit);
+ }
+
+ if (config.dir && config.dir == 'future') return upper;
+ if (config.dir && config.dir == 'past') return lower;
+
+ if (Math.abs(date - lower) < Math.abs(upper - date)) {
+ return lower;
+ } else {
+ return upper;
+ }
+ };
+
+ gantt.correctTaskWorkTime = function (task) {
+ if (gantt.config.work_time && gantt.config.correct_work_time) {
+ if (!this.isWorkTime(task.start_date, undefined, task)) {
+ task.start_date = this.getClosestWorkTime({
+ date: task.start_date,
+ dir: 'future',
+ task: task
+ });
+ task.end_date = this.calculateEndDate(task);
+ } else if (!this.isWorkTime(new Date(+task.end_date - 1), undefined, task)) {
+ task.end_date = this.calculateEndDate(task);
+ }
+ }
+ };
+
+ gantt.attachEvent("onBeforeTaskUpdate", function (id, task) {
+ gantt._init_task_timing(task);
+
+ return true;
+ });
+ gantt.attachEvent("onBeforeTaskAdd", function (id, task) {
+ gantt._init_task_timing(task);
+
+ return true;
+ });
+ gantt.attachEvent("onAfterTaskMove", function (id, parent, tindex) {
+ gantt._init_task_timing(gantt.getTask(id));
+
+ return true;
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/data_task_layers.gpl.js":
+/*!**********************************************!*\
+ !*** ./sources/core/data_task_layers.gpl.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ delete gantt.addTaskLayer;
+ delete gantt.addLinkLayer;
+};
+
+/***/ }),
+
+/***/ "./sources/core/data_task_types.js":
+/*!*****************************************!*\
+ !*** ./sources/core/data_task_types.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+module.exports = function (gantt) {
+ gantt.getTaskType = function (type) {
+ var checkType = type;
+
+ if (type && _typeof(type) == "object") {
+ checkType = type.type;
+ }
+
+ for (var i in this.config.types) {
+ if (this.config.types[i] == checkType) {
+ return checkType;
+ }
+ }
+
+ return gantt.config.types.task;
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/dataprocessor/data_processor.ts":
+/*!******************************************************!*\
+ !*** ./sources/core/dataprocessor/data_processor.ts ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var eventable = __webpack_require__(/*! ../../utils/eventable */ "./sources/utils/eventable.js");
+var helpers = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js");
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+var data_processor_events_1 = __webpack_require__(/*! ./data_processor_events */ "./sources/core/dataprocessor/data_processor_events.ts");
+var extend_gantt_1 = __webpack_require__(/*! ./extend_gantt */ "./sources/core/dataprocessor/extend_gantt.ts");
+var simple_storage_1 = __webpack_require__(/*! ./simple_storage */ "./sources/core/dataprocessor/simple_storage.ts");
+function createDataProcessor(config) {
+ var router;
+ var tMode;
+ if (config instanceof Function) {
+ router = config;
+ }
+ else if (config.hasOwnProperty("router")) {
+ router = config.router;
+ }
+ else if (config.hasOwnProperty("assignment") || config.hasOwnProperty("link") || config.hasOwnProperty("task")) {
+ router = config;
+ }
+ if (router) {
+ tMode = "CUSTOM";
+ }
+ else {
+ tMode = config.mode || "REST-JSON";
+ }
+ var gantt = this; // tslint:disable-line
+ var dp = new DataProcessor(config.url);
+ dp.init(gantt);
+ dp.setTransactionMode({
+ mode: tMode,
+ router: router
+ }, config.batchUpdate);
+ if (config.deleteAfterConfirmation) {
+ dp.deleteAfterConfirmation = config.deleteAfterConfirmation;
+ }
+ return dp;
+}
+exports.createDataProcessor = createDataProcessor;
+var DataProcessor = /** @class */ (function () {
+ function DataProcessor(serverProcessorURL) {
+ this.serverProcessor = serverProcessorURL;
+ this.action_param = "!nativeeditor_status";
+ this.updatedRows = []; // ids of updated rows
+ this.autoUpdate = true;
+ this.updateMode = "cell";
+ this._headers = null;
+ this._payload = null;
+ this._postDelim = "_";
+ this._routerParametersFormat = "parameters";
+ this._waitMode = 0;
+ this._in_progress = {}; // ?
+ this._storage = simple_storage_1.default.create();
+ this._invalid = {};
+ this.messages = [];
+ this.styles = {
+ updated: "font-weight:bold;",
+ inserted: "font-weight:bold;",
+ deleted: "text-decoration : line-through;",
+ invalid: "background-color:FFE0E0;",
+ invalid_cell: "border-bottom:2px solid red;",
+ error: "color:red;",
+ clear: "font-weight:normal;text-decoration:none;"
+ };
+ this.enableUTFencoding(true);
+ eventable(this);
+ }
+ DataProcessor.prototype.setTransactionMode = function (mode, total) {
+ if (typeof mode === "object") {
+ this._tMode = mode.mode || this._tMode;
+ if (utils.defined(mode.headers)) {
+ this._headers = mode.headers;
+ }
+ if (utils.defined(mode.payload)) {
+ this._payload = mode.payload;
+ }
+ this._tSend = !!total;
+ }
+ else {
+ this._tMode = mode;
+ this._tSend = total;
+ }
+ if (this._tMode === "REST") {
+ this._tSend = false;
+ }
+ if (this._tMode === "JSON" || this._tMode === "REST-JSON") {
+ this._tSend = false;
+ this._serializeAsJson = true;
+ this._headers = this._headers || {};
+ this._headers["Content-Type"] = "application/json";
+ }
+ else {
+ if (this._headers && !this._headers["Content-Type"]) {
+ this._headers["Content-Type"] = "application/x-www-form-urlencoded";
+ }
+ }
+ if (this._tMode === "CUSTOM") {
+ this._tSend = false;
+ this._router = mode.router;
+ }
+ };
+ DataProcessor.prototype.escape = function (data) {
+ if (this._utf) {
+ return encodeURIComponent(data);
+ }
+ else {
+ return escape(data);
+ }
+ };
+ /**
+ * @desc: allows to set escaping mode
+ * @param: true - utf based escaping, simple - use current page encoding
+ * @type: public
+ */
+ DataProcessor.prototype.enableUTFencoding = function (mode) {
+ this._utf = !!mode;
+ };
+ /**
+ * @desc: get state of updating
+ * @returns: true - all in sync with server, false - some items not updated yet.
+ * @type: public
+ */
+ DataProcessor.prototype.getSyncState = function () {
+ return !this.updatedRows.length;
+ };
+ /**
+ * @desc: set if rows should be send to server automatically
+ * @param: mode - "row" - based on row selection changed, "cell" - based on cell editing finished, "off" - manual data sending
+ * @type: public
+ */
+ DataProcessor.prototype.setUpdateMode = function (mode, dnd) {
+ this.autoUpdate = (mode === "cell");
+ this.updateMode = mode;
+ this.dnd = dnd;
+ };
+ DataProcessor.prototype.ignore = function (code, master) {
+ this._silent_mode = true;
+ code.call(master || window);
+ this._silent_mode = false;
+ };
+ /**
+ * @desc: mark row as updated/normal. check mandatory fields, initiate autoupdate (if turned on)
+ * @param: rowId - id of row to set update-status for
+ * @param: state - true for "updated", false for "not updated"
+ * @param: mode - update mode name
+ * @type: public
+ */
+ DataProcessor.prototype.setUpdated = function (rowId, state, mode) {
+ if (this._silent_mode) {
+ return;
+ }
+ var ind = this.findRow(rowId);
+ mode = mode || "updated";
+ var existing = this.$gantt.getUserData(rowId, this.action_param, this._ganttMode);
+ if (existing && mode === "updated") {
+ mode = existing;
+ }
+ if (state) {
+ this.set_invalid(rowId, false); // clear previous error flag
+ this.updatedRows[ind] = rowId;
+ this.$gantt.setUserData(rowId, this.action_param, mode, this._ganttMode);
+ if (this._in_progress[rowId]) {
+ this._in_progress[rowId] = "wait";
+ }
+ }
+ else {
+ if (!this.is_invalid(rowId)) {
+ this.updatedRows.splice(ind, 1);
+ this.$gantt.setUserData(rowId, this.action_param, "", this._ganttMode);
+ }
+ }
+ this.markRow(rowId, state, mode);
+ if (state && this.autoUpdate) {
+ this.sendData(rowId);
+ }
+ };
+ DataProcessor.prototype.markRow = function (id, state, mode) {
+ var str = "";
+ var invalid = this.is_invalid(id);
+ if (invalid) {
+ str = this.styles[invalid];
+ state = true;
+ }
+ if (this.callEvent("onRowMark", [id, state, mode, invalid])) {
+ // default logic
+ str = this.styles[state ? mode : "clear"] + " " + str;
+ this.$gantt[this._methods[0]](id, str);
+ if (invalid && invalid.details) {
+ str += this.styles[invalid + "_cell"];
+ for (var i = 0; i < invalid.details.length; i++) {
+ if (invalid.details[i]) {
+ this.$gantt[this._methods[1]](id, i, str);
+ }
+ }
+ }
+ }
+ };
+ DataProcessor.prototype.getActionByState = function (state) {
+ if (state === "inserted") {
+ return "create";
+ }
+ if (state === "updated") {
+ return "update";
+ }
+ if (state === "deleted") {
+ return "delete";
+ }
+ // reorder
+ return "update";
+ };
+ DataProcessor.prototype.getState = function (id) {
+ return this.$gantt.getUserData(id, this.action_param, this._ganttMode);
+ };
+ DataProcessor.prototype.is_invalid = function (id) {
+ return this._invalid[id];
+ };
+ DataProcessor.prototype.set_invalid = function (id, mode, details) {
+ if (details) {
+ mode = {
+ value: mode,
+ details: details,
+ toString: function () {
+ return this.value.toString();
+ }
+ };
+ }
+ this._invalid[id] = mode;
+ };
+ /**
+ * @desc: check mandatory fields and verify values of cells, initiate update (if specified). Can be redefined in order to provide custom validation
+ * @param: rowId - id of row to set update-status for
+ * @type: public
+ */
+ // tslint:disable-next-line
+ DataProcessor.prototype.checkBeforeUpdate = function (rowId) {
+ return true;
+ };
+ /**
+ * @desc: send row(s) values to server
+ * @param: rowId - id of row which data to send. If not specified, then all "updated" rows will be send
+ * @type: public
+ */
+ DataProcessor.prototype.sendData = function (rowId) {
+ var _this = this;
+ if (this.$gantt.editStop) {
+ this.$gantt.editStop();
+ }
+ if (typeof rowId === "undefined" || this._tSend) {
+ var pendingUpdateModes_1 = [];
+ if (this.modes) {
+ var knownModes = ["task", "link", "assignment"];
+ knownModes.forEach(function (mode) {
+ if (_this.modes[mode] && _this.modes[mode].updatedRows.length) {
+ pendingUpdateModes_1.push(mode);
+ }
+ });
+ }
+ if (pendingUpdateModes_1.length) {
+ for (var i = 0; i < pendingUpdateModes_1.length; i++) {
+ this.setGanttMode(pendingUpdateModes_1[i]);
+ this.sendAllData();
+ }
+ return;
+ }
+ else {
+ return this.sendAllData();
+ }
+ }
+ if (this._in_progress[rowId]) {
+ return false;
+ }
+ this.messages = [];
+ if (!this.checkBeforeUpdate(rowId) && this.callEvent("onValidationError", [rowId, this.messages])) {
+ return false;
+ }
+ this._beforeSendData(this._getRowData(rowId), rowId);
+ };
+ DataProcessor.prototype.serialize = function (data, id) {
+ if (this._serializeAsJson) {
+ return this._serializeAsJSON(data);
+ }
+ if (typeof data === "string") {
+ return data;
+ }
+ if (typeof id !== "undefined") {
+ return this.serialize_one(data, "");
+ }
+ else {
+ var stack = [];
+ var keys = [];
+ for (var key in data) {
+ if (data.hasOwnProperty(key)) {
+ stack.push(this.serialize_one(data[key], key + this._postDelim));
+ keys.push(key);
+ }
+ }
+ stack.push("ids=" + this.escape(keys.join(",")));
+ if (this.$gantt.security_key) {
+ stack.push("dhx_security=" + this.$gantt.security_key);
+ }
+ return stack.join("&");
+ }
+ };
+ DataProcessor.prototype.serialize_one = function (data, pref) {
+ if (typeof data === "string") {
+ return data;
+ }
+ var stack = [];
+ var serialized = "";
+ for (var key in data)
+ if (data.hasOwnProperty(key)) {
+ if ((key === "id" ||
+ key == this.action_param) && // tslint:disable-line
+ this._tMode === "REST") {
+ continue;
+ }
+ if (typeof data[key] === "string" || typeof data[key] === "number") {
+ serialized = data[key];
+ }
+ else {
+ serialized = JSON.stringify(data[key]);
+ }
+ stack.push(this.escape((pref || "") + key) + "=" + this.escape(serialized));
+ }
+ return stack.join("&");
+ };
+ DataProcessor.prototype.sendAllData = function () {
+ if (!this.updatedRows.length) {
+ return;
+ }
+ this.messages = [];
+ var valid = true;
+ this._forEachUpdatedRow(function (rowId) {
+ valid = valid && this.checkBeforeUpdate(rowId);
+ });
+ if (!valid && !this.callEvent("onValidationError", ["", this.messages])) {
+ return false;
+ }
+ if (this._tSend) {
+ this._sendData(this._getAllData());
+ }
+ else {
+ // this.updatedRows can be spliced from onBeforeUpdate via dp.setUpdated false
+ // use an iterator instead of for(var i = 0; i < this.updatedRows; i++) then
+ this._forEachUpdatedRow(function (rowId) {
+ if (!this._in_progress[rowId]) {
+ if (this.is_invalid(rowId)) {
+ return;
+ }
+ this._beforeSendData(this._getRowData(rowId), rowId);
+ }
+ });
+ }
+ };
+ DataProcessor.prototype.findRow = function (pattern) {
+ var i = 0;
+ for (i = 0; i < this.updatedRows.length; i++) {
+ if (pattern == this.updatedRows[i]) { // tslint:disable-line
+ break;
+ }
+ }
+ return i;
+ };
+ /**
+ * @desc: define custom actions
+ * @param: name - name of action, same as value of action attribute
+ * @param: handler - custom function, which receives a XMl response content for action
+ * @type: private
+ */
+ DataProcessor.prototype.defineAction = function (name, handler) {
+ if (!this._uActions) {
+ this._uActions = {};
+ }
+ this._uActions[name] = handler;
+ };
+ /**
+ * @desc: used in combination with setOnBeforeUpdateHandler to create custom client-server transport system
+ * @param: sid - id of item before update
+ * @param: tid - id of item after up0ate
+ * @param: action - action name
+ * @type: public
+ * @topic: 0
+ */
+ DataProcessor.prototype.afterUpdateCallback = function (sid, tid, action, btag, ganttMode) {
+ var _this = this;
+ if (!this.$gantt) {
+ // destructor has been called before the callback
+ return;
+ }
+ this.setGanttMode(ganttMode);
+ var marker = sid;
+ var correct = (action !== "error" && action !== "invalid");
+ if (!correct) {
+ this.set_invalid(sid, action);
+ }
+ if ((this._uActions) && (this._uActions[action]) && (!this._uActions[action](btag))) {
+ return (delete this._in_progress[marker]);
+ }
+ if (this._in_progress[marker] !== "wait") {
+ this.setUpdated(sid, false);
+ }
+ var originalSid = sid;
+ switch (action) {
+ case "inserted":
+ case "insert":
+ if (tid != sid) { // tslint:disable-line
+ this.setUpdated(sid, false);
+ this.$gantt[this._methods[2]](sid, tid);
+ sid = tid;
+ }
+ break;
+ case "delete":
+ case "deleted":
+ if (!this.deleteAfterConfirmation || this._ganttMode !== "task") {
+ this.$gantt.setUserData(sid, this.action_param, "true_deleted", this._ganttMode);
+ this.$gantt[this._methods[3]](sid);
+ delete this._in_progress[marker];
+ return this.callEvent("onAfterUpdate", [sid, action, tid, btag]);
+ }
+ else {
+ if (this._ganttMode === "task" && this.$gantt.isTaskExists(sid)) {
+ this.$gantt.setUserData(sid, this.action_param, "true_deleted", this._ganttMode);
+ var task = this.$gantt.getTask(sid);
+ this.$gantt.silent(function () {
+ _this.$gantt.deleteTask(sid);
+ });
+ this.$gantt.callEvent("onAfterTaskDelete", [sid, task]);
+ this.$gantt.render();
+ delete this._in_progress[marker];
+ }
+ return this.callEvent("onAfterUpdate", [sid, action, tid, btag]);
+ }
+ }
+ if (this._in_progress[marker] !== "wait") {
+ if (correct) {
+ this.$gantt.setUserData(sid, this.action_param, "", this._ganttMode);
+ }
+ delete this._in_progress[marker];
+ }
+ else {
+ delete this._in_progress[marker];
+ this.setUpdated(tid, true, this.$gantt.getUserData(sid, this.action_param, this._ganttMode));
+ }
+ this.callEvent("onAfterUpdate", [originalSid, action, tid, btag]);
+ };
+ /**
+ * @desc: response from server
+ * @param: xml - XMLLoader object with response XML
+ * @type: private
+ */
+ DataProcessor.prototype.afterUpdate = function (that, xml, id) {
+ var _this = this;
+ var _xml;
+ if (arguments.length === 3) {
+ _xml = arguments[1];
+ }
+ else {
+ // old dataprocessor
+ _xml = arguments[4];
+ }
+ var mode = this.getGanttMode();
+ var reqUrl = _xml.filePath || _xml.url;
+ if (this._tMode !== "REST" && this._tMode !== "REST-JSON") {
+ if (reqUrl.indexOf("gantt_mode=links") !== -1) {
+ mode = "link";
+ }
+ else if (reqUrl.indexOf("gantt_mode=assignments") !== -1) {
+ mode = "assignment";
+ }
+ else {
+ mode = "task";
+ }
+ }
+ else {
+ if (reqUrl.indexOf("/link") >= 0) {
+ mode = "link";
+ }
+ else if (reqUrl.indexOf("/assignment") >= 0) {
+ mode = "assignment";
+ }
+ else {
+ mode = "task";
+ }
+ }
+ this.setGanttMode(mode);
+ var ajax = this.$gantt.ajax;
+ // try to use json first
+ var tag;
+ try {
+ tag = JSON.parse(xml.xmlDoc.responseText);
+ }
+ catch (e) {
+ // empty response also can be processed by json handler
+ if (!xml.xmlDoc.responseText.length) {
+ tag = {};
+ }
+ }
+ var processCallback = function (itemId) {
+ var action = tag.action || _this.getState(itemId) || "updated";
+ var sid = tag.sid || itemId[0];
+ var tid = tag.tid || itemId[0];
+ that.afterUpdateCallback(sid, tid, action, tag, mode);
+ };
+ if (tag) {
+ // GS-753. When multiple tasks are updated, unhighlight all of them
+ if (Array.isArray(id) && id.length > 1) {
+ id.forEach(function (taskId) { return processCallback(taskId); });
+ }
+ else {
+ processCallback(id);
+ }
+ that.finalizeUpdate();
+ this.setGanttMode(mode);
+ return;
+ }
+ // xml response
+ var top = ajax.xmltop("data", xml.xmlDoc); // fix incorrect content type in IE
+ if (!top) {
+ return this.cleanUpdate(id);
+ }
+ var atag = ajax.xpath("//data/action", top);
+ if (!atag.length) {
+ return this.cleanUpdate(id);
+ }
+ for (var i = 0; i < atag.length; i++) {
+ var btag = atag[i];
+ var action = btag.getAttribute("type");
+ var sid = btag.getAttribute("sid");
+ var tid = btag.getAttribute("tid");
+ that.afterUpdateCallback(sid, tid, action, btag, mode);
+ }
+ that.finalizeUpdate();
+ };
+ DataProcessor.prototype.cleanUpdate = function (id) {
+ if (id) {
+ for (var i = 0; i < id.length; i++) {
+ delete this._in_progress[id[i]];
+ }
+ }
+ };
+ DataProcessor.prototype.finalizeUpdate = function () {
+ if (this._waitMode) {
+ this._waitMode--;
+ }
+ this.callEvent("onAfterUpdateFinish", []);
+ if (!this.updatedRows.length) {
+ this.callEvent("onFullSync", []);
+ }
+ };
+ /**
+ * @desc: initializes data-processor
+ * @param: gantt - dhtmlxGantt object to attach this data-processor to
+ * @type: public
+ */
+ DataProcessor.prototype.init = function (gantt) {
+ if (this._initialized) {
+ return;
+ }
+ this.$gantt = gantt;
+ if (this.$gantt._dp_init) {
+ this.$gantt._dp_init(this);
+ }
+ this._setDefaultTransactionMode();
+ this.styles = {
+ updated: "gantt_updated",
+ order: "gantt_updated",
+ inserted: "gantt_inserted",
+ deleted: "gantt_deleted",
+ delete_confirmation: "gantt_deleted",
+ invalid: "gantt_invalid",
+ error: "gantt_error",
+ clear: ""
+ };
+ this._methods = ["_row_style", "setCellTextStyle", "_change_id", "_delete_task"];
+ extend_gantt_1.default(this.$gantt, this);
+ var dataProcessorEvents = new data_processor_events_1.default(this.$gantt, this);
+ dataProcessorEvents.attach();
+ this.attachEvent("onDestroy", function () {
+ delete this.setGanttMode;
+ delete this._getRowData;
+ delete this.$gantt._dp;
+ delete this.$gantt._change_id;
+ delete this.$gantt._row_style;
+ delete this.$gantt._delete_task;
+ delete this.$gantt._sendTaskOrder;
+ delete this.$gantt;
+ dataProcessorEvents.detach();
+ });
+ this.$gantt.callEvent("onDataProcessorReady", [this]);
+ this._initialized = true;
+ };
+ DataProcessor.prototype.setOnAfterUpdate = function (handler) {
+ this.attachEvent("onAfterUpdate", handler);
+ };
+ DataProcessor.prototype.setOnBeforeUpdateHandler = function (handler) {
+ this.attachEvent("onBeforeDataSending", handler);
+ };
+ /* starts autoupdate mode
+ @param interval time interval for sending update requests
+ */
+ DataProcessor.prototype.setAutoUpdate = function (interval, user) {
+ var _this = this;
+ interval = interval || 2000;
+ this._user = user || (new Date()).valueOf();
+ this._needUpdate = false;
+ this._updateBusy = false;
+ this.attachEvent("onAfterUpdate", this.afterAutoUpdate); // arguments sid, action, tid, xml_node;
+ this.attachEvent("onFullSync", this.fullSync);
+ setInterval(function () {
+ _this.loadUpdate();
+ }, interval);
+ };
+ /* process updating request response
+ if status == collision version is deprecated
+ set flag for autoupdating immediately
+ */
+ DataProcessor.prototype.afterAutoUpdate = function (sid, action, tid, xml_node) {
+ if (action === "collision") {
+ this._needUpdate = true;
+ return false;
+ }
+ else {
+ return true;
+ }
+ };
+ /* callback function for onFillSync event
+ call update function if it's need
+ */
+ DataProcessor.prototype.fullSync = function () {
+ if (this._needUpdate) {
+ this._needUpdate = false;
+ this.loadUpdate();
+ }
+ return true;
+ };
+ /* sends query to the server and call callback function
+ */
+ DataProcessor.prototype.getUpdates = function (url, callback) {
+ var ajax = this.$gantt.ajax;
+ if (this._updateBusy) {
+ return false;
+ }
+ else {
+ this._updateBusy = true;
+ }
+ ajax.get(url, callback);
+ };
+ /* loads updates and processes them
+ */
+ DataProcessor.prototype.loadUpdate = function () {
+ var _this = this;
+ var ajax = this.$gantt.ajax;
+ var version = this.$gantt.getUserData(0, "version", this._ganttMode);
+ var url = this.serverProcessor + ajax.urlSeparator(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + version].join("&");
+ url = url.replace("editing=true&", "");
+ this.getUpdates(url, function (xml) {
+ var vers = ajax.xpath("//userdata", xml);
+ _this.$gantt.setUserData(0, "version", _this._getXmlNodeValue(vers[0]), _this._ganttMode);
+ var updates = ajax.xpath("//update", xml);
+ if (updates.length) {
+ _this._silent_mode = true;
+ for (var i = 0; i < updates.length; i++) {
+ var status_1 = updates[i].getAttribute("status");
+ var id = updates[i].getAttribute("id");
+ var parent_1 = updates[i].getAttribute("parent");
+ switch (status_1) {
+ case "inserted":
+ _this.callEvent("insertCallback", [updates[i], id, parent_1]);
+ break;
+ case "updated":
+ _this.callEvent("updateCallback", [updates[i], id, parent_1]);
+ break;
+ case "deleted":
+ _this.callEvent("deleteCallback", [updates[i], id, parent_1]);
+ break;
+ }
+ }
+ _this._silent_mode = false;
+ }
+ _this._updateBusy = false;
+ });
+ };
+ DataProcessor.prototype.destructor = function () {
+ this.callEvent("onDestroy", []);
+ this.detachAllEvents();
+ this.updatedRows = [];
+ this._in_progress = {}; // ?
+ this._invalid = {};
+ this._storage.clear();
+ this._storage = null;
+ this._headers = null;
+ this._payload = null;
+ delete this._initialized;
+ };
+ DataProcessor.prototype.setGanttMode = function (mode) {
+ if (mode === "tasks") {
+ mode = "task";
+ }
+ else if (mode === "links") {
+ mode = "link";
+ }
+ var modes = this.modes || {};
+ var ganttMode = this.getGanttMode();
+ if (ganttMode) {
+ modes[ganttMode] = {
+ _in_progress: this._in_progress,
+ _invalid: this._invalid,
+ _storage: this._storage,
+ updatedRows: this.updatedRows
+ };
+ }
+ var newState = modes[mode];
+ if (!newState) {
+ newState = modes[mode] = {
+ _in_progress: {},
+ _invalid: {},
+ _storage: simple_storage_1.default.create(),
+ updatedRows: []
+ };
+ }
+ this._in_progress = newState._in_progress;
+ this._invalid = newState._invalid;
+ this._storage = newState._storage;
+ this.updatedRows = newState.updatedRows;
+ this.modes = modes;
+ this._ganttMode = mode;
+ };
+ DataProcessor.prototype.getGanttMode = function () {
+ return this._ganttMode;
+ };
+ DataProcessor.prototype.storeItem = function (item) {
+ this._storage.storeItem(item);
+ };
+ DataProcessor.prototype.url = function (url) {
+ this.serverProcessor = this._serverProcessor = url;
+ };
+ DataProcessor.prototype._beforeSendData = function (data, rowId) {
+ if (!this.callEvent("onBeforeUpdate", [rowId, this.getState(rowId), data])) {
+ return false;
+ }
+ this._sendData(data, rowId);
+ };
+ DataProcessor.prototype._serializeAsJSON = function (data) {
+ if (typeof data === "string") {
+ return data;
+ }
+ var copy = utils.copy(data);
+ if (this._tMode === "REST-JSON") {
+ delete copy.id;
+ delete copy[this.action_param];
+ }
+ return JSON.stringify(copy);
+ };
+ DataProcessor.prototype._applyPayload = function (url) {
+ var ajax = this.$gantt.ajax;
+ if (this._payload) {
+ for (var key in this._payload) {
+ url = url + ajax.urlSeparator(url) + this.escape(key) + "=" + this.escape(this._payload[key]);
+ }
+ }
+ return url;
+ };
+ // GET/POST/JSON modes of the dataProcessor didn't send the whole data items in 'delete' requests
+ // clear extra info from the data in order not to change the request format
+ DataProcessor.prototype._cleanupArgumentsBeforeSend = function (dataToSend) {
+ var processedData;
+ if (dataToSend[this.action_param] === undefined) { // hash of updated items, and not an individual item
+ processedData = {};
+ for (var i in dataToSend) {
+ processedData[i] = this._cleanupArgumentsBeforeSend(dataToSend[i]);
+ }
+ }
+ else {
+ processedData = this._cleanupItemBeforeSend(dataToSend);
+ }
+ return processedData;
+ };
+ DataProcessor.prototype._cleanupItemBeforeSend = function (updatedItem) {
+ var output = null;
+ if (updatedItem) {
+ if (updatedItem[this.action_param] === "deleted") {
+ output = {};
+ output.id = updatedItem.id;
+ output[this.action_param] = updatedItem[this.action_param];
+ }
+ else {
+ output = updatedItem;
+ }
+ }
+ return output;
+ };
+ DataProcessor.prototype._sendData = function (dataToSend, rowId) {
+ var _this = this;
+ if (!dataToSend) {
+ return; // nothing to send
+ }
+ if (!this.callEvent("onBeforeDataSending", rowId ? [rowId, this.getState(rowId), dataToSend] : [null, null, dataToSend])) {
+ return false;
+ }
+ if (rowId) {
+ this._in_progress[rowId] = (new Date()).valueOf();
+ }
+ var ajax = this.$gantt.ajax;
+ if (this._tMode === "CUSTOM") {
+ var taskState_1 = this.getState(rowId);
+ var taskAction = this.getActionByState(taskState_1);
+ var ganttMode_1 = this.getGanttMode();
+ var _onResolvedCreateUpdate_1 = function (tag) {
+ var action = taskState_1 || "updated";
+ var sid = rowId;
+ var tid = rowId;
+ if (tag) {
+ action = tag.action || taskState_1;
+ sid = tag.sid || sid;
+ tid = tag.id || tag.tid || tid;
+ }
+ _this.afterUpdateCallback(sid, tid, action, tag, ganttMode_1);
+ };
+ var actionPromise = void 0;
+ if (this._router instanceof Function) {
+ if (this._routerParametersFormat === "object") {
+ var obj = {
+ entity: ganttMode_1,
+ action: taskAction,
+ data: dataToSend,
+ id: rowId
+ };
+ actionPromise = this._router(obj);
+ }
+ else {
+ actionPromise = this._router(ganttMode_1, taskAction, dataToSend, rowId);
+ }
+ }
+ else if (this._router[ganttMode_1] instanceof Function) {
+ actionPromise = this._router[ganttMode_1](taskAction, dataToSend, rowId);
+ }
+ else {
+ var errorMsgStart = "Incorrect configuration of gantt.createDataProcessor";
+ var errorMsgEnd = "\nYou need to either add missing properties to the dataProcessor router object or to use a router function.\nSee https://docs.dhtmlx.com/gantt/desktop__server_side.html#customrouting and https://docs.dhtmlx.com/gantt/api__gantt_createdataprocessor.html for details.";
+ if (!this._router[ganttMode_1]) {
+ throw new Error(errorMsgStart + ": router for the **" + ganttMode_1 + "** entity is not defined. " + errorMsgEnd);
+ }
+ switch (taskState_1) {
+ case "inserted":
+ if (!this._router[ganttMode_1].create) {
+ throw new Error(errorMsgStart + ": **create** action for the **" + ganttMode_1 + "** entity is not defined. " + errorMsgEnd);
+ }
+ actionPromise = this._router[ganttMode_1].create(dataToSend);
+ break;
+ case "deleted":
+ if (!this._router[ganttMode_1].delete) {
+ throw new Error(errorMsgStart + ": **delete** action for the **" + ganttMode_1 + "** entity is not defined. " + errorMsgEnd);
+ }
+ actionPromise = this._router[ganttMode_1].delete(rowId);
+ break;
+ default:
+ if (!this._router[ganttMode_1].update) {
+ throw new Error(errorMsgStart + ": **update**\" action for the **" + ganttMode_1 + "** entity is not defined. " + errorMsgEnd);
+ }
+ actionPromise = this._router[ganttMode_1].update(dataToSend, rowId);
+ break;
+ }
+ }
+ if (actionPromise) {
+ // neither promise nor {tid: newId} response object
+ if (!actionPromise.then &&
+ (actionPromise.id === undefined && actionPromise.tid === undefined && actionPromise.action === undefined)) {
+ throw new Error("Incorrect router return value. A Promise or a response object is expected");
+ }
+ if (actionPromise.then) {
+ actionPromise.then(_onResolvedCreateUpdate_1).catch(function (error) {
+ if (error && error.action) {
+ _onResolvedCreateUpdate_1(error);
+ }
+ else {
+ _onResolvedCreateUpdate_1({ action: "error", value: error });
+ }
+ });
+ }
+ else {
+ // custom method may return a response object in case of sync action
+ _onResolvedCreateUpdate_1(actionPromise);
+ }
+ }
+ else {
+ _onResolvedCreateUpdate_1(null);
+ }
+ return;
+ }
+ var queryParams;
+ queryParams = {
+ callback: function (xml) {
+ var ids = [];
+ if (rowId) {
+ ids.push(rowId);
+ }
+ else if (dataToSend) {
+ for (var key in dataToSend) {
+ ids.push(key);
+ }
+ }
+ return _this.afterUpdate(_this, xml, ids);
+ },
+ headers: this._headers
+ };
+ var dhxVersion = "dhx_version=" + this.$gantt.getUserData(0, "version", this._ganttMode);
+ var urlParams = this.serverProcessor + (this._user ? (ajax.urlSeparator(this.serverProcessor) + ["dhx_user=" + this._user, dhxVersion].join("&")) : "");
+ var url = this._applyPayload(urlParams);
+ var data;
+ switch (this._tMode) {
+ case "GET":
+ data = this._cleanupArgumentsBeforeSend(dataToSend);
+ queryParams.url = url + ajax.urlSeparator(url) + this.serialize(data, rowId);
+ queryParams.method = "GET";
+ break;
+ case "POST":
+ data = this._cleanupArgumentsBeforeSend(dataToSend);
+ queryParams.url = url;
+ queryParams.method = "POST";
+ queryParams.data = this.serialize(data, rowId);
+ break;
+ case "JSON":
+ data = {};
+ var preprocessedData = this._cleanupItemBeforeSend(dataToSend);
+ for (var key in preprocessedData) {
+ if (key === this.action_param || key === "id" || key === "gr_id") {
+ continue;
+ }
+ data[key] = preprocessedData[key];
+ }
+ queryParams.url = url;
+ queryParams.method = "POST";
+ queryParams.data = JSON.stringify({
+ id: rowId,
+ action: dataToSend[this.action_param],
+ data: data
+ });
+ break;
+ case "REST":
+ case "REST-JSON":
+ url = urlParams.replace(/(&|\?)editing=true/, "");
+ data = "";
+ switch (this.getState(rowId)) {
+ case "inserted":
+ queryParams.method = "POST";
+ queryParams.data = this.serialize(dataToSend, rowId);
+ break;
+ case "deleted":
+ queryParams.method = "DELETE";
+ url = url + (url.slice(-1) === "/" ? "" : "/") + rowId;
+ break;
+ default:
+ queryParams.method = "PUT";
+ queryParams.data = this.serialize(dataToSend, rowId);
+ url = url + (url.slice(-1) === "/" ? "" : "/") + rowId;
+ break;
+ }
+ queryParams.url = this._applyPayload(url);
+ break;
+ }
+ this._waitMode++;
+ return ajax.query(queryParams);
+ };
+ DataProcessor.prototype._forEachUpdatedRow = function (code) {
+ var updatedRows = this.updatedRows.slice();
+ for (var i = 0; i < updatedRows.length; i++) {
+ var rowId = updatedRows[i];
+ if (this.$gantt.getUserData(rowId, this.action_param, this._ganttMode)) {
+ code.call(this, rowId);
+ }
+ }
+ };
+ DataProcessor.prototype._setDefaultTransactionMode = function () {
+ if (this.serverProcessor) {
+ this.setTransactionMode("POST", true);
+ this.serverProcessor += (this.serverProcessor.indexOf("?") !== -1 ? "&" : "?") + "editing=true";
+ this._serverProcessor = this.serverProcessor;
+ }
+ };
+ /* returns xml node value
+ @param node
+ xml node
+ */
+ DataProcessor.prototype._getXmlNodeValue = function (node) {
+ if (node.firstChild) {
+ return node.firstChild.nodeValue;
+ }
+ return "";
+ };
+ DataProcessor.prototype._getAllData = function () {
+ var out = {};
+ var hasOne = false;
+ this._forEachUpdatedRow(function (id) {
+ if (this._in_progress[id] || this.is_invalid(id)) {
+ return;
+ }
+ var row = this._getRowData(id);
+ if (!this.callEvent("onBeforeUpdate", [id, this.getState(id), row])) {
+ return;
+ }
+ out[id] = row;
+ hasOne = true;
+ this._in_progress[id] = (new Date()).valueOf();
+ });
+ return hasOne ? out : null;
+ };
+ DataProcessor.prototype._prepareDate = function (value) {
+ return this.$gantt.defined(this.$gantt.templates.xml_format) ? this.$gantt.templates.xml_format(value) : this.$gantt.templates.format_date(value);
+ };
+ DataProcessor.prototype._prepareArray = function (value, traversedObjects) {
+ var _this = this;
+ traversedObjects.push(value);
+ return value.map(function (item) {
+ if (helpers.isDate(item)) {
+ return _this._prepareDate(item);
+ }
+ else if (Array.isArray(item) && !helpers.arrayIncludes(traversedObjects, item)) {
+ return _this._prepareArray(item, traversedObjects);
+ }
+ else if (item && typeof item === "object" && !helpers.arrayIncludes(traversedObjects, item)) {
+ return _this._prepareObject(item, traversedObjects);
+ }
+ else {
+ return item;
+ }
+ });
+ };
+ DataProcessor.prototype._prepareObject = function (rawItem, traversedObjects) {
+ var processedItem = {};
+ traversedObjects.push(rawItem);
+ for (var key in rawItem) {
+ if (key.substr(0, 1) === "$") {
+ continue;
+ }
+ var value = rawItem[key];
+ if (helpers.isDate(value)) {
+ processedItem[key] = this._prepareDate(value);
+ }
+ else if (value === null) {
+ processedItem[key] = "";
+ }
+ else if (Array.isArray(value) && !helpers.arrayIncludes(traversedObjects, value)) {
+ processedItem[key] = this._prepareArray(value, traversedObjects);
+ }
+ else if (value && typeof value === "object" && !helpers.arrayIncludes(traversedObjects, value)) {
+ processedItem[key] = this._prepareObject(value, traversedObjects);
+ }
+ else {
+ processedItem[key] = value;
+ }
+ }
+ return processedItem;
+ };
+ DataProcessor.prototype._prepareDataItem = function (rawItem) {
+ var processedItem = this._prepareObject(rawItem, []);
+ processedItem[this.action_param] = this.$gantt.getUserData(rawItem.id, this.action_param, this._ganttMode);
+ return processedItem;
+ };
+ DataProcessor.prototype.getStoredItem = function (id) {
+ return this._storage.getStoredItem(id);
+ };
+ DataProcessor.prototype._getRowData = function (id) {
+ var dataItem;
+ var gantt = this.$gantt;
+ if (this.getGanttMode() === "task") {
+ if (gantt.isTaskExists(id)) {
+ dataItem = this.$gantt.getTask(id);
+ }
+ }
+ else if (this.getGanttMode() === "assignment") {
+ if (this.$gantt.$data.assignmentsStore.exists(id)) {
+ dataItem = this.$gantt.$data.assignmentsStore.getItem(id);
+ }
+ }
+ else {
+ if (gantt.isLinkExists(id)) {
+ dataItem = this.$gantt.getLink(id);
+ }
+ }
+ if (!dataItem) {
+ dataItem = this.getStoredItem(id);
+ }
+ if (!dataItem) {
+ dataItem = { id: id };
+ }
+ return this._prepareDataItem(dataItem);
+ };
+ return DataProcessor;
+}());
+exports.DataProcessor = DataProcessor;
+
+
+/***/ }),
+
+/***/ "./sources/core/dataprocessor/data_processor_events.ts":
+/*!*************************************************************!*\
+ !*** ./sources/core/dataprocessor/data_processor_events.ts ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var helpers = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js");
+var DataProcessorEvents = /** @class */ (function () {
+ function DataProcessorEvents(gantt, dp) {
+ this.$gantt = gantt;
+ this.$dp = dp;
+ this._dataProcessorHandlers = [];
+ }
+ DataProcessorEvents.prototype.attach = function () {
+ var _this = this;
+ var dp = this.$dp;
+ var gantt = this.$gantt;
+ var treeHelper = __webpack_require__(/*! ../../utils/task_tree_helpers */ "./sources/utils/task_tree_helpers.js");
+ var cascadeDelete = {};
+ var clientSideDelete = function (id) {
+ return _this.clientSideDelete(id, dp, gantt);
+ };
+ function getTaskLinks(task) {
+ var _links = [];
+ if (task.$source) {
+ _links = _links.concat(task.$source);
+ }
+ if (task.$target) {
+ _links = _links.concat(task.$target);
+ }
+ return _links;
+ }
+ this._dataProcessorHandlers.push(gantt.attachEvent("onAfterTaskAdd", function (id, item) {
+ if (gantt.isTaskExists(id)) {
+ dp.setGanttMode("tasks");
+ dp.setUpdated(id, true, "inserted");
+ }
+ }));
+ this._dataProcessorHandlers.push(gantt.attachEvent("onAfterTaskUpdate", function (id, item) {
+ if (gantt.isTaskExists(id)) {
+ dp.setGanttMode("tasks");
+ dp.setUpdated(id, true);
+ // gantt can be destroyed/reinitialized after dp.setUpdated
+ if (gantt._sendTaskOrder) {
+ gantt._sendTaskOrder(id, item);
+ }
+ }
+ }));
+ this._dataProcessorHandlers.push(gantt.attachEvent("onBeforeTaskDelete", function (id, item) {
+ if (gantt.config.cascade_delete) {
+ cascadeDelete[id] = {
+ tasks: treeHelper.getSubtreeTasks(gantt, id),
+ links: treeHelper.getSubtreeLinks(gantt, id)
+ };
+ }
+ // GS-631. Keep the deleted item in Gantt until we receive the successful response from the server
+ if (dp.deleteAfterConfirmation) {
+ dp.setGanttMode("tasks");
+ dp.setUpdated(id, true, "deleted");
+ return false;
+ }
+ return true;
+ }));
+ this._dataProcessorHandlers.push(gantt.attachEvent("onAfterTaskDelete", function (id, item) {
+ dp.setGanttMode("tasks");
+ // not send delete request if item is not inserted into the db - just remove it from the client
+ var needDbDelete = !clientSideDelete(id);
+ var needCascadeDelete = gantt.config.cascade_delete && cascadeDelete[id];
+ if (!needDbDelete && !needCascadeDelete) {
+ return;
+ }
+ if (needCascadeDelete) {
+ var dpMode = dp.updateMode;
+ dp.setUpdateMode("off");
+ var cascade = cascadeDelete[id];
+ for (var i in cascade.tasks) {
+ if (!clientSideDelete(i)) {
+ dp.storeItem(cascade.tasks[i]);
+ dp.setUpdated(i, true, "deleted");
+ }
+ }
+ dp.setGanttMode("links");
+ for (var i in cascade.links) {
+ if (!clientSideDelete(i)) {
+ dp.storeItem(cascade.links[i]);
+ dp.setUpdated(i, true, "deleted");
+ }
+ }
+ cascadeDelete[id] = null;
+ if (dpMode !== "off") {
+ dp.sendAllData();
+ }
+ dp.setGanttMode("tasks");
+ dp.setUpdateMode(dpMode);
+ }
+ if (needDbDelete) {
+ dp.storeItem(item);
+ if (!dp.deleteAfterConfirmation) {
+ dp.setUpdated(id, true, "deleted");
+ }
+ }
+ if (dp.updateMode !== "off" && !dp._tSend) {
+ dp.sendAllData();
+ }
+ }));
+ this._dataProcessorHandlers.push(gantt.attachEvent("onAfterLinkUpdate", function (id, item) {
+ if (gantt.isLinkExists(id)) {
+ dp.setGanttMode("links");
+ dp.setUpdated(id, true);
+ }
+ }));
+ this._dataProcessorHandlers.push(gantt.attachEvent("onAfterLinkAdd", function (id, item) {
+ if (gantt.isLinkExists(id)) {
+ dp.setGanttMode("links");
+ dp.setUpdated(id, true, "inserted");
+ }
+ }));
+ this._dataProcessorHandlers.push(gantt.attachEvent("onAfterLinkDelete", function (id, item) {
+ dp.setGanttMode("links");
+ var needDbDelete = !clientSideDelete(id);
+ if (!needDbDelete) {
+ return;
+ }
+ dp.storeItem(item);
+ dp.setUpdated(id, true, "deleted");
+ }));
+ this._dataProcessorHandlers.push(gantt.attachEvent("onRowDragEnd", function (id, target) {
+ gantt._sendTaskOrder(id, gantt.getTask(id));
+ }));
+ var tasks = null;
+ var links = null;
+ this._dataProcessorHandlers.push(gantt.attachEvent("onTaskIdChange", function (oldId, newId) {
+ if (!dp._waitMode) {
+ return;
+ }
+ var children = gantt.getChildren(newId);
+ if (children.length) {
+ tasks = tasks || {};
+ for (var i = 0; i < children.length; i++) {
+ var ch = this.getTask(children[i]);
+ tasks[ch.id] = ch;
+ }
+ }
+ var item = this.getTask(newId);
+ var itemLinks = getTaskLinks(item);
+ if (itemLinks.length) {
+ links = links || {};
+ for (var i = 0; i < itemLinks.length; i++) {
+ var link = this.getLink(itemLinks[i]);
+ links[link.id] = link;
+ }
+ }
+ }));
+ dp.attachEvent("onAfterUpdateFinish", function () {
+ if (tasks || links) {
+ gantt.batchUpdate(function () {
+ for (var id in tasks) {
+ gantt.updateTask(tasks[id].id);
+ }
+ for (var id in links) {
+ gantt.updateLink(links[id].id);
+ }
+ tasks = null;
+ links = null;
+ });
+ if (tasks) {
+ gantt._dp.setGanttMode("tasks");
+ }
+ else {
+ gantt._dp.setGanttMode("links");
+ }
+ }
+ });
+ dp.attachEvent("onBeforeDataSending", function () {
+ if (this._tMode === "CUSTOM") {
+ return true;
+ }
+ var url = this._serverProcessor;
+ if (this._tMode === "REST-JSON" || this._tMode === "REST") {
+ var mode = this._ganttMode;
+ url = url.substring(0, url.indexOf("?") > -1 ? url.indexOf("?") : url.length);
+ // editing=true&
+ this.serverProcessor = url + (url.slice(-1) === "/" ? "" : "/") + mode;
+ }
+ else {
+ var pluralizedMode = this._ganttMode + "s";
+ this.serverProcessor = url + gantt.ajax.urlSeparator(url) + "gantt_mode=" + pluralizedMode;
+ }
+ return true;
+ });
+ dp.attachEvent("insertCallback", function insertCallback(upd, id, parent, mode) {
+ var data = upd.data || gantt.xml._xmlNodeToJSON(upd.firstChild);
+ var methods = {
+ add: gantt.addTask,
+ isExist: gantt.isTaskExists
+ };
+ if (mode === "links") {
+ methods.add = gantt.addLink;
+ methods.isExist = gantt.isLinkExists;
+ }
+ if (methods.isExist.call(gantt, id)) {
+ return;
+ }
+ data.id = id;
+ methods.add.call(gantt, data);
+ });
+ dp.attachEvent("updateCallback", function updateCallback(upd, id) {
+ var data = upd.data || gantt.xml._xmlNodeToJSON(upd.firstChild);
+ if (!gantt.isTaskExists(id)) {
+ return;
+ }
+ var objData = gantt.getTask(id);
+ for (var key in data) {
+ var property = data[key];
+ switch (key) {
+ case "id":
+ continue;
+ case "start_date":
+ case "end_date":
+ property = gantt.defined(gantt.templates.xml_date) ? gantt.templates.xml_date(property) : gantt.templates.parse_date(property);
+ break;
+ case "duration":
+ objData.end_date = gantt.calculateEndDate({ start_date: objData.start_date, duration: property, task: objData });
+ break;
+ }
+ objData[key] = property;
+ }
+ gantt.updateTask(id);
+ gantt.refreshData();
+ });
+ dp.attachEvent("deleteCallback", function deleteCallback(upd, id, parent, mode) {
+ var methods = {
+ delete: gantt.deleteTask,
+ isExist: gantt.isTaskExists
+ };
+ if (mode === "links") {
+ methods.delete = gantt.deleteLink;
+ methods.isExist = gantt.isLinkExists;
+ }
+ else if (mode === "assignment") {
+ methods.delete = function (val) {
+ gantt.$data.assignmentsStore.remove(val);
+ };
+ methods.isExist = function (val) {
+ return gantt.$data.assignmentsStore.exists(val);
+ };
+ }
+ if (methods.isExist.call(gantt, id)) {
+ methods.delete.call(gantt, id);
+ }
+ });
+ this.handleResourceCRUD(dp, gantt);
+ this.handleResourceAssignmentCRUD(dp, gantt);
+ };
+ DataProcessorEvents.prototype.clientSideDelete = function (id, dp, gantt) {
+ var updated = dp.updatedRows.slice();
+ var clientOnly = false;
+ if (gantt.getUserData(id, "!nativeeditor_status", dp._ganttMode) === "true_deleted") {
+ clientOnly = true;
+ dp.setUpdated(id, false);
+ }
+ for (var i = 0; i < updated.length && !dp._in_progress[id]; i++) {
+ if (updated[i] === id) {
+ if (gantt.getUserData(id, "!nativeeditor_status", dp._ganttMode) === "inserted") {
+ clientOnly = true;
+ }
+ dp.setUpdated(id, false);
+ }
+ }
+ return clientOnly;
+ };
+ DataProcessorEvents.prototype.handleResourceAssignmentCRUD = function (dp, gantt) {
+ var _this = this;
+ if (!gantt.config.resources || gantt.config.resources.dataprocessor_assignments !== true) {
+ return;
+ }
+ var assignmentsStore = gantt.getDatastore(gantt.config.resource_assignment_store);
+ var insertedTasks = {};
+ var pendingAssignments = {};
+ gantt.attachEvent("onBeforeTaskAdd", function (id, task) {
+ insertedTasks[id] = true;
+ return true;
+ });
+ function putAssignmentToQueue(item) {
+ pendingAssignments[item.id] = item;
+ insertedTasks[item.task_id] = true;
+ }
+ function insertResourceAssignment(assignment) {
+ var id = assignment.id;
+ if (assignmentsStore.exists(id)) {
+ dp.setGanttMode("assignment");
+ dp.setUpdated(id, true, "inserted");
+ }
+ delete pendingAssignments[id];
+ }
+ gantt.attachEvent("onTaskIdChange", function (id, newId) {
+ delete insertedTasks[id];
+ });
+ assignmentsStore.attachEvent("onAfterAdd", function (id, item) {
+ if (insertedTasks[item.task_id]) {
+ // inserting assignment of new task
+ // task is not saved yet, need to wait till it gets permanent id and save assigmnents after that
+ putAssignmentToQueue(item);
+ }
+ else {
+ insertResourceAssignment(item);
+ }
+ });
+ assignmentsStore.attachEvent("onAfterUpdate", function (id, item) {
+ if (assignmentsStore.exists(id)) {
+ if (pendingAssignments[id]) {
+ insertResourceAssignment(item);
+ }
+ else {
+ dp.setGanttMode("assignment");
+ dp.setUpdated(id, true);
+ }
+ }
+ });
+ assignmentsStore.attachEvent("onAfterDelete", function (id, item) {
+ dp.setGanttMode("assignment");
+ var needDbDelete = !_this.clientSideDelete(id, dp, gantt);
+ if (!needDbDelete) {
+ return;
+ }
+ dp.storeItem(item);
+ dp.setUpdated(id, true, "deleted");
+ });
+ };
+ DataProcessorEvents.prototype.handleResourceCRUD = function (dp, gantt) {
+ var _this = this;
+ if (!gantt.config.resources || gantt.config.resources.dataprocessor_resources !== true) {
+ return;
+ }
+ var resourcesStore = gantt.getDatastore(gantt.config.resource_store);
+ function insertResource(resource) {
+ var id = resource.id;
+ if (resourcesStore.exists(id)) {
+ dp.setGanttMode("resource");
+ dp.setUpdated(id, true, "inserted");
+ }
+ }
+ resourcesStore.attachEvent("onAfterAdd", function (id, item) {
+ insertResource(item);
+ });
+ resourcesStore.attachEvent("onAfterUpdate", function (id, item) {
+ if (resourcesStore.exists(id)) {
+ dp.setGanttMode("resource");
+ dp.setUpdated(id, true);
+ }
+ });
+ resourcesStore.attachEvent("onAfterDelete", function (id, item) {
+ dp.setGanttMode("resource");
+ var needDbDelete = !_this.clientSideDelete(id, dp, gantt);
+ if (!needDbDelete) {
+ return;
+ }
+ dp.storeItem(item);
+ dp.setUpdated(id, true, "deleted");
+ });
+ };
+ DataProcessorEvents.prototype.detach = function () {
+ var _this = this;
+ helpers.forEach(this._dataProcessorHandlers, function (e) {
+ _this.$gantt.detachEvent(e);
+ });
+ this._dataProcessorHandlers = [];
+ };
+ return DataProcessorEvents;
+}());
+exports.default = DataProcessorEvents;
+
+
+/***/ }),
+
+/***/ "./sources/core/dataprocessor/extend_gantt.ts":
+/*!****************************************************!*\
+ !*** ./sources/core/dataprocessor/extend_gantt.ts ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function extendGantt(gantt, dp) {
+ gantt.getUserData = function (id, name, store) {
+ if (!this.userdata) {
+ this.userdata = {};
+ }
+ this.userdata[store] = this.userdata[store] || {};
+ if (this.userdata[store][id] && this.userdata[store][id][name]) {
+ return this.userdata[store][id][name];
+ }
+ return "";
+ };
+ gantt.setUserData = function (id, name, value, store) {
+ if (!this.userdata) {
+ this.userdata = {};
+ }
+ this.userdata[store] = this.userdata[store] || {};
+ this.userdata[store][id] = this.userdata[store][id] || {};
+ this.userdata[store][id][name] = value;
+ };
+ gantt._change_id = function (oldId, newId) {
+ switch (this._dp._ganttMode) {
+ case "task":
+ this.changeTaskId(oldId, newId);
+ break;
+ case "link":
+ this.changeLinkId(oldId, newId);
+ break;
+ case "assignment":
+ this.$data.assignmentsStore.changeId(oldId, newId);
+ break;
+ case "resource":
+ this.$data.resourcesStore.changeId(oldId, newId);
+ break;
+ default:
+ throw new Error("Invalid mode of the dataProcessor after database id is received: " + this._dp._ganttMode + ", new id: " + newId);
+ }
+ };
+ gantt._row_style = function (rowId, classname) {
+ if (this._dp._ganttMode !== "task") {
+ return;
+ }
+ if (!gantt.isTaskExists(rowId)) {
+ return;
+ }
+ var task = gantt.getTask(rowId);
+ task.$dataprocessor_class = classname;
+ gantt.refreshTask(rowId);
+ };
+ // fake method for dataprocessor
+ gantt._delete_task = function (rowId, node) { }; // tslint:disable-line
+ gantt._sendTaskOrder = function (id, item) {
+ if (item.$drop_target) {
+ this._dp.setGanttMode("task");
+ this.getTask(id).target = item.$drop_target;
+ this._dp.setUpdated(id, true, "order");
+ delete this.getTask(id).$drop_target;
+ }
+ };
+ gantt.setDp = function () {
+ this._dp = dp;
+ };
+ gantt.setDp();
+}
+exports.default = extendGantt;
+
+
+/***/ }),
+
+/***/ "./sources/core/dataprocessor/index.js":
+/*!*********************************************!*\
+ !*** ./sources/core/dataprocessor/index.js ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DataProcessor = __webpack_require__(/*! ./data_processor */ "./sources/core/dataprocessor/data_processor.ts");
+
+module.exports = {
+ DEPRECATED_api: function DEPRECATED_api(server) {
+ return new DataProcessor.DataProcessor(server);
+ },
+ createDataProcessor: DataProcessor.createDataProcessor,
+ getDataProcessorModes: DataProcessor.getAvailableModes
+};
+
+/***/ }),
+
+/***/ "./sources/core/dataprocessor/simple_storage.ts":
+/*!******************************************************!*\
+ !*** ./sources/core/dataprocessor/simple_storage.ts ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+var SimpleStorage = /** @class */ (function () {
+ function SimpleStorage() {
+ var _this = this;
+ this.clear = function () {
+ _this._storage = {};
+ };
+ this.storeItem = function (item) {
+ _this._storage[item.id] = utils.copy(item);
+ };
+ this.getStoredItem = function (id) {
+ return _this._storage[id] || null;
+ };
+ this._storage = {};
+ }
+ SimpleStorage.create = function () {
+ return new SimpleStorage();
+ };
+ return SimpleStorage;
+}());
+exports.default = SimpleStorage;
+
+
+/***/ }),
+
+/***/ "./sources/core/datastore/datastore.js":
+/*!*********************************************!*\
+ !*** ./sources/core/datastore/datastore.js ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var powerArray = __webpack_require__(/*! ./power_array */ "./sources/core/datastore/power_array.js");
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var eventable = __webpack_require__(/*! ../../utils/eventable */ "./sources/utils/eventable.js");
+
+var isPlaceholderTask = __webpack_require__(/*! ../../utils/placeholder_task */ "./sources/utils/placeholder_task.js");
+
+var DataStore = function DataStore(config) {
+ this.pull = {};
+ this.$initItem = config.initItem;
+ this.visibleOrder = powerArray.$create();
+ this.fullOrder = powerArray.$create();
+ this._skip_refresh = false;
+ this._filterRule = null;
+ this._searchVisibleOrder = {};
+ this._indexRangeCache = {};
+ this._getItemsCache = null;
+ this.$config = config;
+ eventable(this);
+
+ this._attachDataChange(function () {
+ this._indexRangeCache = {};
+ this._getItemsCache = null;
+ return true;
+ });
+
+ return this;
+};
+
+DataStore.prototype = {
+ _attachDataChange: function _attachDataChange(callback) {
+ this.attachEvent("onClearAll", callback);
+ this.attachEvent("onBeforeParse", callback);
+ this.attachEvent("onBeforeUpdate", callback);
+ this.attachEvent("onBeforeDelete", callback);
+ this.attachEvent("onBeforeAdd", callback);
+ this.attachEvent("onParse", callback);
+ this.attachEvent("onBeforeFilter", callback);
+ },
+ _parseInner: function _parseInner(data) {
+ var item = null,
+ loaded = [];
+
+ for (var i = 0, len = data.length; i < len; i++) {
+ item = data[i];
+
+ if (this.$initItem) {
+ if (this.$config.copyOnParse()) {
+ item = utils.copy(item);
+ }
+
+ item = this.$initItem(item);
+ }
+
+ if (this.callEvent("onItemLoading", [item])) {
+ if (!this.pull.hasOwnProperty(item.id)) {
+ this.fullOrder.push(item.id);
+ }
+
+ loaded.push(item);
+ this.pull[item.id] = item;
+ }
+ }
+
+ return loaded;
+ },
+ parse: function parse(data) {
+ if (!this.isSilent()) {
+ this.callEvent("onBeforeParse", [data]);
+ }
+
+ var loaded = this._parseInner(data);
+
+ if (!this.isSilent()) {
+ this.refresh();
+ this.callEvent("onParse", [loaded]);
+ }
+ },
+ getItem: function getItem(id) {
+ return this.pull[id];
+ },
+ _updateOrder: function _updateOrder(code) {
+ code.call(this.visibleOrder);
+ code.call(this.fullOrder);
+ },
+ updateItem: function updateItem(id, item) {
+ if (!utils.defined(item)) item = this.getItem(id);
+
+ if (!this.isSilent()) {
+ if (this.callEvent("onBeforeUpdate", [item.id, item]) === false) return false;
+ } // This is how it worked before updating the properties:
+ // this.pull[id]=item;
+
+
+ utils.mixin(this.pull[id], item, true);
+
+ if (!this.isSilent()) {
+ this.callEvent("onAfterUpdate", [item.id, item]);
+ this.callEvent("onStoreUpdated", [item.id, item, "update"]);
+ }
+ },
+ _removeItemInner: function _removeItemInner(id) {
+ //clear from collections
+ //this.visibleOrder.$remove(id);
+ this._updateOrder(function () {
+ this.$remove(id);
+ });
+
+ delete this.pull[id];
+ },
+ removeItem: function removeItem(id) {
+ //utils.assert(this.exists(id), "Not existing ID in remove command"+id);
+ var obj = this.getItem(id); //save for later event
+
+ if (!this.isSilent()) {
+ if (this.callEvent("onBeforeDelete", [obj.id, obj]) === false) return false;
+ }
+
+ this.callEvent("onAfterDeleteConfirmed", [obj.id, obj]);
+
+ this._removeItemInner(id);
+
+ if (!this.isSilent()) {
+ this.filter();
+ this.callEvent("onAfterDelete", [obj.id, obj]); //repaint signal
+
+ this.callEvent("onStoreUpdated", [obj.id, obj, "delete"]);
+ }
+ },
+ _addItemInner: function _addItemInner(item, index) {
+ //in case of treetable order is sent as 3rd parameter
+ //var order = index;
+ if (this.exists(item.id)) {
+ this.silent(function () {
+ this.updateItem(item.id, item);
+ });
+ } else {
+ var order = this.visibleOrder; //by default item is added to the end of the list
+
+ var data_size = order.length;
+ if (!utils.defined(index) || index < 0) index = data_size; //check to prevent too big indexes
+
+ if (index > data_size) {
+ //dhx.log("Warning","DataStore:add","Index of out of bounds");
+ index = Math.min(order.length, index);
+ }
+ } //gantt.assert(!this.exists(id), "Not unique ID");
+
+
+ this.pull[item.id] = item;
+
+ if (!this.isSilent()) {
+ this._updateOrder(function () {
+ if (this.$find(item.id) === -1) this.$insertAt(item.id, index);
+ });
+ }
+
+ this.filter(); //order.$insertAt(item.id,index);
+ },
+ isVisible: function isVisible(id) {
+ return this.visibleOrder.$find(id) > -1;
+ },
+ getVisibleItems: function getVisibleItems() {
+ return this.getIndexRange();
+ },
+ addItem: function addItem(item, index) {
+ if (!utils.defined(item.id)) item.id = utils.uid();
+
+ if (this.$initItem) {
+ item = this.$initItem(item);
+ }
+
+ if (!this.isSilent()) {
+ if (this.callEvent("onBeforeAdd", [item.id, item]) === false) return false;
+ }
+
+ this._addItemInner(item, index);
+
+ if (!this.isSilent()) {
+ this.callEvent("onAfterAdd", [item.id, item]); //repaint signal
+
+ this.callEvent("onStoreUpdated", [item.id, item, "add"]);
+ }
+
+ return item.id;
+ },
+ _changeIdInner: function _changeIdInner(oldId, newId) {
+ if (this.pull[oldId]) this.pull[newId] = this.pull[oldId];
+ var visibleOrder = this._searchVisibleOrder[oldId];
+ this.pull[newId].id = newId;
+
+ this._updateOrder(function () {
+ this[this.$find(oldId)] = newId;
+ });
+
+ this._searchVisibleOrder[newId] = visibleOrder;
+ delete this._searchVisibleOrder[oldId]; //this.visibleOrder[this.visibleOrder.$find(oldId)]=newId;
+
+ delete this.pull[oldId];
+ },
+ changeId: function changeId(oldId, newId) {
+ this._changeIdInner(oldId, newId);
+
+ this.callEvent("onIdChange", [oldId, newId]);
+ },
+ exists: function exists(id) {
+ return !!this.pull[id];
+ },
+ _moveInner: function _moveInner(sindex, tindex) {
+ var id = this.getIdByIndex(sindex);
+
+ this._updateOrder(function () {
+ this.$removeAt(sindex);
+ this.$insertAt(id, Math.min(this.length, tindex));
+ }); //this.visibleOrder.$removeAt(sindex); //remove at old position
+ //if (sindex<tindex) tindex--; //correct shift, caused by element removing
+ //this.visibleOrder.$insertAt(id,Math.min(this.visibleOrder.length, tindex)); //insert at new position
+
+ },
+ move: function move(sindex, tindex) {
+ //gantt.assert(sindex>=0 && tindex>=0, "DataStore::move","Incorrect indexes");
+ var id = this.getIdByIndex(sindex);
+ var obj = this.getItem(id);
+
+ this._moveInner(sindex, tindex);
+
+ if (!this.isSilent()) {
+ //repaint signal
+ this.callEvent("onStoreUpdated", [obj.id, obj, "move"]);
+ }
+ },
+ clearAll: function clearAll() {
+ if (this.$destroyed) {
+ return;
+ } // GS-956 We need to unselect the resource as its ID is cached
+
+
+ this.silent(function () {
+ this.unselect();
+ });
+ this.pull = {};
+ this.visibleOrder = powerArray.$create();
+ this.fullOrder = powerArray.$create();
+ if (this.isSilent()) return;
+ this.callEvent("onClearAll", []);
+ this.refresh();
+ },
+ silent: function silent(code, master) {
+ var alreadySilent = false;
+
+ if (this.isSilent()) {
+ alreadySilent = true;
+ }
+
+ this._skip_refresh = true;
+ code.call(master || this);
+
+ if (!alreadySilent) {
+ this._skip_refresh = false;
+ }
+ },
+ isSilent: function isSilent() {
+ return !!this._skip_refresh;
+ },
+ arraysEqual: function arraysEqual(arr1, arr2) {
+ if (arr1.length !== arr2.length) return false;
+
+ for (var i = 0; i < arr1.length; i++) {
+ if (arr1[i] !== arr2[i]) return false;
+ }
+
+ return true;
+ },
+ refresh: function refresh(id, quick) {
+ if (this.isSilent()) return;
+ var item;
+
+ if (id) {
+ item = this.getItem(id);
+ }
+
+ var args;
+
+ if (id) {
+ args = [id, item, "paint"];
+ } else {
+ args = [null, null, null];
+ }
+
+ if (this.callEvent("onBeforeStoreUpdate", args) === false) {
+ return;
+ }
+
+ var skipFilter = this._quick_refresh && !this._mark_recompute;
+ this._mark_recompute = false;
+
+ if (id) {
+ // if item changes visible order (e.g. expand-collapse branch) - do a complete repaint
+ if (!quick && !skipFilter) {
+ var oldOrder = this.visibleOrder;
+ this.filter();
+
+ if (!this.arraysEqual(oldOrder, this.visibleOrder)) {
+ id = undefined;
+ }
+ }
+ } else if (!skipFilter) {
+ this.filter();
+ }
+
+ if (id) {
+ args = [id, item, "paint"];
+ } else {
+ args = [null, null, null];
+ }
+
+ this.callEvent("onStoreUpdated", args);
+ },
+ count: function count() {
+ return this.fullOrder.length;
+ },
+ countVisible: function countVisible() {
+ return this.visibleOrder.length;
+ },
+ sort: function sort(_sort) {},
+ serialize: function serialize() {},
+ eachItem: function eachItem(code) {
+ for (var i = 0; i < this.fullOrder.length; i++) {
+ var item = this.getItem(this.fullOrder[i]);
+ code.call(this, item);
+ }
+ },
+ find: function find(filter) {
+ var result = [];
+ this.eachItem(function (item) {
+ if (filter(item)) {
+ result.push(item);
+ }
+ });
+ return result;
+ },
+ filter: function filter(rule) {
+ if (!this.isSilent()) {
+ this.callEvent("onBeforeFilter", []);
+ }
+
+ this.callEvent("onPreFilter", []);
+ var filteredOrder = powerArray.$create();
+ var placeholderIds = [];
+ this.eachItem(function (item) {
+ if (this.callEvent("onFilterItem", [item.id, item])) {
+ if (isPlaceholderTask(item.id, null, this, this._ganttConfig)) {
+ placeholderIds.push(item.id);
+ } else {
+ filteredOrder.push(item.id);
+ }
+ }
+ });
+
+ for (var i = 0; i < placeholderIds.length; i++) {
+ filteredOrder.push(placeholderIds[i]);
+ }
+
+ this.visibleOrder = filteredOrder;
+ this._searchVisibleOrder = {};
+
+ for (var i = 0; i < this.visibleOrder.length; i++) {
+ this._searchVisibleOrder[this.visibleOrder[i]] = i;
+ }
+
+ if (!this.isSilent()) {
+ this.callEvent("onFilter", []);
+ }
+ },
+ getIndexRange: function getIndexRange(from, to) {
+ var max = Math.min(to || Infinity, this.countVisible() - 1);
+ var min = from || 0;
+ var cacheKey = min + '-' + max;
+
+ if (this._indexRangeCache[cacheKey]) {
+ return this._indexRangeCache[cacheKey].slice();
+ }
+
+ var ret = [];
+
+ for (var i = min; i <= max; i++) {
+ ret.push(this.getItem(this.visibleOrder[i]));
+ }
+
+ this._indexRangeCache[cacheKey] = ret.slice();
+ return ret;
+ },
+ getItems: function getItems() {
+ if (this._getItemsCache) {
+ return this._getItemsCache.slice();
+ }
+
+ var res = [];
+
+ for (var i in this.pull) {
+ res.push(this.pull[i]);
+ }
+
+ this._getItemsCache = res.slice();
+ return res;
+ },
+ getIdByIndex: function getIdByIndex(index) {
+ return this.visibleOrder[index];
+ },
+ getIndexById: function getIndexById(id) {
+ var res = this._searchVisibleOrder[id];
+
+ if (res === undefined) {
+ res = -1;
+ }
+
+ return res;
+ },
+ _getNullIfUndefined: function _getNullIfUndefined(value) {
+ if (value === undefined) {
+ return null;
+ } else {
+ return value;
+ }
+ },
+ getFirst: function getFirst() {
+ return this._getNullIfUndefined(this.visibleOrder[0]);
+ },
+ getLast: function getLast() {
+ return this._getNullIfUndefined(this.visibleOrder[this.visibleOrder.length - 1]);
+ },
+ getNext: function getNext(id) {
+ return this._getNullIfUndefined(this.visibleOrder[this.getIndexById(id) + 1]);
+ },
+ getPrev: function getPrev(id) {
+ return this._getNullIfUndefined(this.visibleOrder[this.getIndexById(id) - 1]);
+ },
+ destructor: function destructor() {
+ this.callEvent("onDestroy", []);
+ this.detachAllEvents();
+ this.$destroyed = true;
+ this.pull = null;
+ this.$initItem = null;
+ this.visibleOrder = null;
+ this.fullOrder = null;
+ this._skip_refresh = null;
+ this._filterRule = null;
+ this._searchVisibleOrder = null;
+ this._indexRangeCache = {};
+ }
+};
+module.exports = DataStore;
+
+/***/ }),
+
+/***/ "./sources/core/datastore/datastore_hooks.js":
+/*!***************************************************!*\
+ !*** ./sources/core/datastore/datastore_hooks.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var facadeFactory = __webpack_require__(/*! ./../facades/datastore */ "./sources/core/facades/datastore.js");
+
+var calculateScaleRange = __webpack_require__(/*! ../gantt_data_range */ "./sources/core/gantt_data_range.js");
+
+var isPlaceholderTask = __webpack_require__(/*! ../../utils/placeholder_task */ "./sources/utils/placeholder_task.js");
+
+function initDataStores(gantt) {
+ var facade = facadeFactory.create();
+ utils.mixin(gantt, facade);
+ var tasksStore = gantt.createDatastore({
+ name: "task",
+ type: "treeDatastore",
+ rootId: function rootId() {
+ return gantt.config.root_id;
+ },
+ initItem: utils.bind(_init_task, gantt),
+ getConfig: function getConfig() {
+ return gantt.config;
+ }
+ });
+ var linksStore = gantt.createDatastore({
+ name: "link",
+ initItem: utils.bind(_init_link, gantt)
+ });
+ gantt.attachEvent("onDestroy", function () {
+ tasksStore.destructor();
+ linksStore.destructor();
+ });
+ gantt.attachEvent("onLinkValidation", function (link) {
+ if (gantt.isLinkExists(link.id) || link.id === "predecessor_generated") {
+ // link was already added into gantt
+ return true;
+ }
+
+ var source = gantt.getTask(link.source);
+ var taskLinks = source.$source;
+
+ for (var i = 0; i < taskLinks.length; i++) {
+ var existingLink = gantt.getLink(taskLinks[i]);
+ var sourceMatch = link.source == existingLink.source;
+ var targetMatch = link.target == existingLink.target;
+ var typeMatch = link.type == existingLink.type; // prevent creating duplicated links from the UI
+
+ if (sourceMatch && targetMatch && typeMatch) {
+ return false;
+ }
+ }
+
+ return true;
+ });
+ tasksStore.attachEvent("onBeforeRefreshAll", function () {
+ // GS-2170 do not recalculate indexes and dates as the event will be called later in the onStoreUpdate event
+ if (tasksStore._skipTaskRecalculation) {
+ return;
+ }
+
+ var order = tasksStore.getVisibleItems();
+
+ for (var i = 0; i < order.length; i++) {
+ var item = order[i];
+ item.$index = i;
+ item.$local_index = gantt.getTaskIndex(item.id);
+ gantt.resetProjectDates(item);
+ }
+ });
+ tasksStore.attachEvent("onFilterItem", function (id, task) {
+ if (gantt.config.show_tasks_outside_timescale) {
+ return true;
+ }
+
+ var min = null,
+ max = null;
+
+ if (gantt.config.start_date && gantt.config.end_date) {
+ if (gantt._isAllowedUnscheduledTask(task)) return true;
+ min = gantt.config.start_date.valueOf();
+ max = gantt.config.end_date.valueOf();
+ if (+task.start_date > max || +task.end_date < +min) return false;
+ }
+
+ return true;
+ });
+ tasksStore.attachEvent("onIdChange", function (oldId, newId) {
+ gantt._update_flags(oldId, newId);
+
+ var changedTask = gantt.getTask(newId);
+
+ if (!tasksStore.isSilent()) {
+ if (changedTask.$split_subtask || changedTask.rollup) {
+ gantt.eachParent(function (parent) {
+ gantt.refreshTask(parent.id);
+ }, newId);
+ }
+ }
+ });
+ tasksStore.attachEvent("onAfterUpdate", function (id) {
+ gantt._update_parents(id);
+
+ if (gantt.getState("batchUpdate").batch_update) {
+ return true;
+ }
+
+ var task = tasksStore.getItem(id);
+ if (!task.$source) task.$source = [];
+
+ for (var i = 0; i < task.$source.length; i++) {
+ linksStore.refresh(task.$source[i]);
+ }
+
+ if (!task.$target) task.$target = [];
+
+ for (var i = 0; i < task.$target.length; i++) {
+ linksStore.refresh(task.$target[i]);
+ }
+ });
+ tasksStore.attachEvent("onBeforeItemMove", function (sid, parent, tindex) {
+ // GS-125. Don't allow users to move the placeholder task
+ if (isPlaceholderTask(sid, gantt, tasksStore)) {
+ //eslint-disable-next-line
+ console.log("The placeholder task cannot be moved to another position.");
+ return false;
+ }
+
+ return true;
+ });
+ tasksStore.attachEvent("onAfterItemMove", function (sid, parent, tindex) {
+ var source = gantt.getTask(sid);
+
+ if (this.getNextSibling(sid) !== null) {
+ source.$drop_target = this.getNextSibling(sid);
+ } else if (this.getPrevSibling(sid) !== null) {
+ source.$drop_target = "next:" + this.getPrevSibling(sid);
+ } else {
+ source.$drop_target = "next:null";
+ }
+ });
+ tasksStore.attachEvent("onStoreUpdated", function (id, item, action) {
+ if (action == "delete") {
+ gantt._update_flags(id, null);
+ }
+
+ var state = gantt.$services.getService("state");
+
+ if (state.getState("batchUpdate").batch_update) {
+ return;
+ }
+
+ if (gantt.config.fit_tasks && action !== "paint") {
+ var oldState = gantt.getState();
+ calculateScaleRange(gantt);
+ var newState = gantt.getState(); //this._init_tasks_range();
+
+ if (+oldState.min_date != +newState.min_date || +oldState.max_date != +newState.max_date) {
+ gantt.render();
+ gantt.callEvent("onScaleAdjusted", []);
+ return true;
+ }
+ }
+
+ if (action == "add" || action == "move" || action == "delete") {
+ if (gantt.$layout) {
+ // GS-2170. Do not recalculate the indexes and dates of other tasks in the
+ // onBeforeResize layout event, but do it later. If lightbox is opened, it will
+ // trigger the refreshData, so the indexes and dates will be recalculated there
+ if (this.$config.name == "task" && (action == "add" || action == "delete")) {
+ if (this._skipTaskRecalculation != "lightbox") {
+ this._skipTaskRecalculation = true;
+ }
+ }
+
+ gantt.$layout.resize();
+ }
+ } else if (!id) {
+ linksStore.refresh();
+ }
+ });
+ linksStore.attachEvent("onAfterAdd", function (id, link) {
+ sync_link(link);
+ });
+ linksStore.attachEvent("onAfterUpdate", function (id, link) {
+ sync_links();
+ });
+ linksStore.attachEvent("onAfterDelete", function (id, link) {
+ sync_link_delete(link);
+ });
+ linksStore.attachEvent("onBeforeIdChange", function (oldId, newId) {
+ sync_link_delete(gantt.mixin({
+ id: oldId
+ }, gantt.$data.linksStore.getItem(newId)));
+ sync_link(gantt.$data.linksStore.getItem(newId));
+ });
+
+ function checkLinkedTaskVisibility(taskId) {
+ var isVisible = gantt.isTaskVisible(taskId);
+
+ if (!isVisible && gantt.isTaskExists(taskId)) {
+ var parent = gantt.getParent(taskId);
+
+ if (gantt.isTaskExists(parent) && gantt.isTaskVisible(parent)) {
+ parent = gantt.getTask(parent);
+
+ if (gantt.isSplitTask(parent)) {
+ isVisible = true;
+ }
+ }
+ }
+
+ return isVisible;
+ }
+
+ linksStore.attachEvent("onFilterItem", function (id, link) {
+ if (!gantt.config.show_links) {
+ return false;
+ }
+
+ var sourceVisible = checkLinkedTaskVisibility(link.source);
+ var targetVisible = checkLinkedTaskVisibility(link.target);
+ if (!(sourceVisible && targetVisible) || gantt._isAllowedUnscheduledTask(gantt.getTask(link.source)) || gantt._isAllowedUnscheduledTask(gantt.getTask(link.target))) return false;
+ return gantt.callEvent("onBeforeLinkDisplay", [id, link]);
+ });
+
+ (function () {
+ // delete all connected links after task is deleted
+ var treeHelper = __webpack_require__(/*! ../../utils/task_tree_helpers */ "./sources/utils/task_tree_helpers.js");
+
+ var deletedLinks = {};
+ gantt.attachEvent("onBeforeTaskDelete", function (id, item) {
+ deletedLinks[id] = treeHelper.getSubtreeLinks(gantt, id);
+ return true;
+ });
+ gantt.attachEvent("onAfterTaskDelete", function (id, item) {
+ if (deletedLinks[id]) {
+ gantt.$data.linksStore.silent(function () {
+ for (var i in deletedLinks[id]) {
+ if (gantt.isLinkExists(i)) {
+ gantt.$data.linksStore.removeItem(i);
+ }
+
+ sync_link_delete(deletedLinks[id][i]);
+ }
+
+ deletedLinks[id] = null;
+ });
+ }
+ });
+ })();
+
+ gantt.attachEvent("onAfterLinkDelete", function (id, link) {
+ gantt.refreshTask(link.source);
+ gantt.refreshTask(link.target);
+ });
+ gantt.attachEvent("onParse", sync_links);
+ mapEvents({
+ source: linksStore,
+ target: gantt,
+ events: {
+ "onItemLoading": "onLinkLoading",
+ "onBeforeAdd": "onBeforeLinkAdd",
+ "onAfterAdd": "onAfterLinkAdd",
+ "onBeforeUpdate": "onBeforeLinkUpdate",
+ "onAfterUpdate": "onAfterLinkUpdate",
+ "onBeforeDelete": "onBeforeLinkDelete",
+ "onAfterDelete": "onAfterLinkDelete",
+ "onIdChange": "onLinkIdChange"
+ }
+ });
+ mapEvents({
+ source: tasksStore,
+ target: gantt,
+ events: {
+ "onItemLoading": "onTaskLoading",
+ "onBeforeAdd": "onBeforeTaskAdd",
+ "onAfterAdd": "onAfterTaskAdd",
+ "onBeforeUpdate": "onBeforeTaskUpdate",
+ "onAfterUpdate": "onAfterTaskUpdate",
+ "onBeforeDelete": "onBeforeTaskDelete",
+ "onAfterDelete": "onAfterTaskDelete",
+ "onIdChange": "onTaskIdChange",
+ "onBeforeItemMove": "onBeforeTaskMove",
+ "onAfterItemMove": "onAfterTaskMove",
+ "onFilterItem": "onBeforeTaskDisplay",
+ "onItemOpen": "onTaskOpened",
+ "onItemClose": "onTaskClosed",
+ "onBeforeSelect": "onBeforeTaskSelected",
+ "onAfterSelect": "onTaskSelected",
+ "onAfterUnselect": "onTaskUnselected"
+ }
+ });
+ gantt.$data = {
+ tasksStore: tasksStore,
+ linksStore: linksStore
+ };
+
+ function sync_link(link) {
+ if (gantt.isTaskExists(link.source)) {
+ var sourceTask = gantt.getTask(link.source);
+ sourceTask.$source = sourceTask.$source || [];
+ sourceTask.$source.push(link.id);
+ }
+
+ if (gantt.isTaskExists(link.target)) {
+ var targetTask = gantt.getTask(link.target);
+ targetTask.$target = targetTask.$target || [];
+ targetTask.$target.push(link.id);
+ }
+ }
+
+ function sync_link_delete(link) {
+ if (gantt.isTaskExists(link.source)) {
+ var sourceTask = gantt.getTask(link.source);
+
+ for (var i = 0; i < sourceTask.$source.length; i++) {
+ if (sourceTask.$source[i] == link.id) {
+ sourceTask.$source.splice(i, 1);
+ break;
+ }
+ }
+ }
+
+ if (gantt.isTaskExists(link.target)) {
+ var targetTask = gantt.getTask(link.target);
+
+ for (var i = 0; i < targetTask.$target.length; i++) {
+ if (targetTask.$target[i] == link.id) {
+ targetTask.$target.splice(i, 1);
+ break;
+ }
+ }
+ }
+ }
+
+ function sync_links() {
+ var task = null;
+ var tasks = gantt.$data.tasksStore.getItems();
+
+ for (var i = 0, len = tasks.length; i < len; i++) {
+ task = tasks[i];
+ task.$source = [];
+ task.$target = [];
+ }
+
+ var links = gantt.$data.linksStore.getItems();
+
+ for (var i = 0, len = links.length; i < len; i++) {
+ var link = links[i];
+ sync_link(link);
+ }
+ }
+
+ function mapEvents(conf) {
+ var mapFrom = conf.source;
+ var mapTo = conf.target;
+
+ for (var i in conf.events) {
+ (function (sourceEvent, targetEvent) {
+ mapFrom.attachEvent(sourceEvent, function () {
+ return mapTo.callEvent(targetEvent, Array.prototype.slice.call(arguments));
+ }, targetEvent);
+ })(i, conf.events[i]);
+ }
+ }
+
+ function _init_task(task) {
+ if (!this.defined(task.id)) task.id = this.uid();
+ if (task.start_date) task.start_date = gantt.date.parseDate(task.start_date, "parse_date");
+ if (task.end_date) task.end_date = gantt.date.parseDate(task.end_date, "parse_date");
+ var duration = null;
+
+ if (task.duration || task.duration === 0) {
+ task.duration = duration = task.duration * 1;
+ }
+
+ if (duration) {
+ if (task.start_date && !task.end_date) {
+ task.end_date = this.calculateEndDate(task);
+ } else if (!task.start_date && task.end_date) {
+ task.start_date = this.calculateEndDate({
+ start_date: task.end_date,
+ duration: -task.duration,
+ task: task
+ });
+ } //task.$calculate_duration = false;
+
+ }
+
+ task.progress = Number(task.progress) || 0;
+
+ if (this._isAllowedUnscheduledTask(task)) {
+ this._set_default_task_timing(task);
+ }
+
+ this._init_task_timing(task);
+
+ if (task.start_date && task.end_date) this.correctTaskWorkTime(task);
+ task.$source = [];
+ task.$target = [];
+ var originalTask = this.$data.tasksStore.getItem(task.id);
+
+ if (originalTask && !utils.defined(task.open)) {
+ // if a task with the same id is already in the gantt and the new object doesn't specify the `open` state -
+ // restore the `open` state we already have in the chart
+ task.$open = originalTask.$open;
+ }
+
+ if (task.parent === undefined) {
+ task.parent = this.config.root_id;
+ }
+
+ return task;
+ }
+
+ function _init_link(link) {
+ if (!this.defined(link.id)) link.id = this.uid();
+ return link;
+ }
+}
+
+module.exports = initDataStores;
+
+/***/ }),
+
+/***/ "./sources/core/datastore/datastore_render.js":
+/*!****************************************************!*\
+ !*** ./sources/core/datastore/datastore_render.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isHeadless = __webpack_require__(/*! ../../utils/is_headless */ "./sources/utils/is_headless.js");
+
+var storeRenderCreator = function storeRenderCreator(name, gantt) {
+ var store = gantt.getDatastore(name);
+ var itemRepainter = {
+ renderItem: function renderItem(id, renderer) {
+ var renders = renderer.getLayers();
+ var item = store.getItem(id);
+
+ if (item && store.isVisible(id)) {
+ for (var i = 0; i < renders.length; i++) {
+ renders[i].render_item(item);
+ }
+ }
+ },
+ renderItems: function renderItems(renderer) {
+ var renderers = renderer.getLayers();
+
+ for (var i = 0; i < renderers.length; i++) {
+ renderers[i].clear();
+ }
+
+ var allData = null;
+ var loadedRanges = {};
+
+ for (var _i = 0; _i < renderers.length; _i++) {
+ var layer = renderers[_i];
+ var layerData = void 0;
+
+ if (layer.get_visible_range) {
+ var range = layer.get_visible_range(store);
+
+ if (range.start !== undefined && range.end !== undefined) {
+ var key = range.start + " - " + range.end;
+
+ if (loadedRanges[key]) {
+ layerData = loadedRanges[key];
+ } else {
+ layerData = store.getIndexRange(range.start, range.end);
+ loadedRanges[key] = layerData;
+ }
+ } else if (range.ids !== undefined) {
+ layerData = range.ids.map(function (id) {
+ return store.getItem(id);
+ });
+ } else {
+ throw new Error("Invalid range returned from 'getVisibleRange' of the layer");
+ }
+ } else {
+ if (!allData) {
+ allData = store.getVisibleItems();
+ }
+
+ layerData = allData;
+ }
+
+ if (layer.prepare_data) {
+ // GS-1605. Highlight timeline cells below tasks and in an empty chart
+ layer.prepare_data(layerData);
+ }
+
+ renderers[_i].render_items(layerData);
+ }
+ },
+ updateItems: function updateItems(layer) {
+ if (layer.update_items) {
+ var data;
+
+ if (layer.get_visible_range) {
+ var range = layer.get_visible_range(store);
+
+ if (range.start !== undefined && range.end !== undefined) {
+ data = store.getIndexRange(range.start, range.end);
+ } else if (range.ids !== undefined) {
+ data = range.ids.map(function (id) {
+ return store.getItem(id);
+ });
+ } else {
+ throw new Error("Invalid range returned from 'getVisibleRange' of the layer");
+ }
+ } else {
+ data = store.getVisibleItems();
+ }
+
+ if (layer.prepare_data) {
+ // GS-1605. Highlight timeline cells below tasks and in an empty chart
+ layer.prepare_data(data, layer);
+ }
+
+ layer.update_items(data);
+ }
+ }
+ };
+ store.attachEvent("onStoreUpdated", function (id, item, action) {
+ if (isHeadless(gantt)) {
+ return true;
+ }
+
+ var renderer = gantt.$services.getService("layers").getDataRender(name);
+
+ if (renderer) {
+ renderer.onUpdateRequest = function (layer) {
+ itemRepainter.updateItems(layer);
+ };
+ }
+ });
+
+ function skipRepaint(gantt) {
+ var state = gantt.$services.getService("state");
+
+ if (state.getState("batchUpdate").batch_update) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ store.attachEvent("onStoreUpdated", function (id, item, action) {
+ if (skipRepaint(gantt)) {
+ return;
+ }
+
+ if (!id || action == "move" || action == "delete") {
+ store.callEvent("onBeforeRefreshAll", []);
+ store.callEvent("onAfterRefreshAll", []);
+ } else {
+ store.callEvent("onBeforeRefreshItem", [item.id]);
+ store.callEvent("onAfterRefreshItem", [item.id]);
+ }
+ });
+ store.attachEvent("onAfterRefreshAll", function () {
+ if (isHeadless(gantt)) {
+ return true;
+ }
+
+ var renderer = gantt.$services.getService("layers").getDataRender(name);
+
+ if (renderer && !skipRepaint(gantt)) {
+ itemRepainter.renderItems(renderer);
+ }
+ });
+ store.attachEvent("onAfterRefreshItem", function (id) {
+ if (isHeadless(gantt)) {
+ return true;
+ }
+
+ var renderer = gantt.$services.getService("layers").getDataRender(name);
+
+ if (renderer) {
+ itemRepainter.renderItem(id, renderer);
+ }
+ }); // TODO: probably can be done more in a more efficient way
+
+ store.attachEvent("onItemOpen", function () {
+ if (isHeadless(gantt)) {
+ return true;
+ }
+
+ gantt.render();
+ });
+ store.attachEvent("onItemClose", function () {
+ if (isHeadless(gantt)) {
+ return true;
+ }
+
+ gantt.render();
+ });
+
+ function refreshId(renders, oldId, newId, item) {
+ for (var i = 0; i < renders.length; i++) {
+ renders[i].change_id(oldId, newId);
+ }
+ }
+
+ store.attachEvent("onIdChange", function (oldId, newId) {
+ if (isHeadless(gantt)) {
+ return true;
+ } // in case of linked datastores (tasks <-> links), id change should recalculate something in linked datastore before any repaint
+ // use onBeforeIdChange for this hook.
+ // TODO: use something more reasonable instead
+
+
+ store.callEvent("onBeforeIdChange", [oldId, newId]);
+
+ if (skipRepaint(gantt)) {
+ return;
+ }
+
+ if (!store.isSilent()) {
+ var renderer = gantt.$services.getService("layers").getDataRender(name);
+
+ if (renderer) {
+ // missing check for renderer GS-1814
+ refreshId(renderer.getLayers(), oldId, newId, store.getItem(newId));
+ itemRepainter.renderItem(newId, renderer);
+ } else {
+ // GS-1814 repaint ui to apply new id when the datastore don't have own renderer
+ gantt.render();
+ }
+ }
+ });
+};
+
+module.exports = {
+ bindDataStore: storeRenderCreator
+};
+
+/***/ }),
+
+/***/ "./sources/core/datastore/power_array.js":
+/*!***********************************************!*\
+ !*** ./sources/core/datastore/power_array.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var $powerArray = {
+ $create: function $create(array) {
+ return utils.mixin(array || [], this);
+ },
+ //remove element at specified position
+ $removeAt: function $removeAt(pos, len) {
+ if (pos >= 0) this.splice(pos, len || 1);
+ },
+ //find element in collection and remove it
+ $remove: function $remove(value) {
+ this.$removeAt(this.$find(value));
+ },
+ //add element to collection at specific position
+ $insertAt: function $insertAt(data, pos) {
+ if (!pos && pos !== 0) //add to the end by default
+ this.push(data);else {
+ var b = this.splice(pos, this.length - pos);
+ this[pos] = data;
+ this.push.apply(this, b); //reconstruct array without loosing this pointer
+ }
+ },
+ //return index of element, -1 if it doesn't exists
+ $find: function $find(data) {
+ for (var i = 0; i < this.length; i++) {
+ if (data == this[i]) return i;
+ }
+
+ return -1;
+ },
+ //execute some method for each element of array
+ $each: function $each(functor, master) {
+ for (var i = 0; i < this.length; i++) {
+ functor.call(master || this, this[i]);
+ }
+ },
+ //create new array from source, by using results of functor
+ $map: function $map(functor, master) {
+ for (var i = 0; i < this.length; i++) {
+ this[i] = functor.call(master || this, this[i]);
+ }
+
+ return this;
+ },
+ $filter: function $filter(functor, master) {
+ for (var i = 0; i < this.length; i++) {
+ if (!functor.call(master || this, this[i])) {
+ this.splice(i, 1);
+ i--;
+ }
+ }
+
+ return this;
+ }
+};
+module.exports = $powerArray;
+
+/***/ }),
+
+/***/ "./sources/core/datastore/select.js":
+/*!******************************************!*\
+ !*** ./sources/core/datastore/select.js ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function createDataStoreSelectMixin(store) {
+ var selectedId = null;
+ var deleteItem = store._removeItemInner;
+
+ function _unselect(id) {
+ selectedId = null;
+ this.callEvent("onAfterUnselect", [id]);
+ }
+
+ store._removeItemInner = function (id) {
+ if (selectedId == id) {
+ _unselect.call(this, id);
+ }
+
+ if (selectedId && this.eachItem) {
+ this.eachItem(function (subItem) {
+ if (subItem.id == selectedId) {
+ _unselect.call(this, subItem.id);
+ }
+ }, id);
+ }
+
+ return deleteItem.apply(this, arguments);
+ };
+
+ store.attachEvent("onIdChange", function (oldId, newId) {
+ if (store.getSelectedId() == oldId) {
+ store.silent(function () {
+ store.unselect(oldId);
+ store.select(newId);
+ });
+ }
+ });
+ return {
+ select: function select(id) {
+ if (id) {
+ if (selectedId == id) return selectedId;
+
+ if (!this._skip_refresh) {
+ if (!this.callEvent("onBeforeSelect", [id])) {
+ return false;
+ }
+ }
+
+ this.unselect();
+ selectedId = id;
+
+ if (!this._skip_refresh) {
+ this.refresh(id);
+ this.callEvent("onAfterSelect", [id]);
+ }
+ }
+
+ return selectedId;
+ },
+ getSelectedId: function getSelectedId() {
+ return selectedId;
+ },
+ isSelected: function isSelected(id) {
+ return id == selectedId;
+ },
+ unselect: function unselect(id) {
+ var id = id || selectedId;
+ if (!id) return;
+ selectedId = null;
+
+ if (!this._skip_refresh) {
+ this.refresh(id);
+
+ _unselect.call(this, id);
+ }
+ }
+ };
+}
+
+module.exports = createDataStoreSelectMixin;
+
+/***/ }),
+
+/***/ "./sources/core/datastore/treedatastore.js":
+/*!*************************************************!*\
+ !*** ./sources/core/datastore/treedatastore.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var powerArray = __webpack_require__(/*! ./power_array */ "./sources/core/datastore/power_array.js");
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var helpers = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js");
+
+var DataStore = __webpack_require__(/*! ./datastore */ "./sources/core/datastore/datastore.js");
+
+var isPlaceholderTask = __webpack_require__(/*! ../../utils/placeholder_task */ "./sources/utils/placeholder_task.js");
+
+var _require = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js"),
+ replaceValidZeroId = _require.replaceValidZeroId; // TODO: remove workaround for mixup with es5 and ts imports
+
+
+if (DataStore["default"]) {
+ DataStore = DataStore["default"];
+}
+
+var TreeDataStore = function TreeDataStore(config) {
+ DataStore.apply(this, [config]);
+ this._branches = {};
+ this.pull = {}; //GS-761 Update existing item instead of adding it to the new position
+
+ this.$initItem = function (item) {
+ var loadedItem = item;
+
+ if (config.initItem) {
+ loadedItem = config.initItem(loadedItem);
+ }
+
+ var existingItem = this.getItem(item.id);
+
+ if (existingItem && existingItem.parent != loadedItem.parent) {
+ this.move(loadedItem.id, loadedItem.$index || -1, loadedItem.parent || this._ganttConfig.root_id);
+ }
+
+ return loadedItem;
+ };
+
+ this.$parentProperty = config.parentProperty || "parent";
+
+ if (typeof config.rootId !== "function") {
+ this.$getRootId = function (val) {
+ return function () {
+ return val;
+ };
+ }(config.rootId || 0);
+ } else {
+ this.$getRootId = config.rootId;
+ } // TODO: replace with live reference to gantt config
+
+
+ this.$openInitially = config.openInitially;
+ this.visibleOrder = powerArray.$create();
+ this.fullOrder = powerArray.$create();
+ this._searchVisibleOrder = {};
+ this._indexRangeCache = {};
+ this._eachItemMainRangeCache = null;
+ this._getItemsCache = null;
+ this._skip_refresh = false;
+ this._ganttConfig = null;
+
+ if (config.getConfig) {
+ this._ganttConfig = config.getConfig();
+ }
+
+ var splitParents = {};
+ var splitItems = {};
+ var taskOpenState = {};
+ var taskVisibility = {};
+ var haveSplitItems = false;
+
+ this._attachDataChange(function () {
+ this._indexRangeCache = {};
+ this._eachItemMainRangeCache = null;
+ this._getItemsCache = null;
+ return true;
+ });
+
+ this.attachEvent("onPreFilter", function () {
+ this._indexRangeCache = {};
+ this._eachItemMainRangeCache = null;
+ splitParents = {};
+ splitItems = {};
+ taskOpenState = {};
+ taskVisibility = {};
+ haveSplitItems = false;
+ this.eachItem(function (item) {
+ var parent = this.getParent(item.id);
+
+ if (item.$open && taskOpenState[parent] !== false) {
+ taskOpenState[item.id] = true;
+ } else {
+ taskOpenState[item.id] = false;
+ }
+
+ if (this._isSplitItem(item)) {
+ haveSplitItems = true;
+ splitParents[item.id] = true;
+ splitItems[item.id] = true;
+ }
+
+ if (haveSplitItems && splitItems[parent]) {
+ splitItems[item.id] = true;
+ }
+
+ if (taskOpenState[parent] || taskOpenState[parent] === undefined) {
+ taskVisibility[item.id] = true;
+ } else {
+ taskVisibility[item.id] = false;
+ }
+ });
+ });
+ this.attachEvent("onFilterItem", function (id, item) {
+ var canOpenSplitTasks = false;
+
+ if (this._ganttConfig) {
+ var canOpenSplitTasks = this._ganttConfig.open_split_tasks;
+ }
+
+ var open = taskVisibility[item.id];
+
+ if (haveSplitItems) {
+ if (open && splitItems[item.id] && !splitParents[item.id]) {
+ open = !!canOpenSplitTasks;
+ }
+
+ if (splitItems[item.id] && !splitParents[item.id]) {
+ item.$split_subtask = true;
+ }
+ }
+
+ item.$expanded_branch = !!taskVisibility[item.id];
+ return !!open;
+ });
+ this.attachEvent("onFilter", function () {
+ splitParents = {};
+ splitItems = {};
+ taskOpenState = {};
+ taskVisibility = {};
+ });
+ return this;
+};
+
+TreeDataStore.prototype = utils.mixin({
+ _buildTree: function _buildTree(data) {
+ var item = null;
+ var rootId = this.$getRootId();
+
+ for (var i = 0, len = data.length; i < len; i++) {
+ item = data[i];
+ this.setParent(item, replaceValidZeroId(this.getParent(item), rootId) || rootId);
+ } // calculating $level for each item
+
+
+ for (var i = 0, len = data.length; i < len; i++) {
+ item = data[i];
+
+ this._add_branch(item);
+
+ item.$level = this.calculateItemLevel(item);
+ item.$local_index = this.getBranchIndex(item.id);
+
+ if (!utils.defined(item.$open)) {
+ item.$open = utils.defined(item.open) ? item.open : this.$openInitially();
+ }
+ }
+
+ this._updateOrder();
+ },
+ _isSplitItem: function _isSplitItem(item) {
+ return item.render == "split" && this.hasChild(item.id);
+ },
+ parse: function parse(data) {
+ if (!this._skip_refresh) {
+ this.callEvent("onBeforeParse", [data]);
+ }
+
+ var loaded = this._parseInner(data);
+
+ this._buildTree(loaded);
+
+ this.filter();
+
+ if (!this._skip_refresh) {
+ this.callEvent("onParse", [loaded]);
+ }
+ },
+ _addItemInner: function _addItemInner(item, index) {
+ var parent = this.getParent(item);
+
+ if (!utils.defined(parent)) {
+ parent = this.$getRootId();
+ this.setParent(item, parent);
+ }
+
+ var parentIndex = this.getIndexById(parent);
+ var targetIndex = parentIndex + Math.min(Math.max(index, 0), this.visibleOrder.length);
+
+ if (targetIndex * 1 !== targetIndex) {
+ targetIndex = undefined;
+ }
+
+ DataStore.prototype._addItemInner.call(this, item, targetIndex);
+
+ this.setParent(item, parent);
+
+ if (item.hasOwnProperty("$rendered_parent")) {
+ this._move_branch(item, item.$rendered_parent);
+ }
+
+ this._add_branch(item, index);
+ },
+ _changeIdInner: function _changeIdInner(oldId, newId) {
+ var children = this.getChildren(oldId);
+ var visibleOrder = this._searchVisibleOrder[oldId];
+
+ DataStore.prototype._changeIdInner.call(this, oldId, newId);
+
+ var parent = this.getParent(newId);
+
+ this._replace_branch_child(parent, oldId, newId);
+
+ if (this._branches[oldId]) {
+ this._branches[newId] = this._branches[oldId];
+ }
+
+ for (var i = 0; i < children.length; i++) {
+ var child = this.getItem(children[i]);
+ child[this.$parentProperty] = newId;
+ child.$rendered_parent = newId;
+ }
+
+ this._searchVisibleOrder[newId] = visibleOrder;
+ delete this._branches[oldId];
+ },
+ _traverseBranches: function _traverseBranches(code, parent) {
+ if (!utils.defined(parent)) {
+ parent = this.$getRootId();
+ }
+
+ var branch = this._branches[parent];
+
+ if (branch) {
+ for (var i = 0; i < branch.length; i++) {
+ var itemId = branch[i];
+ code.call(this, itemId);
+ if (this._branches[itemId]) this._traverseBranches(code, itemId);
+ }
+ }
+ },
+ _updateOrder: function _updateOrder(code) {
+ this.fullOrder = powerArray.$create();
+
+ this._traverseBranches(function (taskId) {
+ this.fullOrder.push(taskId);
+ });
+
+ if (code) DataStore.prototype._updateOrder.call(this, code);
+ },
+ _removeItemInner: function _removeItemInner(id) {
+ var items = [];
+ this.eachItem(function (child) {
+ items.push(child);
+ }, id);
+ items.push(this.getItem(id));
+
+ for (var i = 0; i < items.length; i++) {
+ this._move_branch(items[i], this.getParent(items[i]), null);
+
+ DataStore.prototype._removeItemInner.call(this, items[i].id);
+
+ this._move_branch(items[i], this.getParent(items[i]), null);
+ }
+ },
+ move: function move(sid, tindex, parent) {
+ //target id as 4th parameter
+ var id = arguments[3];
+ var config = this._ganttConfig || {};
+ var root_id = config.root_id || 0;
+ id = replaceValidZeroId(id, root_id);
+
+ if (id) {
+ if (id === sid) return;
+ parent = this.getParent(id);
+ tindex = this.getBranchIndex(id);
+ }
+
+ if (sid == parent) {
+ return;
+ }
+
+ if (!utils.defined(parent)) {
+ parent = this.$getRootId();
+ }
+
+ var source = this.getItem(sid);
+ var source_pid = this.getParent(source.id);
+ var tbranch = this.getChildren(parent);
+ if (tindex == -1) tindex = tbranch.length + 1;
+
+ if (source_pid == parent) {
+ var sindex = this.getBranchIndex(sid);
+ if (sindex == tindex) return;
+ }
+
+ if (this.callEvent("onBeforeItemMove", [sid, parent, tindex]) === false) return false;
+ var placeholderIds = [];
+
+ for (var i = 0; i < tbranch.length; i++) {
+ if (isPlaceholderTask(tbranch[i], null, this, this._ganttConfig)) {
+ placeholderIds.push(tbranch[i]);
+ tbranch.splice(i, 1);
+ i--;
+ }
+ }
+
+ this._replace_branch_child(source_pid, sid);
+
+ tbranch = this.getChildren(parent);
+ var tid = tbranch[tindex];
+ tid = replaceValidZeroId(tid, root_id);
+ if (!tid) //adding as last element
+ tbranch.push(sid);else tbranch = tbranch.slice(0, tindex).concat([sid]).concat(tbranch.slice(tindex));
+
+ if (placeholderIds.length) {
+ tbranch = tbranch.concat(placeholderIds);
+ }
+
+ this.setParent(source, parent);
+ this._branches[parent] = tbranch;
+ var diff = this.calculateItemLevel(source) - source.$level;
+ source.$level += diff;
+ this.eachItem(function (item) {
+ item.$level += diff;
+ }, source.id, this);
+
+ this._moveInner(this.getIndexById(sid), this.getIndexById(parent) + tindex);
+
+ this.callEvent("onAfterItemMove", [sid, parent, tindex]);
+ this.refresh();
+ },
+ getBranchIndex: function getBranchIndex(id) {
+ var branch = this.getChildren(this.getParent(id));
+ var index = branch.indexOf(id + "");
+
+ if (index == -1) {
+ index = branch.indexOf(+id);
+ }
+
+ return index;
+ },
+ hasChild: function hasChild(id) {
+ var branch = this._branches[id];
+ return branch && branch.length;
+ },
+ getChildren: function getChildren(id) {
+ var branch = this._branches[id];
+ return branch ? branch : powerArray.$create();
+ },
+ isChildOf: function isChildOf(childId, parentId) {
+ if (!this.exists(childId)) return false;
+ if (parentId === this.$getRootId()) return true;
+ if (!this.hasChild(parentId)) return false;
+ var item = this.getItem(childId);
+ var pid = this.getParent(childId);
+ var parent = this.getItem(parentId);
+
+ if (parent.$level >= item.$level) {
+ return false;
+ }
+
+ while (item && this.exists(pid)) {
+ item = this.getItem(pid);
+ if (item && item.id == parentId) return true;
+ pid = this.getParent(item);
+ }
+
+ return false;
+ },
+ getSiblings: function getSiblings(id) {
+ if (!this.exists(id)) {
+ return powerArray.$create();
+ }
+
+ var parent = this.getParent(id);
+ return this.getChildren(parent);
+ },
+ getNextSibling: function getNextSibling(id) {
+ var siblings = this.getSiblings(id);
+
+ for (var i = 0, len = siblings.length; i < len; i++) {
+ if (siblings[i] == id) {
+ var nextSibling = siblings[i + 1];
+
+ if (nextSibling === 0 && i > 0) {
+ nextSibling = "0";
+ }
+
+ return nextSibling || null;
+ }
+ }
+
+ return null;
+ },
+ getPrevSibling: function getPrevSibling(id) {
+ var siblings = this.getSiblings(id);
+
+ for (var i = 0, len = siblings.length; i < len; i++) {
+ if (siblings[i] == id) {
+ var previousSibling = siblings[i - 1];
+
+ if (previousSibling === 0 && i > 0) {
+ previousSibling = "0";
+ }
+
+ return previousSibling || null;
+ }
+ }
+
+ return null;
+ },
+ getParent: function getParent(id) {
+ var item = null;
+
+ if (id.id !== undefined) {
+ item = id;
+ } else {
+ item = this.getItem(id);
+ }
+
+ var parent;
+
+ if (item) {
+ parent = item[this.$parentProperty];
+ } else {
+ parent = this.$getRootId();
+ }
+
+ return parent;
+ },
+ clearAll: function clearAll() {
+ this._branches = {};
+ DataStore.prototype.clearAll.call(this);
+ },
+ calculateItemLevel: function calculateItemLevel(item) {
+ var level = 0;
+ this.eachParent(function () {
+ level++;
+ }, item);
+ return level;
+ },
+ _setParentInner: function _setParentInner(item, new_pid, silent) {
+ if (!silent) {
+ if (item.hasOwnProperty("$rendered_parent")) {
+ this._move_branch(item, item.$rendered_parent, new_pid);
+ } else {
+ this._move_branch(item, item[this.$parentProperty], new_pid);
+ }
+ }
+ },
+ setParent: function setParent(item, new_pid, silent) {
+ this._setParentInner(item, new_pid, silent);
+
+ item[this.$parentProperty] = new_pid;
+ },
+ _eachItemCached: function _eachItemCached(code, cache) {
+ for (var i = 0, len = cache.length; i < len; i++) {
+ code.call(this, cache[i]);
+ }
+ },
+ _eachItemIterate: function _eachItemIterate(code, startId, cache) {
+ var itemsStack = this.getChildren(startId);
+
+ if (itemsStack.length) {
+ itemsStack = itemsStack.slice().reverse();
+ }
+
+ while (itemsStack.length) {
+ var itemId = itemsStack.pop();
+ var item = this.getItem(itemId);
+ code.call(this, item);
+
+ if (cache) {
+ cache.push(item);
+ }
+
+ if (this.hasChild(item.id)) {
+ var children = this.getChildren(item.id);
+ var len = children.length;
+
+ for (var i = len - 1; i >= 0; i--) {
+ itemsStack.push(children[i]);
+ }
+ }
+ }
+ },
+ eachItem: function eachItem(code, parent) {
+ var rootId = this.$getRootId();
+
+ if (!utils.defined(parent)) {
+ parent = rootId;
+ }
+
+ var startId = replaceValidZeroId(parent, rootId) || rootId;
+ var useCache = false;
+ var buildCache = false;
+ var cache = null;
+
+ if (startId === rootId) {
+ if (this._eachItemMainRangeCache) {
+ useCache = true;
+ cache = this._eachItemMainRangeCache;
+ } else {
+ buildCache = true;
+ cache = this._eachItemMainRangeCache = [];
+ }
+ }
+
+ if (useCache) {
+ this._eachItemCached(code, cache);
+ } else {
+ this._eachItemIterate(code, startId, buildCache ? cache : null);
+ }
+ },
+ eachParent: function eachParent(code, startItem) {
+ var parentsHash = {};
+ var item = startItem;
+ var parent = this.getParent(item);
+
+ while (this.exists(parent)) {
+ if (parentsHash[parent]) {
+ throw new Error("Invalid tasks tree. Cyclic reference has been detected on task " + parent);
+ }
+
+ parentsHash[parent] = true;
+ item = this.getItem(parent);
+ code.call(this, item);
+ parent = this.getParent(item);
+ }
+ },
+ _add_branch: function _add_branch(item, index, parent) {
+ var pid = parent === undefined ? this.getParent(item) : parent;
+ if (!this.hasChild(pid)) this._branches[pid] = powerArray.$create();
+ var branch = this.getChildren(pid);
+ var added_already = branch.indexOf(item.id + "") > -1 || branch.indexOf(+item.id) > -1;
+
+ if (!added_already) {
+ if (index * 1 == index) {
+ branch.splice(index, 0, item.id);
+ } else {
+ branch.push(item.id);
+ }
+
+ item.$rendered_parent = pid;
+ }
+ },
+ _move_branch: function _move_branch(item, old_parent, new_parent) {
+ this._eachItemMainRangeCache = null; //this.setParent(item, new_parent);
+ //this._sync_parent(task);
+
+ this._replace_branch_child(old_parent, item.id);
+
+ if (this.exists(new_parent) || new_parent == this.$getRootId()) {
+ this._add_branch(item, undefined, new_parent);
+ } else {
+ delete this._branches[item.id];
+ }
+
+ item.$level = this.calculateItemLevel(item);
+ this.eachItem(function (child) {
+ child.$level = this.calculateItemLevel(child);
+ }, item.id);
+ },
+ _replace_branch_child: function _replace_branch_child(node, old_id, new_id) {
+ var branch = this.getChildren(node);
+
+ if (branch && node !== undefined) {
+ var newbranch = powerArray.$create();
+ var index = branch.indexOf(old_id + "");
+
+ if (index == -1 && !isNaN(+old_id)) {
+ index = branch.indexOf(+old_id);
+ }
+
+ if (index > -1) {
+ if (new_id) {
+ branch.splice(index, 1, new_id);
+ } else {
+ branch.splice(index, 1);
+ }
+ }
+
+ newbranch = branch;
+ this._branches[node] = newbranch;
+ }
+ },
+ sort: function sort(field, desc, parent) {
+ if (!this.exists(parent)) {
+ parent = this.$getRootId();
+ }
+
+ if (!field) field = "order";
+ var criteria = typeof field == "string" ? function (a, b) {
+ if (a[field] == b[field] || helpers.isDate(a[field]) && helpers.isDate(b[field]) && a[field].valueOf() == b[field].valueOf()) {
+ return 0;
+ }
+
+ var result = a[field] > b[field];
+ return result ? 1 : -1;
+ } : field;
+
+ if (desc) {
+ var original_criteria = criteria;
+
+ criteria = function criteria(a, b) {
+ return original_criteria(b, a);
+ };
+ }
+
+ var els = this.getChildren(parent);
+
+ if (els) {
+ var temp = [];
+
+ for (var i = els.length - 1; i >= 0; i--) {
+ temp[i] = this.getItem(els[i]);
+ }
+
+ temp.sort(criteria);
+
+ for (var i = 0; i < temp.length; i++) {
+ els[i] = temp[i].id;
+ this.sort(field, desc, els[i]);
+ }
+ }
+ },
+ filter: function filter(rule) {
+ for (var i in this.pull) {
+ var renderedParent = this.pull[i].$rendered_parent;
+ var actualParent = this.getParent(this.pull[i]);
+
+ if (renderedParent !== actualParent) {
+ this._move_branch(this.pull[i], renderedParent, actualParent);
+ }
+ }
+
+ return DataStore.prototype.filter.apply(this, arguments);
+ },
+ open: function open(id) {
+ if (this.exists(id)) {
+ this.getItem(id).$open = true; // GS-2170. Do not recalculate the indexes and dates as they will be recalculated later
+
+ this._skipTaskRecalculation = true;
+ this.callEvent("onItemOpen", [id]);
+ }
+ },
+ close: function close(id) {
+ if (this.exists(id)) {
+ this.getItem(id).$open = false; // GS-2170. Do not recalculate the indexes and dates as they will be recalculated later
+
+ this._skipTaskRecalculation = true;
+ this.callEvent("onItemClose", [id]);
+ }
+ },
+ destructor: function destructor() {
+ DataStore.prototype.destructor.call(this);
+ this._branches = null;
+ this._indexRangeCache = {};
+ this._eachItemMainRangeCache = null;
+ }
+}, DataStore.prototype);
+module.exports = TreeDataStore;
+
+/***/ }),
+
+/***/ "./sources/core/destructor.js":
+/*!************************************!*\
+ !*** ./sources/core/destructor.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function extend(gantt) {
+ gantt.destructor = function () {
+ this.clearAll();
+ this.callEvent("onDestroy", []);
+
+ if (this.$root) {
+ delete this.$root.gantt;
+ }
+
+ if (this._eventRemoveAll) {
+ this._eventRemoveAll();
+ }
+
+ if (this.$layout) {
+ this.$layout.destructor();
+ }
+
+ if (this.resetLightbox) {
+ this.resetLightbox();
+ }
+
+ if (this._dp && this._dp.destructor) {
+ this._dp.destructor();
+ }
+
+ this.$services.destructor(); // detachAllEvents should be called last, because in components may be attached events
+
+ this.detachAllEvents();
+
+ for (var i in this) {
+ if (i.indexOf("$") === 0) {
+ delete this[i];
+ }
+ }
+
+ this.$destroyed = true;
+ };
+}
+
+module.exports = extend;
+
+/***/ }),
+
+/***/ "./sources/core/dynamic_loading.js":
+/*!*****************************************!*\
+ !*** ./sources/core/dynamic_loading.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var TreeDataStore = __webpack_require__(/*! ./datastore/treedatastore */ "./sources/core/datastore/treedatastore.js");
+
+ var loadedBranches = {};
+ gantt.attachEvent("onClearAll", function () {
+ loadedBranches = {};
+ });
+ var oldHasChildren = TreeDataStore.prototype.hasChild;
+
+ gantt.$data.tasksStore.hasChild = function (id) {
+ if (!gantt.config.branch_loading) {
+ return oldHasChildren.call(this, id);
+ } else {
+ if (oldHasChildren.call(this, id)) return true;
+
+ if (this.exists(id)) {
+ return this.getItem(id)[gantt.config.branch_loading_property];
+ }
+ }
+
+ return false;
+ };
+
+ function needLoading(id) {
+ if (gantt.config.branch_loading && gantt._load_url) {
+ var alreadyLoaded = !!loadedBranches[id]; // call ajax only if branch has children
+
+ if (!alreadyLoaded && !gantt.getChildren(id).length && gantt.hasChild(id)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ gantt.attachEvent("onTaskOpened", function (id) {
+ if (gantt.config.branch_loading && gantt._load_url) {
+ // call ajax only if branch has children
+ if (needLoading(id)) {
+ var url = gantt._load_url;
+ url = url.replace(/(\?|&)?parent_id=.+&?/, "");
+ var param = url.indexOf("?") >= 0 ? "&" : "?";
+ var y = gantt.getScrollState().y || 0;
+ var requestData = {
+ taskId: id,
+ url: url + param + "parent_id=" + encodeURIComponent(id)
+ };
+
+ if (gantt.callEvent("onBeforeBranchLoading", [requestData]) === false) {
+ return;
+ }
+
+ gantt.load(requestData.url, this._load_type, function () {
+ if (y) {
+ gantt.scrollTo(null, y);
+ }
+
+ gantt.callEvent("onAfterBranchLoading", [requestData]);
+ });
+ loadedBranches[id] = true;
+ }
+ }
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/facades/datastore.js":
+/*!*******************************************!*\
+ !*** ./sources/core/facades/datastore.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var createTasksFacade = __webpack_require__(/*! ./datastore_tasks */ "./sources/core/facades/datastore_tasks.js"),
+ createLinksFacade = __webpack_require__(/*! ./datastore_links */ "./sources/core/facades/datastore_links.js"),
+ DataStore = __webpack_require__(/*! ../datastore/datastore */ "./sources/core/datastore/datastore.js"),
+ TreeDataStore = __webpack_require__(/*! ../datastore/treedatastore */ "./sources/core/datastore/treedatastore.js"),
+ createDatastoreSelect = __webpack_require__(/*! ../datastore/select */ "./sources/core/datastore/select.js");
+
+var datastoreRender = __webpack_require__(/*! ../datastore/datastore_render */ "./sources/core/datastore/datastore_render.js");
+
+var isHeadless = __webpack_require__(/*! ../../utils/is_headless */ "./sources/utils/is_headless.js");
+
+var _require = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js"),
+ replaceValidZeroId = _require.replaceValidZeroId; // TODO: remove workaround for mixup with es5 and ts imports
+
+
+if (DataStore["default"]) {
+ DataStore = DataStore["default"];
+}
+
+function getDatastores() {
+ var storeNames = this.$services.getService("datastores");
+ var res = [];
+
+ for (var i = 0; i < storeNames.length; i++) {
+ var store = this.getDatastore(storeNames[i]);
+
+ if (!store.$destroyed) {
+ res.push(store);
+ }
+ }
+
+ return res;
+}
+
+var createDatastoreFacade = function createDatastoreFacade() {
+ return {
+ createDatastore: function createDatastore(config) {
+ var $StoreType = (config.type || "").toLowerCase() == "treedatastore" ? TreeDataStore : DataStore;
+
+ if (config) {
+ var self = this;
+
+ config.openInitially = function () {
+ return self.config.open_tree_initially;
+ };
+
+ config.copyOnParse = function () {
+ return self.config.deepcopy_on_parse;
+ };
+ }
+
+ var store = new $StoreType(config);
+ this.mixin(store, createDatastoreSelect(store));
+
+ if (config.name) {
+ var servicePrefix = "datastore:";
+ var storeAccessName = servicePrefix + config.name;
+ store.attachEvent("onDestroy", function () {
+ this.$services.dropService(storeAccessName);
+ var storeList = this.$services.getService("datastores");
+
+ for (var i = 0; i < storeList.length; i++) {
+ if (storeList[i] === config.name) {
+ storeList.splice(i, 1);
+ break;
+ }
+ }
+ }.bind(this));
+ this.$services.dropService(storeAccessName);
+ this.$services.setService(storeAccessName, function () {
+ return store;
+ });
+ var storeList = this.$services.getService("datastores");
+
+ if (!storeList) {
+ storeList = [];
+ this.$services.setService("datastores", function () {
+ return storeList;
+ });
+ storeList.push(config.name);
+ } else if (storeList.indexOf(config.name) < 0) {
+ storeList.push(config.name);
+ }
+
+ datastoreRender.bindDataStore(config.name, this);
+ }
+
+ return store;
+ },
+ getDatastore: function getDatastore(name) {
+ return this.$services.getService("datastore:" + name);
+ },
+ _getDatastores: getDatastores,
+ refreshData: function refreshData() {
+ var scrollState;
+
+ if (!isHeadless(this)) {
+ scrollState = this.getScrollState();
+ }
+
+ this.callEvent("onBeforeDataRender", []);
+ var stores = getDatastores.call(this);
+
+ for (var i = 0; i < stores.length; i++) {
+ stores[i].refresh();
+ }
+
+ if (this.config.preserve_scroll && !isHeadless(this) && (scrollState.x || scrollState.y)) {
+ this.scrollTo(scrollState.x, scrollState.y);
+ }
+
+ this.callEvent("onDataRender", []);
+ },
+ isChildOf: function isChildOf(childId, parentId) {
+ return this.$data.tasksStore.isChildOf(childId, parentId);
+ },
+ refreshTask: function refreshTask(taskId, refresh_links) {
+ var task = this.getTask(taskId);
+ var self = this;
+
+ function refreshLinks() {
+ if (refresh_links !== undefined && !refresh_links) return;
+
+ for (var i = 0; i < task.$source.length; i++) {
+ self.refreshLink(task.$source[i]);
+ }
+
+ for (var i = 0; i < task.$target.length; i++) {
+ self.refreshLink(task.$target[i]);
+ }
+ }
+
+ if (task && this.isTaskVisible(taskId)) {
+ this.$data.tasksStore.refresh(taskId, !!this.getState("tasksDnd").drag_id || refresh_links === false); // do quick refresh during drag and drop
+
+ refreshLinks();
+ } else if (this.isTaskExists(taskId) && this.isTaskExists(this.getParent(taskId)) && !this._bulk_dnd) {
+ this.refreshTask(this.getParent(taskId));
+ var hasSplitParent = false;
+ this.eachParent(function (parent) {
+ if (hasSplitParent || this.isSplitTask(parent)) {
+ hasSplitParent = true;
+ }
+ }, taskId);
+
+ if (hasSplitParent) {
+ refreshLinks();
+ }
+ }
+ },
+ refreshLink: function refreshLink(linkId) {
+ this.$data.linksStore.refresh(linkId, !!this.getState("tasksDnd").drag_id); // do quick refresh during drag and drop
+ },
+ silent: function silent(code) {
+ var gantt = this;
+ gantt.$data.tasksStore.silent(function () {
+ gantt.$data.linksStore.silent(function () {
+ code();
+ });
+ });
+ },
+ clearAll: function clearAll() {
+ var stores = getDatastores.call(this); // clear all stores without invoking clearAll event
+ // in order to prevent calling handlers when only some stores are cleared
+
+ for (var i = 0; i < stores.length; i++) {
+ stores[i].silent(function () {
+ stores[i].clearAll();
+ });
+ } // run clearAll again to invoke events
+
+
+ for (var i = 0; i < stores.length; i++) {
+ stores[i].clearAll();
+ }
+
+ this._update_flags();
+
+ this.userdata = {};
+ this.callEvent("onClear", []);
+ this.render();
+ },
+ _clear_data: function _clear_data() {
+ this.$data.tasksStore.clearAll();
+ this.$data.linksStore.clearAll();
+
+ this._update_flags();
+
+ this.userdata = {};
+ },
+ selectTask: function selectTask(id) {
+ var store = this.$data.tasksStore;
+ if (!this.config.select_task) return false;
+ id = replaceValidZeroId(id, this.config.root_id);
+
+ if (id) {
+ var oldSelectId = this.getSelectedId(); // Don't repaint the resource panel as the data didn't change
+
+ store._skipResourceRepaint = true;
+ store.select(id);
+ store._skipResourceRepaint = false; // GS-730. Split task is not included in the tree,
+ // so the datastore renderer will think that the task is not visible
+
+ if (oldSelectId && store.pull[oldSelectId].$split_subtask && oldSelectId != id) {
+ this.refreshTask(oldSelectId);
+ }
+
+ if (store.pull[id].$split_subtask && oldSelectId != id) {
+ // GS-1850. Do not repaint split task after double click
+ this.refreshTask(id);
+ }
+ }
+
+ return store.getSelectedId();
+ },
+ unselectTask: function unselectTask(id) {
+ var store = this.$data.tasksStore;
+ store.unselect(id); // GS-730. Split task is not included in the tree,
+ // so the datastore renderer will think that the task is not visible
+
+ if (id && store.pull[id].$split_subtask) {
+ this.refreshTask(id);
+ }
+ },
+ isSelectedTask: function isSelectedTask(id) {
+ return this.$data.tasksStore.isSelected(id);
+ },
+ getSelectedId: function getSelectedId() {
+ return this.$data.tasksStore.getSelectedId();
+ }
+ };
+};
+
+function createFacade() {
+ var res = utils.mixin({}, createDatastoreFacade());
+ utils.mixin(res, createTasksFacade());
+ utils.mixin(res, createLinksFacade());
+ return res;
+}
+
+module.exports = {
+ create: createFacade
+};
+
+/***/ }),
+
+/***/ "./sources/core/facades/datastore_links.js":
+/*!*************************************************!*\
+ !*** ./sources/core/facades/datastore_links.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var createLinksStoreFacade = function createLinksStoreFacade() {
+ return {
+ getLinkCount: function getLinkCount() {
+ return this.$data.linksStore.count();
+ },
+ getLink: function getLink(id) {
+ return this.$data.linksStore.getItem(id);
+ },
+ getLinks: function getLinks() {
+ return this.$data.linksStore.getItems();
+ },
+ isLinkExists: function isLinkExists(id) {
+ return this.$data.linksStore.exists(id);
+ },
+ addLink: function addLink(link) {
+ var newLink = this.$data.linksStore.addItem(link); // GS-1222. Update fullOrder otherwise the link won't appear after render
+
+ if (this.$data.linksStore.isSilent()) {
+ this.$data.linksStore.fullOrder.push(newLink);
+ }
+
+ return newLink;
+ },
+ updateLink: function updateLink(id, data) {
+ if (!utils.defined(data)) data = this.getLink(id);
+ this.$data.linksStore.updateItem(id, data);
+ },
+ deleteLink: function deleteLink(id) {
+ return this.$data.linksStore.removeItem(id);
+ },
+ changeLinkId: function changeLinkId(oldid, newid) {
+ return this.$data.linksStore.changeId(oldid, newid);
+ }
+ };
+};
+
+module.exports = createLinksStoreFacade;
+
+/***/ }),
+
+/***/ "./sources/core/facades/datastore_tasks.js":
+/*!*************************************************!*\
+ !*** ./sources/core/facades/datastore_tasks.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var _require = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js"),
+ replaceValidZeroId = _require.replaceValidZeroId;
+
+var createTasksDatastoreFacade = function createTasksDatastoreFacade() {
+ return {
+ getTask: function getTask(id) {
+ id = replaceValidZeroId(id, this.config.root_id);
+ this.assert(id, "Invalid argument for gantt.getTask");
+ var task = this.$data.tasksStore.getItem(id);
+ this.assert(task, "Task not found id=" + id);
+ return task;
+ },
+ getTaskByTime: function getTaskByTime(from, to) {
+ var p = this.$data.tasksStore.getItems();
+ var res = [];
+
+ if (!(from || to)) {
+ res = p;
+ } else {
+ from = +from || -Infinity;
+ to = +to || Infinity;
+
+ for (var t = 0; t < p.length; t++) {
+ var task = p[t];
+ if (+task.start_date < to && +task.end_date > from) res.push(task);
+ }
+ }
+
+ return res;
+ },
+ isTaskExists: function isTaskExists(id) {
+ if (!this.$data || !this.$data.tasksStore) {
+ return false;
+ }
+
+ return this.$data.tasksStore.exists(id);
+ },
+ updateTask: function updateTask(id, item) {
+ if (!utils.defined(item)) item = this.getTask(id);
+ this.$data.tasksStore.updateItem(id, item);
+ if (this.isTaskExists(id)) this.refreshTask(id);
+ },
+ addTask: function addTask(item, parent, index) {
+ if (!utils.defined(item.id)) item.id = utils.uid(); //GS-761: assert unique ID
+
+ if (this.isTaskExists(item.id)) {
+ var task = this.getTask(item.id);
+
+ if (task.$index != item.$index) {
+ // Someone may try to mistakenly add a task with the same ID, and most likely
+ // use the string format for the dates. Gantt shouldn't break in this scenario
+ if (item.start_date && typeof item.start_date === "string") {
+ item.start_date = this.date.parseDate(item.start_date, "parse_date");
+ }
+
+ if (item.end_date && typeof item.end_date === "string") {
+ item.end_date = this.date.parseDate(item.end_date, "parse_date");
+ }
+
+ return this.$data.tasksStore.updateItem(item.id, item);
+ }
+ }
+
+ if (!utils.defined(parent)) parent = this.getParent(item) || 0;
+ if (!this.isTaskExists(parent)) parent = this.config.root_id;
+ this.setParent(item, parent);
+ return this.$data.tasksStore.addItem(item, index, parent);
+ },
+ deleteTask: function deleteTask(id) {
+ id = replaceValidZeroId(id, this.config.root_id);
+ return this.$data.tasksStore.removeItem(id);
+ },
+ getTaskCount: function getTaskCount() {
+ return this.$data.tasksStore.count();
+ },
+ getVisibleTaskCount: function getVisibleTaskCount() {
+ return this.$data.tasksStore.countVisible();
+ },
+ getTaskIndex: function getTaskIndex(id) {
+ return this.$data.tasksStore.getBranchIndex(id);
+ },
+ getGlobalTaskIndex: function getGlobalTaskIndex(id) {
+ id = replaceValidZeroId(id, this.config.root_id);
+ this.assert(id, "Invalid argument");
+ return this.$data.tasksStore.getIndexById(id);
+ },
+ eachTask: function eachTask(code, parent, master) {
+ return this.$data.tasksStore.eachItem(utils.bind(code, master || this), parent);
+ },
+ eachParent: function eachParent(callback, startTask, master) {
+ return this.$data.tasksStore.eachParent(utils.bind(callback, master || this), startTask);
+ },
+ changeTaskId: function changeTaskId(oldid, newid) {
+ this.$data.tasksStore.changeId(oldid, newid);
+ var task = this.$data.tasksStore.getItem(newid);
+ var links = [];
+
+ if (task.$source) {
+ links = links.concat(task.$source);
+ }
+
+ if (task.$target) {
+ links = links.concat(task.$target);
+ }
+
+ for (var i = 0; i < links.length; i++) {
+ var link = this.getLink(links[i]);
+
+ if (link.source == oldid) {
+ link.source = newid;
+ }
+
+ if (link.target == oldid) {
+ link.target = newid;
+ }
+ }
+ },
+ calculateTaskLevel: function calculateTaskLevel(item) {
+ return this.$data.tasksStore.calculateItemLevel(item);
+ },
+ getNext: function getNext(id) {
+ return this.$data.tasksStore.getNext(id);
+ },
+ getPrev: function getPrev(id) {
+ return this.$data.tasksStore.getPrev(id);
+ },
+ getParent: function getParent(id) {
+ return this.$data.tasksStore.getParent(id);
+ },
+ setParent: function setParent(task, new_pid, silent) {
+ return this.$data.tasksStore.setParent(task, new_pid, silent);
+ },
+ getSiblings: function getSiblings(id) {
+ return this.$data.tasksStore.getSiblings(id).slice();
+ },
+ getNextSibling: function getNextSibling(id) {
+ return this.$data.tasksStore.getNextSibling(id);
+ },
+ getPrevSibling: function getPrevSibling(id) {
+ return this.$data.tasksStore.getPrevSibling(id);
+ },
+ getTaskByIndex: function getTaskByIndex(index) {
+ var id = this.$data.tasksStore.getIdByIndex(index);
+
+ if (this.isTaskExists(id)) {
+ return this.getTask(id);
+ } else {
+ return null;
+ }
+ },
+ getChildren: function getChildren(id) {
+ if (!this.hasChild(id)) {
+ return [];
+ } else {
+ return this.$data.tasksStore.getChildren(id).slice();
+ }
+ },
+ hasChild: function hasChild(id) {
+ return this.$data.tasksStore.hasChild(id);
+ },
+ open: function open(id) {
+ this.$data.tasksStore.open(id);
+ },
+ close: function close(id) {
+ this.$data.tasksStore.close(id);
+ },
+ moveTask: function moveTask(sid, tindex, parent) {
+ parent = replaceValidZeroId(parent, this.config.root_id);
+ return this.$data.tasksStore.move.apply(this.$data.tasksStore, arguments);
+ },
+ sort: function sort(field, desc, parent, silent) {
+ var render = !silent; //4th argument to cancel redraw after sorting
+
+ this.$data.tasksStore.sort(field, desc, parent);
+ this.callEvent("onAfterSort", [field, desc, parent]);
+
+ if (render) {
+ this.render();
+ }
+ }
+ };
+};
+
+module.exports = createTasksDatastoreFacade;
+
+/***/ }),
+
+/***/ "./sources/core/facades/layout.js":
+/*!****************************************!*\
+ !*** ./sources/core/facades/layout.js ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function createLayoutFacade() {
+ function getTimeline(gantt) {
+ return gantt.$ui.getView("timeline");
+ }
+
+ function getGrid(gantt) {
+ return gantt.$ui.getView("grid");
+ }
+
+ function getBaseCell(gantt) {
+ var timeline = getTimeline(gantt);
+
+ if (timeline && !timeline.$config.hidden) {
+ return timeline;
+ } else {
+ var grid = getGrid(gantt);
+
+ if (grid && !grid.$config.hidden) {
+ return grid;
+ } else {
+ return null;
+ }
+ }
+ }
+
+ function getVerticalScrollbar(gantt) {
+ var baseCell = null; // GS-1150: if we reorder or resize something in the grid, we should obtain the grid container
+
+ var gridDrag = false;
+ var gridMarkers = [".gantt_drag_marker.gantt_grid_resize_area", ".gantt_drag_marker .gantt_row.gantt_row_task", ".gantt_drag_marker.gantt_grid_dnd_marker"];
+ gridMarkers.forEach(function (selector) {
+ gridDrag = gridDrag || !!document.querySelector(selector);
+ });
+
+ if (gridDrag) {
+ baseCell = getGrid(gantt);
+ } else {
+ baseCell = getBaseCell(gantt);
+ } // GS-1827. If there is no grid and timeline, there is no scrollbar for them
+
+
+ if (!baseCell) {
+ return null;
+ }
+
+ var verticalScrollbar = getAttachedScrollbar(gantt, baseCell, "scrollY");
+ return verticalScrollbar;
+ }
+
+ function getHorizontalScrollbar(gantt) {
+ var baseCell = getBaseCell(gantt);
+
+ if (!baseCell || baseCell.id == "grid") {
+ return null; // if the timeline is not displayed, do not return the scrollbar
+ }
+
+ var horizontalScrollbar = getAttachedScrollbar(gantt, baseCell, "scrollX");
+ return horizontalScrollbar;
+ }
+
+ function getAttachedScrollbar(gantt, cell, type) {
+ var attachedScrollbar = cell.$config[type];
+ var scrollbarView = gantt.$ui.getView(attachedScrollbar);
+ return scrollbarView;
+ }
+
+ var DEFAULT_VALUE = "DEFAULT_VALUE";
+
+ function tryCall(getView, method, args, fallback) {
+ var view = getView(this);
+
+ if (!(view && view.isVisible())) {
+ if (fallback) {
+ return fallback();
+ } else {
+ return DEFAULT_VALUE;
+ }
+ } else {
+ return view[method].apply(view, args);
+ }
+ }
+
+ return {
+ getColumnIndex: function getColumnIndex(name) {
+ var res = tryCall.call(this, getGrid, "getColumnIndex", [name]);
+
+ if (res === DEFAULT_VALUE) {
+ return 0;
+ } else {
+ return res;
+ }
+ },
+ dateFromPos: function dateFromPos(x) {
+ var res = tryCall.call(this, getTimeline, "dateFromPos", Array.prototype.slice.call(arguments));
+
+ if (res === DEFAULT_VALUE) {
+ return this.getState().min_date;
+ } else {
+ return res;
+ }
+ },
+ posFromDate: function posFromDate(date) {
+ var res = tryCall.call(this, getTimeline, "posFromDate", [date]);
+
+ if (res === DEFAULT_VALUE) {
+ return 0;
+ } else {
+ return res;
+ }
+ },
+ getRowTop: function getRowTop(index) {
+ var self = this;
+ var res = tryCall.call(self, getTimeline, "getRowTop", [index], function () {
+ return tryCall.call(self, getGrid, "getRowTop", [index]);
+ });
+
+ if (res === DEFAULT_VALUE) {
+ return 0;
+ } else {
+ return res;
+ }
+ },
+ getTaskTop: function getTaskTop(id) {
+ var self = this;
+ var res = tryCall.call(self, getTimeline, "getItemTop", [id], function () {
+ return tryCall.call(self, getGrid, "getItemTop", [id]);
+ });
+
+ if (res === DEFAULT_VALUE) {
+ return 0;
+ } else {
+ return res;
+ }
+ },
+ getTaskPosition: function getTaskPosition(task, start_date, end_date) {
+ var res = tryCall.call(this, getTimeline, "getItemPosition", [task, start_date, end_date]);
+
+ if (res === DEFAULT_VALUE) {
+ var top = this.getTaskTop(task.id);
+ var height = this.getTaskBarHeight(task.id);
+ return {
+ left: 0,
+ top: top,
+ height: height,
+ width: 0
+ };
+ } else {
+ return res;
+ }
+ },
+ getTaskBarHeight: function getTaskBarHeight(taskId, isMilestoneRender) {
+ var self = this;
+ var res = tryCall.call(self, getTimeline, "getBarHeight", [taskId, isMilestoneRender], function () {
+ return tryCall.call(self, getGrid, "getItemHeight", [taskId]);
+ });
+
+ if (res === DEFAULT_VALUE) {
+ return 0;
+ } else {
+ return res;
+ }
+ },
+ getTaskHeight: function getTaskHeight(taskId) {
+ var self = this;
+ var res = tryCall.call(self, getTimeline, "getItemHeight", [taskId], function () {
+ return tryCall.call(self, getGrid, "getItemHeight", [taskId]);
+ });
+
+ if (res === DEFAULT_VALUE) {
+ return 0;
+ } else {
+ return res;
+ }
+ },
+ columnIndexByDate: function columnIndexByDate(date) {
+ var res = tryCall.call(this, getTimeline, "columnIndexByDate", [date]);
+
+ if (res === DEFAULT_VALUE) {
+ return 0;
+ } else {
+ return res;
+ }
+ },
+ roundTaskDates: function roundTaskDates() {
+ tryCall.call(this, getTimeline, "roundTaskDates", []);
+ },
+ getScale: function getScale() {
+ var res = tryCall.call(this, getTimeline, "getScale", []);
+
+ if (res === DEFAULT_VALUE) {
+ return null;
+ } else {
+ return res;
+ }
+ },
+ getTaskNode: function getTaskNode(id) {
+ var timeline = getTimeline(this);
+
+ if (!timeline || !timeline.isVisible()) {
+ return null;
+ } else {
+ var node = timeline._taskRenderer.rendered[id];
+
+ if (!node) {
+ var domAttr = timeline.$config.item_attribute;
+ node = timeline.$task_bars.querySelector("[" + domAttr + "='" + id + "']");
+ }
+
+ return node || null;
+ }
+ },
+ getLinkNode: function getLinkNode(id) {
+ var timeline = getTimeline(this);
+
+ if (!timeline.isVisible()) {
+ return null;
+ } else {
+ return timeline._linkRenderer.rendered[id];
+ }
+ },
+ scrollTo: function scrollTo(left, top) {
+ var vertical = getVerticalScrollbar(this);
+ var horizontal = getHorizontalScrollbar(this);
+ var oldH = {
+ position: 0
+ },
+ oldV = {
+ position: 0
+ };
+
+ if (vertical) {
+ oldV = vertical.getScrollState();
+ }
+
+ if (horizontal) {
+ oldH = horizontal.getScrollState();
+ }
+
+ var scrollHorizontal = horizontal && left * 1 == left;
+ var scrollVertical = vertical && top * 1 == top;
+ var scrollBoth = scrollHorizontal && scrollVertical;
+
+ if (scrollBoth) {
+ // some views will be scrolled both horizontally and vertically and smart rendering can be called twice
+ // set flag in order not to invoke smart rendering at the horizontal scroll stage
+ // so it will repaint only once when the scroll is completed
+ var verticalViews = vertical._getLinkedViews();
+
+ var horizontalViews = horizontal._getLinkedViews();
+
+ var commonViews = [];
+
+ for (var i = 0; i < verticalViews.length; i++) {
+ for (var j = 0; j < horizontalViews.length; j++) {
+ if (verticalViews[i].$config.id && horizontalViews[j].$config.id && verticalViews[i].$config.id === horizontalViews[j].$config.id) {
+ commonViews.push(verticalViews[i].$config.id);
+ }
+ }
+ }
+ }
+
+ if (scrollHorizontal) {
+ if (commonViews) {
+ commonViews.forEach(function (viewId) {
+ this.$ui.getView(viewId).$config.$skipSmartRenderOnScroll = true;
+ }.bind(this));
+ }
+
+ horizontal.scroll(left);
+
+ if (commonViews) {
+ commonViews.forEach(function (viewId) {
+ this.$ui.getView(viewId).$config.$skipSmartRenderOnScroll = false;
+ }.bind(this));
+ }
+ }
+
+ if (scrollVertical) {
+ vertical.scroll(top);
+ }
+
+ var newV = {
+ position: 0
+ },
+ newH = {
+ position: 0
+ };
+
+ if (vertical) {
+ newV = vertical.getScrollState();
+ }
+
+ if (horizontal) {
+ newH = horizontal.getScrollState();
+ }
+
+ this.callEvent("onGanttScroll", [oldH.position, oldV.position, newH.position, newV.position]);
+ },
+ showDate: function showDate(date) {
+ var date_x = this.posFromDate(date);
+ var scroll_to = Math.max(date_x - this.config.task_scroll_offset, 0);
+ this.scrollTo(scroll_to);
+ },
+ showTask: function showTask(id) {
+ var pos = this.getTaskPosition(this.getTask(id)); // GS-1261: we need to show the start_date even in the RTL mode
+
+ var leftPos = pos.left;
+ if (this.config.rtl) leftPos = pos.left + pos.width;
+ var left = Math.max(leftPos - this.config.task_scroll_offset, 0);
+
+ var dataHeight = this._scroll_state().y;
+
+ var top;
+
+ if (!dataHeight) {
+ top = pos.top;
+ } else {
+ top = pos.top - (dataHeight - this.getTaskBarHeight(id)) / 2;
+ }
+
+ this.scrollTo(left, top); // GS-1150: if the grid and timeline have different scrollbars, we need to scroll thegrid to show the task
+
+ var gridCell = getGrid(this);
+ var timelineCell = getTimeline(this);
+
+ if (gridCell && timelineCell && gridCell.$config.scrollY != timelineCell.$config.scrollY) {
+ var gridScrollbar = getAttachedScrollbar(this, gridCell, "scrollY");
+ gridScrollbar.scrollTo(null, top);
+ }
+ },
+ _scroll_state: function _scroll_state() {
+ var result = {
+ x: false,
+ y: false,
+ x_pos: 0,
+ y_pos: 0,
+ scroll_size: this.config.scroll_size + 1,
+ //1px for inner content
+ x_inner: 0,
+ y_inner: 0
+ };
+ var scrollVer = getVerticalScrollbar(this),
+ scrollHor = getHorizontalScrollbar(this);
+
+ if (scrollHor) {
+ var horState = scrollHor.getScrollState();
+
+ if (horState.visible) {
+ result.x = horState.size;
+ result.x_inner = horState.scrollSize;
+ }
+
+ result.x_pos = horState.position || 0;
+ }
+
+ if (scrollVer) {
+ var verState = scrollVer.getScrollState();
+
+ if (verState.visible) {
+ result.y = verState.size;
+ result.y_inner = verState.scrollSize;
+ }
+
+ result.y_pos = verState.position || 0;
+ }
+
+ return result;
+ },
+ getScrollState: function getScrollState() {
+ var state = this._scroll_state();
+
+ return {
+ x: state.x_pos,
+ y: state.y_pos,
+ inner_width: state.x,
+ inner_height: state.y,
+ width: state.x_inner,
+ height: state.y_inner
+ };
+ },
+ getLayoutView: function getLayoutView(cellName) {
+ return this.$ui.getView(cellName);
+ },
+ scrollLayoutCell: function scrollLayoutCell(cellName, left, top) {
+ var cell = this.$ui.getView(cellName);
+
+ if (!cell) {
+ return false;
+ }
+
+ if (left !== null) {
+ var horizontalScroll = this.$ui.getView(cell.$config.scrollX);
+
+ if (horizontalScroll) {
+ horizontalScroll.scrollTo(left, null);
+ }
+ }
+
+ if (top !== null) {
+ var verticalScroll = this.$ui.getView(cell.$config.scrollY);
+
+ if (verticalScroll) {
+ verticalScroll.scrollTo(null, top);
+ }
+ }
+ }
+ };
+}
+
+module.exports = createLayoutFacade;
+
+/***/ }),
+
+/***/ "./sources/core/facades/worktime_calendars.js":
+/*!****************************************************!*\
+ !*** ./sources/core/facades/worktime_calendars.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// TODO: rework public api for date methods
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var createWorkTimeFacade = function createWorkTimeFacade(calendarManager, timeCalculator) {
+ return {
+ getWorkHours: function getWorkHours(date) {
+ return timeCalculator.getWorkHours(date);
+ },
+ setWorkTime: function setWorkTime(config) {
+ return timeCalculator.setWorkTime(config);
+ },
+ unsetWorkTime: function unsetWorkTime(config) {
+ timeCalculator.unsetWorkTime(config);
+ },
+ isWorkTime: function isWorkTime(date, unit, task) {
+ return timeCalculator.isWorkTime(date, unit, task);
+ },
+ getClosestWorkTime: function getClosestWorkTime(config) {
+ return timeCalculator.getClosestWorkTime(config);
+ },
+ calculateDuration: function calculateDuration(start_date, end_date, task) {
+ return timeCalculator.calculateDuration(start_date, end_date, task);
+ },
+ _hasDuration: function _hasDuration(start_date, end_date, task) {
+ return timeCalculator.hasDuration(start_date, end_date, task);
+ },
+ calculateEndDate: function calculateEndDate(start, duration, unit, task) {
+ return timeCalculator.calculateEndDate(start, duration, unit, task);
+ },
+ mergeCalendars: utils.bind(calendarManager.mergeCalendars, calendarManager),
+ createCalendar: utils.bind(calendarManager.createCalendar, calendarManager),
+ addCalendar: utils.bind(calendarManager.addCalendar, calendarManager),
+ getCalendar: utils.bind(calendarManager.getCalendar, calendarManager),
+ getCalendars: utils.bind(calendarManager.getCalendars, calendarManager),
+ getResourceCalendar: utils.bind(calendarManager.getResourceCalendar, calendarManager),
+ getTaskCalendar: utils.bind(calendarManager.getTaskCalendar, calendarManager),
+ deleteCalendar: utils.bind(calendarManager.deleteCalendar, calendarManager)
+ };
+};
+
+module.exports = {
+ create: createWorkTimeFacade
+};
+
+/***/ }),
+
+/***/ "./sources/core/gantt_core.js":
+/*!************************************!*\
+ !*** ./sources/core/gantt_core.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var domHelpers = __webpack_require__(/*! ./ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js"),
+ helpers = __webpack_require__(/*! ../utils/helpers */ "./sources/utils/helpers.js");
+
+var isHeadless = __webpack_require__(/*! ../utils/is_headless */ "./sources/utils/is_headless.js");
+
+var addResizeListener = __webpack_require__(/*! ./ui/resize_listener */ "./sources/core/ui/resize_listener.js");
+
+module.exports = function (gantt) {
+ var calculateScaleRange = __webpack_require__(/*! ./gantt_data_range */ "./sources/core/gantt_data_range.js");
+
+ gantt.assert = __webpack_require__(/*! ./common/assert */ "./sources/core/common/assert.js")(gantt);
+
+ function isHTMLElement(node) {
+ try {
+ node.cloneNode(false);
+ } catch (e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ var invalidContainerMessage = "Invalid value of the first argument of `gantt.init`. Supported values: HTMLElement, String (element id)." + "This error means that either invalid object is passed into `gantt.init` or that the element with the specified ID doesn't exist on the page when `gantt.init` is called.";
+
+ function validateNode(node) {
+ if (!node || typeof node == 'string' && document.getElementById(node)) return true;
+ if (isHTMLElement(node)) return true;
+ gantt.assert(false, invalidContainerMessage);
+ throw new Error(invalidContainerMessage);
+ } //initial initialization
+
+
+ gantt.init = function (node, from, to) {
+ if (gantt.env.isNode) {
+ node = null; // for the nodejs version
+ } else {
+ validateNode(node); // for the web version
+ }
+
+ if (from && to) {
+ this.config.start_date = this._min_date = new Date(from);
+ this.config.end_date = this._max_date = new Date(to);
+ }
+
+ this.date.init(); //can be called only once
+
+ this.init = function (node) {
+ if (gantt.env.isNode) {
+ node = null; // for the nodejs version
+ } else {
+ validateNode(node); // for the web version
+ }
+
+ if (this.$container && this.$container.parentNode) {
+ this.$container.parentNode.removeChild(this.$container);
+ this.$container = null;
+ }
+
+ if (this.$layout) {
+ this.$layout.clear();
+ }
+
+ this._reinit(node);
+ };
+
+ this._reinit(node);
+ };
+
+ gantt._quickRefresh = function (code) {
+ var stores = this._getDatastores.call(this);
+
+ for (var i = 0; i < stores.length; i++) {
+ stores[i]._quick_refresh = true;
+ }
+
+ code();
+
+ for (var i = 0; i < stores.length; i++) {
+ stores[i]._quick_refresh = false;
+ }
+ };
+
+ var dropLayout = function dropLayout() {
+ if (this._clearTaskLayers) {
+ this._clearTaskLayers();
+ }
+
+ if (this._clearLinkLayers) {
+ this._clearLinkLayers();
+ }
+
+ if (this.$layout) {
+ this.$layout.destructor();
+ this.$layout = null;
+ this.$ui.reset();
+ }
+ }.bind(gantt);
+
+ var rebuildLayout = function rebuildLayout() {
+ if (isHeadless(gantt)) {
+ return;
+ }
+
+ this.$root.innerHTML = "";
+ this.$root.gantt = this;
+ calculateScaleRange(this);
+ this.config.layout.id = "main";
+ this.$layout = this.$ui.createView("layout", this.$root, this.config.layout);
+ this.$layout.attachEvent("onBeforeResize", function () {
+ var storeNames = gantt.$services.getService("datastores");
+
+ for (var i = 0; i < storeNames.length; i++) {
+ gantt.getDatastore(storeNames[i]).filter();
+
+ if (gantt.$data.tasksStore._skipTaskRecalculation) {
+ // do not repaint items, they will be repainted later in the onStoreUpdate event
+ if (gantt.$data.tasksStore._skipTaskRecalculation != "lightbox") {
+ gantt.$data.tasksStore._skipTaskRecalculation = false;
+ }
+ } else {
+ gantt.getDatastore(storeNames[i]).callEvent("onBeforeRefreshAll", []);
+ }
+ }
+ });
+ this.$layout.attachEvent("onResize", function () {
+ gantt._quickRefresh(function () {
+ gantt.refreshData();
+ });
+ });
+ this.callEvent("onGanttLayoutReady", []);
+ this.$layout.render();
+ this.$container = this.$layout.$container.firstChild;
+ addResizeListener(this);
+ }.bind(gantt);
+
+ gantt.resetLayout = function () {
+ dropLayout();
+ rebuildLayout();
+ this.render();
+ };
+
+ gantt._reinit = function (node) {
+ this.callEvent("onBeforeGanttReady", []);
+
+ this._update_flags();
+
+ var config = this.$services.getService("templateLoader");
+ config.initTemplates(this);
+ dropLayout();
+ this.$root = null;
+
+ if (node) {
+ this.$root = domHelpers.toNode(node);
+ rebuildLayout();
+ this.$mouseEvents.reset(this.$root);
+ }
+
+ this.callEvent("onTemplatesReady", []);
+ this.callEvent("onGanttReady", []);
+ this.render();
+ };
+
+ gantt.$click = {
+ buttons: {
+ "edit": function edit(id) {
+ if (gantt.isReadonly(gantt.getTask(id))) {
+ return;
+ }
+
+ gantt.showLightbox(id);
+ },
+ "delete": function _delete(id) {
+ var task = gantt.getTask(id);
+
+ if (gantt.isReadonly(task)) {
+ return;
+ }
+
+ var question = gantt.locale.labels.confirm_deleting;
+ var title = gantt.locale.labels.confirm_deleting_title;
+
+ gantt._simple_confirm(question, title, function () {
+ if (!gantt.isTaskExists(id)) {
+ gantt.hideLightbox();
+ return;
+ }
+
+ if (task.$new) {
+ // GS-2170. Do not recalculate the indexes and dates of other tasks
+ // as they will be recalculated in the `refreshData`
+ gantt.$data.tasksStore._skipTaskRecalculation = "lightbox";
+ gantt.silent(function () {
+ gantt.deleteTask(id, true);
+ });
+ gantt.$data.tasksStore._skipTaskRecalculation = false;
+ gantt.refreshData();
+ } else {
+ gantt.$data.tasksStore._skipTaskRecalculation = true;
+ gantt.deleteTask(id);
+ }
+
+ gantt.hideLightbox();
+ });
+ }
+ }
+ }; //renders self
+
+ gantt.render = function () {
+ this.callEvent("onBeforeGanttRender", []);
+ var visibleDate;
+
+ if (!isHeadless(gantt)) {
+ if (!this.config.sort && this._sort) {
+ this._sort = undefined;
+ }
+
+ if (this.$root) {
+ if (this.config.rtl) {
+ this.$root.classList.add("gantt_rtl");
+ this.$root.firstChild.classList.add("gantt_rtl"); // GS-1499
+ } else {
+ this.$root.classList.remove("gantt_rtl");
+ this.$root.firstChild.classList.remove("gantt_rtl"); // GS-1499
+ }
+ }
+
+ var pos = this.getScrollState();
+ var posX = pos ? pos.x : 0;
+
+ if (this._getHorizontalScrollbar()) {
+ var scrollbar = this._getHorizontalScrollbar();
+
+ posX = scrollbar.$config.codeScrollLeft || posX || 0;
+ }
+
+ visibleDate = null;
+
+ if (posX) {
+ visibleDate = gantt.dateFromPos(posX + this.config.task_scroll_offset);
+ }
+ }
+
+ calculateScaleRange(this);
+
+ if (!isHeadless(gantt)) {
+ this.$layout.$config.autosize = this.config.autosize;
+ var preserveScroll = this.config.preserve_scroll;
+ this.config.preserve_scroll = false; // prevent scrolling from layout resize, scroll will be called here later on
+
+ this.$layout.resize();
+ this.config.preserve_scroll = preserveScroll;
+
+ if (this.config.preserve_scroll && pos) {
+ // GS-1640: We need pos.y, otherwise part of the timeline won't be rendered if the scrollbar disappeared
+ if (posX || pos.y) {
+ var new_pos = gantt.getScrollState();
+ var new_date = gantt.dateFromPos(new_pos.x);
+
+ if (!(+visibleDate == +new_date && new_pos.y == pos.y)) {
+ var posX = null;
+ var posY = null;
+
+ if (visibleDate) {
+ var posX = Math.max(gantt.posFromDate(visibleDate) - gantt.config.task_scroll_offset, 0);
+ }
+
+ if (pos.y) {
+ posY = pos.y;
+ }
+
+ gantt.scrollTo(posX, posY);
+ }
+ } // GS-1640: We need to reset the scroll position for the grid if the scrollbar disappeared and
+ // the grid and timeline have different scrollbars
+
+
+ var gridCell = gantt.$ui.getView("grid");
+
+ if (gridCell) {
+ var attachedScrollbar = gridCell.$config.scrollY;
+ var verticalScrollbar = gantt.$ui.getView(attachedScrollbar);
+
+ if (verticalScrollbar) {
+ var scrollbarNodeVisible = gantt.utils.dom.isChildOf(verticalScrollbar.$view, gantt.$container);
+
+ if (!scrollbarNodeVisible) {
+ gridCell.scrollTo(undefined, 0);
+ }
+ }
+ }
+ }
+ } else {
+ gantt.refreshData();
+ }
+
+ this.callEvent("onGanttRender", []);
+ }; //TODO: add layout.resize method that wouldn't trigger data repaint
+
+
+ gantt.setSizes = gantt.render;
+
+ gantt.getTaskRowNode = function (id) {
+ var els = this.$grid_data.childNodes;
+ var attribute = this.config.task_attribute;
+
+ for (var i = 0; i < els.length; i++) {
+ if (els[i].getAttribute) {
+ var value = els[i].getAttribute(attribute);
+ if (value == id) return els[i];
+ }
+ }
+
+ return null;
+ };
+
+ gantt.changeLightboxType = function (type) {
+ if (this.getLightboxType() == type) return true;
+
+ gantt._silent_redraw_lightbox(type);
+ };
+
+ gantt._get_link_type = function (from_start, to_start) {
+ var type = null;
+
+ if (from_start && to_start) {
+ type = gantt.config.links.start_to_start;
+ } else if (!from_start && to_start) {
+ type = gantt.config.links.finish_to_start;
+ } else if (!from_start && !to_start) {
+ type = gantt.config.links.finish_to_finish;
+ } else if (from_start && !to_start) {
+ type = gantt.config.links.start_to_finish;
+ }
+
+ return type;
+ };
+
+ gantt.isLinkAllowed = function (from, to, from_start, to_start) {
+ var link = null;
+
+ if (_typeof(from) == "object") {
+ link = from;
+ } else {
+ link = {
+ source: from,
+ target: to,
+ type: this._get_link_type(from_start, to_start)
+ };
+ }
+
+ if (!link) return false;
+ if (!(link.source && link.target && link.type)) return false;
+ if (link.source == link.target) return false;
+ var res = true; //any custom rules
+
+ if (this.checkEvent("onLinkValidation")) res = this.callEvent("onLinkValidation", [link]);
+ return res;
+ };
+
+ gantt._correct_dst_change = function (date, prevOffset, step, unit) {
+ var time_unit = helpers.getSecondsInUnit(unit) * step;
+
+ if (time_unit > 60 * 60 && time_unit < 60 * 60 * 24) {
+ //correct dst change only if current unit is more than one hour and less than day (days have own checking), e.g. 12h
+ var offsetChanged = date.getTimezoneOffset() - prevOffset;
+
+ if (offsetChanged) {
+ date = gantt.date.add(date, offsetChanged, "minute");
+ }
+ }
+
+ return date;
+ };
+
+ gantt.isSplitTask = function (task) {
+ gantt.assert(task && task instanceof Object, "Invalid argument <b>task</b>=" + task + " of gantt.isSplitTask. Task object was expected");
+ return this.$data.tasksStore._isSplitItem(task);
+ };
+
+ gantt._is_icon_open_click = function (e) {
+ if (!e) return false;
+ var target = e.target || e.srcElement;
+ if (!(target && target.className)) return false;
+ var className = domHelpers.getClassName(target);
+ if (className.indexOf("gantt_tree_icon") !== -1 && (className.indexOf("gantt_close") !== -1 || className.indexOf("gantt_open") !== -1)) return true;
+ return false;
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/gantt_data_range.js":
+/*!******************************************!*\
+ !*** ./sources/core/gantt_data_range.js ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ScaleHelper = __webpack_require__(/*! ./ui/timeline/scales_ignore */ "./sources/core/ui/timeline/scales.js");
+
+var PrimaryScaleHelper = __webpack_require__(/*! ./ui/timeline/scales */ "./sources/core/ui/timeline/scales.js");
+
+function resolveConfigRange(unit, gantt) {
+ var range = {
+ start_date: null,
+ end_date: null
+ };
+
+ if (gantt.config.start_date && gantt.config.end_date) {
+ range.start_date = gantt.date[unit + "_start"](new Date(gantt.config.start_date));
+ var end = new Date(gantt.config.end_date);
+ var start_interval = gantt.date[unit + "_start"](new Date(end));
+
+ if (+end != +start_interval) {
+ end = gantt.date.add(start_interval, 1, unit);
+ } else {
+ end = start_interval;
+ }
+
+ range.end_date = end;
+ }
+
+ return range;
+}
+
+function _scale_range_unit(gantt) {
+ var primaryScale = new PrimaryScaleHelper(gantt).primaryScale();
+ var unit = primaryScale.unit;
+ var step = primaryScale.step;
+
+ if (gantt.config.scale_offset_minimal) {
+ var helper = new ScaleHelper(gantt);
+ var scales = [helper.primaryScale()].concat(helper.getSubScales());
+ helper.sortScales(scales);
+ unit = scales[scales.length - 1].unit;
+ step = scales[scales.length - 1].step || 1;
+ }
+
+ return {
+ unit: unit,
+ step: step
+ };
+}
+
+function _init_tasks_range(gantt) {
+ var cfg = _scale_range_unit(gantt);
+
+ var unit = cfg.unit,
+ step = cfg.step;
+ var range = resolveConfigRange(unit, gantt); // GS-1544: Show correct date range if we have tasks or only projects
+
+ if (!(range.start_date && range.end_date)) {
+ var onlyProjectTasks = true;
+ var tasks = gantt.getTaskByTime();
+
+ for (var i = 0; i < tasks.length; i++) {
+ var task = tasks[i];
+
+ if (task.type !== gantt.config.types.project) {
+ onlyProjectTasks = false;
+ break;
+ }
+ }
+
+ if (tasks.length && onlyProjectTasks) {
+ var start_date = tasks[0].start_date;
+ var end_date = gantt.date.add(start_date, 1, gantt.config.duration_unit);
+ range = {
+ start_date: new Date(start_date),
+ end_date: new Date(end_date)
+ };
+ } else {
+ range = gantt.getSubtaskDates();
+ }
+
+ if (!range.start_date || !range.end_date) {
+ range = {
+ start_date: new Date(),
+ end_date: new Date()
+ };
+ }
+
+ range.start_date = gantt.date[unit + "_start"](range.start_date);
+ range.start_date = gantt.calculateEndDate({
+ start_date: gantt.date[unit + "_start"](range.start_date),
+ duration: -1,
+ unit: unit,
+ step: step
+ }); //one free column before first task
+
+ range.end_date = gantt.date[unit + "_start"](range.end_date);
+ range.end_date = gantt.calculateEndDate({
+ start_date: range.end_date,
+ duration: 2,
+ unit: unit,
+ step: step
+ }); //one free column after last task
+ }
+
+ gantt._min_date = range.start_date;
+ gantt._max_date = range.end_date;
+}
+
+function _adjust_scales(gantt) {
+ if (gantt.config.fit_tasks) {
+ var old_min = +gantt._min_date,
+ old_max = +gantt._max_date; //this._init_tasks_range();
+
+ if (+gantt._min_date != old_min || +gantt._max_date != old_max) {
+ gantt.render();
+ gantt.callEvent("onScaleAdjusted", []);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+module.exports = function updateTasksRange(gantt) {
+ _init_tasks_range(gantt);
+
+ _adjust_scales(gantt);
+};
+
+/***/ }),
+
+/***/ "./sources/core/grid_column_api.gpl.js":
+/*!*********************************************!*\
+ !*** ./sources/core/grid_column_api.gpl.js ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.getGridColumn = function (name) {
+ var columns = gantt.config.columns;
+
+ for (var i = 0; i < columns.length; i++) {
+ if (columns[i].name == name) return columns[i];
+ }
+
+ return null;
+ };
+
+ gantt.getGridColumns = function () {
+ return gantt.config.columns.slice();
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/grid_column_api.js":
+/*!*****************************************!*\
+ !*** ./sources/core/grid_column_api.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Grid = __webpack_require__(/*! ./ui/grid/grid */ "./sources/core/ui/grid/grid.js");
+
+module.exports = function (gantt) {
+ __webpack_require__(/*! ./grid_column_api.gpl */ "./sources/core/grid_column_api.gpl.js")(gantt);
+
+ Grid.prototype.getGridColumns = function () {
+ var config = this.$getConfig();
+ var columns = config.columns,
+ visibleColumns = [];
+
+ for (var i = 0; i < columns.length; i++) {
+ if (!columns[i].hide) visibleColumns.push(columns[i]);
+ }
+
+ return visibleColumns;
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/load.js":
+/*!******************************!*\
+ !*** ./sources/core/load.js ***!
+ \******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var helpers = __webpack_require__(/*! ../utils/helpers */ "./sources/utils/helpers.js");
+
+module.exports = function (gantt) {
+ gantt.load = function (url, type, callback) {
+ this._load_url = url;
+ this.assert(arguments.length, "Invalid load arguments");
+ var tp = 'json',
+ cl = null;
+
+ if (arguments.length >= 3) {
+ tp = type;
+ cl = callback;
+ } else {
+ if (typeof arguments[1] == "string") tp = arguments[1];else if (typeof arguments[1] == "function") cl = arguments[1];
+ }
+
+ this._load_type = tp;
+ this.callEvent("onLoadStart", [url, tp]);
+ return this.ajax.get(url, gantt.bind(function (l) {
+ this.on_load(l, tp);
+ this.callEvent("onLoadEnd", [url, tp]);
+ if (typeof cl == "function") cl.call(this);
+ }, this));
+ };
+
+ gantt.parse = function (data, type) {
+ this.on_load({
+ xmlDoc: {
+ responseText: data
+ }
+ }, type);
+ };
+
+ gantt.serialize = function (type) {
+ type = type || "json";
+ return this[type].serialize();
+ };
+ /*
+ tasks and relations
+ {
+ data:[
+ {
+ "id":"string",
+ "text":"...",
+ "start_date":"Date or string",
+ "end_date":"Date or string",
+ "duration":"number",
+ "progress":"0..1",
+ "parent_id":"string",
+ "order":"number"
+ },...],
+ links:[
+ {
+ id:"string",
+ source:"string",
+ target:"string",
+ type:"string"
+ },...],
+ collections:{
+ collectionName:[
+ {key:, label:, optional:...},...
+ ],...
+ }
+ }
+
+ * */
+
+
+ gantt.on_load = function (resp, type) {
+ if (resp.xmlDoc && resp.xmlDoc.status === 404) {
+ // work if we don't have a file at current url
+ this.assert(false, "Failed to load the data from <a href='" + resp.xmlDoc.responseURL + "' target='_blank'>" + resp.xmlDoc.responseURL + "</a>, server returns 404");
+ return;
+ }
+
+ if (gantt.$destroyed) {
+ return;
+ }
+
+ this.callEvent("onBeforeParse", []);
+ if (!type) type = "json";
+ this.assert(this[type], "Invalid data type:'" + type + "'");
+ var raw = resp.xmlDoc.responseText;
+ var data = this[type].parse(raw, resp);
+
+ this._process_loading(data);
+ };
+
+ function attachAssignmentsToTasks(tasks, assignments) {
+ var assignmentsByTasks = {};
+ assignments.forEach(function (a) {
+ if (!assignmentsByTasks[a.task_id]) {
+ assignmentsByTasks[a.task_id] = [];
+ }
+
+ assignmentsByTasks[a.task_id].push(a);
+ });
+ tasks.forEach(function (t) {
+ t[gantt.config.resource_property] = assignmentsByTasks[t.id] || [];
+ });
+ }
+
+ gantt._process_loading = function (data) {
+ if (data.collections) this._load_collections(data.collections);
+
+ if (data.resources && this.$data.resourcesStore) {
+ this.$data.resourcesStore.parse(data.resources);
+ }
+
+ var tasks = data.data || data.tasks;
+
+ if (data.assignments) {
+ attachAssignmentsToTasks(tasks, data.assignments);
+ }
+
+ this.$data.tasksStore.parse(tasks);
+ var links = data.links || (data.collections ? data.collections.links : []);
+ this.$data.linksStore.parse(links); //this._sync_links();
+
+ this.callEvent("onParse", []);
+ this.render();
+ };
+
+ gantt._load_collections = function (collections) {
+ var collections_loaded = false;
+
+ for (var key in collections) {
+ if (collections.hasOwnProperty(key)) {
+ collections_loaded = true;
+ var collection = collections[key]; // GS-1728. Create an empty serverList if it doesn't exist
+
+ this.serverList[key] = this.serverList[key] || [];
+ var arr = this.serverList[key];
+ if (!arr) continue;
+ arr.splice(0, arr.length); //clear old options
+
+ for (var j = 0; j < collection.length; j++) {
+ var option = collection[j];
+ var obj = this.copy(option);
+ obj.key = obj.value; // resulting option object
+
+ for (var option_key in option) {
+ if (option.hasOwnProperty(option_key)) {
+ if (option_key == "value" || option_key == "label") continue;
+ obj[option_key] = option[option_key]; // obj['value'] = option['value']
+ }
+ }
+
+ arr.push(obj);
+ }
+ }
+ }
+
+ if (collections_loaded) this.callEvent("onOptionsLoad", []);
+ };
+
+ gantt.attachEvent("onBeforeTaskDisplay", function (id, task) {
+ return !task.$ignore;
+ });
+
+ function jsonParseError(data) {
+ gantt.assert(false, "Can't parse data: incorrect value of gantt.parse or gantt.load method. " + "Actual argument value: " + JSON.stringify(data));
+ throw new Error("Invalid argument for gantt.parse or gantt.load. An object or a JSON string of format https://docs.dhtmlx.com/gantt/desktop__supported_data_formats.html#json is expected. Actual argument value: " + JSON.stringify(data));
+ }
+
+ gantt.json = {
+ parse: function parse(data) {
+ if (!data) {
+ jsonParseError(data);
+ }
+
+ if (typeof data == "string") {
+ if ((typeof JSON === "undefined" ? "undefined" : _typeof(JSON)) != undefined) {
+ try {
+ data = JSON.parse(data);
+ } catch (e) {
+ jsonParseError(data);
+ }
+ } else {
+ gantt.assert(false, "JSON is not supported");
+ }
+ }
+
+ if (!data.data && !data.tasks) {
+ jsonParseError(data);
+ }
+
+ if (data.dhx_security) gantt.security_key = data.dhx_security;
+ return data;
+ },
+ serializeTask: function serializeTask(task) {
+ return this._copyObject(task);
+ },
+ serializeLink: function serializeLink(link) {
+ return this._copyLink(link);
+ },
+ _copyLink: function _copyLink(obj) {
+ var copy = {};
+
+ for (var key in obj) {
+ copy[key] = obj[key];
+ }
+
+ return copy;
+ },
+ _copyObject: function _copyObject(obj) {
+ var copy = {};
+
+ for (var key in obj) {
+ if (key.charAt(0) == "$") continue;
+ copy[key] = obj[key];
+
+ if (helpers.isDate(copy[key])) {
+ copy[key] = gantt.defined(gantt.templates.xml_format) ? gantt.templates.xml_format(copy[key]) : gantt.templates.format_date(copy[key]);
+ }
+ }
+
+ return copy;
+ },
+ serialize: function serialize() {
+ var tasks = [];
+ var links = [];
+ gantt.eachTask(function (obj) {
+ gantt.resetProjectDates(obj);
+ tasks.push(this.serializeTask(obj));
+ }, gantt.config.root_id, this);
+ var rawLinks = gantt.getLinks();
+
+ for (var i = 0; i < rawLinks.length; i++) {
+ links.push(this.serializeLink(rawLinks[i]));
+ }
+
+ return {
+ data: tasks,
+ links: links
+ };
+ }
+ };
+ /*
+ <data>
+ <task id:"some" parent_id="0" progress="0.5">
+ <text>My task 1</text>
+ <start_date>16.08.2013</start_date>
+ <end_date>22.08.2013</end_date>
+ </task>
+ <coll_options>
+ <links>
+ <link source='a1' target='b2' type='c3' />
+ </links>
+ </coll_options>
+ </data>
+ */
+
+ function xmlParseError(data) {
+ gantt.assert(false, "Can't parse data: incorrect value of gantt.parse or gantt.load method. " + "Actual argument value: " + JSON.stringify(data));
+ throw new Error("Invalid argument for gantt.parse or gantt.load. An XML of format https://docs.dhtmlx.com/gantt/desktop__supported_data_formats.html#xmldhtmlxgantt20 is expected. Actual argument value: " + JSON.stringify(data));
+ }
+
+ gantt.xml = {
+ _xmlNodeToJSON: function _xmlNodeToJSON(node, attrs_only) {
+ var t = {};
+
+ for (var i = 0; i < node.attributes.length; i++) {
+ t[node.attributes[i].name] = node.attributes[i].value;
+ }
+
+ if (!attrs_only) {
+ for (var i = 0; i < node.childNodes.length; i++) {
+ var child = node.childNodes[i];
+ if (child.nodeType == 1) t[child.tagName] = child.firstChild ? child.firstChild.nodeValue : "";
+ }
+
+ if (!t.text) t.text = node.firstChild ? node.firstChild.nodeValue : "";
+ }
+
+ return t;
+ },
+ _getCollections: function _getCollections(loader) {
+ var collection = {};
+ var opts = gantt.ajax.xpath("//coll_options", loader);
+
+ for (var i = 0; i < opts.length; i++) {
+ var bind = opts[i].getAttribute("for");
+ var arr = collection[bind] = [];
+ var itms = gantt.ajax.xpath(".//item", opts[i]);
+
+ for (var j = 0; j < itms.length; j++) {
+ var itm = itms[j];
+ var attrs = itm.attributes;
+ var obj = {
+ key: itms[j].getAttribute("value"),
+ label: itms[j].getAttribute("label")
+ };
+
+ for (var k = 0; k < attrs.length; k++) {
+ var attr = attrs[k];
+ if (attr.nodeName == "value" || attr.nodeName == "label") continue;
+ obj[attr.nodeName] = attr.nodeValue;
+ }
+
+ arr.push(obj);
+ }
+ }
+
+ return collection;
+ },
+ _getXML: function _getXML(text, loader, toptag) {
+ toptag = toptag || "data";
+
+ if (!loader.getXMLTopNode) {
+ loader = gantt.ajax.parse(loader);
+ }
+
+ var xml = gantt.ajax.xmltop(toptag, loader.xmlDoc);
+
+ if (!xml || xml.tagName != toptag) {
+ xmlParseError(text);
+ }
+
+ var skey = xml.getAttribute("dhx_security");
+ if (skey) gantt.security_key = skey;
+ return xml;
+ },
+ parse: function parse(text, loader) {
+ loader = this._getXML(text, loader);
+ var data = {};
+ var evs = data.data = [];
+ var xml = gantt.ajax.xpath("//task", loader);
+
+ for (var i = 0; i < xml.length; i++) {
+ evs[i] = this._xmlNodeToJSON(xml[i]);
+ }
+
+ data.collections = this._getCollections(loader);
+ return data;
+ },
+ _copyLink: function _copyLink(obj) {
+ return "<item id='" + obj.id + "' source='" + obj.source + "' target='" + obj.target + "' type='" + obj.type + "' />";
+ },
+ _copyObject: function _copyObject(obj) {
+ return "<task id='" + obj.id + "' parent='" + (obj.parent || "") + "' start_date='" + obj.start_date + "' duration='" + obj.duration + "' open='" + !!obj.open + "' progress='" + obj.progress + "' end_date='" + obj.end_date + "'><![CDATA[" + obj.text + "]]></task>";
+ },
+ serialize: function serialize() {
+ var tasks = [];
+ var links = [];
+ var json = gantt.json.serialize();
+
+ for (var i = 0, len = json.data.length; i < len; i++) {
+ tasks.push(this._copyObject(json.data[i]));
+ }
+
+ for (var i = 0, len = json.links.length; i < len; i++) {
+ links.push(this._copyLink(json.links[i]));
+ }
+
+ return "<data>" + tasks.join("") + "<coll_options for='links'>" + links.join("") + "</coll_options></data>";
+ }
+ };
+ gantt.oldxml = {
+ parse: function parse(text, loader) {
+ loader = gantt.xml._getXML(text, loader, "projects");
+ var data = {
+ collections: {
+ links: []
+ }
+ };
+ var evs = data.data = [];
+ var xml = gantt.ajax.xpath("//task", loader);
+
+ for (var i = 0; i < xml.length; i++) {
+ evs[i] = gantt.xml._xmlNodeToJSON(xml[i]);
+ var parent = xml[i].parentNode;
+ if (parent.tagName == "project") evs[i].parent = "project-" + parent.getAttribute("id");else evs[i].parent = parent.parentNode.getAttribute("id");
+ }
+
+ xml = gantt.ajax.xpath("//project", loader);
+
+ for (var i = 0; i < xml.length; i++) {
+ var ev = gantt.xml._xmlNodeToJSON(xml[i], true);
+
+ ev.id = "project-" + ev.id;
+ evs.push(ev);
+ }
+
+ for (var i = 0; i < evs.length; i++) {
+ var ev = evs[i];
+ ev.start_date = ev.startdate || ev.est;
+ ev.end_date = ev.enddate;
+ ev.text = ev.name;
+ ev.duration = ev.duration / 8;
+ ev.open = 1;
+ if (!ev.duration && !ev.end_date) ev.duration = 1;
+ if (ev.predecessortasks) data.collections.links.push({
+ target: ev.id,
+ source: ev.predecessortasks,
+ type: gantt.config.links.finish_to_start
+ });
+ }
+
+ return data;
+ },
+ serialize: function serialize() {
+ gantt.message("Serialization to 'old XML' is not implemented");
+ }
+ };
+
+ gantt.serverList = function (name, array) {
+ if (array) {
+ this.serverList[name] = array.slice(0);
+ } else if (!this.serverList[name]) {
+ this.serverList[name] = [];
+ }
+
+ return this.serverList[name];
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/auto_task_types.js":
+/*!*************************************************!*\
+ !*** ./sources/core/plugins/auto_task_types.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ function isEnabled() {
+ return gantt.config.auto_types && // if enabled
+ gantt.getTaskType(gantt.config.types.project) == gantt.config.types.project; // and supported
+ }
+
+ function callIfEnabled(callback) {
+ return function () {
+ if (!isEnabled()) {
+ return true;
+ }
+
+ return callback.apply(this, arguments);
+ };
+ }
+
+ function checkTaskType(id, changedTypes) {
+ var task = gantt.getTask(id);
+ var targetType = getTaskTypeToUpdate(task);
+
+ if (targetType !== false && gantt.getTaskType(task) !== targetType) {
+ changedTypes.$needsUpdate = true;
+ changedTypes[task.id] = {
+ task: task,
+ type: targetType
+ };
+ }
+ }
+
+ function getUpdatedTypes(id, changedTypes) {
+ changedTypes = changedTypes || {};
+ checkTaskType(id, changedTypes);
+ gantt.eachParent(function (parent) {
+ checkTaskType(parent.id, changedTypes);
+ }, id);
+ return changedTypes;
+ }
+
+ function applyChanges(changedTypes) {
+ for (var i in changedTypes) {
+ if (changedTypes[i] && changedTypes[i].task) {
+ var task = changedTypes[i].task;
+ task.type = changedTypes[i].type;
+ gantt.updateTask(task.id);
+ }
+ }
+ }
+
+ function updateParentTypes(startId) {
+ if (gantt.getState().group_mode) {
+ return;
+ }
+
+ var changedTypes = getUpdatedTypes(startId);
+
+ if (changedTypes.$needsUpdate) {
+ gantt.batchUpdate(function () {
+ applyChanges(changedTypes);
+ });
+ }
+ }
+
+ var delTaskParent;
+
+ function updateTaskType(task, targetType) {
+ if (!gantt.getState().group_mode) {
+ task.type = targetType;
+ gantt.updateTask(task.id);
+ }
+ }
+
+ function getTaskTypeToUpdate(task) {
+ var allTypes = gantt.config.types;
+ var hasChildren = gantt.hasChild(task.id);
+ var taskType = gantt.getTaskType(task.type);
+
+ if (hasChildren && taskType === allTypes.task) {
+ return allTypes.project;
+ }
+
+ if (!hasChildren && taskType === allTypes.project) {
+ return allTypes.task;
+ }
+
+ return false;
+ }
+
+ var isParsingDone = true;
+ gantt.attachEvent("onParse", callIfEnabled(function () {
+ isParsingDone = false;
+
+ if (gantt.getState().group_mode) {
+ return;
+ }
+
+ gantt.batchUpdate(function () {
+ gantt.eachTask(function (task) {
+ var targetType = getTaskTypeToUpdate(task);
+
+ if (targetType !== false) {
+ updateTaskType(task, targetType);
+ }
+ });
+ });
+ isParsingDone = true;
+ }));
+ gantt.attachEvent("onAfterTaskAdd", callIfEnabled(function (id) {
+ if (isParsingDone) {
+ updateParentTypes(id);
+ }
+ }));
+ gantt.attachEvent("onAfterTaskUpdate", callIfEnabled(function (id) {
+ if (isParsingDone) {
+ updateParentTypes(id);
+ }
+ }));
+
+ function updateAfterRemoveChild(id) {
+ if (id != gantt.config.root_id && gantt.isTaskExists(id)) {
+ updateParentTypes(id);
+ }
+ }
+
+ gantt.attachEvent("onBeforeTaskDelete", callIfEnabled(function (id, task) {
+ delTaskParent = gantt.getParent(id);
+ return true;
+ }));
+ gantt.attachEvent("onAfterTaskDelete", callIfEnabled(function (id, task) {
+ updateAfterRemoveChild(delTaskParent);
+ }));
+ var originalRowDndParent;
+ gantt.attachEvent("onRowDragStart", callIfEnabled(function (id, target, e) {
+ originalRowDndParent = gantt.getParent(id);
+ return true;
+ }));
+ gantt.attachEvent("onRowDragEnd", callIfEnabled(function (id, target) {
+ updateAfterRemoveChild(originalRowDndParent);
+ updateParentTypes(id);
+ }));
+ var originalMoveTaskParent;
+ gantt.attachEvent("onBeforeTaskMove", callIfEnabled(function (sid, parent, tindex) {
+ originalMoveTaskParent = gantt.getParent(sid);
+ return true;
+ }));
+ gantt.attachEvent("onAfterTaskMove", callIfEnabled(function (id, parent, tindex) {
+ if (document.querySelector(".gantt_drag_marker")) {
+ // vertical dnd in progress
+ return;
+ }
+
+ updateAfterRemoveChild(originalMoveTaskParent);
+ updateParentTypes(id);
+ }));
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/batch_update.js":
+/*!**********************************************!*\
+ !*** ./sources/core/plugins/batch_update.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../../utils/global */ "./sources/utils/global.js");
+
+function createMethod(gantt) {
+ var methods = {};
+ var isActive = false;
+
+ function disableMethod(methodName, dummyMethod) {
+ dummyMethod = typeof dummyMethod == "function" ? dummyMethod : function () {};
+
+ if (!methods[methodName]) {
+ methods[methodName] = this[methodName];
+ this[methodName] = dummyMethod;
+ }
+ }
+
+ function restoreMethod(methodName) {
+ if (methods[methodName]) {
+ this[methodName] = methods[methodName];
+ methods[methodName] = null;
+ }
+ }
+
+ function disableMethods(methodsHash) {
+ for (var i in methodsHash) {
+ disableMethod.call(this, i, methodsHash[i]);
+ }
+ }
+
+ function restoreMethods() {
+ for (var i in methods) {
+ restoreMethod.call(this, i);
+ }
+ }
+
+ function batchUpdatePayload(callback) {
+ try {
+ callback();
+ } catch (e) {
+ global.console.error(e);
+ }
+ }
+
+ var state = gantt.$services.getService("state");
+ state.registerProvider("batchUpdate", function () {
+ return {
+ batch_update: isActive
+ };
+ }, false);
+ return function batchUpdate(callback, noRedraw) {
+ if (isActive) {
+ // batch mode is already active
+ batchUpdatePayload(callback);
+ return;
+ }
+
+ var call_dp = this._dp && this._dp.updateMode != "off";
+ var dp_mode;
+
+ if (call_dp) {
+ dp_mode = this._dp.updateMode;
+
+ this._dp.setUpdateMode("off");
+ } // temporary disable some methods while updating multiple tasks
+
+
+ var resetProjects = {};
+ var methods = {
+ "render": true,
+ "refreshData": true,
+ "refreshTask": true,
+ "refreshLink": true,
+ "resetProjectDates": function resetProjectDates(task) {
+ resetProjects[task.id] = task;
+ }
+ };
+ disableMethods.call(this, methods);
+ isActive = true;
+ this.callEvent("onBeforeBatchUpdate", []);
+ batchUpdatePayload(callback);
+ this.callEvent("onAfterBatchUpdate", []);
+ restoreMethods.call(this); // do required updates after changes applied
+
+ for (var i in resetProjects) {
+ this.resetProjectDates(resetProjects[i]);
+ }
+
+ isActive = false;
+
+ if (!noRedraw) {
+ this.render();
+ }
+
+ if (call_dp) {
+ this._dp.setUpdateMode(dp_mode);
+
+ this._dp.setGanttMode("task");
+
+ this._dp.sendData();
+
+ this._dp.setGanttMode("link");
+
+ this._dp.sendData();
+ }
+ };
+}
+
+module.exports = function (gantt) {
+ gantt.batchUpdate = createMethod(gantt);
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/empty_state_screen.ts":
+/*!****************************************************!*\
+ !*** ./sources/core/plugins/empty_state_screen.ts ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function default_1(gantt) {
+ gantt.ext = gantt.ext || {};
+ gantt.config.show_empty_state = false;
+ gantt.ext.emptyStateElement = gantt.ext.emptyStateElement || {
+ isEnabled: function () {
+ return gantt.config.show_empty_state === true;
+ },
+ isGanttEmpty: function () {
+ return !gantt.getTaskByTime().length;
+ },
+ renderContent: function (container) {
+ var placeholderTextElement = "<div class='gantt_empty_state_text'>\n <div class='gantt_empty_state_text_link' data-empty-state-create-task>" + gantt.locale.labels.empty_state_text_link + "</div>\n <div class='gantt_empty_state_text_description'>" + gantt.locale.labels.empty_state_text_description + "</div>\n </div>";
+ var placeholderImageElement = "<div class='gantt_empty_state_image'></div>";
+ var placeholderContainer = "<div class='gantt_empty_state'>" + placeholderImageElement + placeholderTextElement + "</div>";
+ container.innerHTML = placeholderContainer;
+ },
+ clickEvents: [],
+ attachAddTaskEvent: function () {
+ var id = gantt.attachEvent("onEmptyClick", function (e) {
+ var domHelpers = gantt.utils.dom;
+ var gridPlaceholder = domHelpers.closest(e.target, "[data-empty-state-create-task]");
+ if (gridPlaceholder) {
+ gantt.createTask({
+ id: gantt.uid(),
+ text: "New Task"
+ });
+ }
+ });
+ this.clickEvents.push(id);
+ },
+ detachAddTaskEvents: function () {
+ this.clickEvents.forEach(function (event) {
+ gantt.detachEvent(event);
+ });
+ this.clickEvents = [];
+ },
+ getContainer: function () {
+ if (gantt.$container) {
+ var domHelpers = gantt.utils.dom;
+ if (gantt.$container.contains(gantt.$grid_data)) {
+ return domHelpers.closest(gantt.$grid_data, ".gantt_layout_content");
+ }
+ if (gantt.$container.contains(gantt.$task_data)) {
+ return domHelpers.closest(gantt.$task_data, ".gantt_layout_content");
+ }
+ }
+ return null;
+ },
+ getNode: function () {
+ var container = this.getContainer();
+ if (!container) {
+ return null;
+ }
+ var emptyStateElementNode = container.querySelector(".gantt_empty_state_wrapper");
+ return emptyStateElementNode;
+ },
+ show: function () {
+ var container = this.getContainer();
+ if (!container && this.isGanttEmpty()) {
+ return null;
+ }
+ var wrapper = document.createElement("div");
+ wrapper.className = "gantt_empty_state_wrapper";
+ wrapper.style.marginTop = (gantt.config.scale_height - container.offsetHeight) + "px";
+ var oldNodes = gantt.$container.querySelectorAll(".gantt_empty_state_wrapper");
+ // for IE11
+ Array.prototype.forEach.call(oldNodes, function (node) {
+ node.parentNode.removeChild(node);
+ });
+ this.detachAddTaskEvents();
+ this.attachAddTaskEvent();
+ container.appendChild(wrapper);
+ this.renderContent(wrapper);
+ },
+ hide: function () {
+ var emptyStateElementNode = this.getNode();
+ if (emptyStateElementNode) {
+ emptyStateElementNode.parentNode.removeChild(emptyStateElementNode);
+ }
+ else {
+ return false;
+ }
+ },
+ init: function () { }
+ };
+ gantt.attachEvent("onDataRender", function () {
+ var emptyStateElement = gantt.ext.emptyStateElement;
+ if (emptyStateElement.isEnabled() && emptyStateElement.isGanttEmpty()) {
+ emptyStateElement.show();
+ }
+ else {
+ emptyStateElement.hide();
+ }
+ });
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/core/plugins/formatters.js":
+/*!********************************************!*\
+ !*** ./sources/core/plugins/formatters.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DurationFormatter = __webpack_require__(/*! ../common/duration_formatter */ "./sources/core/common/duration_formatter_numeric.ts")["default"];
+
+var LinkFormatter = __webpack_require__(/*! ../common/link_formatter */ "./sources/core/common/link_formatter_simple.ts")["default"];
+
+module.exports = function (gantt) {
+ gantt.ext.formatters = {
+ durationFormatter: function durationFormatter(settings) {
+ if (!settings) {
+ settings = {};
+ }
+
+ if (!settings.store) {
+ settings.store = gantt.config.duration_unit;
+ }
+
+ if (!settings.enter) {
+ settings.enter = gantt.config.duration_unit;
+ }
+
+ return DurationFormatter.create(settings, gantt);
+ },
+ linkFormatter: function linkFormatter(settings) {
+ return LinkFormatter.create(settings, gantt);
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/index.js":
+/*!***************************************!*\
+ !*** ./sources/core/plugins/index.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ if (!gantt.ext) {
+ gantt.ext = {};
+ }
+
+ var modules = [__webpack_require__(/*! ./batch_update */ "./sources/core/plugins/batch_update.js"), __webpack_require__(/*! ./wbs */ "./sources/core/plugins/wbs.js"), __webpack_require__(/*! ./resources */ "./sources/core/plugins/resources.js"), __webpack_require__(/*! ./resource_assignments */ "./sources/core/plugins/resource_assignments.js"), __webpack_require__(/*! ./new_task_placeholder */ "./sources/core/plugins/new_task_placeholder.js"), __webpack_require__(/*! ./auto_task_types */ "./sources/core/plugins/auto_task_types.js"), __webpack_require__(/*! ./formatters */ "./sources/core/plugins/formatters.js"), __webpack_require__(/*! ./empty_state_screen */ "./sources/core/plugins/empty_state_screen.ts")["default"]];
+
+ for (var i = 0; i < modules.length; i++) {
+ if (modules[i]) modules[i](gantt);
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/new_task_placeholder.js":
+/*!******************************************************!*\
+ !*** ./sources/core/plugins/new_task_placeholder.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function addPlaceholder(gantt) {
+ function isEnabled() {
+ return gantt.config.placeholder_task;
+ }
+
+ function callIfEnabled(callback) {
+ return function () {
+ if (!isEnabled()) {
+ return true;
+ }
+
+ return callback.apply(this, arguments);
+ };
+ }
+
+ function silenceDataProcessor(dataProcessor) {
+ if (dataProcessor && !dataProcessor._silencedPlaceholder) {
+ dataProcessor._silencedPlaceholder = true;
+ dataProcessor.attachEvent("onBeforeUpdate", callIfEnabled(function (id, state, data) {
+ if (data.type == gantt.config.types.placeholder) {
+ dataProcessor.setUpdated(id, false);
+ return false;
+ }
+
+ return true;
+ }));
+ }
+ }
+
+ function insertPlaceholder() {
+ var placeholders = gantt.getTaskBy("type", gantt.config.types.placeholder);
+
+ if (!placeholders.length || !gantt.isTaskExists(placeholders[0].id)) {
+ var placeholder = {
+ unscheduled: true,
+ type: gantt.config.types.placeholder,
+ duration: 0,
+ text: gantt.locale.labels.new_task
+ };
+
+ if (gantt.callEvent("onTaskCreated", [placeholder]) === false) {
+ return;
+ }
+
+ gantt.addTask(placeholder);
+ }
+ }
+
+ function afterEdit(id) {
+ var item = gantt.getTask(id);
+
+ if (item.type == gantt.config.types.placeholder) {
+ if (item.start_date && item.end_date && item.unscheduled) {
+ item.unscheduled = false;
+ }
+
+ gantt.batchUpdate(function () {
+ var newTask = gantt.copy(item);
+ gantt.silent(function () {
+ gantt.deleteTask(item.id);
+ });
+ delete newTask["!nativeeditor_status"];
+ newTask.type = gantt.config.types.task;
+ newTask.id = gantt.uid();
+ gantt.addTask(newTask); //insertPlaceholder();
+ });
+ }
+ }
+
+ gantt.config.types.placeholder = "placeholder";
+ gantt.attachEvent("onDataProcessorReady", callIfEnabled(silenceDataProcessor));
+ var ready = false;
+ gantt.attachEvent("onGanttReady", function () {
+ if (ready) {
+ return;
+ }
+
+ ready = true;
+ gantt.attachEvent("onAfterTaskUpdate", callIfEnabled(afterEdit));
+ gantt.attachEvent("onAfterTaskAdd", callIfEnabled(function (id, task) {
+ if (task.type != gantt.config.types.placeholder) {
+ var placeholders = gantt.getTaskBy("type", gantt.config.types.placeholder);
+ placeholders.forEach(function (p) {
+ gantt.silent(function () {
+ if (gantt.isTaskExists(p.id)) gantt.deleteTask(p.id);
+ });
+ });
+ insertPlaceholder();
+ }
+ }));
+ gantt.attachEvent("onParse", callIfEnabled(insertPlaceholder));
+ });
+
+ function isPlaceholderTask(taskId) {
+ if (gantt.config.types.placeholder && gantt.isTaskExists(taskId)) {
+ var task = gantt.getTask(taskId);
+
+ if (task.type == gantt.config.types.placeholder) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function isPlaceholderLink(link) {
+ if (isPlaceholderTask(link.source) || isPlaceholderTask(link.target)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ gantt.attachEvent("onLinkValidation", function (link) {
+ if (isPlaceholderLink(link)) {
+ return false;
+ }
+
+ return true;
+ });
+ gantt.attachEvent("onBeforeLinkAdd", function (id, link) {
+ if (isPlaceholderLink(link)) {
+ return false;
+ }
+
+ return true;
+ });
+ gantt.attachEvent("onBeforeUndoStack", function (action) {
+ for (var i = 0; i < action.commands.length; i++) {
+ var command = action.commands[i];
+
+ if (command.entity === "task" && command.value.type === gantt.config.types.placeholder) {
+ action.commands.splice(i, 1);
+ i--;
+ }
+ }
+
+ return true;
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/resource_assignments.js":
+/*!******************************************************!*\
+ !*** ./sources/core/plugins/resource_assignments.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ var resourceAssignmentsProperty = "$resourceAssignments";
+ gantt.config.resource_assignment_store = "resourceAssignments";
+ gantt.config.process_resource_assignments = true;
+ var resourceAssignmentFormats = {
+ auto: "auto",
+ singleValue: "singleValue",
+ valueArray: "valueArray",
+ resourceValueArray: "resourceValueArray",
+ assignmentsArray: "assignmentsArray"
+ };
+ var resourceAssignmentFormat = resourceAssignmentFormats.auto; //"primitiveSingle";//"primitive";//"object"|"assignment"
+
+ var assignmentModes = {
+ fixedDates: "fixedDates",
+ fixedDuration: "fixedDuration",
+ "default": "default"
+ };
+
+ function initAssignmentFields(item, task) {
+ if (item.start_date) {
+ item.start_date = gantt.date.parseDate(item.start_date, "parse_date");
+ } else {
+ item.start_date = null;
+ }
+
+ if (item.end_date) {
+ item.end_date = gantt.date.parseDate(item.end_date, "parse_date");
+ } else {
+ item.end_date = null;
+ }
+
+ var delay = Number(item.delay);
+ var initDelay = false;
+
+ if (!isNaN(delay)) {
+ item.delay = delay;
+ } else {
+ item.delay = 0;
+ initDelay = true;
+ }
+
+ if (!gantt.defined(item.value)) {
+ item.value = null;
+ }
+
+ if (!item.task_id || !item.resource_id) {
+ return false;
+ }
+
+ item.mode = item.mode || assignmentModes["default"];
+
+ if (item.mode === assignmentModes.fixedDuration) {
+ if (isNaN(Number(item.duration))) {
+ task = task || gantt.getTask(item.task_id);
+ item.duration = gantt.calculateDuration({
+ start_date: item.start_date,
+ end_date: item.end_date,
+ id: task
+ });
+ }
+
+ if (initDelay) {
+ task = task || gantt.getTask(item.task_id);
+ item.delay = gantt.calculateDuration({
+ start_date: task.start_date,
+ end_date: item.start_date,
+ id: task
+ });
+ }
+ }
+
+ if (item.mode !== assignmentModes.fixedDates && (task || gantt.isTaskExists(item.task_id))) {
+ task = task || gantt.getTask(item.task_id);
+
+ var timing = _assignmentTimeFromTask(item, task);
+
+ item.start_date = timing.start_date;
+ item.end_date = timing.end_date;
+ item.duration = timing.duration;
+ }
+ } // gantt init
+
+
+ var resourceAssignmentsStore = gantt.createDatastore({
+ name: gantt.config.resource_assignment_store,
+ initItem: function initItem(item) {
+ if (!item.id) {
+ item.id = gantt.uid();
+ }
+
+ initAssignmentFields(item);
+ return item;
+ }
+ });
+ gantt.$data.assignmentsStore = resourceAssignmentsStore;
+
+ function _assignmentTimeFromTask(assignment, task) {
+ if (assignment.mode === assignmentModes.fixedDates) {
+ return {
+ start_date: assignment.start_date,
+ end_date: assignment.end_date,
+ duration: assignment.duration
+ };
+ } else {
+ var start = assignment.delay ? gantt.calculateEndDate({
+ start_date: task.start_date,
+ duration: assignment.delay,
+ task: task
+ }) : new Date(task.start_date);
+ var end;
+ var duration;
+
+ if (assignment.mode === assignmentModes.fixedDuration) {
+ end = gantt.calculateEndDate({
+ start_date: start,
+ duration: assignment.duration,
+ task: task
+ });
+ duration = assignment.duration;
+ } else {
+ end = new Date(task.end_date);
+ duration = task.duration - assignment.delay;
+ }
+ }
+
+ return {
+ start_date: start,
+ end_date: end,
+ duration: duration
+ };
+ } // data loading
+
+
+ function _makeAssignmentsFromTask(task) {
+ var property = gantt.config.resource_property;
+ var assignments = task[property];
+ var resourceAssignments = [];
+ var detectFormat = resourceAssignmentFormat === resourceAssignmentFormats.auto;
+
+ if (gantt.defined(assignments) && assignments) {
+ if (!Array.isArray(assignments)) {
+ assignments = [assignments];
+
+ if (detectFormat) {
+ resourceAssignmentFormat = resourceAssignmentFormats.singleValue;
+ detectFormat = false;
+ }
+ }
+
+ var usedIds = {};
+ assignments.forEach(function (res) {
+ if (!res.resource_id) {
+ // when resource is a string/number
+ res = {
+ resource_id: res
+ };
+
+ if (detectFormat) {
+ resourceAssignmentFormat = resourceAssignmentFormats.valueArray;
+ detectFormat = false;
+ } // isSimpleArray = true;
+
+ }
+
+ if (detectFormat) {
+ if (res.id && res.resource_id) {
+ resourceAssignmentFormat = resourceAssignmentFormats.assignmentsArray;
+ detectFormat = false;
+ } else {
+ resourceAssignmentFormat = resourceAssignmentFormats.resourceValueArray;
+ detectFormat = false;
+ }
+ }
+
+ var defaultMode = assignmentModes["default"];
+
+ if (!res.mode) {
+ if (res.start_date && res.end_date || res.start_date && res.duration) {
+ defaultMode = assignmentModes.fixedDuration;
+ }
+ }
+
+ var id;
+
+ if (!res.id && res.$id && !usedIds[res.$id]) {
+ id = res.$id;
+ } else if (res.id && !usedIds[res.id]) {
+ id = res.id;
+ } else {
+ id = gantt.uid();
+ }
+
+ usedIds[id] = true;
+ var assignment = {
+ id: id,
+ start_date: res.start_date,
+ duration: res.duration,
+ end_date: res.end_date,
+ delay: res.delay,
+ task_id: task.id,
+ resource_id: res.resource_id,
+ value: res.value,
+ mode: res.mode || defaultMode
+ };
+
+ if (!(assignment.start_date && assignment.start_date.getMonth && assignment.end_date && assignment.end_date.getMonth && typeof assignment.duration === "number")) {
+ initAssignmentFields(assignment, task);
+ }
+
+ resourceAssignments.push(assignment);
+ });
+ }
+
+ return resourceAssignments;
+ }
+
+ function _updateTaskBack(taskId) {
+ // GS-1493. In some cases, the resource assignment store has the tasks that no longer exist
+ if (!gantt.isTaskExists(taskId)) {
+ return;
+ }
+
+ var task = gantt.getTask(taskId);
+ var assignments = gantt.getTaskAssignments(task.id);
+
+ _assignAssignments(task, assignments);
+ }
+
+ function _assignAssignments(task, assignments) {
+ assignments.sort(function (a, b) {
+ if (a.start_date && b.start_date && a.start_date.valueOf() != b.start_date.valueOf()) {
+ return a.start_date - b.start_date;
+ } else {
+ return 0;
+ }
+ });
+
+ if (resourceAssignmentFormat == resourceAssignmentFormats.assignmentsArray) {
+ task[gantt.config.resource_property] = assignments;
+ } else if (resourceAssignmentFormat == resourceAssignmentFormats.resourceValueArray) {
+ task[gantt.config.resource_property] = assignments.map(function (a) {
+ return {
+ $id: a.id,
+ start_date: a.start_date,
+ duration: a.duration,
+ end_date: a.end_date,
+ delay: a.delay,
+ resource_id: a.resource_id,
+ value: a.value,
+ mode: a.mode
+ };
+ });
+ }
+
+ task[resourceAssignmentsProperty] = assignments;
+ }
+
+ function _loadAssignmentsFromTask(task) {
+ var assignments = _makeAssignmentsFromTask(task);
+
+ var taskAssignments = [];
+ assignments.forEach(function (a) {
+ a.id = a.id || gantt.uid(); //var newId = resourceAssignmentsStore.addItem(a);
+
+ taskAssignments.push(a);
+ });
+ return assignments;
+ }
+
+ function diffAssignments(taskValues, assignmentsStoreValues) {
+ var result = {
+ inBoth: [],
+ inTaskNotInStore: [],
+ inStoreNotInTask: []
+ };
+
+ if (resourceAssignmentFormat == resourceAssignmentFormats.singleValue) {
+ var taskOwner = taskValues[0];
+ var ownerId = taskOwner ? taskOwner.resource_id : null;
+ var foundOwnerAssignment = false;
+ assignmentsStoreValues.forEach(function (a) {
+ if (a.resource_id != ownerId) {
+ result.inStoreNotInTask.push(a);
+ } else if (a.resource_id == ownerId) {
+ result.inBoth.push({
+ store: a,
+ task: taskOwner
+ });
+ foundOwnerAssignment = true;
+ }
+ });
+
+ if (!foundOwnerAssignment && taskOwner) {
+ result.inTaskNotInStore.push(taskOwner);
+ }
+ } else if (resourceAssignmentFormat == resourceAssignmentFormats.valueArray) {
+ var taskSearch = {};
+ var storeSearch = {};
+ var processedIds = {};
+ taskValues.forEach(function (a) {
+ taskSearch[a.resource_id] = a;
+ });
+ assignmentsStoreValues.forEach(function (a) {
+ storeSearch[a.resource_id] = a;
+ });
+ taskValues.concat(assignmentsStoreValues).forEach(function (a) {
+ if (processedIds[a.resource_id]) {
+ return;
+ }
+
+ processedIds[a.resource_id] = true;
+ var inTask = taskSearch[a.resource_id];
+ var inStore = storeSearch[a.resource_id];
+
+ if (inTask && inStore) {
+ result.inBoth.push({
+ store: inStore,
+ task: inTask
+ });
+ } else if (inTask && !inStore) {
+ result.inTaskNotInStore.push(inTask);
+ } else if (!inTask && inStore) {
+ result.inStoreNotInTask.push(inStore);
+ }
+ });
+ } else if (resourceAssignmentFormat == resourceAssignmentFormats.assignmentsArray || resourceAssignmentFormat == resourceAssignmentFormats.resourceValueArray) {
+ var taskSearch = {};
+ var storeSearch = {};
+ var processedIds = {};
+ taskValues.forEach(function (a) {
+ taskSearch[a.id || a.$id] = a;
+ });
+ assignmentsStoreValues.forEach(function (a) {
+ storeSearch[a.id] = a;
+ });
+ taskValues.concat(assignmentsStoreValues).forEach(function (a) {
+ var id = a.id || a.$id;
+
+ if (processedIds[id]) {
+ return;
+ }
+
+ processedIds[id] = true;
+ var inTask = taskSearch[id];
+ var inStore = storeSearch[id];
+
+ if (inTask && inStore) {
+ result.inBoth.push({
+ store: inStore,
+ task: inTask
+ });
+ } else if (inTask && !inStore) {
+ result.inTaskNotInStore.push(inTask);
+ } else if (!inTask && inStore) {
+ result.inStoreNotInTask.push(inStore);
+ }
+ });
+ }
+
+ return result;
+ }
+
+ function assignmentHasChanged(source, target) {
+ var ignoreFields = {
+ id: true
+ };
+
+ for (var i in source) {
+ if (!ignoreFields[i]) {
+ if (String(source[i]) !== String(target[i])) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ function updateAssignment(source, target) {
+ var ignoreFields = {
+ id: true
+ };
+
+ for (var i in source) {
+ if (!ignoreFields[i]) {
+ target[i] = source[i];
+ }
+ }
+ }
+
+ function _syncAssignments(task, storeAssignments) {
+ var tasksAssignments = _makeAssignmentsFromTask(task);
+
+ var diff = diffAssignments(tasksAssignments, storeAssignments);
+ diff.inStoreNotInTask.forEach(function (a) {
+ resourceAssignmentsStore.removeItem(a.id);
+ });
+ diff.inTaskNotInStore.forEach(function (a) {
+ resourceAssignmentsStore.addItem(a);
+ });
+ diff.inBoth.forEach(function (a) {
+ if (assignmentHasChanged(a.task, a.store)) {
+ updateAssignment(a.task, a.store);
+ resourceAssignmentsStore.updateItem(a.store.id);
+ } else {
+ if (a.task.start_date && a.task.end_date && a.task.mode !== assignmentModes.fixedDates) {
+ var timing = _assignmentTimeFromTask(a.store, task);
+
+ if (a.store.start_date.valueOf() != timing.start_date.valueOf() || a.store.end_date.valueOf() != timing.end_date.valueOf()) {
+ a.store.start_date = timing.start_date;
+ a.store.end_date = timing.end_date;
+ a.store.duration = timing.duration;
+ resourceAssignmentsStore.updateItem(a.store.id);
+ }
+ }
+ }
+ });
+
+ _updateTaskBack(task.id);
+ }
+
+ function _syncOnTaskUpdate(task) {
+ var storeAssignments = task[resourceAssignmentsProperty] || resourceAssignmentsStore.find(function (a) {
+ return a.task_id == task.id;
+ });
+
+ _syncAssignments(task, storeAssignments);
+ }
+
+ function _syncOnTaskDelete(ids) {
+ var idsSearch = {};
+ ids.forEach(function (id) {
+ idsSearch[id] = true;
+ });
+ var taskResources = resourceAssignmentsStore.find(function (a) {
+ return idsSearch[a.task_id];
+ });
+ taskResources.forEach(function (a) {
+ resourceAssignmentsStore.removeItem(a.id);
+ });
+ }
+
+ gantt.attachEvent("onGanttReady", function () {
+ if (gantt.config.process_resource_assignments) {
+ gantt.attachEvent("onParse", function () {
+ gantt.silent(function () {
+ resourceAssignmentsStore.clearAll();
+ var totalAssignments = [];
+ gantt.eachTask(function (task) {
+ if (task.type === gantt.config.types.project) {
+ return;
+ }
+
+ var assignments = _loadAssignmentsFromTask(task);
+
+ _assignAssignments(task, assignments);
+
+ assignments.forEach(function (a) {
+ totalAssignments.push(a);
+ });
+ });
+ resourceAssignmentsStore.parse(totalAssignments);
+ });
+ });
+ var batchUpdate = false;
+ var needUpdate = false;
+ var needUpdateFor = {};
+ var undoBatchCancel = false;
+ gantt.attachEvent("onBeforeBatchUpdate", function () {
+ batchUpdate = true;
+ });
+ gantt.attachEvent("onAfterBatchUpdate", function () {
+ if (needUpdate) {
+ var assignmentsHash = {};
+
+ for (var i in needUpdateFor) {
+ assignmentsHash[i] = gantt.getTaskAssignments(needUpdateFor[i].id);
+ }
+
+ for (var i in needUpdateFor) {
+ _syncAssignments(needUpdateFor[i], assignmentsHash[i]);
+ }
+ }
+
+ needUpdate = false;
+ batchUpdate = false;
+ needUpdateFor = {};
+ });
+ gantt.attachEvent("onTaskCreated", function (item) {
+ var assignments = _loadAssignmentsFromTask(item);
+
+ resourceAssignmentsStore.parse(assignments);
+
+ _assignAssignments(item, assignments);
+
+ return true;
+ });
+ gantt.attachEvent("onAfterTaskUpdate", function (id, item) {
+ if (batchUpdate) {
+ needUpdate = true;
+ needUpdateFor[id] = item;
+ } else {
+ _syncOnTaskUpdate(item);
+ }
+ });
+ gantt.attachEvent("onAfterTaskAdd", function (id, item) {
+ if (batchUpdate) {
+ needUpdate = true;
+ needUpdateFor[id] = item;
+ } else {
+ _syncOnTaskUpdate(item);
+ }
+ });
+ /* gantt.attachEvent("onRowDragMove", function (id) {
+ _syncOnTaskUpdate(gantt.getTask(id));
+ });*/
+
+ gantt.attachEvent("onRowDragEnd", function (id) {
+ _syncOnTaskUpdate(gantt.getTask(id));
+ });
+ gantt.$data.tasksStore.attachEvent("onAfterDeleteConfirmed", function (id, item) {
+ var deleteIds = [id];
+ gantt.eachTask(function (task) {
+ deleteIds.push(task.id);
+ }, id);
+
+ _syncOnTaskDelete(deleteIds);
+ });
+ gantt.$data.tasksStore.attachEvent("onClearAll", function () {
+ resourceAssignmentsCache = null;
+ resourceTaskAssignmentsCache = null;
+ taskAssignmentsCache = null;
+ resourceAssignmentsStore.clearAll();
+ return true;
+ });
+ gantt.attachEvent("onTaskIdChange", function (id, new_id) {
+ var taskResources = resourceAssignmentsStore.find(function (a) {
+ return a.task_id == id;
+ });
+ taskResources.forEach(function (a) {
+ a.task_id = new_id;
+ resourceAssignmentsStore.updateItem(a.id);
+ });
+
+ _updateTaskBack(new_id); //any custom logic here
+
+ }); // GS-2144. When we Undo something, the cache should be reset
+ // during the `onStoreUpdated` event to properly update the assignments
+
+ gantt.attachEvent("onBeforeUndo", function (action) {
+ undoBatchCancel = true;
+ return true;
+ });
+ gantt.attachEvent("onAfterUndo", function (action) {
+ undoBatchCancel = true;
+ });
+ var resourceAssignmentsCache = null;
+ var resourceTaskAssignmentsCache = null;
+ var taskAssignmentsCache = null;
+ resourceAssignmentsStore.attachEvent("onStoreUpdated", function resetCache() {
+ if (batchUpdate && !undoBatchCancel) {
+ return true;
+ }
+
+ resourceAssignmentsCache = null;
+ resourceTaskAssignmentsCache = null;
+ taskAssignmentsCache = null;
+ return true;
+ });
+
+ gantt.getResourceAssignments = function (resourceId, taskId) {
+ var searchTaskId = gantt.defined(taskId) && taskId !== null;
+
+ if (resourceAssignmentsCache === null) {
+ resourceAssignmentsCache = {};
+ resourceTaskAssignmentsCache = {};
+ resourceAssignmentsStore.eachItem(function (a) {
+ if (!resourceAssignmentsCache[a.resource_id]) {
+ resourceAssignmentsCache[a.resource_id] = [];
+ }
+
+ resourceAssignmentsCache[a.resource_id].push(a);
+ var resourceTaskCacheKey = a.resource_id + "-" + a.task_id;
+
+ if (!resourceTaskAssignmentsCache[resourceTaskCacheKey]) {
+ resourceTaskAssignmentsCache[resourceTaskCacheKey] = [];
+ }
+
+ resourceTaskAssignmentsCache[resourceTaskCacheKey].push(a);
+ });
+ }
+
+ if (searchTaskId) {
+ return (resourceTaskAssignmentsCache[resourceId + "-" + taskId] || []).slice();
+ } else {
+ return (resourceAssignmentsCache[resourceId] || []).slice();
+ }
+ };
+
+ gantt.getTaskAssignments = function (taskId) {
+ if (taskAssignmentsCache === null) {
+ var result = [];
+ taskAssignmentsCache = {};
+ resourceAssignmentsStore.eachItem(function (a) {
+ if (!taskAssignmentsCache[a.task_id]) {
+ taskAssignmentsCache[a.task_id] = [];
+ }
+
+ taskAssignmentsCache[a.task_id].push(a);
+
+ if (a.task_id == taskId) {
+ result.push(a);
+ }
+ });
+ }
+
+ return (taskAssignmentsCache[taskId] || []).slice();
+ };
+
+ gantt.getTaskResources = function (taskId) {
+ var store = gantt.getDatastore("resource");
+ var assignments = gantt.getTaskAssignments(taskId);
+ var uniqueResources = {};
+ assignments.forEach(function (a) {
+ if (!uniqueResources[a.resource_id]) {
+ uniqueResources[a.resource_id] = a.resource_id;
+ }
+ });
+ var resources = [];
+
+ for (var i in uniqueResources) {
+ var res = store.getItem(uniqueResources[i]);
+
+ if (res) {
+ resources.push(res);
+ }
+ }
+
+ return resources;
+ };
+
+ gantt.updateTaskAssignments = _updateTaskBack;
+ }
+ }, {
+ once: true
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/resources.js":
+/*!*******************************************!*\
+ !*** ./sources/core/plugins/resources.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var helpers = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js");
+
+function createResourceMethods(gantt) {
+ var resourceTaskCache = {};
+ var singleResourceCacheBuilt = false;
+ gantt.$data.tasksStore.attachEvent("onStoreUpdated", function () {
+ resourceTaskCache = {};
+ singleResourceCacheBuilt = false;
+ });
+ gantt.attachEvent("onBeforeGanttRender", function () {
+ resourceTaskCache = {};
+ });
+
+ function getTaskBy(propertyName, propertyValue, typeFilter) {
+ if (typeof propertyName == "function") {
+ return filterResourceTasks(propertyName);
+ } else {
+ if (helpers.isArray(propertyValue)) {
+ return getResourceTasks(propertyName, propertyValue, typeFilter);
+ } else {
+ return getResourceTasks(propertyName, [propertyValue], typeFilter);
+ }
+ }
+ }
+
+ function filterResourceTasks(filter) {
+ var res = [];
+ gantt.eachTask(function (task) {
+ if (filter(task)) {
+ res.push(task);
+ }
+ });
+ return res;
+ }
+
+ var falsyValuePrefix = String(Math.random());
+
+ function resourceHashFunction(value) {
+ if (value === null) {
+ return falsyValuePrefix + String(value);
+ }
+
+ return String(value);
+ }
+
+ function getCacheKey(resourceIds, property, typeFilter) {
+ if (Array.isArray(resourceIds)) {
+ return resourceIds.map(function (value) {
+ return resourceHashFunction(value);
+ }).join("_") + "_".concat(property, "_").concat(typeFilter);
+ } else {
+ return resourceHashFunction(resourceIds) + "_".concat(property, "_").concat(typeFilter);
+ }
+ }
+
+ function getResourceTasks(property, resourceIds, typeFilter) {
+ var res;
+ var cacheKey = getCacheKey(resourceIds, property, JSON.stringify(typeFilter));
+ var matchingResources = {};
+ helpers.forEach(resourceIds, function (resourceId) {
+ matchingResources[resourceHashFunction(resourceId)] = true;
+ });
+
+ if (!resourceTaskCache[cacheKey]) {
+ res = resourceTaskCache[cacheKey] = [];
+ gantt.eachTask(function (task) {
+ if (typeFilter) {
+ if (!typeFilter[gantt.getTaskType(task)]) {
+ return;
+ }
+ } else if (task.type == gantt.config.types.project) {
+ return;
+ }
+
+ if (property in task) {
+ var resourceValue;
+
+ if (!helpers.isArray(task[property])) {
+ resourceValue = [task[property]];
+ } else {
+ resourceValue = task[property];
+ }
+
+ helpers.forEach(resourceValue, function (value) {
+ var resourceValue = value && value.resource_id ? value.resource_id : value;
+
+ if (matchingResources[resourceHashFunction(resourceValue)]) {
+ res.push(task);
+ } else if (!singleResourceCacheBuilt) {
+ var key = getCacheKey(value, property);
+
+ if (!resourceTaskCache[key]) {
+ resourceTaskCache[key] = [];
+ }
+
+ resourceTaskCache[key].push(task);
+ }
+ });
+ }
+ });
+ singleResourceCacheBuilt = true;
+ } else {
+ res = resourceTaskCache[cacheKey];
+ }
+
+ return res;
+ }
+
+ function selectAssignments(resourceId, taskId, result) {
+ var property = gantt.config.resource_property;
+ var owners = [];
+
+ if (gantt.getDatastore("task").exists(taskId)) {
+ var task = gantt.getTask(taskId);
+ owners = task[property] || [];
+ }
+
+ if (!Array.isArray(owners)) {
+ owners = [owners];
+ }
+
+ for (var i = 0; i < owners.length; i++) {
+ if (owners[i].resource_id == resourceId) {
+ result.push({
+ task_id: task.id,
+ resource_id: owners[i].resource_id,
+ value: owners[i].value
+ });
+ }
+ }
+ }
+
+ function getResourceAssignments(resourceId, taskId) {
+ // resource assignment as an independent module:
+ // {taskId:, resourceId, value}
+ // TODO: probably should add a separate datastore for these
+ var assignments = [];
+ var property = gantt.config.resource_property;
+
+ if (taskId !== undefined) {
+ selectAssignments(resourceId, taskId, assignments);
+ } else {
+ var tasks = gantt.getTaskBy(property, resourceId);
+ tasks.forEach(function (task) {
+ selectAssignments(resourceId, task.id, assignments);
+ });
+ }
+
+ return assignments;
+ }
+
+ return {
+ getTaskBy: getTaskBy,
+ getResourceAssignments: getResourceAssignments
+ };
+}
+
+function createHelper(gantt) {
+ var resourcePlugin = {
+ renderEditableLabel: function renderEditableLabel(start_date, end_date, resource, tasks, assignments) {
+ var editable = gantt.config.readonly ? "" : "contenteditable";
+
+ if (start_date < resource.end_date && end_date > resource.start_date) {
+ for (var i = 0; i < assignments.length; i++) {
+ var a = assignments[i];
+ return "<div " + editable + " data-assignment-cell data-assignment-id='" + a.id + "'" + " data-row-id='" + resource.id + "'" + " data-task='" + resource.$task_id + "'" + " data-start-date='" + gantt.templates.format_date(start_date) + "'" + " data-end-date='" + gantt.templates.format_date(end_date) + "'>" + a.value + "</div>";
+ }
+
+ return "<div " + editable + " data-assignment-cell data-empty " + " data-row-id='" + resource.id + "'" + " data-resource-id='" + resource.$resource_id + "'" + " data-task='" + resource.$task_id + "'" + " data-start-date='" + gantt.templates.format_date(start_date) + "'" + "' data-end-date='" + gantt.templates.format_date(end_date) + "'>-</div>";
+ }
+
+ return "";
+ },
+ renderSummaryLabel: function renderSummaryLabel(start_date, end_date, resource, tasks, assignments) {
+ var sum = assignments.reduce(function (total, assignment) {
+ return total + Number(assignment.value);
+ }, 0);
+
+ if (sum % 1) {
+ sum = Math.round(sum * 10) / 10;
+ }
+
+ if (sum) {
+ return "<div>" + sum + "</div>";
+ }
+
+ return "";
+ },
+ editableResourceCellTemplate: function editableResourceCellTemplate(start_date, end_date, resource, tasks, assignments) {
+ if (resource.$role === "task") {
+ return resourcePlugin.renderEditableLabel(start_date, end_date, resource, tasks, assignments);
+ } else {
+ return resourcePlugin.renderSummaryLabel(start_date, end_date, resource, tasks, assignments);
+ }
+ },
+ editableResourceCellClass: function editableResourceCellClass(start_date, end_date, resource, tasks, assignments) {
+ var css = [];
+ css.push("resource_marker");
+
+ if (resource.$role === "task") {
+ css.push("task_cell");
+ } else {
+ css.push("resource_cell");
+ }
+
+ var sum = assignments.reduce(function (total, assignment) {
+ return total + Number(assignment.value);
+ }, 0);
+ var capacity = Number(resource.capacity);
+
+ if (isNaN(capacity)) {
+ capacity = 8;
+ }
+
+ if (sum <= capacity) {
+ css.push("workday_ok");
+ } else {
+ css.push("workday_over");
+ }
+
+ return css.join(" ");
+ },
+ getSummaryResourceAssignments: function getResourceAssignments(resourceId) {
+ var assignments;
+ var store = gantt.getDatastore(gantt.config.resource_store);
+ var resource = store.getItem(resourceId);
+
+ if (resource.$role === "task") {
+ assignments = gantt.getResourceAssignments(resource.$resource_id, resource.$task_id);
+ } else {
+ assignments = gantt.getResourceAssignments(resourceId);
+
+ if (store.eachItem) {
+ store.eachItem(function (childResource) {
+ if (childResource.$role !== "task") {
+ assignments = assignments.concat(gantt.getResourceAssignments(childResource.id));
+ }
+ }, resourceId);
+ }
+ }
+
+ return assignments;
+ },
+ initEditableDiagram: function initEditableDiagram() {
+ gantt.config.resource_render_empty_cells = true;
+
+ (function () {
+ /// salesforce locker workaround
+ // SF removes 'contenteditable' attribute from cells
+ // restore it on render
+ var timeoutId = null;
+
+ function makeEditable() {
+ if (timeoutId) {
+ cancelAnimationFrame(timeoutId);
+ }
+
+ timeoutId = requestAnimationFrame(function () {
+ var cells = Array.prototype.slice.call(gantt.$container.querySelectorAll(".resourceTimeline_cell [data-assignment-cell]"));
+ cells.forEach(function (cell) {
+ cell.contentEditable = true;
+ });
+ });
+ return true;
+ }
+
+ gantt.attachEvent("onGanttReady", function () {
+ gantt.getDatastore(gantt.config.resource_assignment_store).attachEvent("onStoreUpdated", makeEditable);
+ gantt.getDatastore(gantt.config.resource_store).attachEvent("onStoreUpdated", makeEditable);
+ }, {
+ once: true
+ });
+ gantt.attachEvent("onGanttLayoutReady", function () {
+ var ganttViews = gantt.$layout.getCellsByType("viewCell");
+ ganttViews.forEach(function (view) {
+ if (view.$config && view.$config.view === "resourceTimeline" && view.$content) {
+ view.$content.attachEvent("onScroll", makeEditable);
+ }
+ });
+ });
+ })();
+
+ gantt.attachEvent("onGanttReady", function () {
+ var assignmentEditInProcess = false;
+ gantt.event(gantt.$container, "keypress", function (e) {
+ var target = e.target.closest(".resourceTimeline_cell [data-assignment-cell]");
+
+ if (target) {
+ if (e.keyCode === 13 || e.keyCode === 27) {
+ target.blur();
+ }
+ }
+ });
+ gantt.event(gantt.$container, "focusout", function (e) {
+ if (assignmentEditInProcess) {
+ return;
+ }
+
+ assignmentEditInProcess = true;
+ setTimeout(function () {
+ assignmentEditInProcess = false;
+ }, 300);
+ var target = e.target.closest(".resourceTimeline_cell [data-assignment-cell]");
+
+ if (target) {
+ var strValue = (target.innerText || "").trim();
+
+ if (strValue == "-") {
+ strValue = "0";
+ }
+
+ var value = Number(strValue);
+ var rowId = target.getAttribute("data-row-id");
+ var assignmentId = target.getAttribute("data-assignment-id");
+ var taskId = target.getAttribute("data-task");
+ var resourceId = target.getAttribute("data-resource-id");
+ var startDate = gantt.templates.parse_date(target.getAttribute("data-start-date"));
+ var endDate = gantt.templates.parse_date(target.getAttribute("data-end-date"));
+ var assignmentStore = gantt.getDatastore(gantt.config.resource_assignment_store);
+
+ if (isNaN(value)) {
+ gantt.getDatastore(gantt.config.resource_store).refresh(rowId);
+ } else {
+ var task = gantt.getTask(taskId); // GS-2141. Track the changes by the Undo extension
+
+ if (gantt.plugins().undo) {
+ gantt.ext.undo.saveState(taskId, "task");
+ }
+
+ if (assignmentId) {
+ var assignment = assignmentStore.getItem(assignmentId);
+
+ if (value === assignment.value) {
+ return;
+ }
+
+ if (assignment.start_date.valueOf() === startDate.valueOf() && assignment.end_date.valueOf() === endDate.valueOf()) {
+ assignment.value = value;
+
+ if (!value) {
+ assignmentStore.removeItem(assignment.id);
+ } else {
+ assignmentStore.updateItem(assignment.id);
+ }
+ } else {
+ if (assignment.end_date.valueOf() > endDate.valueOf()) {
+ var nextChunk = gantt.copy(assignment);
+ nextChunk.id = gantt.uid();
+ nextChunk.start_date = endDate;
+ nextChunk.duration = gantt.calculateDuration({
+ start_date: nextChunk.start_date,
+ end_date: nextChunk.end_date,
+ task: task
+ });
+ nextChunk.delay = gantt.calculateDuration({
+ start_date: task.start_date,
+ end_date: nextChunk.start_date,
+ task: task
+ });
+ nextChunk.mode = assignment.mode || "default";
+
+ if (nextChunk.duration !== 0) {
+ assignmentStore.addItem(nextChunk);
+ }
+ }
+
+ if (assignment.start_date.valueOf() < startDate.valueOf()) {
+ assignment.end_date = startDate;
+ assignment.duration = gantt.calculateDuration({
+ start_date: assignment.start_date,
+ end_date: assignment.end_date,
+ task: task
+ });
+ assignment.mode = "fixedDuration";
+
+ if (assignment.duration === 0) {
+ assignmentStore.removeItem(assignment.id);
+ } else {
+ assignmentStore.updateItem(assignment.id);
+ }
+ } else {
+ assignmentStore.removeItem(assignment.id);
+ }
+
+ if (value) {
+ assignmentStore.addItem({
+ task_id: assignment.task_id,
+ resource_id: assignment.resource_id,
+ value: value,
+ start_date: startDate,
+ end_date: endDate,
+ duration: gantt.calculateDuration({
+ start_date: startDate,
+ end_date: endDate,
+ task: task
+ }),
+ delay: gantt.calculateDuration({
+ start_date: task.start_date,
+ end_date: startDate,
+ task: task
+ }),
+ mode: "fixedDuration"
+ });
+ }
+ }
+
+ gantt.updateTaskAssignments(task.id);
+ gantt.updateTask(task.id);
+ } else if (value) {
+ var assignment = {
+ task_id: taskId,
+ resource_id: resourceId,
+ value: value,
+ start_date: startDate,
+ end_date: endDate,
+ duration: gantt.calculateDuration({
+ start_date: startDate,
+ end_date: endDate,
+ task: task
+ }),
+ delay: gantt.calculateDuration({
+ start_date: task.start_date,
+ end_date: startDate,
+ task: task
+ }),
+ mode: "fixedDuration"
+ };
+ assignmentStore.addItem(assignment);
+ gantt.updateTaskAssignments(task.id);
+ gantt.updateTask(task.id);
+ }
+ }
+ }
+ });
+ }, {
+ once: true
+ });
+ }
+ };
+ return resourcePlugin;
+}
+
+module.exports = function (gantt) {
+ var methods = createResourceMethods(gantt);
+ gantt.ext.resources = createHelper(gantt);
+ gantt.config.resources = {
+ dataprocessor_assignments: false,
+ dataprocessor_resources: false,
+ editable_resource_diagram: false,
+ resource_store: {
+ type: "treeDataStore",
+ fetchTasks: false,
+ initItem: function initItem(item) {
+ item.parent = item.parent || gantt.config.root_id;
+ item[gantt.config.resource_property] = item.parent;
+ item.open = true;
+ return item;
+ }
+ },
+ lightbox_resources: function selectResourceControlOptions(resources) {
+ var lightboxOptions = [];
+ var store = gantt.getDatastore(gantt.config.resource_store);
+ resources.forEach(function (res) {
+ if (!store.hasChild(res.id)) {
+ var copy = gantt.copy(res);
+ copy.key = res.id;
+ copy.label = res.text;
+ lightboxOptions.push(copy);
+ }
+ });
+ return lightboxOptions;
+ }
+ };
+ gantt.attachEvent("onBeforeGanttReady", function () {
+ if (gantt.getDatastore(gantt.config.resource_store)) {
+ return;
+ }
+
+ var resourceStoreConfig = gantt.config.resources ? gantt.config.resources.resource_store : undefined;
+ var fetchTasks = resourceStoreConfig ? resourceStoreConfig.fetchTasks : undefined;
+
+ if (gantt.config.resources && gantt.config.resources.editable_resource_diagram) {
+ fetchTasks = true;
+ }
+
+ var initItems = function initItems(item) {
+ item.parent = item.parent || gantt.config.root_id;
+ item[gantt.config.resource_property] = item.parent;
+ item.open = true;
+ return item;
+ };
+
+ if (resourceStoreConfig && resourceStoreConfig.initItem) {
+ initItems = resourceStoreConfig.initItem;
+ }
+
+ var storeType = resourceStoreConfig && resourceStoreConfig.type ? resourceStoreConfig.type : "treeDatastore";
+ gantt.$resourcesStore = gantt.createDatastore({
+ name: gantt.config.resource_store,
+ type: storeType,
+ fetchTasks: fetchTasks !== undefined ? fetchTasks : false,
+ initItem: initItems
+ });
+ gantt.$data.resourcesStore = gantt.$resourcesStore;
+ gantt.$resourcesStore.attachEvent("onParse", function () {
+ function selectResourceControlOptions(resources) {
+ var lightboxOptions = [];
+ resources.forEach(function (res) {
+ if (!gantt.$resourcesStore.hasChild(res.id)) {
+ var copy = gantt.copy(res);
+ copy.key = res.id;
+ copy.label = res.text;
+ lightboxOptions.push(copy);
+ }
+ });
+ return lightboxOptions;
+ }
+
+ var lightboxOptionsFnc = selectResourceControlOptions;
+
+ if (gantt.config.resources && gantt.config.resources.lightbox_resources) {
+ lightboxOptionsFnc = gantt.config.resources.lightbox_resources;
+ }
+
+ var options = lightboxOptionsFnc(gantt.$resourcesStore.getItems());
+ gantt.updateCollection("resourceOptions", options);
+ });
+ });
+ gantt.getTaskBy = methods.getTaskBy;
+ gantt.getResourceAssignments = methods.getResourceAssignments;
+ gantt.config.resource_property = "owner_id";
+ gantt.config.resource_store = "resource";
+ gantt.config.resource_render_empty_cells = false;
+ /**
+ * these are placeholder functions that should be redefined by the user
+ */
+
+ gantt.templates.histogram_cell_class = function (start_date, end_date, resource, tasks, assignments) {};
+
+ gantt.templates.histogram_cell_label = function (start_date, end_date, resource, tasks, assignments) {
+ return tasks.length + "/3";
+ };
+
+ gantt.templates.histogram_cell_allocated = function (start_date, end_date, resource, tasks, assignments) {
+ return tasks.length / 3;
+ };
+
+ gantt.templates.histogram_cell_capacity = function (start_date, end_date, resource, tasks, assignments) {
+ return 0;
+ };
+
+ var defaultResourceCellClass = function defaultResourceCellClass(start, end, resource, tasks, assignments) {
+ var css = "";
+
+ if (tasks.length <= 1) {
+ css = "gantt_resource_marker_ok";
+ } else {
+ css = "gantt_resource_marker_overtime";
+ }
+
+ return css;
+ };
+
+ var defaultResourceCellTemplate = function defaultResourceCellTemplate(start, end, resource, tasks, assignments) {
+ return tasks.length * 8;
+ };
+
+ gantt.templates.resource_cell_value = defaultResourceCellTemplate;
+ gantt.templates.resource_cell_class = defaultResourceCellClass; //editable_resource_diagram
+
+ gantt.attachEvent("onBeforeGanttReady", function () {
+ if (gantt.config.resources && gantt.config.resources.editable_resource_diagram) {
+ gantt.config.resource_render_empty_cells = true;
+
+ if (gantt.templates.resource_cell_value === defaultResourceCellTemplate) {
+ gantt.templates.resource_cell_value = gantt.ext.resources.editableResourceCellTemplate;
+ }
+
+ if (gantt.templates.resource_cell_class === defaultResourceCellClass) {
+ gantt.templates.resource_cell_class = gantt.ext.resources.editableResourceCellClass;
+ }
+
+ gantt.ext.resources.initEditableDiagram(gantt);
+ }
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/plugins/wbs.js":
+/*!*************************************!*\
+ !*** ./sources/core/plugins/wbs.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var createWbs = function createWbs(gantt) {
+ return {
+ _needRecalc: true,
+ reset: function reset() {
+ this._needRecalc = true;
+ },
+ _isRecalcNeeded: function _isRecalcNeeded() {
+ return !this._isGroupSort() && this._needRecalc;
+ },
+ _isGroupSort: function _isGroupSort() {
+ return !!gantt.getState().group_mode;
+ },
+ _getWBSCode: function _getWBSCode(task) {
+ if (!task) return "";
+
+ if (this._isRecalcNeeded()) {
+ this._calcWBS();
+ }
+
+ if (task.$virtual) return "";
+ if (this._isGroupSort()) return task.$wbs || "";
+
+ if (!task.$wbs) {
+ this.reset();
+
+ this._calcWBS();
+ }
+
+ return task.$wbs;
+ },
+ _setWBSCode: function _setWBSCode(task, value) {
+ task.$wbs = value;
+ },
+ getWBSCode: function getWBSCode(task) {
+ return this._getWBSCode(task);
+ },
+ getByWBSCode: function getByWBSCode(code) {
+ var parts = code.split(".");
+ var currentNode = gantt.config.root_id;
+
+ for (var i = 0; i < parts.length; i++) {
+ var children = gantt.getChildren(currentNode);
+ var index = parts[i] * 1 - 1;
+
+ if (gantt.isTaskExists(children[index])) {
+ currentNode = children[index];
+ } else {
+ return null;
+ }
+ }
+
+ if (gantt.isTaskExists(currentNode)) {
+ return gantt.getTask(currentNode);
+ } else {
+ return null;
+ }
+ },
+ _calcWBS: function _calcWBS() {
+ if (!this._isRecalcNeeded()) return;
+ var _isFirst = true;
+ gantt.eachTask(function (ch) {
+ if (_isFirst) {
+ _isFirst = false;
+
+ this._setWBSCode(ch, "1");
+
+ return;
+ }
+
+ var _prevSibling = gantt.getPrevSibling(ch.id);
+
+ if (_prevSibling !== null) {
+ var _wbs = gantt.getTask(_prevSibling).$wbs;
+
+ if (_wbs) {
+ _wbs = _wbs.split(".");
+ _wbs[_wbs.length - 1]++;
+
+ this._setWBSCode(ch, _wbs.join("."));
+ }
+ } else {
+ var _parent = gantt.getParent(ch.id);
+
+ this._setWBSCode(ch, gantt.getTask(_parent).$wbs + ".1");
+ }
+ }, gantt.config.root_id, this);
+ this._needRecalc = false;
+ }
+ };
+};
+
+module.exports = function (gantt) {
+ var wbs = createWbs(gantt);
+
+ gantt.getWBSCode = function getWBSCode(task) {
+ return wbs.getWBSCode(task);
+ };
+
+ gantt.getTaskByWBSCode = function (code) {
+ return wbs.getByWBSCode(code);
+ };
+
+ function resetCache() {
+ wbs.reset();
+ return true;
+ }
+
+ gantt.attachEvent("onAfterTaskMove", resetCache);
+ gantt.attachEvent("onBeforeParse", resetCache);
+ gantt.attachEvent("onAfterTaskDelete", resetCache);
+ gantt.attachEvent("onAfterTaskAdd", resetCache);
+ gantt.attachEvent("onAfterSort", resetCache);
+};
+
+/***/ }),
+
+/***/ "./sources/core/remote/remote_events.js":
+/*!**********************************************!*\
+ !*** ./sources/core/remote/remote_events.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var remote_client = __webpack_require__(/*! remote-client */ "./node_modules/remote-client/dist/remote.es6.js");
+
+module.exports = {
+ remoteEvents: function remoteEvents(url, token) {
+ var _this = this;
+
+ var remote = new remote_client.Client({
+ url: url,
+ token: token
+ }); // temporary patch, as we do not want credentials
+
+ remote.fetch = function (url, body) {
+ var req = {
+ headers: this.headers()
+ };
+
+ if (body) {
+ req.method = "POST";
+ req.body = body;
+ }
+
+ return fetch(url, req).then(function (res) {
+ return res.json();
+ });
+ };
+
+ this._ready = remote.load().then(function (back) {
+ return _this._remote = back;
+ });
+
+ function ready() {
+ return this._ready;
+ }
+
+ function on(name, handler) {
+ this.ready().then(function (back) {
+ if (typeof name === "string") back.on(name, handler);else {
+ for (var key in name) {
+ back.on(key, name[key]);
+ }
+ }
+ });
+ }
+
+ this.ready = ready;
+ this.on = on;
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/resource_timetable_builder.js":
+/*!****************************************************!*\
+ !*** ./sources/core/resource_timetable_builder.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var helpers = __webpack_require__(/*! ../utils/helpers */ "./sources/utils/helpers.js");
+
+module.exports = function createResourceTimelineBuilder(gantt) {
+ var resourceTaskCache = {};
+ gantt.$data.tasksStore.attachEvent("onStoreUpdated", function () {
+ resourceTaskCache = {};
+ });
+
+ function getResourceLoad(resource, resourceProperty, scale, timeline) {
+ var cacheKey = resource.id + "_" + resourceProperty + "_" + scale.unit + "_" + scale.step;
+ var res;
+
+ if (!resourceTaskCache[cacheKey]) {
+ res = resourceTaskCache[cacheKey] = calculateResourceLoad(resource, resourceProperty, scale, timeline);
+ } else {
+ res = resourceTaskCache[cacheKey];
+ }
+
+ return res;
+ }
+
+ function calculateResourceLoadFromAssignments(items, scale, assignmentsPassed) {
+ var scaleUnit = scale.unit;
+ var scaleStep = scale.step;
+ var timegrid = {};
+ var precalculatedTimes = {};
+
+ for (var i = 0; i < items.length; i++) {
+ var item = items[i];
+ var task = item;
+
+ if (assignmentsPassed) {
+ task = gantt.getTask(item.task_id);
+ }
+
+ var minDate = item.start_date || task.start_date;
+ var maxDate = item.end_date || task.end_date;
+
+ if (assignmentsPassed) {
+ if (item.start_date) {
+ minDate = new Date(Math.max(item.start_date.valueOf(), task.start_date.valueOf()));
+ }
+
+ if (item.end_date) {
+ maxDate = new Date(Math.min(item.end_date.valueOf(), task.end_date.valueOf()));
+ }
+ }
+
+ var firstColumn = helpers.findBinary(scale.trace_x, minDate.valueOf());
+ var currDate = new Date(scale.trace_x[firstColumn] || gantt.date[scaleUnit + "_start"](new Date(minDate)));
+ var calendar = gantt.config.work_time ? gantt.getTaskCalendar(task) : gantt;
+ precalculatedTimes[calendar.id] = {};
+
+ while (currDate < maxDate) {
+ var cachedTimes = precalculatedTimes[calendar.id];
+ var date = currDate;
+ var timestamp = date.valueOf();
+ currDate = gantt.date.add(currDate, scaleStep, scaleUnit);
+
+ if (cachedTimes[timestamp] === false) {
+ continue;
+ }
+
+ var isWorkTime = calendar.isWorkTime({
+ date: date,
+ task: task,
+ unit: scaleUnit
+ });
+
+ if (!isWorkTime) {
+ cachedTimes[timestamp] = false;
+ continue;
+ }
+
+ if (!timegrid[timestamp]) {
+ timegrid[timestamp] = {
+ tasks: [],
+ assignments: []
+ };
+ }
+
+ timegrid[timestamp].tasks.push(task);
+
+ if (assignmentsPassed) {
+ timegrid[timestamp].assignments.push(item);
+ }
+ }
+ }
+
+ return timegrid;
+ }
+
+ function calculateResourceLoad(resource, resourceProperty, scale, timeline) {
+ var items;
+ var assignmentsPassed = false;
+ var timegrid = {};
+
+ if (gantt.config.process_resource_assignments && resourceProperty === gantt.config.resource_property) {
+ if (resource.$role == "task") {
+ items = gantt.getResourceAssignments(resource.$resource_id, resource.$task_id);
+ } else {
+ items = gantt.getResourceAssignments(resource.id);
+ }
+
+ assignmentsPassed = true;
+ } else if (resource.$role == "task") {
+ items = [];
+ } else {
+ items = gantt.getTaskBy(resourceProperty, resource.id);
+ }
+
+ var timegrid = calculateResourceLoadFromAssignments(items, scale, assignmentsPassed);
+ var scaleUnit = scale.unit;
+ var scaleStep = scale.step;
+ var timetable = [];
+ var start, end, tasks, assignments, cell;
+ var config = timeline.$getConfig();
+
+ for (var i = 0; i < scale.trace_x.length; i++) {
+ start = new Date(scale.trace_x[i]);
+ end = gantt.date.add(start, scaleStep, scaleUnit);
+ cell = timegrid[start.valueOf()] || {};
+ tasks = cell.tasks || [];
+ assignments = cell.assignments || [];
+
+ if (tasks.length || config.resource_render_empty_cells) {
+ timetable.push({
+ start_date: start,
+ end_date: end,
+ tasks: tasks,
+ assignments: assignments
+ });
+ } else {
+ timetable.push(null);
+ }
+ }
+
+ return timetable;
+ }
+
+ return getResourceLoad;
+};
+
+/***/ }),
+
+/***/ "./sources/core/tasks.js":
+/*!*******************************!*\
+ !*** ./sources/core/tasks.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.isReadonly = function (item) {
+ if ((typeof item == "number" || typeof item == "string") && gantt.isTaskExists(item)) {
+ item = gantt.getTask(item);
+ }
+
+ if (item && item[this.config.editable_property]) {
+ return false;
+ } else {
+ return item && item[this.config.readonly_property] || this.config.readonly;
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/configurable.js":
+/*!*****************************************!*\
+ !*** ./sources/core/ui/configurable.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+function extendSettings(store, parentSettings) {
+ var own = this.$config[store];
+
+ if (own) {
+ if (!own.$extendedConfig) {
+ own.$extendedConfig = true;
+ Object.setPrototypeOf(own, parentSettings);
+ }
+
+ return own;
+ } else {
+ return parentSettings;
+ }
+}
+
+var configurable = function configurable(parentView) {
+ var parentConfig, parentTemplates;
+ return {
+ $getConfig: function $getConfig() {
+ if (!parentConfig) {
+ parentConfig = parentView ? parentView.$getConfig() : this.$gantt.config;
+ }
+
+ if (!this.$config.config) {
+ return parentConfig;
+ } else {
+ return extendSettings.call(this, "config", parentConfig);
+ }
+ },
+ $getTemplates: function $getTemplates() {
+ if (!parentTemplates) {
+ parentTemplates = parentView ? parentView.$getTemplates() : this.$gantt.templates;
+ }
+
+ if (!this.$config.templates) {
+ return parentTemplates;
+ } else {
+ return extendSettings.call(this, "templates", parentTemplates);
+ }
+ }
+ };
+};
+
+module.exports = function (obj, parent) {
+ utils.mixin(obj, configurable(parent));
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/gantt_layers.js":
+/*!*****************************************!*\
+ !*** ./sources/core/ui/gantt_layers.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createLayerFactory = __webpack_require__(/*! ./render/layer_engine */ "./sources/core/ui/render/layer_engine.js");
+
+var getVisibleTaskRange = __webpack_require__(/*! ./render/viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+var getVisibleLinksRangeFactory = __webpack_require__(/*! ./render/viewport/factory/get_visible_link_range */ "./sources/core/ui/render/viewport/factory/get_visible_link_range.js");
+
+var isLinkInViewport = __webpack_require__(/*! ./render/viewport/is_link_in_viewport */ "./sources/core/ui/render/viewport/is_link_in_viewport.js");
+
+function initLayer(layer, gantt) {
+ if (!layer.view) {
+ return;
+ }
+
+ var view = layer.view;
+
+ if (typeof view === "string") {
+ view = gantt.$ui.getView(view);
+ }
+
+ if (view && view.attachEvent) {
+ view.attachEvent("onScroll", function () {
+ var state = gantt.$services.getService("state"); // don't repaint if we're inside batchUpdate, a complete repaint will be called afterwards
+
+ if (!state.getState("batchUpdate").batch_update && !view.$config.$skipSmartRenderOnScroll) {
+ if (layer.requestUpdate) {
+ layer.requestUpdate();
+ }
+ }
+ });
+ }
+}
+
+var createLayerEngine = function createLayerEngine(gantt) {
+ var factory = createLayerFactory(gantt);
+ return {
+ getDataRender: function getDataRender(name) {
+ return gantt.$services.getService("layer:" + name) || null;
+ },
+ createDataRender: function createDataRender(config) {
+ var name = config.name,
+ defaultContainer = config.defaultContainer,
+ previusSiblingContainer = config.defaultContainerSibling;
+ var layers = factory.createGroup(defaultContainer, previusSiblingContainer, function (itemId, item) {
+ if (layers.filters) {
+ for (var i = 0; i < layers.filters.length; i++) {
+ if (layers.filters[i](itemId, item) === false) {
+ return false;
+ }
+ }
+ } else {
+ return true;
+ }
+ }, initLayer);
+ gantt.$services.setService("layer:" + name, function () {
+ return layers;
+ });
+ gantt.attachEvent("onGanttReady", function () {
+ layers.addLayer(); // init layers on start
+ });
+ return layers;
+ },
+ init: function init() {
+ var taskLayers = this.createDataRender({
+ name: "task",
+ defaultContainer: function defaultContainer() {
+ if (gantt.$task_data) {
+ return gantt.$task_data;
+ } else if (gantt.$ui.getView("timeline")) {
+ return gantt.$ui.getView("timeline").$task_data;
+ }
+ },
+ defaultContainerSibling: function defaultContainerSibling() {
+ if (gantt.$task_links) {
+ return gantt.$task_links;
+ } else if (gantt.$ui.getView("timeline")) {
+ return gantt.$ui.getView("timeline").$task_links;
+ }
+ },
+ filter: function filter(item) {}
+ }, gantt);
+ var linkLayers = this.createDataRender({
+ name: "link",
+ defaultContainer: function defaultContainer() {
+ if (gantt.$task_data) {
+ return gantt.$task_data;
+ } else if (gantt.$ui.getView("timeline")) {
+ return gantt.$ui.getView("timeline").$task_data;
+ }
+ }
+ }, gantt);
+ return {
+ addTaskLayer: function addTaskLayer(config) {
+ var rangeFunction = getVisibleTaskRange;
+
+ if (typeof config === "function") {
+ config = {
+ renderer: {
+ render: config,
+ getVisibleRange: rangeFunction
+ }
+ };
+ } else {
+ if (config.renderer && !config.renderer.getVisibleRange) {
+ config.renderer.getVisibleRange = rangeFunction;
+ }
+ }
+
+ config.view = "timeline";
+ return taskLayers.addLayer(config);
+ },
+ _getTaskLayers: function _getTaskLayers() {
+ return taskLayers.getLayers();
+ },
+ removeTaskLayer: function removeTaskLayer(id) {
+ taskLayers.removeLayer(id);
+ },
+ _clearTaskLayers: function _clearTaskLayers() {
+ taskLayers.clear();
+ },
+ addLinkLayer: function addLinkLayer(config) {
+ var rangeFunction = getVisibleLinksRangeFactory();
+
+ if (typeof config === "function") {
+ config = {
+ renderer: {
+ render: config,
+ getVisibleRange: rangeFunction
+ }
+ };
+ } else {
+ if (config.renderer && !config.renderer.getVisibleRange) {
+ config.renderer.getVisibleRange = rangeFunction;
+ }
+ }
+
+ config.view = "timeline";
+
+ if (config && config.renderer) {
+ if (!config.renderer.getRectangle && !config.renderer.isInViewPort) {
+ config.renderer.isInViewPort = isLinkInViewport;
+ }
+ }
+
+ return linkLayers.addLayer(config);
+ },
+ _getLinkLayers: function _getLinkLayers() {
+ return linkLayers.getLayers();
+ },
+ removeLinkLayer: function removeLinkLayer(id) {
+ linkLayers.removeLayer(id);
+ },
+ _clearLinkLayers: function _clearLinkLayers() {
+ linkLayers.clear();
+ }
+ };
+ }
+ };
+};
+
+module.exports = createLayerEngine;
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/controller.js":
+/*!****************************************************!*\
+ !*** ./sources/core/ui/grid/editors/controller.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getKeyboardMapping = __webpack_require__(/*! ./keyboard_mappings */ "./sources/core/ui/grid/editors/keyboard_mappings.js");
+
+var textEditorFactory = __webpack_require__(/*! ./editors/text */ "./sources/core/ui/grid/editors/editors/text.js"),
+ numberEditorFactory = __webpack_require__(/*! ./editors/number */ "./sources/core/ui/grid/editors/editors/number.js"),
+ selectEditorFactory = __webpack_require__(/*! ./editors/select */ "./sources/core/ui/grid/editors/editors/select.js"),
+ dateEditorFactory = __webpack_require__(/*! ./editors/date */ "./sources/core/ui/grid/editors/editors/date.js"),
+ predecessorEditorFactory = __webpack_require__(/*! ./editors/predecessor */ "./sources/core/ui/grid/editors/editors/predecessor.js"),
+ durationEditorFactory = __webpack_require__(/*! ./editors/duration */ "./sources/core/ui/grid/editors/editors/duration.js");
+
+var utils = __webpack_require__(/*! ../../../../utils/utils */ "./sources/utils/utils.js");
+
+var domHelpers = __webpack_require__(/*! ../../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var eventable = __webpack_require__(/*! ../../../../utils/eventable */ "./sources/utils/eventable.js");
+
+var linkedPropertiesProcessor = __webpack_require__(/*! ./linked_properties */ "./sources/core/ui/grid/editors/linked_properties.js");
+
+function initConfigs(gantt) {
+ gantt.config.editor_types = {
+ text: new (textEditorFactory(gantt))(),
+ number: new (numberEditorFactory(gantt))(),
+ select: new (selectEditorFactory(gantt))(),
+ date: new (dateEditorFactory(gantt))(),
+ predecessor: new (predecessorEditorFactory(gantt))(),
+ duration: new (durationEditorFactory(gantt))()
+ };
+}
+
+function create(gantt) {
+ var keyboardMapping = getKeyboardMapping(gantt);
+ var eventBus = {};
+ eventable(eventBus);
+
+ function createGridEditors(grid) {
+ function _getGridCellFromNode(node) {
+ if (!domHelpers.isChildOf(node, grid.$grid)) {
+ return null;
+ }
+
+ var row = domHelpers.locateAttribute(node, grid.$config.item_attribute);
+ var cell = domHelpers.locateAttribute(node, "data-column-name");
+
+ if (row && cell) {
+ var columnName = cell.getAttribute("data-column-name");
+ var id = row.getAttribute(grid.$config.item_attribute);
+ return {
+ id: id,
+ columnName: columnName
+ };
+ }
+
+ return null;
+ }
+
+ function _getEditorPosition(itemId, columnName) {
+ var config = grid.$getConfig();
+ var top = grid.getItemTop(itemId);
+ var height = grid.getItemHeight(itemId);
+ var cols = grid.getGridColumns();
+ var left = 0,
+ right = 0,
+ width = 0;
+
+ for (var i = 0; i < cols.length; i++) {
+ if (cols[i].name == columnName) {
+ width = cols[i].width;
+ break;
+ }
+
+ if (config.rtl) {
+ right += cols[i].width;
+ } else {
+ left += cols[i].width;
+ }
+ }
+
+ if (config.rtl) {
+ return {
+ top: top,
+ right: right,
+ height: height,
+ width: width
+ };
+ } else {
+ return {
+ top: top,
+ left: left,
+ height: height,
+ width: width
+ };
+ }
+ }
+
+ function findVisibleIndex(grid, columnName) {
+ var columns = grid.getGridColumns();
+
+ for (var i = 0; i < columns.length; i++) {
+ if (columns[i].name == columnName) {
+ return i;
+ }
+ }
+
+ return 0;
+ }
+
+ function _createPlaceholder(itemId, columnName) {
+ var config = grid.$getConfig();
+
+ var pos = _getEditorPosition(itemId, columnName);
+
+ var el = document.createElement("div");
+ el.className = "gantt_grid_editor_placeholder";
+ el.setAttribute(grid.$config.item_attribute, itemId);
+ el.setAttribute(grid.$config.bind + "_id", itemId); // for backward compatibility
+
+ el.setAttribute("data-column-name", columnName);
+ var visibleIndex = findVisibleIndex(grid, columnName);
+ el.setAttribute("data-column-index", visibleIndex);
+
+ gantt._waiAria.inlineEditorAttr(el);
+
+ if (config.rtl) {
+ el.style.cssText = ["top:" + pos.top + "px", "right:" + pos.right + "px", "width:" + pos.width + "px", "height:" + pos.height + "px"].join(";");
+ } else {
+ el.style.cssText = ["top:" + pos.top + "px", "left:" + pos.left + "px", "width:" + pos.width + "px", "height:" + pos.height + "px"].join(";");
+ }
+
+ return el;
+ }
+
+ var updateTaskDateProperties = linkedPropertiesProcessor(gantt);
+ var handlers = [];
+ var ganttHandlers = [];
+ var store = null;
+ var controller = {
+ _itemId: null,
+ _columnName: null,
+ _editor: null,
+ _editorType: null,
+ _placeholder: null,
+ locateCell: _getGridCellFromNode,
+ getEditorConfig: function getEditorConfig(columnName) {
+ var column = grid.getColumn(columnName);
+ return column.editor;
+ },
+ init: function init() {
+ var mapping = keyboardMapping.getMapping();
+
+ if (mapping.init) {
+ mapping.init(this, grid);
+ }
+
+ store = grid.$gantt.getDatastore(grid.$config.bind);
+ var self = this;
+ handlers.push(store.attachEvent("onIdChange", function (oldId, newId) {
+ if (self._itemId == oldId) {
+ self._itemId = newId;
+ }
+ }));
+ handlers.push(store.attachEvent("onStoreUpdated", function () {
+ if (grid.$gantt.getState("batchUpdate").batch_update) {
+ return;
+ }
+
+ if (self.isVisible() && !store.isVisible(self._itemId)) {
+ self.hide();
+ }
+ }));
+ ganttHandlers.push(gantt.attachEvent("onDataRender", function () {
+ if (self._editor && self._placeholder && !domHelpers.isChildOf(self._placeholder, gantt.$root)) {
+ grid.$grid_data.appendChild(self._placeholder);
+ }
+ }));
+
+ this.init = function () {};
+ },
+ getState: function getState() {
+ return {
+ editor: this._editor,
+ editorType: this._editorType,
+ placeholder: this._placeholder,
+ id: this._itemId,
+ columnName: this._columnName
+ };
+ },
+ startEdit: function startEdit(itemId, columnName) {
+ if (this.isVisible()) {
+ this.save();
+ }
+
+ if (!store.exists(itemId)) {
+ return;
+ }
+
+ var editorState = {
+ id: itemId,
+ columnName: columnName
+ };
+
+ if (gantt.isReadonly(store.getItem(itemId))) {
+ this.callEvent("onEditPrevent", [editorState]);
+ return;
+ }
+
+ if (this.callEvent("onBeforeEditStart", [editorState]) === false) {
+ this.callEvent("onEditPrevent", [editorState]);
+ return;
+ }
+
+ this.show(editorState.id, editorState.columnName);
+ this.setValue();
+ this.callEvent("onEditStart", [editorState]);
+ },
+ isVisible: function isVisible() {
+ return !!(this._editor && domHelpers.isChildOf(this._placeholder, gantt.$root));
+ },
+ show: function show(itemId, columnName) {
+ if (this.isVisible()) {
+ this.save();
+ }
+
+ var editorState = {
+ id: itemId,
+ columnName: columnName
+ };
+ var column = grid.getColumn(editorState.columnName);
+ var editorConfig = this.getEditorConfig(column.name);
+ if (!editorConfig) return;
+ var editor = grid.$getConfig().editor_types[editorConfig.type];
+
+ var placeholder = _createPlaceholder(editorState.id, editorState.columnName);
+
+ grid.$grid_data.appendChild(placeholder);
+ editor.show(editorState.id, column, editorConfig, placeholder);
+ this._editor = editor;
+ this._placeholder = placeholder;
+ this._itemId = editorState.id;
+ this._columnName = editorState.columnName;
+ this._editorType = editorConfig.type;
+ var mapping = keyboardMapping.getMapping();
+
+ if (mapping.onShow) {
+ mapping.onShow(this, placeholder, grid);
+ }
+ },
+ setValue: function setValue() {
+ var state = this.getState();
+ var itemId = state.id,
+ columnName = state.columnName;
+ var column = grid.getColumn(columnName);
+ var item = store.getItem(itemId);
+ var editorConfig = this.getEditorConfig(columnName);
+ if (!editorConfig) return;
+ var value = item[editorConfig.map_to];
+
+ if (editorConfig.map_to == "auto") {
+ value = store.getItem(itemId);
+ }
+
+ this._editor.set_value(value, itemId, column, this._placeholder);
+
+ this.focus();
+ },
+ focus: function focus() {
+ this._editor.focus(this._placeholder);
+ },
+ getValue: function getValue() {
+ var column = grid.getColumn(this._columnName);
+ return this._editor.get_value(this._itemId, column, this._placeholder);
+ },
+ _getItemValue: function _getItemValue() {
+ var editorConfig = this.getEditorConfig(this._columnName);
+ if (!editorConfig) return;
+ var item = gantt.getTask(this._itemId);
+ var value = item[editorConfig.map_to];
+
+ if (editorConfig.map_to == "auto") {
+ value = store.getItem(this._itemId);
+ }
+
+ return value;
+ },
+ isChanged: function isChanged() {
+ var column = grid.getColumn(this._columnName);
+
+ var value = this._getItemValue();
+
+ return this._editor.is_changed(value, this._itemId, column, this._placeholder);
+ },
+ hide: function hide() {
+ if (!this._itemId) return;
+ var itemId = this._itemId,
+ columnName = this._columnName;
+ var mapping = keyboardMapping.getMapping();
+
+ if (mapping.onHide) {
+ mapping.onHide(this, this._placeholder, grid);
+ }
+
+ this._itemId = null;
+ this._columnName = null;
+ this._editorType = null;
+ if (!this._placeholder) return;
+
+ if (this._editor && this._editor.hide) {
+ this._editor.hide(this._placeholder);
+ }
+
+ this._editor = null;
+
+ if (this._placeholder.parentNode) {
+ this._placeholder.parentNode.removeChild(this._placeholder);
+ }
+
+ this._placeholder = null;
+ this.callEvent("onEditEnd", [{
+ id: itemId,
+ columnName: columnName
+ }]);
+ },
+ save: function save() {
+ if (!(this.isVisible() && store.exists(this._itemId) && this.isChanged())) {
+ this.hide();
+ return;
+ }
+
+ var itemId = this._itemId,
+ columnName = this._columnName;
+
+ if (!store.exists(itemId)) {
+ return;
+ }
+
+ var item = store.getItem(itemId);
+ var editorConfig = this.getEditorConfig(columnName);
+ var editorState = {
+ id: itemId,
+ columnName: columnName,
+ newValue: this.getValue(),
+ oldValue: this._getItemValue()
+ };
+
+ if (this.callEvent("onBeforeSave", [editorState]) !== false) {
+ if (!this._editor.is_valid || this._editor.is_valid(editorState.newValue, editorState.id, grid.getColumn(columnName), this._placeholder)) {
+ var mapTo = editorConfig.map_to;
+ var value = editorState.newValue;
+
+ if (mapTo != "auto") {
+ item[mapTo] = value;
+ updateTaskDateProperties(item, mapTo, gantt.config.inline_editors_date_processing);
+ store.updateItem(itemId);
+ } else {
+ this._editor.save(itemId, grid.getColumn(columnName), this._placeholder);
+ }
+
+ this.callEvent("onSave", [editorState]);
+ }
+ }
+
+ this.hide();
+ },
+ _findEditableCell: function findEditableCell(start, direction) {
+ var nextIndex = start;
+ var columns = grid.getGridColumns();
+ var nextColumn = columns[nextIndex];
+ var columnName = nextColumn ? nextColumn.name : null;
+
+ if (columnName) {
+ while (columnName && !this.getEditorConfig(columnName)) {
+ columnName = this._findEditableCell(start + direction, direction);
+ }
+
+ return columnName;
+ }
+
+ return null;
+ },
+ getNextCell: function moveCell(dir) {
+ // GS-1257. true means to exclude hidden columns
+ return this._findEditableCell(grid.getColumnIndex(this._columnName, true) + dir, dir);
+ },
+ getFirstCell: function getFirstCell() {
+ return this._findEditableCell(0, 1);
+ },
+ getLastCell: function getLastCell() {
+ return this._findEditableCell(grid.getGridColumns().length - 1, -1);
+ },
+ editNextCell: function nextCell(canChangeRow) {
+ var cell = this.getNextCell(1);
+
+ if (cell) {
+ var nextColumn = this.getNextCell(1);
+
+ if (nextColumn && this.getEditorConfig(nextColumn)) {
+ this.startEdit(this._itemId, nextColumn);
+ }
+ } else if (canChangeRow && this.moveRow(1)) {
+ var task = this.moveRow(1);
+ cell = this.getFirstCell();
+
+ if (cell && this.getEditorConfig(cell)) {
+ this.startEdit(task, cell);
+ }
+ }
+ },
+ editPrevCell: function prevCell(canChangeRow) {
+ var cell = this.getNextCell(-1);
+
+ if (cell) {
+ var nextColumn = this.getNextCell(-1);
+
+ if (nextColumn && this.getEditorConfig(nextColumn)) {
+ this.startEdit(this._itemId, nextColumn);
+ }
+ } else if (canChangeRow && this.moveRow(-1)) {
+ var task = this.moveRow(-1);
+ cell = this.getLastCell();
+
+ if (cell && this.getEditorConfig(cell)) {
+ this.startEdit(task, cell);
+ }
+ }
+ },
+ moveRow: function moveRow(dir) {
+ var moveTask = dir > 0 ? gantt.getNext : gantt.getPrev;
+ moveTask = gantt.bind(moveTask, gantt);
+ var nextItem = moveTask(this._itemId); // skip readonly rows
+
+ while (gantt.isTaskExists(nextItem) && gantt.isReadonly(gantt.getTask(nextItem))) {
+ nextItem = moveTask(nextItem);
+ }
+
+ return nextItem;
+ },
+ editNextRow: function nextRow(skipReadonly) {
+ var id = this.getState().id;
+ if (!gantt.isTaskExists(id)) return;
+ var next = null;
+
+ if (skipReadonly) {
+ next = this.moveRow(1);
+ } else {
+ next = gantt.getNext(id);
+ }
+
+ if (gantt.isTaskExists(next)) {
+ this.startEdit(next, this._columnName);
+ }
+ },
+ editPrevRow: function prevRow(skipReadonly) {
+ var id = this.getState().id;
+ if (!gantt.isTaskExists(id)) return;
+ var prev = null;
+
+ if (skipReadonly) {
+ prev = this.moveRow(-1);
+ } else {
+ prev = gantt.getPrev(id);
+ }
+
+ if (gantt.isTaskExists(prev)) {
+ this.startEdit(prev, this._columnName);
+ }
+ },
+ destructor: function destructor() {
+ handlers.forEach(function (handlerId) {
+ store.detachEvent(handlerId);
+ });
+ ganttHandlers.forEach(function (handlerId) {
+ gantt.detachEvent(handlerId);
+ });
+ handlers = [];
+ ganttHandlers = [];
+ store = null;
+ this.hide();
+ this.detachAllEvents();
+ }
+ };
+ utils.mixin(controller, keyboardMapping);
+ utils.mixin(controller, eventBus);
+ return controller;
+ }
+
+ var inlineEditController = {
+ init: initConfigs,
+ createEditors: createGridEditors
+ };
+ utils.mixin(inlineEditController, keyboardMapping);
+ utils.mixin(inlineEditController, eventBus);
+ return inlineEditController;
+}
+
+module.exports = create;
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/editors/base.js":
+/*!******************************************************!*\
+ !*** ./sources/core/ui/grid/editors/editors/base.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ var BaseEditor = function BaseEditor() {};
+
+ BaseEditor.prototype = {
+ show: function show(id, column, config, placeholder) {},
+ hide: function hide() {},
+ set_value: function set_value(value, id, column, node) {
+ this.get_input(node).value = value;
+ },
+ get_value: function get_value(id, column, node) {
+ return this.get_input(node).value || "";
+ },
+ is_changed: function is_changed(value, id, column, node) {
+ var currentValue = this.get_value(id, column, node);
+
+ if (currentValue && value && currentValue.valueOf && value.valueOf) {
+ return currentValue.valueOf() != value.valueOf();
+ } else {
+ return currentValue != value;
+ }
+ },
+ is_valid: function is_valid(value, id, column, node) {
+ return true;
+ },
+ save: function save(id, column, node) {},
+ get_input: function get_input(node) {
+ return node.querySelector("input");
+ },
+ focus: function focus(node) {
+ var input = this.get_input(node);
+
+ if (!input) {
+ return;
+ }
+
+ if (input.focus) {
+ input.focus();
+ }
+
+ if (input.select) {
+ input.select();
+ }
+ }
+ };
+ return BaseEditor;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/editors/date.js":
+/*!******************************************************!*\
+ !*** ./sources/core/ui/grid/editors/editors/date.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var BaseEditor = __webpack_require__(/*! ./base */ "./sources/core/ui/grid/editors/editors/base.js")(gantt),
+ utils = __webpack_require__(/*! ../../../../../utils/utils */ "./sources/utils/utils.js");
+
+ var __extends = __webpack_require__(/*! ../../../../../utils/extends */ "./sources/utils/extends.js");
+
+ var html5DateFormat = "%Y-%m-%d";
+ var dateToStr = null;
+ var strToDate = null;
+
+ function init() {
+ if (!dateToStr) {
+ dateToStr = gantt.date.date_to_str(html5DateFormat);
+ }
+
+ if (!strToDate) {
+ strToDate = gantt.date.str_to_date(html5DateFormat);
+ }
+ }
+
+ function DateEditor() {
+ var self = BaseEditor.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(DateEditor, BaseEditor);
+
+ utils.mixin(DateEditor.prototype, {
+ show: function show(id, column, config, placeholder) {
+ init();
+ var minValue = null;
+ var maxValue = null;
+
+ if (typeof config.min === "function") {
+ minValue = config.min(id, column);
+ } else {
+ minValue = config.min;
+ }
+
+ if (typeof config.max === "function") {
+ maxValue = config.max(id, column);
+ } else {
+ maxValue = config.max;
+ }
+
+ var minAttr = minValue ? " min='" + dateToStr(minValue) + "' " : "";
+ var maxAttr = maxValue ? " max='" + dateToStr(maxValue) + "' " : "";
+ var html = "<div style='width:140px' role='cell'><input type='date' ".concat(minAttr, " ").concat(maxAttr, " name='").concat(column.name, "' title='").concat(column.name, "'></div>");
+ placeholder.innerHTML = html;
+ },
+ set_value: function set_value(value, id, column, node) {
+ if (value && value.getFullYear) {
+ this.get_input(node).value = dateToStr(value);
+ } else {
+ this.get_input(node).value = value;
+ }
+ },
+ is_valid: function is_valid(value, id, column, node) {
+ if (!value || isNaN(value.getTime())) return false;
+ return true;
+ },
+ get_value: function get_value(id, column, node) {
+ var parsed;
+
+ try {
+ parsed = strToDate(this.get_input(node).value || "");
+ } catch (e) {
+ parsed = null; // return null will cancel changes
+ }
+
+ return parsed;
+ }
+ }, true);
+ return DateEditor;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/editors/duration.js":
+/*!**********************************************************!*\
+ !*** ./sources/core/ui/grid/editors/editors/duration.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var BaseEditor = __webpack_require__(/*! ./base */ "./sources/core/ui/grid/editors/editors/base.js")(gantt),
+ utils = __webpack_require__(/*! ../../../../../utils/utils */ "./sources/utils/utils.js");
+
+ var __extends = __webpack_require__(/*! ../../../../../utils/extends */ "./sources/utils/extends.js");
+
+ function TextEditor() {
+ var self = BaseEditor.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(TextEditor, BaseEditor);
+
+ function getFormatter(config) {
+ return config.formatter || gantt.ext.formatters.durationFormatter();
+ }
+
+ utils.mixin(TextEditor.prototype, {
+ show: function show(id, column, config, placeholder) {
+ var html = "<div role='cell'><input type='text' name='".concat(column.name, "' title='").concat(column.name, "'></div>");
+ placeholder.innerHTML = html;
+ },
+ set_value: function set_value(value, id, column, node) {
+ this.get_input(node).value = getFormatter(column.editor).format(value);
+ },
+ get_value: function get_value(id, column, node) {
+ return getFormatter(column.editor).parse(this.get_input(node).value || "");
+ }
+ }, true);
+ return TextEditor;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/editors/number.js":
+/*!********************************************************!*\
+ !*** ./sources/core/ui/grid/editors/editors/number.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var BaseEditor = __webpack_require__(/*! ./base */ "./sources/core/ui/grid/editors/editors/base.js")(gantt),
+ utils = __webpack_require__(/*! ../../../../../utils/utils */ "./sources/utils/utils.js");
+
+ var __extends = __webpack_require__(/*! ../../../../../utils/extends */ "./sources/utils/extends.js");
+
+ function NumberEditor() {
+ var self = BaseEditor.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(NumberEditor, BaseEditor);
+
+ utils.mixin(NumberEditor.prototype, {
+ show: function show(id, column, config, placeholder) {
+ var min = config.min || 0,
+ max = config.max || 100;
+ var html = "<div role='cell'><input type='number' min='".concat(min, "' max='").concat(max, "' name='").concat(column.name, "' title='").concat(column.name, "'></div>");
+ placeholder.innerHTML = html;
+ },
+ get_value: function get_value(id, column, node) {
+ return this.get_input(node).value || "";
+ },
+ is_valid: function is_valid(value, id, column, node) {
+ return !isNaN(parseInt(value, 10));
+ }
+ }, true);
+ return NumberEditor;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/editors/predecessor.js":
+/*!*************************************************************!*\
+ !*** ./sources/core/ui/grid/editors/editors/predecessor.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var BaseEditor = __webpack_require__(/*! ./base */ "./sources/core/ui/grid/editors/editors/base.js")(gantt),
+ utils = __webpack_require__(/*! ../../../../../utils/utils */ "./sources/utils/utils.js");
+
+ var __extends = __webpack_require__(/*! ../../../../../utils/extends */ "./sources/utils/extends.js");
+
+ function PredecessorEditor() {
+ var self = BaseEditor.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(PredecessorEditor, BaseEditor);
+
+ function getFormatter(config) {
+ return config.formatter || gantt.ext.formatters.linkFormatter();
+ }
+
+ function parseInputString(value, config) {
+ var predecessors = (value || "").split(config.delimiter || ",");
+
+ for (var i = 0; i < predecessors.length; i++) {
+ var val = predecessors[i].trim();
+
+ if (val) {
+ predecessors[i] = val;
+ } else {
+ predecessors.splice(i, 1);
+ i--;
+ }
+ }
+
+ predecessors.sort();
+ return predecessors;
+ }
+
+ function formatPredecessors(task, config, gantt) {
+ var links = task.$target;
+ var labels = [];
+
+ for (var i = 0; i < links.length; i++) {
+ var link = gantt.getLink(links[i]);
+ labels.push(getFormatter(config).format(link));
+ }
+
+ return labels.join((config.delimiter || ",") + " ");
+ }
+
+ function getSelectedLinks(taskId, predecessorCodes, config) {
+ var links = [];
+ predecessorCodes.forEach(function (code) {
+ var link = getFormatter(config).parse(code);
+
+ if (link) {
+ link.target = taskId; // GS-1290 A way to preserve the link. Otherwise validation will return false
+ // because the existing link ID is not passed there
+
+ link.id = "predecessor_generated";
+
+ if (gantt.isLinkAllowed(link)) {
+ link.id = undefined;
+ links.push(link);
+ }
+ }
+ });
+ return links;
+ }
+
+ function formatLinkKey(link) {
+ return link.source + "_" + link.target + "_" + link.type + "_" + (link.lag || 0);
+ }
+
+ function getLinksDiff(task, predecessorCodes, config) {
+ var selectedLinks = getSelectedLinks(task.id, predecessorCodes, config);
+ var existingLinksSearch = {};
+ task.$target.forEach(function (linkId) {
+ var link = gantt.getLink(linkId);
+ existingLinksSearch[formatLinkKey(link)] = link.id;
+ });
+ var linksToAdd = [];
+ selectedLinks.forEach(function (link) {
+ var linkKey = formatLinkKey(link);
+
+ if (!existingLinksSearch[linkKey]) {
+ linksToAdd.push(link);
+ } else {
+ delete existingLinksSearch[linkKey];
+ }
+ });
+ var linksToDelete = [];
+
+ for (var i in existingLinksSearch) {
+ linksToDelete.push(existingLinksSearch[i]);
+ }
+
+ return {
+ add: linksToAdd,
+ remove: linksToDelete
+ };
+ }
+
+ utils.mixin(PredecessorEditor.prototype, {
+ show: function show(id, column, config, placeholder) {
+ var html = "<div role='cell'><input type='text' name='".concat(column.name, "' title='").concat(column.name, "'></div>");
+ placeholder.innerHTML = html;
+ },
+ hide: function hide() {},
+ set_value: function set_value(value, id, column, node) {
+ this.get_input(node).value = formatPredecessors(value, column.editor, gantt);
+ },
+ get_value: function get_value(id, column, node) {
+ return parseInputString(this.get_input(node).value || "", column.editor);
+ },
+ save: function save(id, column, node) {
+ var task = gantt.getTask(id);
+ var linksDiff = getLinksDiff(task, this.get_value(id, column, node), column.editor);
+
+ if (linksDiff.add.length || linksDiff.remove.length) {
+ gantt.batchUpdate(function () {
+ linksDiff.add.forEach(function (link) {
+ gantt.addLink(link);
+ });
+ linksDiff.remove.forEach(function (linkId) {
+ gantt.deleteLink(linkId);
+ });
+ if (gantt.autoSchedule) gantt.autoSchedule();
+ });
+ }
+ },
+ is_changed: function is_changed(value, id, column, node) {
+ var inputPredecessors = this.get_value(id, column, node);
+ var taskPredecessors = parseInputString(formatPredecessors(value, column.editor, gantt), column.editor);
+ return inputPredecessors.join() !== taskPredecessors.join();
+ }
+ }, true);
+ return PredecessorEditor;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/editors/select.js":
+/*!********************************************************!*\
+ !*** ./sources/core/ui/grid/editors/editors/select.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var BaseEditor = __webpack_require__(/*! ./base */ "./sources/core/ui/grid/editors/editors/base.js")(gantt),
+ utils = __webpack_require__(/*! ../../../../../utils/utils */ "./sources/utils/utils.js");
+
+ var __extends = __webpack_require__(/*! ../../../../../utils/extends */ "./sources/utils/extends.js");
+
+ function SelectEditor() {
+ var self = BaseEditor.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(SelectEditor, BaseEditor);
+
+ utils.mixin(SelectEditor.prototype, {
+ show: function show(id, column, config, placeholder) {
+ var html = "<div role='cell'><select name='".concat(column.name, "' title='").concat(column.name, "'>");
+ var optionsHtml = [],
+ options = config.options || [];
+
+ for (var i = 0; i < options.length; i++) {
+ optionsHtml.push("<option value='" + config.options[i].key + "'>" + options[i].label + "</option>");
+ }
+
+ html += optionsHtml.join("") + "</select></div>";
+ placeholder.innerHTML = html;
+ },
+ get_input: function get_input(node) {
+ return node.querySelector("select");
+ }
+ }, true);
+ return SelectEditor;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/editors/text.js":
+/*!******************************************************!*\
+ !*** ./sources/core/ui/grid/editors/editors/text.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var BaseEditor = __webpack_require__(/*! ./base */ "./sources/core/ui/grid/editors/editors/base.js")(gantt),
+ utils = __webpack_require__(/*! ../../../../../utils/utils */ "./sources/utils/utils.js");
+
+ var __extends = __webpack_require__(/*! ../../../../../utils/extends */ "./sources/utils/extends.js");
+
+ function TextEditor() {
+ var self = BaseEditor.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(TextEditor, BaseEditor);
+
+ utils.mixin(TextEditor.prototype, {
+ show: function show(id, column, config, placeholder) {
+ var html = "<div role='cell'><input type='text' name='".concat(column.name, "' title='").concat(column.name, "'></div>");
+ placeholder.innerHTML = html;
+ }
+ }, true);
+ return TextEditor;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/keyboard_mappings.js":
+/*!***********************************************************!*\
+ !*** ./sources/core/ui/grid/editors/keyboard_mappings.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defaultMapping = __webpack_require__(/*! ./keyboard_mappings/default */ "./sources/core/ui/grid/editors/keyboard_mappings/default.js");
+
+var keyNavMappings = __webpack_require__(/*! ./keyboard_mappings/keyboard_navigation */ "./sources/core/ui/grid/editors/keyboard_mappings/keyboard_navigation.js");
+
+module.exports = function (gantt) {
+ var mapping = null;
+ return {
+ setMapping: function setMapping(map) {
+ mapping = map;
+ },
+ getMapping: function getMapping() {
+ if (mapping) {
+ return mapping;
+ } else if (gantt.config.keyboard_navigation_cells && gantt.ext.keyboardNavigation) {
+ return keyNavMappings;
+ } else {
+ return defaultMapping;
+ }
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/keyboard_mappings/default.js":
+/*!*******************************************************************!*\
+ !*** ./sources/core/ui/grid/editors/keyboard_mappings/default.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ init: function init(controller, grid) {
+ var gantt = grid.$gantt;
+ gantt.attachEvent("onTaskClick", function (id, e) {
+ if (gantt._is_icon_open_click(e)) return true;
+ var state = controller.getState();
+ var cell = controller.locateCell(e.target);
+
+ if (cell && controller.getEditorConfig(cell.columnName)) {
+ if (controller.isVisible() && state.id == cell.id && state.columnName == cell.columnName) {// do nothing if editor is already active in this cell
+ } else {
+ controller.startEdit(cell.id, cell.columnName);
+ }
+
+ return false;
+ }
+
+ return true;
+ });
+ gantt.attachEvent("onEmptyClick", function () {
+ if (controller.isVisible() && controller.isChanged()) {
+ controller.save();
+ } else {
+ controller.hide();
+ }
+
+ return true;
+ });
+ gantt.attachEvent("onTaskDblClick", function (id, e) {
+ var state = controller.getState();
+ var cell = controller.locateCell(e.target);
+
+ if (cell && controller.isVisible() && cell.columnName == state.columnName) {
+ //GS-933 probably, we don't need to hide the inline editor because the lightbox cannot be opened if you double-click on an inline editor
+ //remove this code later if people don't complain
+ //controller.hide();
+ return false;
+ }
+
+ return true;
+ });
+ },
+ onShow: function onShow(controller, placeholder, grid) {
+ var gantt = grid.$gantt;
+
+ if (gantt.ext && gantt.ext.keyboardNavigation) {
+ var keyNav = gantt.ext.keyboardNavigation;
+ keyNav.attachEvent("onKeyDown", function (command, e) {
+ var keyboard = gantt.constants.KEY_CODES;
+ var keyCode = e.keyCode;
+ var preventKeyNav = false;
+
+ switch (keyCode) {
+ case keyboard.SPACE:
+ if (controller.isVisible()) {
+ preventKeyNav = true;
+ }
+
+ break;
+ }
+
+ if (preventKeyNav) {
+ return false;
+ } else {
+ return true;
+ }
+ });
+ }
+
+ placeholder.onkeydown = function (e) {
+ e = e || window.event;
+ var keyboard = gantt.constants.KEY_CODES;
+
+ if (e.defaultPrevented || e.shiftKey && e.keyCode != keyboard.TAB) {
+ return;
+ }
+
+ var shouldPrevent = true;
+
+ switch (e.keyCode) {
+ case gantt.keys.edit_save:
+ controller.save();
+ break;
+
+ case gantt.keys.edit_cancel:
+ controller.hide();
+ break;
+
+ case keyboard.UP:
+ case keyboard.DOWN:
+ if (controller.isVisible()) {
+ controller.hide();
+ shouldPrevent = false;
+ }
+
+ break;
+
+ case keyboard.TAB:
+ if (e.shiftKey) {
+ controller.editPrevCell(true);
+ } else {
+ controller.editNextCell(true);
+ }
+
+ break;
+
+ default:
+ shouldPrevent = false;
+ break;
+ }
+
+ if (shouldPrevent) {
+ e.preventDefault();
+ }
+ };
+ },
+ onHide: function onHide() {},
+ destroy: function destroy() {}
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/keyboard_mappings/keyboard_navigation.js":
+/*!*******************************************************************************!*\
+ !*** ./sources/core/ui/grid/editors/keyboard_mappings/keyboard_navigation.js ***!
+ \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ init: function init(controller, grid) {
+ var self = controller;
+ var gantt = grid.$gantt;
+ var onBlurDelay = null;
+ var keyNav = gantt.ext.keyboardNavigation;
+ keyNav.attachEvent("onBeforeFocus", function (node) {
+ var activeCell = controller.locateCell(node);
+ clearTimeout(onBlurDelay);
+
+ if (activeCell) {
+ var columnName = activeCell.columnName;
+ var id = activeCell.id;
+ var editorState = self.getState();
+
+ if (self.isVisible()) {
+ if (editorState.id == id && editorState.columnName === columnName) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ });
+ keyNav.attachEvent("onFocus", function (node) {
+ var activeCell = controller.locateCell(node);
+ var state = controller.getState();
+ clearTimeout(onBlurDelay);
+
+ if (activeCell && !(activeCell.id == state.id && activeCell.columnName == state.columnName)) {
+ if (self.isVisible()) {
+ self.save();
+ }
+ }
+
+ return true;
+ });
+ controller.attachEvent("onHide", function () {
+ clearTimeout(onBlurDelay);
+ });
+ keyNav.attachEvent("onBlur", function () {
+ onBlurDelay = setTimeout(function () {
+ self.save();
+ });
+ return true;
+ });
+ gantt.attachEvent("onTaskDblClick", function (id, e) {
+ // block lightbox on double click inside editor
+ var state = controller.getState();
+ var cell = controller.locateCell(e.target);
+
+ if (cell && controller.isVisible() && cell.columnName == state.columnName) {
+ return false;
+ }
+
+ return true;
+ });
+ gantt.attachEvent("onTaskClick", function (id, e) {
+ if (gantt._is_icon_open_click(e)) return true;
+ var state = controller.getState();
+ var cell = controller.locateCell(e.target);
+
+ if (cell && controller.getEditorConfig(cell.columnName)) {
+ if (controller.isVisible() && state.id == cell.id && state.columnName == cell.columnName) {// do nothing if editor is already active in this cell
+ } else {
+ controller.startEdit(cell.id, cell.columnName);
+ }
+
+ return false;
+ }
+
+ return true;
+ });
+ gantt.attachEvent("onEmptyClick", function () {
+ self.save();
+ return true;
+ });
+ keyNav.attachEvent("onKeyDown", function (command, e) {
+ var activeCell = controller.locateCell(e.target);
+ var hasEditor = activeCell ? controller.getEditorConfig(activeCell.columnName) : false;
+ var state = controller.getState();
+ var keyboard = gantt.constants.KEY_CODES;
+ var keyCode = e.keyCode;
+ var preventKeyNav = false;
+
+ switch (keyCode) {
+ case keyboard.ENTER:
+ if (controller.isVisible()) {
+ controller.save();
+ e.preventDefault();
+ preventKeyNav = true;
+ } else if (hasEditor && !(e.ctrlKey || e.metaKey || e.shiftKey)) {
+ self.startEdit(activeCell.id, activeCell.columnName);
+ e.preventDefault();
+ preventKeyNav = true;
+ }
+
+ break;
+
+ case keyboard.ESC:
+ if (controller.isVisible()) {
+ controller.hide();
+ e.preventDefault();
+ preventKeyNav = true;
+ }
+
+ break;
+
+ case keyboard.UP:
+ case keyboard.DOWN:
+ break;
+
+ case keyboard.LEFT:
+ case keyboard.RIGHT:
+ if (hasEditor && controller.isVisible() || state.editorType === "date") {
+ preventKeyNav = true;
+ }
+
+ break;
+
+ case keyboard.SPACE:
+ if (controller.isVisible()) {
+ preventKeyNav = true;
+ }
+
+ if (hasEditor && !controller.isVisible()) {
+ self.startEdit(activeCell.id, activeCell.columnName);
+ e.preventDefault();
+ preventKeyNav = true;
+ }
+
+ break;
+
+ case keyboard.DELETE:
+ if (hasEditor && !controller.isVisible()) {
+ self.startEdit(activeCell.id, activeCell.columnName);
+ preventKeyNav = true;
+ } else if (hasEditor && controller.isVisible()) {
+ preventKeyNav = true;
+ }
+
+ break;
+
+ case keyboard.TAB:
+ if (controller.isVisible()) {
+ if (e.shiftKey) {
+ controller.editPrevCell(true);
+ } else {
+ controller.editNextCell(true);
+ }
+
+ var newState = controller.getState();
+
+ if (newState.id) {
+ keyNav.focus({
+ type: "taskCell",
+ id: newState.id,
+ column: newState.columnName
+ });
+ }
+
+ e.preventDefault();
+ preventKeyNav = true;
+ }
+
+ break;
+
+ default:
+ if (controller.isVisible()) preventKeyNav = true;else {
+ // start editing on character key
+ if (keyCode >= 48 && keyCode <= 57 || // [0-9]
+ keyCode > 95 && keyCode < 112 || // numpad
+ keyCode >= 64 && keyCode <= 91 || // [a-z]
+ keyCode > 185 && keyCode < 193 || //;=-,etc
+ keyCode > 218 && keyCode < 223) {
+ var modifiers = command.modifiers;
+ var anyModifier = modifiers.alt || modifiers.ctrl || modifiers.meta || modifiers.shift;
+
+ if (modifiers.alt) {// don't start editing on alt+key
+ } else if (anyModifier && keyNav.getCommandHandler(command, "taskCell")) {// don't start editing if command already have a keyboard shortcut
+ } else if (hasEditor && !controller.isVisible()) {
+ self.startEdit(activeCell.id, activeCell.columnName);
+ preventKeyNav = true;
+ }
+ }
+ }
+ break;
+ }
+
+ if (preventKeyNav) {
+ return false;
+ } else {
+ return true;
+ }
+ });
+ },
+ onShow: function onShow(controller, placeholder, grid) {},
+ onHide: function onHide(controller, placeholder, grid) {
+ var gantt = grid.$gantt;
+ gantt.focus();
+ },
+ destroy: function destroy() {}
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/editors/linked_properties.js":
+/*!***********************************************************!*\
+ !*** ./sources/core/ui/grid/editors/linked_properties.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ return function processTaskDateProperties(item, mapTo, mode) {
+ if (mode == "keepDates") {
+ keepDatesOnEdit(item, mapTo);
+ } else if (mode == "keepDuration") {
+ keepDurationOnEdit(item, mapTo);
+ } else {
+ defaultActionOnEdit(item, mapTo);
+ }
+ }; // resize task
+ // resize task when start/end/duration changes
+
+ function keepDatesOnEdit(item, mapTo) {
+ if (mapTo == "duration") {
+ item.end_date = gantt.calculateEndDate(item);
+ } else if (mapTo == "end_date" || mapTo == "start_date") {
+ item.duration = gantt.calculateDuration(item);
+ }
+ } // move task(before 6.2)
+ // move task when start/end dates changes
+ // resize task when duration changes
+
+
+ function keepDurationOnEdit(item, mapTo) {
+ if (mapTo == "end_date") {
+ item.start_date = decreaseStartDate(item);
+ } else if (mapTo == "start_date" || mapTo == "duration") {
+ item.end_date = gantt.calculateEndDate(item);
+ }
+ } // default behavior
+ // move task when start date changes
+ // resize task when end date/duration changes
+
+
+ function defaultActionOnEdit(item, mapTo) {
+ if (gantt.config.schedule_from_end) {
+ if (mapTo == "end_date" || mapTo == "duration") {
+ item.start_date = decreaseStartDate(item);
+ } else if (mapTo == "start_date") {
+ item.duration = gantt.calculateDuration(item);
+ }
+ } else {
+ if (mapTo == "start_date" || mapTo == "duration") {
+ item.end_date = gantt.calculateEndDate(item);
+ } else if (mapTo == "end_date") {
+ item.duration = gantt.calculateDuration(item);
+ }
+ }
+ }
+
+ function decreaseStartDate(item) {
+ return gantt.calculateEndDate({
+ start_date: item.end_date,
+ duration: -item.duration,
+ task: item
+ });
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/grid.js":
+/*!**************************************!*\
+ !*** ./sources/core/ui/grid/grid.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js"),
+ utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js"),
+ eventable = __webpack_require__(/*! ../../../utils/eventable */ "./sources/utils/eventable.js"),
+ gridResize = __webpack_require__(/*! ./grid_resize */ "./sources/core/ui/grid/grid_resize.gpl.js"),
+ topPositionMixin = __webpack_require__(/*! ../row_position_mixin */ "./sources/core/ui/row_position_mixin.js"),
+ rowResize = __webpack_require__(/*! ./task_grid_row_resize */ "./sources/core/ui/grid/task_grid_row_resize.js");
+
+var ColumnDnd = __webpack_require__(/*! ../plugins/column_grid_dnd */ "./sources/core/ui/plugins/column_grid_dnd/index.ts")["default"];
+
+var Grid = function Grid(parent, config, factory, gantt) {
+ this.$config = utils.mixin({}, config || {});
+ this.$gantt = gantt;
+ this.$parent = parent;
+ eventable(this);
+ this.$state = {};
+ utils.mixin(this, topPositionMixin(this));
+};
+
+Grid.prototype = {
+ init: function init(container) {
+ var gantt = this.$gantt;
+
+ var gridAriaAttr = gantt._waiAria.gridAttrString();
+
+ var gridDataAriaAttr = gantt._waiAria.gridDataAttrString();
+
+ var _ganttConfig = this.$getConfig();
+
+ var reorderColumns = _ganttConfig.reorder_grid_columns || false;
+
+ if (this.$config.reorder_grid_columns !== undefined) {
+ reorderColumns = this.$config.reorder_grid_columns;
+ }
+
+ container.innerHTML = "<div class='gantt_grid' style='height:inherit;width:inherit;' " + gridAriaAttr + "></div>";
+ this.$grid = container.childNodes[0];
+ this.$grid.innerHTML = "<div class='gantt_grid_scale' " + gantt._waiAria.gridScaleRowAttrString() + "></div><div class='gantt_grid_data' " + gridDataAriaAttr + "></div>";
+ this.$grid_scale = this.$grid.childNodes[0];
+ this.$grid_data = this.$grid.childNodes[1];
+ var attr = _ganttConfig[this.$config.bind + "_attribute"];
+
+ if (!attr && this.$config.bind) {
+ attr = "data-" + this.$config.bind + "-id";
+ }
+
+ this.$config.item_attribute = attr || null;
+
+ if (!this.$config.layers) {
+ var layers = this._createLayerConfig();
+
+ this.$config.layers = layers;
+ }
+
+ var resizer = gridResize(gantt, this);
+ resizer.init();
+ this._renderHeaderResizers = resizer.doOnRender;
+ this._mouseDelegates = __webpack_require__(/*! ../mouse_event_container */ "./sources/core/ui/mouse_event_container.js")(gantt);
+ var resizerrow = rowResize(gantt, this);
+ resizerrow.init();
+
+ this._addLayers(this.$gantt);
+
+ this._initEvents();
+
+ if (reorderColumns) {
+ this._columnDND = new ColumnDnd(gantt, this);
+
+ this._columnDND.init();
+ }
+
+ this.callEvent("onReady", []); //this.refresh();
+ },
+ _validateColumnWidth: function _validateColumnWidth(column, property) {
+ // user can set {name:"text", width:"200",...} for some reason,
+ // check and convert it to number when possible
+ var value = column[property];
+
+ if (value && value != "*") {
+ var gantt = this.$gantt;
+ var numericWidth = value * 1;
+
+ if (isNaN(numericWidth)) {
+ gantt.assert(false, "Wrong " + property + " value of column " + column.name);
+ } else {
+ column[property] = numericWidth;
+ }
+ }
+ },
+ setSize: function setSize(width, height) {
+ this.$config.width = this.$state.width = width;
+ this.$config.height = this.$state.height = height; // TODO: maybe inherit and override in a subclass instead of extending here
+
+ var columns = this.getGridColumns(),
+ innerWidth = 0;
+ var config = this.$getConfig();
+ var elasticColumns = config.grid_elastic_columns;
+
+ for (var i = 0, l = columns.length; i < l; i++) {
+ this._validateColumnWidth(columns[i], "min_width");
+
+ this._validateColumnWidth(columns[i], "max_width");
+
+ this._validateColumnWidth(columns[i], "width");
+
+ innerWidth += columns[i].width * 1;
+ }
+
+ var outerWidth;
+
+ if (isNaN(innerWidth) || !this.$config.scrollable) {
+ outerWidth = this._setColumnsWidth(width + 1);
+ innerWidth = outerWidth;
+ }
+
+ if (this.$config.scrollable && elasticColumns && !isNaN(innerWidth)) {
+ // GS-1352: Allow resizing the grid columns, then the grid width is increased
+ // or keep the grid width, but don't allow column resize to affect the grid width
+ var columnProperty = "width";
+
+ if (elasticColumns == "min_width") {
+ columnProperty = "min_width";
+ }
+
+ var newColumnWidth = 0;
+ columns.forEach(function (col) {
+ newColumnWidth += col[columnProperty] || config.min_grid_column_width;
+ }); //newColumnWidth--; // the total column width shouldn't match the outerWidth // GS-2190 reducing width seems to be not needed
+
+ var columnsWidth = Math.max(newColumnWidth, width);
+ innerWidth = this._setColumnsWidth(columnsWidth);
+ outerWidth = width;
+ }
+
+ if (this.$config.scrollable) {
+ this.$grid_scale.style.width = innerWidth + "px";
+ this.$grid_data.style.width = innerWidth + "px";
+ } else {
+ this.$grid_scale.style.width = "inherit";
+ this.$grid_data.style.width = "inherit";
+ }
+
+ this.$config.width -= 1;
+ var config = this.$getConfig();
+
+ if (outerWidth !== width) {
+ if (outerWidth !== undefined) {
+ config.grid_width = outerWidth;
+ this.$config.width = outerWidth - 1;
+ } else {
+ if (!isNaN(innerWidth)) {
+ this._setColumnsWidth(innerWidth);
+
+ config.grid_width = innerWidth;
+ this.$config.width = innerWidth - 1;
+ }
+ }
+ }
+
+ var dataHeight = Math.max(this.$state.height - config.scale_height, 0);
+ this.$grid_data.style.height = dataHeight + "px";
+ this.refresh();
+ },
+ getSize: function getSize() {
+ var config = this.$getConfig();
+ var store = this.$config.rowStore;
+
+ var contentHeight = store ? this.getTotalHeight() : 0,
+ contentWidth = this._getGridWidth();
+
+ var size = {
+ x: this.$state.width,
+ y: this.$state.height,
+ contentX: this.isVisible() ? contentWidth : 0,
+ contentY: this.isVisible() ? config.scale_height + contentHeight : 0,
+ scrollHeight: this.isVisible() ? contentHeight : 0,
+ scrollWidth: this.isVisible() ? contentWidth : 0
+ };
+ return size;
+ },
+ _bindStore: function _bindStore() {
+ if (this.$config.bind) {
+ var rowStore = this.$gantt.getDatastore(this.$config.bind);
+ this.$config.rowStore = rowStore;
+
+ if (rowStore && !rowStore._gridCacheAttached) {
+ var self = this;
+ rowStore._gridCacheAttached = rowStore.attachEvent("onBeforeFilter", function () {
+ self._resetTopPositionHeight();
+ });
+ }
+ }
+ },
+ _unbindStore: function _unbindStore() {
+ if (this.$config.bind) {
+ var rowStore = this.$gantt.getDatastore(this.$config.bind);
+
+ if (rowStore && rowStore._gridCacheAttached) {
+ rowStore.detachEvent(rowStore._gridCacheAttached);
+ rowStore._gridCacheAttached = false;
+ }
+ }
+ },
+ refresh: function refresh() {
+ this._bindStore();
+
+ this._resetTopPositionHeight();
+
+ this._resetHeight();
+
+ this._initSmartRenderingPlaceholder();
+
+ this._calculateGridWidth();
+
+ this._renderGridHeader();
+ },
+ getViewPort: function getViewPort() {
+ var scrollLeft = this.$config.scrollLeft || 0;
+ var scrollTop = this.$config.scrollTop || 0;
+ var height = this.$config.height || 0;
+ var width = this.$config.width || 0;
+ return {
+ y: scrollTop,
+ y_end: scrollTop + height,
+ x: scrollLeft,
+ x_end: scrollLeft + width,
+ height: height,
+ width: width
+ };
+ },
+ scrollTo: function scrollTo(left, top) {
+ if (!this.isVisible()) return;
+ var scrolled = false;
+ this.$config.scrollTop = this.$config.scrollTop || 0;
+ this.$config.scrollLeft = this.$config.scrollLeft || 0;
+
+ if (left * 1 == left) {
+ this.$config.scrollLeft = this.$state.scrollLeft = this.$grid.scrollLeft = left;
+ scrolled = true;
+ } // var config = this.$getConfig();
+
+
+ if (top * 1 == top) {
+ this.$config.scrollTop = this.$state.scrollTop = this.$grid_data.scrollTop = top;
+ scrolled = true;
+ }
+
+ if (scrolled) {
+ this.callEvent("onScroll", [this.$config.scrollLeft, this.$config.scrollTop]);
+ }
+ },
+ getColumnIndex: function getColumnIndex(name, excludeHidden) {
+ var columns = this.$getConfig().columns;
+ var hiddenIndexShift = 0;
+
+ for (var i = 0; i < columns.length; i++) {
+ // GS-1257. If the cell is hidden, the target column index should be correct
+ if (excludeHidden && columns[i].hide) {
+ hiddenIndexShift++;
+ }
+
+ if (columns[i].name == name) {
+ return i - hiddenIndexShift;
+ }
+ }
+
+ return null;
+ },
+ getColumn: function getColumn(name) {
+ var index = this.getColumnIndex(name);
+
+ if (index === null) {
+ return null;
+ }
+
+ return this.$getConfig().columns[index];
+ },
+ getGridColumns: function getGridColumns() {
+ var config = this.$getConfig();
+ return config.columns.slice();
+ },
+ isVisible: function isVisible() {
+ if (this.$parent && this.$parent.$config) {
+ return !this.$parent.$config.hidden;
+ } else {
+ return this.$grid.offsetWidth;
+ }
+ },
+ // getItemHeight: function () {
+ // var config = this.$getConfig();
+ // return config.row_height;
+ // },
+ _createLayerConfig: function _createLayerConfig() {
+ var gantt = this.$gantt;
+ var self = this;
+ var layers = [{
+ renderer: gantt.$ui.layers.gridLine(),
+ container: this.$grid_data,
+ filter: [function () {
+ return self.isVisible();
+ }]
+ }, {
+ renderer: gantt.$ui.layers.gridTaskRowResizer(),
+ container: this.$grid_data,
+ append: true,
+ filter: [function () {
+ return gantt.config.resize_rows;
+ }]
+ }];
+ return layers;
+ },
+ _addLayers: function _addLayers(gantt) {
+ if (!this.$config.bind) return;
+ this._taskLayers = [];
+ var self = this;
+ var layers = this.$gantt.$services.getService("layers");
+ var taskRenderer = layers.getDataRender(this.$config.bind);
+
+ if (!taskRenderer) {
+ taskRenderer = layers.createDataRender({
+ name: this.$config.bind,
+ defaultContainer: function defaultContainer() {
+ return self.$grid_data;
+ }
+ });
+ }
+
+ var taskLayers = this.$config.layers;
+
+ for (var i = 0; taskLayers && i < taskLayers.length; i++) {
+ var layer = taskLayers[i];
+ layer.view = this;
+ var bar_layer = taskRenderer.addLayer(layer);
+
+ this._taskLayers.push(bar_layer);
+ }
+
+ this._bindStore();
+
+ this._initSmartRenderingPlaceholder();
+ },
+ _refreshPlaceholderOnStoreUpdate: function _refreshPlaceholderOnStoreUpdate(id) {
+ var config = this.$getConfig(),
+ store = this.$config.rowStore;
+
+ if (!store || id !== null || !this.isVisible() || !config.smart_rendering) {
+ return;
+ }
+
+ var contentHeight;
+
+ if (this.$config.scrollY) {
+ var scroll = this.$gantt.$ui.getView(this.$config.scrollY);
+ if (scroll) contentHeight = scroll.getScrollState().scrollSize;
+ }
+
+ if (!contentHeight) {
+ contentHeight = store ? this.getTotalHeight() : 0;
+ }
+
+ if (contentHeight) {
+ if (this.$rowsPlaceholder && this.$rowsPlaceholder.parentNode) {
+ this.$rowsPlaceholder.parentNode.removeChild(this.$rowsPlaceholder);
+ }
+
+ var placeholder = this.$rowsPlaceholder = document.createElement("div");
+ placeholder.style.visibility = "hidden";
+ placeholder.style.height = contentHeight + "px";
+ placeholder.style.width = "1px";
+ this.$grid_data.appendChild(placeholder);
+ }
+ },
+ _initSmartRenderingPlaceholder: function _initSmartRenderingPlaceholder() {
+ var store = this.$config.rowStore;
+
+ if (!store) {
+ return;
+ } else {
+ this._initSmartRenderingPlaceholder = function () {};
+ }
+
+ this._staticBgHandler = store.attachEvent("onStoreUpdated", utils.bind(this._refreshPlaceholderOnStoreUpdate, this));
+ },
+ _initEvents: function _initEvents() {
+ var gantt = this.$gantt;
+
+ this._mouseDelegates.delegate("click", "gantt_close", gantt.bind(function (e, id, trg) {
+ var store = this.$config.rowStore;
+ if (!store) return true;
+ var target = domHelpers.locateAttribute(e, this.$config.item_attribute);
+
+ if (target) {
+ store.close(target.getAttribute(this.$config.item_attribute));
+ }
+
+ return false;
+ }, this), this.$grid);
+
+ this._mouseDelegates.delegate("click", "gantt_open", gantt.bind(function (e, id, trg) {
+ var store = this.$config.rowStore;
+ if (!store) return true;
+ var target = domHelpers.locateAttribute(e, this.$config.item_attribute);
+
+ if (target) {
+ store.open(target.getAttribute(this.$config.item_attribute));
+ }
+
+ return false;
+ }, this), this.$grid);
+ },
+ _clearLayers: function _clearLayers(gantt) {
+ var layers = this.$gantt.$services.getService("layers");
+ var taskRenderer = layers.getDataRender(this.$config.bind);
+
+ if (this._taskLayers) {
+ for (var i = 0; i < this._taskLayers.length; i++) {
+ taskRenderer.removeLayer(this._taskLayers[i]);
+ }
+ }
+
+ this._taskLayers = [];
+ },
+ _getColumnWidth: function _getColumnWidth(column, config, width) {
+ var min_width = column.min_width || config.min_grid_column_width;
+ var new_width = Math.max(width, min_width || 10);
+ if (column.max_width) new_width = Math.min(new_width, column.max_width);
+ return new_width;
+ },
+ // set min width only if width < than config.min_grid_column_width
+ _checkGridColumnMinWidthLimits: function _checkGridColumnMinWidthLimits(columns, config) {
+ for (var i = 0, l = columns.length; i < l; i++) {
+ var width = columns[i].width * 1;
+
+ if (!columns[i].min_width && width < config.min_grid_column_width) {
+ columns[i].min_width = width;
+ }
+ }
+ },
+ // return min and max possible grid width according to restricts
+ _getGridWidthLimits: function _getGridWidthLimits() {
+ var config = this.$getConfig(),
+ columns = this.getGridColumns(),
+ min_limit = 0,
+ max_limit = 0;
+
+ for (var i = 0; i < columns.length; i++) {
+ min_limit += columns[i].min_width ? columns[i].min_width : config.min_grid_column_width;
+
+ if (max_limit !== undefined) {
+ max_limit = columns[i].max_width ? max_limit + columns[i].max_width : undefined;
+ }
+ }
+
+ this._checkGridColumnMinWidthLimits(columns, config); // FIX ME: should it be before calculating limits?
+
+
+ return [min_limit, max_limit];
+ },
+ // resize columns to get total newWidth, starting from columns[start_index]
+ _setColumnsWidth: function _setColumnsWidth(newWidth, start_index) {
+ var config = this.$getConfig();
+ var columns = this.getGridColumns(),
+ columns_width = 0,
+ final_width = newWidth;
+ start_index = !window.isNaN(start_index) ? start_index : -1;
+
+ for (var i = 0, l = columns.length; i < l; i++) {
+ columns_width += columns[i].width * 1;
+ }
+
+ if (window.isNaN(columns_width)) {
+ this._calculateGridWidth();
+
+ columns_width = 0;
+
+ for (var i = 0, l = columns.length; i < l; i++) {
+ columns_width += columns[i].width * 1;
+ }
+ }
+
+ var extra_width = final_width - columns_width;
+ var start_width = 0;
+
+ for (var i = 0; i < start_index + 1; i++) {
+ start_width += columns[i].width;
+ }
+
+ columns_width -= start_width;
+
+ for (var i = start_index + 1; i < columns.length; i++) {
+ var col = columns[i];
+ var share = Math.round(extra_width * (col.width / columns_width)); // columns have 2 additional restrict fields - min_width & max_width that are set by user
+
+ if (extra_width < 0) {
+ if (col.min_width && col.width + share < col.min_width) share = col.min_width - col.width;else if (!col.min_width && config.min_grid_column_width && col.width + share < config.min_grid_column_width) share = config.min_grid_column_width - col.width;
+ } else if (col.max_width && col.width + share > col.max_width) share = col.max_width - col.width;
+
+ columns_width -= col.width;
+ col.width += share;
+ extra_width -= share;
+ }
+
+ var iterator = extra_width > 0 ? 1 : -1;
+
+ while (extra_width > 0 && iterator === 1 || extra_width < 0 && iterator === -1) {
+ var curExtra = extra_width;
+
+ for (i = start_index + 1; i < columns.length; i++) {
+ var new_width = columns[i].width + iterator;
+
+ if (new_width == this._getColumnWidth(columns[i], config, new_width)) {
+ extra_width -= iterator;
+ columns[i].width = new_width;
+ }
+
+ if (!extra_width) break;
+ }
+
+ if (curExtra == extra_width) break;
+ } // if impossible to resize the right-side columns, resize the start column
+
+
+ if (extra_width && start_index > -1) {
+ var new_width = columns[start_index].width + extra_width;
+ if (new_width == this._getColumnWidth(columns[start_index], config, new_width)) columns[start_index].width = new_width;
+ } //if (this.callEvent("onGridResizeEnd", [config.grid_width, final_width]) === false)
+ // return;
+
+
+ return this._getColsTotalWidth();
+ },
+ _getColsTotalWidth: function _getColsTotalWidth() {
+ var columns = this.getGridColumns();
+ var cols_width = 0;
+
+ for (var i = 0; i < columns.length; i++) {
+ var v = parseFloat(columns[i].width);
+
+ if (window.isNaN(v)) {
+ return false;
+ }
+
+ cols_width += v;
+ }
+
+ return cols_width;
+ },
+ _calculateGridWidth: function _calculateGridWidth() {
+ var config = this.$getConfig();
+ var columns = this.getGridColumns();
+ var cols_width = 0;
+ var unknown = [];
+ var width = [];
+
+ for (var i = 0; i < columns.length; i++) {
+ var v = parseFloat(columns[i].width);
+
+ if (window.isNaN(v)) {
+ v = config.min_grid_column_width || 10;
+ unknown.push(i);
+ }
+
+ width[i] = v;
+ cols_width += v;
+ }
+
+ var gridWidth = this._getGridWidth() + 1;
+
+ if (config.autofit || unknown.length) {
+ var diff = gridWidth - cols_width; // TODO: logic may be improved for proportional changing of width
+ // autofit adjusts columns widths to the outer grid width
+ // it doesn't makes sense if grid has inner scroll with elastic columns
+
+ if (config.autofit && !config.grid_elastic_columns) {
+ // delta must be added for all columns
+ for (var i = 0; i < width.length; i++) {
+ var delta = Math.round(diff / (width.length - i));
+ width[i] += delta;
+
+ var new_width = this._getColumnWidth(columns[i], config, width[i]);
+
+ if (new_width != width[i]) {
+ delta = new_width - width[i];
+ width[i] = new_width;
+ }
+
+ diff -= delta;
+ }
+ } else if (unknown.length) {
+ // there are several columns with undefined width
+ for (var i = 0; i < unknown.length; i++) {
+ var delta = Math.round(diff / (unknown.length - i)); // no float values, just integer
+
+ var index = unknown[i];
+ width[index] += delta;
+
+ var new_width = this._getColumnWidth(columns[index], config, width[index]);
+
+ if (new_width != width[index]) {
+ delta = new_width - width[index];
+ width[index] = new_width;
+ }
+
+ diff -= delta;
+ }
+ }
+
+ for (var i = 0; i < width.length; i++) {
+ columns[i].width = width[i];
+ }
+ } else {
+ var changed = gridWidth != cols_width;
+ this.$config.width = cols_width - 1;
+ config.grid_width = cols_width;
+
+ if (changed) {
+ this.$parent._setContentSize(this.$config.width, null);
+ }
+ }
+ },
+ _renderGridHeader: function _renderGridHeader() {
+ var gantt = this.$gantt;
+ var config = this.$getConfig();
+ var locale = this.$gantt.locale;
+ var templates = this.$gantt.templates;
+ var columns = this.getGridColumns();
+
+ if (config.rtl) {
+ columns = columns.reverse();
+ }
+
+ var cells = [];
+ var width = 0,
+ labels = locale.labels;
+ var lineHeigth = config.scale_height - 1;
+
+ for (var i = 0; i < columns.length; i++) {
+ var last = i == columns.length - 1;
+ var col = columns[i]; // ensure columns have non-empty names
+
+ if (!col.name) {
+ col.name = gantt.uid() + "";
+ }
+
+ var colWidth = col.width * 1;
+
+ var gridWidth = this._getGridWidth();
+
+ if (last && gridWidth > width + colWidth) col.width = colWidth = gridWidth - width;
+ width += colWidth;
+ var sort = gantt._sort && col.name == gantt._sort.name ? "<div class='gantt_sort gantt_" + gantt._sort.direction + "'></div>" : "";
+ var cssClass = ["gantt_grid_head_cell", "gantt_grid_head_" + col.name, last ? "gantt_last_cell" : "", templates.grid_header_class(col.name, col)].join(" ");
+ var style = "width:" + (colWidth - (last ? 1 : 0)) + "px;";
+ var label = col.label || labels["column_" + col.name] || labels[col.name];
+ label = label || "";
+
+ var ariaAttrs = gantt._waiAria.gridScaleCellAttrString(col, label);
+
+ var cell = "<div class='" + cssClass + "' style='" + style + "' " + ariaAttrs + " data-column-id='" + col.name + "' column_id='" + col.name + "'" + " data-column-name='" + col.name + "' data-column-index='" + i + "'" + ">" + label + sort + "</div>";
+ cells.push(cell);
+ }
+
+ this.$grid_scale.style.height = config.scale_height + "px";
+ this.$grid_scale.style.lineHeight = lineHeigth + "px"; //this.$grid_scale.style.width = "inherit";
+
+ this.$grid_scale.innerHTML = cells.join("");
+
+ if (this._renderHeaderResizers) {
+ this._renderHeaderResizers();
+ }
+ },
+ _getGridWidth: function _getGridWidth() {
+ // TODO: refactor/remove/comment some of _getGridWidth/this.$config.width/this.$state.width, it's not clear what they do
+ return this.$config.width;
+ },
+ destructor: function destructor() {
+ this._clearLayers(this.$gantt);
+
+ if (this._mouseDelegates) {
+ this._mouseDelegates.destructor();
+
+ this._mouseDelegates = null;
+ }
+
+ this._unbindStore();
+
+ this.$grid = null;
+ this.$grid_scale = null;
+ this.$grid_data = null;
+ this.$gantt = null;
+
+ if (this.$config.rowStore) {
+ this.$config.rowStore.detachEvent(this._staticBgHandler);
+ this.$config.rowStore = null;
+ }
+
+ this.callEvent("onDestroy", []);
+ this.detachAllEvents();
+ }
+};
+module.exports = Grid;
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/grid_resize.gpl.js":
+/*!*************************************************!*\
+ !*** ./sources/core/ui/grid/grid_resize.gpl.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function createResizer(gantt, grid) {
+ return {
+ init: function init() {},
+ doOnRender: function doOnRender() {}
+ };
+}
+
+module.exports = createResizer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/main_grid_initializer.js":
+/*!*******************************************************!*\
+ !*** ./sources/core/ui/grid/main_grid_initializer.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js");
+
+var rowDnd = __webpack_require__(/*! ./tasks_grid_dnd */ "./sources/core/ui/grid/tasks_grid_dnd.js");
+
+var rowDndMarker = __webpack_require__(/*! ./tasks_grid_dnd_marker */ "./sources/core/ui/grid/tasks_grid_dnd_marker.js");
+
+var initializer = function () {
+ return function (gantt) {
+ return {
+ onCreated: function onCreated(grid) {
+ grid.$config = utils.mixin(grid.$config, {
+ bind: "task"
+ });
+
+ if (grid.$config.id == "grid") {
+ this.extendGantt(grid);
+ gantt.ext.inlineEditors = gantt.ext._inlineEditors.createEditors(grid);
+ gantt.ext.inlineEditors.init();
+ }
+
+ this._mouseDelegates = __webpack_require__(/*! ../mouse_event_container */ "./sources/core/ui/mouse_event_container.js")(gantt);
+ },
+ onInitialized: function onInitialized(grid) {
+ var config = grid.$getConfig();
+
+ if (config.order_branch) {
+ if (config.order_branch == "marker") {
+ rowDndMarker.init(grid.$gantt, grid);
+ } else {
+ rowDnd.init(grid.$gantt, grid);
+ }
+ }
+
+ this.initEvents(grid, gantt);
+
+ if (grid.$config.id == "grid") {
+ this.extendDom(grid);
+ }
+ },
+ onDestroyed: function onDestroyed(grid) {
+ if (grid.$config.id == "grid") {
+ gantt.ext.inlineEditors.destructor();
+ }
+
+ this.clearEvents(grid, gantt);
+ },
+ initEvents: function initEvents(grid, gantt) {
+ this._mouseDelegates.delegate("click", "gantt_row", gantt.bind(function (e, id, trg) {
+ var config = grid.$getConfig();
+
+ if (id !== null) {
+ var task = this.getTask(id);
+ if (config.scroll_on_click && !gantt._is_icon_open_click(e)) this.showDate(task.start_date);
+ gantt.callEvent("onTaskRowClick", [id, trg]);
+ }
+ }, gantt), grid.$grid);
+
+ this._mouseDelegates.delegate("click", "gantt_grid_head_cell", gantt.bind(function (e, id, trg) {
+ var column = trg.getAttribute("data-column-id");
+ if (!gantt.callEvent("onGridHeaderClick", [column, e])) return;
+ var config = grid.$getConfig();
+
+ if (column == "add") {
+ var mouseEvents = gantt.$services.getService("mouseEvents");
+ mouseEvents.callHandler("click", "gantt_add", grid.$grid, [e, config.root_id]);
+ return;
+ }
+
+ if (config.sort && column) {
+ // GS-929: if there is no column name, we cannot sort the column
+ var sorting_method = column,
+ conf;
+
+ for (var i = 0; i < config.columns.length; i++) {
+ if (config.columns[i].name == column) {
+ conf = config.columns[i];
+ break;
+ }
+ }
+
+ if (conf && conf.sort !== undefined && conf.sort !== true) {
+ sorting_method = conf.sort;
+
+ if (!sorting_method) {
+ // column sort property 'false', no sorting
+ return;
+ }
+ }
+
+ var sort = this._sort && this._sort.direction && this._sort.name == column ? this._sort.direction : "desc"; // invert sort direction
+
+ sort = sort == "desc" ? "asc" : "desc";
+ this._sort = {
+ name: column,
+ direction: sort
+ };
+ this.sort(sorting_method, sort == "desc");
+ }
+ }, gantt), grid.$grid);
+
+ this._mouseDelegates.delegate("click", "gantt_add", gantt.bind(function (e, id, trg) {
+ var config = grid.$getConfig();
+ if (config.readonly) return;
+ var item = {};
+ this.createTask(item, id ? id : gantt.config.root_id);
+ return false;
+ }, gantt), grid.$grid);
+ },
+ clearEvents: function clearEvents(grid, gantt) {
+ this._mouseDelegates.destructor();
+
+ this._mouseDelegates = null;
+ },
+ extendDom: function extendDom(grid) {
+ gantt.$grid = grid.$grid;
+ gantt.$grid_scale = grid.$grid_scale;
+ gantt.$grid_data = grid.$grid_data;
+ },
+ extendGantt: function extendGantt(grid) {
+ gantt.getGridColumns = gantt.bind(grid.getGridColumns, grid);
+ grid.attachEvent("onColumnResizeStart", function () {
+ return gantt.callEvent("onColumnResizeStart", arguments);
+ });
+ grid.attachEvent("onColumnResize", function () {
+ return gantt.callEvent("onColumnResize", arguments);
+ });
+ grid.attachEvent("onColumnResizeEnd", function () {
+ return gantt.callEvent("onColumnResizeEnd", arguments);
+ });
+ grid.attachEvent("onColumnResizeComplete", function (columns, totalWidth) {
+ gantt.config.grid_width = totalWidth;
+ });
+ grid.attachEvent("onBeforeRowResize", function () {
+ return gantt.callEvent("onBeforeRowResize", arguments);
+ });
+ grid.attachEvent("onRowResize", function () {
+ return gantt.callEvent("onRowResize", arguments);
+ });
+ grid.attachEvent("onBeforeRowResizeEnd", function () {
+ return gantt.callEvent("onBeforeRowResizeEnd", arguments);
+ });
+ grid.attachEvent("onAfterRowResize", function () {
+ return gantt.callEvent("onAfterRowResize", arguments);
+ });
+ }
+ };
+ };
+}();
+
+module.exports = initializer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/task_grid_row_resize.js":
+/*!******************************************************!*\
+ !*** ./sources/core/ui/grid/task_grid_row_resize.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+function createRowResizer(gantt, grid) {
+ var _task_grid_row_resize = {
+ row_before_start: gantt.bind(function (dnd, obj, e) {
+ var config = grid.$getConfig();
+ var store = grid.$config.rowStore;
+ var el = domHelpers.locateAttribute(e, config.task_grid_row_resizer_attribute);
+ if (!el) return false;
+ var row_id = this.locate(e, config.task_grid_row_resizer_attribute),
+ row = store.getItem(row_id);
+ if (grid.callEvent("onBeforeRowResize", [row]) === false) return false;
+ }, gantt),
+ row_after_start: gantt.bind(function (dnd, obj, e) {
+ var config = grid.$getConfig();
+ var row_id = this.locate(e, config.task_grid_row_resizer_attribute);
+ dnd.config.marker.innerHTML = "";
+ dnd.config.marker.className += " gantt_row_grid_resize_area";
+ dnd.config.marker.style.width = grid.$grid.offsetWidth + "px";
+ dnd.config.drag_id = row_id;
+ }, gantt),
+ row_drag_move: gantt.bind(function (dnd, obj, e) {
+ var store = grid.$config.rowStore;
+ var config = grid.$getConfig();
+ var dd = dnd.config;
+ var id = dd.drag_id,
+ itemHeight = grid.getItemHeight(id),
+ itemTop = grid.getItemTop(id);
+ var pos = domHelpers.getNodePosition(grid.$grid_data),
+ pointerPosition = parseInt(dd.marker.style.top, 10),
+ markerStartPosition = itemTop + pos.y,
+ marker_height = 0,
+ minPointerPosition = config.min_task_grid_row_height;
+ marker_height = pointerPosition - markerStartPosition;
+
+ if (marker_height < minPointerPosition) {
+ marker_height = minPointerPosition;
+ }
+
+ dd.marker.style.left = pos.x + "px";
+ dd.marker.style.top = markerStartPosition - 1 + "px";
+ dd.marker.style.height = Math.abs(marker_height) + 1 + "px";
+ dd.marker_height = marker_height;
+ grid.callEvent("onRowResize", [id, store.getItem(id), marker_height + itemHeight]);
+ return true;
+ }, gantt),
+ row_drag_end: gantt.bind(function (dnd, obj, e) {
+ var store = grid.$config.rowStore;
+ var dd = dnd.config;
+ var id = dd.drag_id,
+ item = store.getItem(id),
+ oldItemHeight = grid.getItemHeight(id);
+ var finalHeight = dd.marker_height;
+ if (grid.callEvent("onBeforeRowResizeEnd", [id, item, finalHeight]) === false) return;
+ if (item.row_height == finalHeight) return;
+ item.row_height = finalHeight;
+ gantt.updateTask(id);
+ grid.callEvent("onAfterRowResize", [id, item, oldItemHeight, finalHeight]);
+ this.render();
+ }, gantt)
+ }; // calls the initialization of the D'n'D events for resize elements
+
+ var _init_resize = function _init_resize() {
+ var DnD = gantt.$services.getService("dnd");
+ var config = grid.$getConfig();
+ var dnd = new DnD(grid.$grid_data, {
+ updates_per_second: 60
+ });
+ if (gantt.defined(config.dnd_sensitivity)) dnd.config.sensitivity = config.dnd_sensitivity;
+ dnd.attachEvent("onBeforeDragStart", function (obj, e) {
+ return _task_grid_row_resize.row_before_start(dnd, obj, e);
+ });
+ dnd.attachEvent("onAfterDragStart", function (obj, e) {
+ return _task_grid_row_resize.row_after_start(dnd, obj, e);
+ });
+ dnd.attachEvent("onDragMove", function (obj, e) {
+ return _task_grid_row_resize.row_drag_move(dnd, obj, e);
+ });
+ dnd.attachEvent("onDragEnd", function (obj, e) {
+ return _task_grid_row_resize.row_drag_end(dnd, obj, e);
+ });
+ };
+
+ return {
+ init: _init_resize
+ };
+}
+
+module.exports = createRowResizer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/tasks_grid_dnd.js":
+/*!************************************************!*\
+ !*** ./sources/core/ui/grid/tasks_grid_dnd.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var isPlaceholderTask = __webpack_require__(/*! ../../../utils/placeholder_task */ "./sources/utils/placeholder_task.js");
+
+function _init_dnd(gantt, grid) {
+ var DnD = gantt.$services.getService("dnd");
+
+ if (!grid.$config.bind || !gantt.getDatastore(grid.$config.bind)) {
+ return;
+ }
+
+ function locate(e) {
+ return domHelpers.locateAttribute(e, grid.$config.item_attribute);
+ }
+
+ function getStore() {
+ return gantt.getDatastore(grid.$config.bind);
+ }
+
+ function checkPlaceholderTask(id) {
+ return isPlaceholderTask(id, gantt, getStore());
+ }
+
+ var dnd = new DnD(grid.$grid_data, {
+ updates_per_second: 60
+ });
+ if (gantt.defined(grid.$getConfig().dnd_sensitivity)) dnd.config.sensitivity = grid.$getConfig().dnd_sensitivity;
+ dnd.attachEvent("onBeforeDragStart", gantt.bind(function (obj, e) {
+ var el = locate(e);
+ if (!el) return false;
+ if (gantt.hideQuickInfo) gantt._hideQuickInfo();
+
+ if (domHelpers.closest(e.target, ".gantt_grid_editor_placeholder")) {
+ return false;
+ }
+
+ var id = el.getAttribute(grid.$config.item_attribute);
+ if (checkPlaceholderTask(id)) return false;
+ var datastore = getStore();
+ var task = datastore.getItem(id);
+ if (gantt.isReadonly(task)) return false;
+ dnd.config.initial_open_state = task.$open;
+
+ if (!gantt.callEvent("onRowDragStart", [id, e.target || e.srcElement, e])) {
+ return false;
+ }
+ }, gantt));
+ dnd.attachEvent("onAfterDragStart", gantt.bind(function (obj, e) {
+ var el = locate(e);
+ dnd.config.marker.innerHTML = el.outerHTML;
+ var element = dnd.config.marker.firstChild;
+
+ if (element) {
+ element.style.position = "static";
+ }
+
+ dnd.config.id = el.getAttribute(grid.$config.item_attribute);
+ var store = getStore();
+ var task = store.getItem(dnd.config.id);
+ dnd.config.index = store.getBranchIndex(dnd.config.id);
+ dnd.config.parent = task.parent;
+ task.$open = false;
+ task.$transparent = true;
+ this.refreshData();
+ }, gantt));
+
+ dnd.lastTaskOfLevel = function (level) {
+ var last_item = null;
+ var store = getStore();
+ var tasks = store.getItems();
+
+ for (var i = 0, len = tasks.length; i < len; i++) {
+ if (tasks[i].$level == level) {
+ last_item = tasks[i];
+ }
+ }
+
+ return last_item ? last_item.id : null;
+ };
+
+ dnd._getGridPos = gantt.bind(function (e) {
+ var pos = domHelpers.getNodePosition(grid.$grid_data); // row offset
+
+ var x = pos.x + grid.$grid.scrollLeft;
+ var y = e.pos.y - 10;
+ var rowHeight = grid.getItemHeight(dnd.config.id); // prevent moving row out of grid_data container
+
+ if (y < pos.y) y = pos.y;
+ var gridHeight = grid.getTotalHeight();
+ if (y > pos.y + gridHeight - rowHeight) y = pos.y + gridHeight - rowHeight;
+ var maxBottom = pos.y + pos.height;
+
+ if (y > maxBottom - rowHeight) {
+ y = maxBottom - rowHeight;
+ }
+
+ pos.x = x;
+ pos.y = y;
+ return pos;
+ }, gantt);
+ dnd._getTargetY = gantt.bind(function (e) {
+ var pos = domHelpers.getNodePosition(grid.$grid_data);
+ var scrollPos = grid.$state.scrollTop || 0;
+ var maxBottom = gantt.$grid_data.getBoundingClientRect().height + scrollPos;
+ var y = e.pageY - pos.y + scrollPos;
+
+ if (y > maxBottom) {
+ y = maxBottom;
+ } else if (y < scrollPos) {
+ y = scrollPos;
+ }
+
+ return y;
+ }, gantt);
+ dnd._getTaskByY = gantt.bind(function (y, dropIndex) {
+ var store = getStore();
+ y = y || 0;
+ var index = grid.getItemIndexByTopPosition(y);
+ index = dropIndex < index ? index - 1 : index;
+ if (index > store.countVisible() - 1) return null;
+ return store.getIdByIndex(index);
+ }, gantt);
+ dnd.attachEvent("onDragMove", gantt.bind(function (obj, e) {
+ var gridDataSizes = gantt.$grid_data.getBoundingClientRect();
+ var maxBottom = gridDataSizes.height + gridDataSizes.y + (grid.$state.scrollTop || 0) + window.scrollY;
+ var dd = dnd.config;
+
+ var pos = dnd._getGridPos(e);
+
+ gantt._waiAria.reorderMarkerAttr(dd.marker);
+
+ var config = grid.$getConfig(),
+ store = getStore(); // setting position of row
+
+ if (pos.y < maxBottom) {
+ dd.marker.style.top = pos.y + "px";
+ } else {
+ dd.marker.style.top = maxBottom + "px";
+ }
+
+ dd.marker.style.left = pos.x + 10 + "px";
+ var containerSize = domHelpers.getNodePosition(gantt.$root);
+
+ if (pos.width > containerSize.width) {
+ dd.marker.style.width = containerSize.width - 10 - 2 + "px";
+ dd.marker.style.overflow = "hidden";
+ } // highlight row when mouseover
+
+
+ var item = store.getItem(dnd.config.id);
+
+ var targetY = dnd._getTargetY(e);
+
+ var el = dnd._getTaskByY(targetY, store.getIndexById(item.id));
+
+ if (!store.exists(el)) {
+ el = dnd.lastTaskOfLevel(config.order_branch_free ? item.$level : 0);
+
+ if (el == dnd.config.id) {
+ el = null;
+ }
+ }
+
+ function allowedLevel(next, item) {
+ return !store.isChildOf(over.id, item.id) && (next.$level == item.$level || config.order_branch_free);
+ }
+
+ if (store.exists(el)) {
+ var over = store.getItem(el);
+ var itemTop = grid.getItemTop(over.id);
+ var itemHeight = grid.getItemHeight(over.id);
+
+ if (itemTop + itemHeight / 2 < targetY) {
+ //hovering over bottom part of item, check can be drop to bottom
+ var index = store.getIndexById(over.id);
+ var nextId = store.getNext(over.id); //adds +1 when hovering over placeholder
+
+ var next = store.getItem(nextId);
+
+ if (checkPlaceholderTask(nextId)) {
+ var prevId = store.getPrev(next.id);
+ next = store.getItem(prevId);
+ }
+
+ if (next) {
+ if (next.id != item.id) {
+ over = next; //there is a valid target
+ } else {
+ if (config.order_branch_free) {
+ if (!(store.isChildOf(item.id, over.id) && store.getChildren(over.id).length == 1)) return;else {
+ store.move(item.id, store.getBranchIndex(over.id) + 1, store.getParent(over.id));
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ } else {
+ //we at end of the list, check and drop at the end of list
+ nextId = store.getIdByIndex(index);
+ next = store.getItem(nextId);
+
+ if (checkPlaceholderTask(nextId)) {
+ var prevId = store.getPrev(next.id);
+ next = store.getItem(prevId);
+ }
+
+ if (allowedLevel(next, item) && next.id != item.id) {
+ store.move(item.id, -1, store.getParent(next.id));
+ return;
+ }
+ }
+ } else if (config.order_branch_free) {
+ if (over.id != item.id && allowedLevel(over, item) && !checkPlaceholderTask(over.id)) {
+ if (!store.hasChild(over.id)) {
+ over.$open = true;
+ store.move(item.id, -1, over.id);
+ return;
+ }
+
+ if (store.getIndexById(over.id) || itemHeight / 3 < targetY) return;
+ }
+ } //if item is on different level, check the one before it
+
+
+ var index = store.getIndexById(over.id),
+ prevId = store.getIdByIndex(index - 1);
+ var prev = store.getItem(prevId);
+ var shift = 1;
+
+ while ((!prev || prev.id == over.id) && index - shift >= 0) {
+ prevId = store.getIdByIndex(index - shift);
+ prev = store.getItem(prevId);
+ shift++;
+ }
+
+ if (item.id == over.id || checkPlaceholderTask(over.id)) return; //replacing item under cursor
+
+ if (allowedLevel(over, item) && item.id != over.id) {
+ store.move(item.id, 0, 0, over.id);
+ } else if (over.$level == item.$level - 1 && !store.getChildren(over.id).length) {
+ store.move(item.id, 0, over.id);
+ } else if (prev && allowedLevel(prev, item) && item.id != prev.id) {
+ store.move(item.id, -1, store.getParent(prev.id));
+ }
+ }
+
+ return true;
+ }, gantt));
+ dnd.attachEvent("onDragEnd", gantt.bind(function () {
+ var store = getStore();
+ var task = store.getItem(dnd.config.id);
+ task.$transparent = false;
+ task.$open = dnd.config.initial_open_state;
+
+ if (this.callEvent("onBeforeRowDragEnd", [dnd.config.id, dnd.config.parent, dnd.config.index]) === false) {
+ store.move(dnd.config.id, dnd.config.index, dnd.config.parent);
+ task.$drop_target = null;
+ } else {
+ this.callEvent("onRowDragEnd", [dnd.config.id, task.$drop_target]);
+ }
+
+ gantt.render();
+ this.refreshData();
+ }, gantt));
+}
+
+module.exports = {
+ init: _init_dnd
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/tasks_grid_dnd_marker.js":
+/*!*******************************************************!*\
+ !*** ./sources/core/ui/grid/tasks_grid_dnd_marker.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var dropTarget = __webpack_require__(/*! ./tasks_grid_dnd_marker_helpers/drop_target */ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/drop_target.js");
+
+var getLockedLevelTarget = __webpack_require__(/*! ./tasks_grid_dnd_marker_helpers/locked_level */ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/locked_level.js");
+
+var getMultiLevelTarget = __webpack_require__(/*! ./tasks_grid_dnd_marker_helpers/multi_level */ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/multi_level.js");
+
+var higlighter = __webpack_require__(/*! ./tasks_grid_dnd_marker_helpers/highlight */ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/highlight.js");
+
+var isPlaceholderTask = __webpack_require__(/*! ../../../utils/placeholder_task */ "./sources/utils/placeholder_task.js");
+
+function _init_dnd(gantt, grid) {
+ var DnD = gantt.$services.getService("dnd");
+
+ if (!grid.$config.bind || !gantt.getDatastore(grid.$config.bind)) {
+ return;
+ }
+
+ function locate(e) {
+ return domHelpers.locateAttribute(e, grid.$config.item_attribute);
+ }
+
+ function getStore() {
+ return gantt.getDatastore(grid.$config.bind);
+ }
+
+ function checkPlaceholderTask(id) {
+ return isPlaceholderTask(id, gantt, getStore());
+ }
+
+ var dnd = new DnD(grid.$grid_data, {
+ updates_per_second: 60
+ });
+ if (gantt.defined(grid.$getConfig().dnd_sensitivity)) dnd.config.sensitivity = grid.$getConfig().dnd_sensitivity;
+ dnd.attachEvent("onBeforeDragStart", gantt.bind(function (obj, e) {
+ var el = locate(e);
+ if (!el) return false;
+ if (gantt.hideQuickInfo) gantt._hideQuickInfo();
+
+ if (domHelpers.closest(e.target, ".gantt_grid_editor_placeholder")) {
+ return false;
+ }
+
+ var id = el.getAttribute(grid.$config.item_attribute);
+ var datastore = grid.$config.rowStore;
+ var task = datastore.getItem(id);
+ if (gantt.isReadonly(task) || checkPlaceholderTask(id)) return false;
+ dnd.config.initial_open_state = task.$open;
+
+ if (!gantt.callEvent("onRowDragStart", [id, e.target || e.srcElement, e])) {
+ return false;
+ }
+ }, gantt));
+ dnd.attachEvent("onAfterDragStart", gantt.bind(function (obj, e) {
+ var el = locate(e);
+ dnd.config.marker.innerHTML = el.outerHTML;
+ var element = dnd.config.marker.firstChild;
+
+ if (element) {
+ dnd.config.marker.style.opacity = 0.4;
+ element.style.position = "static";
+ element.style.pointerEvents = "none";
+ }
+
+ dnd.config.id = el.getAttribute(grid.$config.item_attribute);
+ var store = grid.$config.rowStore;
+ var task = store.getItem(dnd.config.id);
+ dnd.config.level = store.calculateItemLevel(task);
+ dnd.config.drop_target = dropTarget.createDropTargetObject({
+ targetParent: store.getParent(task.id),
+ targetIndex: store.getBranchIndex(task.id),
+ targetId: task.id,
+ nextSibling: true
+ });
+ task.$open = false;
+ task.$transparent = true;
+ this.refreshData();
+ }, gantt));
+
+ function getTargetTaskId(e) {
+ var y = domHelpers.getRelativeEventPosition(e, grid.$grid_data).y;
+ var store = grid.$config.rowStore;
+
+ if (!document.doctype) {
+ y += window.scrollY;
+ }
+
+ y = y || 0; // limits for the marker according to the layout layer
+
+ var scrollPos = grid.$state.scrollTop || 0;
+ var maxBottom = gantt.$grid_data.getBoundingClientRect().height + scrollPos + window.scrollY;
+ var minTop = scrollPos;
+ var firstVisibleTaskIndex = grid.getItemIndexByTopPosition(grid.$state.scrollTop);
+
+ if (!store.exists(firstVisibleTaskIndex)) {
+ firstVisibleTaskIndex = store.countVisible() - 1;
+ }
+
+ if (firstVisibleTaskIndex < 0) {
+ return store.$getRootId();
+ }
+
+ var firstVisibleTaskId = store.getIdByIndex(firstVisibleTaskIndex);
+ var firstVisibleTaskPos = grid.$state.scrollTop / grid.getItemHeight(firstVisibleTaskId);
+ var hiddenTaskPart = firstVisibleTaskPos - Math.floor(firstVisibleTaskPos);
+
+ if (hiddenTaskPart > 0.1 && hiddenTaskPart < 0.9) {
+ maxBottom = maxBottom - grid.getItemHeight(firstVisibleTaskId) * hiddenTaskPart;
+ minTop = minTop + grid.getItemHeight(firstVisibleTaskId) * (1 - hiddenTaskPart);
+ } // GS-715. The placeholder task row shouldn't be draggable below the Gantt container
+
+
+ var gridPosition = domHelpers.getNodePosition(grid.$grid_data);
+ var gridBottom = gridPosition.y + gridPosition.height;
+ var placeholderRowHeight = dnd.config.marker.offsetHeight;
+
+ if (y + placeholderRowHeight + window.scrollY >= maxBottom) {
+ dnd.config.marker.style.top = gridBottom - placeholderRowHeight + "px";
+ }
+
+ if (y >= maxBottom) {
+ y = maxBottom;
+ } else if (y <= minTop) {
+ y = minTop;
+ dnd.config.marker.style.top = gridPosition.y + "px";
+ }
+
+ var index = grid.getItemIndexByTopPosition(y);
+
+ if (index > store.countVisible() - 1 || index < 0) {
+ return store.$getRootId();
+ }
+
+ var targetId = store.getIdByIndex(index);
+
+ if (checkPlaceholderTask(targetId)) {
+ return store.getPrevSibling(targetId);
+ }
+
+ return store.getIdByIndex(index);
+ }
+
+ function getDropPosition(e) {
+ var targetTaskId = getTargetTaskId(e);
+ var relTargetPos = null;
+ var store = grid.$config.rowStore;
+ var config = grid.$getConfig();
+ var lockLevel = !config.order_branch_free;
+ var eventTop = domHelpers.getRelativeEventPosition(e, grid.$grid_data).y;
+
+ if (!document.doctype) {
+ eventTop += window.scrollY;
+ }
+
+ if (targetTaskId !== store.$getRootId()) {
+ var rowTop = grid.getItemTop(targetTaskId);
+ var rowHeight = grid.getItemHeight(targetTaskId);
+ relTargetPos = (eventTop - rowTop) / rowHeight;
+ }
+
+ var result;
+
+ if (!lockLevel) {
+ result = getMultiLevelTarget(dnd.config.id, targetTaskId, relTargetPos, eventTop, store);
+ } else {
+ result = getLockedLevelTarget(dnd.config.id, targetTaskId, relTargetPos, eventTop, store, dnd.config.level);
+
+ if (result && result.targetParent && checkPlaceholderTask(result.targetParent)) {
+ targetTaskId = store.getPrevSibling(result.targetParent);
+ result = getLockedLevelTarget(dnd.config.id, targetTaskId, relTargetPos, eventTop, store, dnd.config.level);
+ }
+ }
+
+ return result;
+ }
+
+ dnd.attachEvent("onDragMove", gantt.bind(function (obj, e) {
+ var target = getDropPosition(e);
+
+ if (!target || gantt.callEvent("onBeforeRowDragMove", [dnd.config.id, target.targetParent, target.targetIndex]) === false) {
+ target = dropTarget.createDropTargetObject(dnd.config.drop_target);
+ }
+
+ higlighter.highlightPosition(target, dnd.config, grid);
+ dnd.config.drop_target = target;
+
+ gantt._waiAria.reorderMarkerAttr(dnd.config.marker);
+
+ this.callEvent("onRowDragMove", [dnd.config.id, target.targetParent, target.targetIndex]);
+ return true;
+ }, gantt));
+ dnd.attachEvent("onDragEnd", gantt.bind(function () {
+ var store = grid.$config.rowStore;
+ var task = store.getItem(dnd.config.id);
+ higlighter.removeLineHighlight(dnd.config);
+ task.$transparent = false;
+ task.$open = dnd.config.initial_open_state;
+ var target = dnd.config.drop_target;
+
+ if (this.callEvent("onBeforeRowDragEnd", [dnd.config.id, target.targetParent, target.targetIndex]) === false) {
+ task.$drop_target = null;
+ } else {
+ store.move(dnd.config.id, target.targetIndex, target.targetParent);
+ gantt.render();
+ this.callEvent("onRowDragEnd", [dnd.config.id, target.targetParent, target.targetIndex]);
+ }
+
+ store.refresh(task.id);
+ }, gantt));
+}
+
+module.exports = {
+ init: _init_dnd
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/drop_target.js":
+/*!***************************************************************************!*\
+ !*** ./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/drop_target.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/**
+ * The state object for order branch drag and drop
+ */
+var utils = __webpack_require__(/*! ../../../../utils/utils */ "./sources/utils/utils.js");
+
+module.exports = {
+ createDropTargetObject: function createDropTargetObject(parent) {
+ var res = {
+ targetParent: null,
+ targetIndex: 0,
+ targetId: null,
+ child: false,
+ nextSibling: false,
+ prevSibling: false
+ };
+
+ if (parent) {
+ utils.mixin(res, parent, true);
+ }
+
+ return res;
+ },
+ nextSiblingTarget: function nextSiblingTarget(dndTaskId, targetTaskId, store) {
+ var result = this.createDropTargetObject();
+ result.targetId = targetTaskId;
+ result.nextSibling = true;
+ result.targetParent = store.getParent(result.targetId);
+ result.targetIndex = store.getBranchIndex(result.targetId);
+
+ if (store.getParent(dndTaskId) != result.targetParent || result.targetIndex < store.getBranchIndex(dndTaskId)) {
+ result.targetIndex += 1;
+ }
+
+ return result;
+ },
+ prevSiblingTarget: function prevSiblingTarget(dndTaskId, targetTaskId, store) {
+ var result = this.createDropTargetObject();
+ result.targetId = targetTaskId;
+ result.prevSibling = true;
+ result.targetParent = store.getParent(result.targetId);
+ result.targetIndex = store.getBranchIndex(result.targetId);
+
+ if (store.getParent(dndTaskId) == result.targetParent && result.targetIndex > store.getBranchIndex(dndTaskId)) {
+ result.targetIndex -= 1;
+ }
+
+ return result;
+ },
+ firstChildTarget: function firstChildTarget(dndTaskId, targetTaskId, store) {
+ var result = this.createDropTargetObject();
+ result.targetId = targetTaskId;
+ result.targetParent = result.targetId;
+ result.targetIndex = 0;
+ result.child = true;
+ return result;
+ },
+ lastChildTarget: function lastChildTarget(dndTaskId, targetTaskId, store) {
+ var children = store.getChildren(targetTaskId);
+ var result = this.createDropTargetObject();
+ result.targetId = children[children.length - 1];
+ result.targetParent = targetTaskId;
+ result.targetIndex = children.length;
+ result.nextSibling = true;
+ return result;
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/highlight.js":
+/*!*************************************************************************!*\
+ !*** ./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/highlight.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+/**
+ * methods for highlighting current drag and drop position
+ */
+
+
+function highlightPosition(target, root, grid) {
+ var markerPos = getTaskMarkerPosition(target, grid); // setting position of row
+
+ root.marker.style.left = markerPos.x + 9 + "px";
+ root.marker.style.width = markerPos.width + "px";
+ root.marker.style.overflow = "hidden";
+ var markerLine = root.markerLine;
+
+ if (!markerLine) {
+ markerLine = document.createElement("div");
+ markerLine.className = "gantt_drag_marker gantt_grid_dnd_marker";
+ markerLine.innerHTML = "<div class='gantt_grid_dnd_marker_line'></div>";
+ markerLine.style.pointerEvents = "none";
+ }
+
+ if (target.child) {
+ highlightFolder(target, markerLine, grid);
+ } else {
+ highlightRow(target, markerLine, grid);
+ }
+
+ if (!root.markerLine) {
+ document.body.appendChild(markerLine);
+ root.markerLine = markerLine;
+ }
+}
+
+function removeLineHighlight(root) {
+ if (root.markerLine && root.markerLine.parentNode) {
+ root.markerLine.parentNode.removeChild(root.markerLine);
+ }
+
+ root.markerLine = null;
+}
+
+function highlightRow(target, markerLine, grid) {
+ var linePos = getLineMarkerPosition(target, grid);
+ var maxBottom = grid.$grid_data.getBoundingClientRect().bottom + window.scrollY;
+ markerLine.innerHTML = "<div class='gantt_grid_dnd_marker_line'></div>";
+ markerLine.style.left = linePos.x + "px";
+ markerLine.style.height = "4px";
+ var markerLineTop = linePos.y - 2;
+ markerLine.style.top = markerLineTop + "px";
+ markerLine.style.width = linePos.width + "px";
+
+ if (markerLineTop > maxBottom) {
+ markerLine.style.top = maxBottom + 'px';
+ }
+
+ return markerLine;
+}
+
+function highlightFolder(target, markerFolder, grid) {
+ var id = target.targetParent;
+ var pos = gridToPageCoordinates({
+ x: 0,
+ y: grid.getItemTop(id)
+ }, grid);
+ var maxBottom = grid.$grid_data.getBoundingClientRect().bottom + window.scrollY;
+ var folderHighlightWidth = setWidthWithinContainer(grid.$gantt, grid.$grid_data.offsetWidth);
+ markerFolder.innerHTML = "<div class='gantt_grid_dnd_marker_folder'></div>";
+ markerFolder.style.width = folderHighlightWidth + "px";
+ markerFolder.style.top = pos.y + "px";
+ markerFolder.style.left = pos.x + "px";
+ markerFolder.style.height = grid.getItemHeight(id) + "px";
+
+ if (pos.y > maxBottom) {
+ markerFolder.style.top = maxBottom + 'px';
+ }
+
+ return markerFolder;
+}
+
+function getLineMarkerPosition(target, grid) {
+ var store = grid.$config.rowStore;
+ var pos = {
+ x: 0,
+ y: 0
+ };
+ var indentNode = grid.$grid_data.querySelector(".gantt_tree_indent");
+ var indent = 15;
+ var level = 0;
+
+ if (indentNode) {
+ indent = indentNode.offsetWidth;
+ }
+
+ var iconWidth = 40;
+
+ if (target.targetId !== store.$getRootId()) {
+ var itemTop = grid.getItemTop(target.targetId);
+ var itemHeight = grid.getItemHeight(target.targetId);
+ level = store.exists(target.targetId) ? store.calculateItemLevel(store.getItem(target.targetId)) : 0;
+
+ if (target.prevSibling) {
+ pos.y = itemTop;
+ } else if (target.nextSibling) {
+ var childCount = 0;
+ store.eachItem(function (child) {
+ if (store.getIndexById(child.id) !== -1) childCount++;
+ }, target.targetId);
+ pos.y = itemTop + itemHeight + childCount * itemHeight;
+ } else {
+ pos.y = itemTop + itemHeight;
+ level += 1;
+ }
+ }
+
+ pos.x = iconWidth + level * indent;
+ pos.width = setWidthWithinContainer(grid.$gantt, Math.max(grid.$grid_data.offsetWidth - pos.x, 0), pos.x);
+ return gridToPageCoordinates(pos, grid);
+}
+
+function gridToPageCoordinates(pos, grid) {
+ var gridPos = domHelpers.getNodePosition(grid.$grid_data);
+ pos.x += gridPos.x + grid.$grid.scrollLeft;
+ pos.y += gridPos.y - grid.$grid_data.scrollTop;
+ return pos;
+}
+
+function getTaskMarkerPosition(e, grid) {
+ var pos = domHelpers.getNodePosition(grid.$grid_data);
+ var ePos = domHelpers.getRelativeEventPosition(e, grid.$grid_data); // row offset
+
+ var x = pos.x + grid.$grid.scrollLeft;
+ var y = ePos.y - 10;
+ var rowHeight = grid.getItemHeight(e.targetId); // prevent moving row out of grid_data container
+
+ if (y < pos.y) y = pos.y;
+ var gridHeight = grid.getTotalHeight();
+ if (y > pos.y + gridHeight - rowHeight) y = pos.y + gridHeight - rowHeight;
+ pos.x = x;
+ pos.y = y;
+ pos.width = setWidthWithinContainer(grid.$gantt, pos.width, 9);
+ return pos;
+}
+
+function setWidthWithinContainer(gantt, width) {
+ var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
+ var containerSize = domHelpers.getNodePosition(gantt.$root);
+
+ if (width > containerSize.width) {
+ width = containerSize.width - offset - 2;
+ }
+
+ return width;
+}
+
+module.exports = {
+ removeLineHighlight: removeLineHighlight,
+ highlightPosition: highlightPosition
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/locked_level.js":
+/*!****************************************************************************!*\
+ !*** ./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/locked_level.js ***!
+ \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/**
+ * resolve dnd position of the task when gantt.config.order_branch_free = false
+ */
+var dropTarget = __webpack_require__(/*! ./drop_target */ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/drop_target.js");
+
+function getLast(store) {
+ var current = store.getNext();
+
+ while (store.exists(current)) {
+ var next = store.getNext(current);
+
+ if (!store.exists(next)) {
+ return current;
+ } else {
+ current = next;
+ }
+ }
+
+ return null;
+}
+
+function findClosesTarget(dndTaskId, taskId, allowedLevel, store, up) {
+ var prev = taskId;
+
+ while (store.exists(prev)) {
+ var targetLevel = store.calculateItemLevel(store.getItem(prev));
+
+ if ((targetLevel === allowedLevel || targetLevel === allowedLevel - 1) && store.getBranchIndex(prev) > -1) {
+ break;
+ } else {
+ prev = up ? store.getPrev(prev) : store.getNext(prev);
+ }
+ }
+
+ if (store.exists(prev)) {
+ if (store.calculateItemLevel(store.getItem(prev)) === allowedLevel) {
+ return up ? dropTarget.nextSiblingTarget(dndTaskId, prev, store) : dropTarget.prevSiblingTarget(dndTaskId, prev, store);
+ } else {
+ return dropTarget.firstChildTarget(dndTaskId, prev, store);
+ }
+ }
+
+ return null;
+}
+
+function findTargetAbove(dndTaskId, taskId, allowedLevel, store) {
+ return findClosesTarget(dndTaskId, taskId, allowedLevel, store, true);
+}
+
+function findTargetBelow(dndTaskId, taskId, allowedLevel, store) {
+ return findClosesTarget(dndTaskId, taskId, allowedLevel, store, false);
+}
+
+module.exports = function getSameLevelDropPosition(dndTaskId, targetTaskId, relTargetPos, eventTop, store, level) {
+ var result;
+
+ if (targetTaskId !== store.$getRootId()) {
+ var targetTask = store.getItem(targetTaskId);
+ var targetLevel = store.calculateItemLevel(targetTask);
+
+ if (targetLevel === level) {
+ var prevSibling = store.getPrevSibling(targetTaskId);
+
+ if (relTargetPos < 0.5 && !prevSibling) {
+ result = dropTarget.prevSiblingTarget(dndTaskId, targetTaskId, store);
+ } else {
+ if (relTargetPos < 0.5) {
+ targetTaskId = prevSibling;
+ }
+
+ result = dropTarget.nextSiblingTarget(dndTaskId, targetTaskId, store);
+ }
+ } else if (targetLevel > level) {
+ store.eachParent(function (parent) {
+ if (store.calculateItemLevel(parent) === level) {
+ targetTaskId = parent.id;
+ }
+ }, targetTask);
+ result = findTargetAbove(dndTaskId, targetTaskId, level, store);
+ } else {
+ var targetAbove = findTargetAbove(dndTaskId, targetTaskId, level, store);
+ var targetBelow = findTargetBelow(dndTaskId, targetTaskId, level, store);
+ result = relTargetPos < 0.5 ? targetAbove : targetBelow;
+ }
+ } else {
+ var rootId = store.$getRootId();
+ var rootLevel = store.getChildren(rootId);
+ result = dropTarget.createDropTargetObject();
+
+ if (rootLevel.length && eventTop >= 0) {
+ result = findTargetAbove(dndTaskId, getLast(store), level, store);
+ } else {
+ result = findTargetBelow(dndTaskId, rootId, level, store);
+ }
+ }
+
+ return result;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/multi_level.js":
+/*!***************************************************************************!*\
+ !*** ./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/multi_level.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/**
+ * resolve dnd position of the task when gantt.config.order_branch_free = true
+ */
+var dropTarget = __webpack_require__(/*! ./drop_target */ "./sources/core/ui/grid/tasks_grid_dnd_marker_helpers/drop_target.js");
+
+module.exports = function getMultiLevelDropPosition(dndTaskId, targetTaskId, relTargetPos, eventTop, store) {
+ var result;
+
+ if (targetTaskId !== store.$getRootId()) {
+ if (relTargetPos < 0.25) {
+ result = dropTarget.prevSiblingTarget(dndTaskId, targetTaskId, store);
+ } else if (relTargetPos > 0.60 && !(store.hasChild(targetTaskId) && store.getItem(targetTaskId).$open)) {
+ result = dropTarget.nextSiblingTarget(dndTaskId, targetTaskId, store);
+ } else {
+ result = dropTarget.firstChildTarget(dndTaskId, targetTaskId, store);
+ }
+ } else {
+ var rootId = store.$getRootId();
+
+ if (store.hasChild(rootId) && eventTop >= 0) {
+ result = dropTarget.lastChildTarget(dndTaskId, rootId, store);
+ } else {
+ result = dropTarget.firstChildTarget(dndTaskId, rootId, store);
+ }
+ }
+
+ return result;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/index.js":
+/*!**********************************!*\
+ !*** ./sources/core/ui/index.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var uiFactory = __webpack_require__(/*! ./ui_factory */ "./sources/core/ui/ui_factory.js"),
+ mouseEvents = __webpack_require__(/*! ./mouse */ "./sources/core/ui/mouse.js"),
+ createLayers = __webpack_require__(/*! ./gantt_layers */ "./sources/core/ui/gantt_layers.js"),
+ Cell = __webpack_require__(/*! ./layout/cell */ "./sources/core/ui/layout/cell.js"),
+ Layout = __webpack_require__(/*! ./layout/layout */ "./sources/core/ui/layout/layout.js"),
+ ViewLayout = __webpack_require__(/*! ./layout/view_layout */ "./sources/core/ui/layout/view_layout.js"),
+ ViewCell = __webpack_require__(/*! ./layout/view_cell */ "./sources/core/ui/layout/view_cell.js"),
+ Resizer = __webpack_require__(/*! ./layout/resizer_cell */ "./sources/core/ui/layout/resizer_cell.gpl.js"),
+ Scrollbar = __webpack_require__(/*! ./layout/scrollbar_cell */ "./sources/core/ui/layout/scrollbar_cell.js"),
+ Timeline = __webpack_require__(/*! ./timeline/timeline */ "./sources/core/ui/timeline/timeline.js"),
+ Grid = __webpack_require__(/*! ./grid/grid */ "./sources/core/ui/grid/grid.js"),
+ ResourceGrid = __webpack_require__(/*! ./grid/resource_grid */ "./sources/core/ui/grid/grid.js"),
+ ResourceTimeline = __webpack_require__(/*! ./timeline/resource_timeline */ "./sources/core/ui/timeline/timeline.js"),
+ ResourceHistogram = __webpack_require__(/*! ./timeline/resource_histogram */ "./sources/core/ui/timeline/timeline.js");
+
+var gridEditorsFactory = __webpack_require__(/*! ./grid/editors/controller */ "./sources/core/ui/grid/editors/controller.js");
+
+var renderTaskBar = __webpack_require__(/*! ./render/task_bar_smart_render */ "./sources/core/ui/render/task_bar_smart_render.js"),
+ renderSplitTaskBar = __webpack_require__(/*! ./render/task_split_render */ "./sources/core/ui/render/task_split_render.js"),
+ renderRollupTaskBar = __webpack_require__(/*! ./render/task_rollup_render */ "./sources/core/ui/render/task_rollup_render.js"),
+ renderTaskBg = __webpack_require__(/*! ./render/task_bg_render */ "./sources/core/ui/render/task_bg_render.js"),
+ renderLink = __webpack_require__(/*! ./render/link_render */ "./sources/core/ui/render/link_render.js"),
+ gridRenderer = __webpack_require__(/*! ./render/task_grid_line_render */ "./sources/core/ui/render/task_grid_line_render.js"),
+ resourceMatrixRenderer = __webpack_require__(/*! ./render/resource_matrix_render */ "./sources/core/ui/render/resource_matrix_render.js"),
+ resourceHistogramRenderer = __webpack_require__(/*! ./render/resource_histogram_render */ "./sources/core/ui/render/resource_histogram_render.js"),
+ gridTaskRowResizerRenderer = __webpack_require__(/*! ./render/task_grid_row_resize_render */ "./sources/core/ui/render/task_grid_row_resize_render.js");
+
+var mainGridInitializer = __webpack_require__(/*! ./grid/main_grid_initializer */ "./sources/core/ui/grid/main_grid_initializer.js");
+
+var mainTimelineInitializer = __webpack_require__(/*! ./timeline/main_timeline_initializer */ "./sources/core/ui/timeline/main_timeline_initializer.js");
+
+var mainLayoutInitializer = __webpack_require__(/*! ./main_layout_initializer */ "./sources/core/ui/main_layout_initializer.js");
+
+function initUI(gantt) {
+ function attachInitializer(view, initializer) {
+ var ext = initializer(gantt);
+ if (ext.onCreated) ext.onCreated(view);
+ view.attachEvent("onReady", function () {
+ if (ext.onInitialized) ext.onInitialized(view);
+ });
+ view.attachEvent("onDestroy", function () {
+ if (ext.onDestroyed) ext.onDestroyed(view);
+ });
+ }
+
+ var factory = uiFactory.createFactory(gantt);
+ factory.registerView("cell", Cell);
+ factory.registerView("resizer", Resizer);
+ factory.registerView("scrollbar", Scrollbar);
+ factory.registerView("layout", Layout, function (view) {
+ var id = view.$config ? view.$config.id : null;
+
+ if (id === "main") {
+ attachInitializer(view, mainLayoutInitializer);
+ }
+ });
+ factory.registerView("viewcell", ViewCell);
+ factory.registerView("multiview", ViewLayout);
+ factory.registerView("timeline", Timeline, function (view) {
+ var id = view.$config ? view.$config.id : null;
+
+ if (id === "timeline" || view.$config.bind == "task") {
+ attachInitializer(view, mainTimelineInitializer);
+ }
+ });
+ factory.registerView("grid", Grid, function (view) {
+ var id = view.$config ? view.$config.id : null;
+
+ if (id === "grid" || view.$config.bind == "task") {
+ attachInitializer(view, mainGridInitializer);
+ }
+ });
+ factory.registerView("resourceGrid", ResourceGrid);
+ factory.registerView("resourceTimeline", ResourceTimeline);
+ factory.registerView("resourceHistogram", ResourceHistogram);
+ var layersEngine = createLayers(gantt);
+ var inlineEditors = gridEditorsFactory(gantt);
+ gantt.ext.inlineEditors = inlineEditors;
+ gantt.ext._inlineEditors = inlineEditors;
+ inlineEditors.init(gantt);
+ return {
+ factory: factory,
+ mouseEvents: mouseEvents.init(gantt),
+ layersApi: layersEngine.init(),
+ render: {
+ gridLine: function gridLine() {
+ return gridRenderer(gantt);
+ },
+ taskBg: function taskBg() {
+ return renderTaskBg(gantt);
+ },
+ taskBar: function taskBar() {
+ return renderTaskBar(gantt);
+ },
+ taskRollupBar: function taskRollupBar() {
+ return renderRollupTaskBar(gantt);
+ },
+ taskSplitBar: function taskSplitBar() {
+ return renderSplitTaskBar(gantt);
+ },
+ link: function link() {
+ return renderLink(gantt);
+ },
+ resourceRow: function resourceRow() {
+ return resourceMatrixRenderer(gantt);
+ },
+ resourceHistogram: function resourceHistogram() {
+ return resourceHistogramRenderer(gantt);
+ },
+ gridTaskRowResizer: function gridTaskRowResizer() {
+ return gridTaskRowResizerRenderer(gantt);
+ }
+ },
+ layersService: {
+ getDataRender: function getDataRender(name) {
+ return layersEngine.getDataRender(name, gantt);
+ },
+ createDataRender: function createDataRender(config) {
+ return layersEngine.createDataRender(config, gantt);
+ }
+ }
+ };
+}
+
+module.exports = {
+ init: initUI
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/layout/cell.js":
+/*!****************************************!*\
+ !*** ./sources/core/ui/layout/cell.js ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js"),
+ eventable = __webpack_require__(/*! ../../../utils/eventable */ "./sources/utils/eventable.js"),
+ domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var Cell = function () {
+ "use strict";
+
+ function Cell(parent, config, factory, gantt) {
+ if (parent) {
+ this.$container = domHelpers.toNode(parent);
+ this.$parent = parent;
+ } // save config
+
+
+ this.$config = utils.mixin(config, {
+ headerHeight: 33
+ });
+ this.$gantt = gantt;
+ this.$domEvents = gantt._createDomEventScope(); // set id
+
+ this.$id = config.id || "c" + utils.uid();
+ this.$name = "cell";
+ this.$factory = factory;
+ eventable(this);
+ }
+
+ Cell.prototype.destructor = function () {
+ this.$parent = this.$container = this.$view = null;
+ var mouse = this.$gantt.$services.getService("mouseEvents");
+ mouse.detach("click", "gantt_header_arrow", this._headerClickHandler);
+ this.$domEvents.detachAll();
+ this.callEvent("onDestroy", []);
+ this.detachAllEvents();
+ };
+
+ Cell.prototype.cell = function (id) {
+ return null;
+ };
+
+ Cell.prototype.scrollTo = function (left, top) {
+ //GS-333 Add a way to scroll the HTML views:
+ var cell = this.$view;
+ if (this.$config.html) cell = this.$view.firstChild;
+
+ if (left * 1 == left) {
+ cell.scrollLeft = left;
+ }
+
+ if (top * 1 == top) {
+ cell.scrollTop = top;
+ }
+ };
+
+ Cell.prototype.clear = function () {
+ this.getNode().innerHTML = "";
+ this.getNode().className = "gantt_layout_content";
+ this.getNode().style.padding = "0";
+ };
+
+ Cell.prototype.resize = function (_final) {
+ if (this.$parent) {
+ return this.$parent.resize(_final);
+ }
+
+ if (_final === false) {
+ this.$preResize = true;
+ }
+
+ var topCont = this.$container;
+ var x = topCont.offsetWidth;
+ var y = topCont.offsetHeight;
+ var topSize = this.getSize();
+
+ if (topCont === document.body) {
+ x = document.body.offsetWidth;
+ y = document.body.offsetHeight;
+ }
+
+ if (x < topSize.minWidth) {
+ x = topSize.minWidth;
+ }
+
+ if (x > topSize.maxWidth) {
+ x = topSize.maxWidth;
+ }
+
+ if (y < topSize.minHeight) {
+ y = topSize.minHeight;
+ }
+
+ if (y > topSize.maxHeight) {
+ y = topSize.maxHeight;
+ }
+
+ this.setSize(x, y);
+
+ if (!this.$preResize) {// self.callEvent("onResize", [x, y]);
+ }
+
+ this.$preResize = false;
+ };
+
+ Cell.prototype.hide = function () {
+ this._hide(true);
+
+ this.resize();
+ };
+
+ Cell.prototype.show = function (force) {
+ this._hide(false);
+
+ if (force && this.$parent) {
+ this.$parent.show();
+ }
+
+ this.resize();
+ };
+
+ Cell.prototype._hide = function (mode) {
+ if (mode === true && this.$view.parentNode) {
+ this.$view.parentNode.removeChild(this.$view);
+ } else if (mode === false && !this.$view.parentNode) {
+ var index = this.$parent.cellIndex(this.$id);
+ this.$parent.moveView(this, index);
+ }
+
+ this.$config.hidden = mode;
+ };
+
+ Cell.prototype.$toHTML = function (content, css) {
+ if (content === void 0) {
+ content = "";
+ }
+
+ css = [css || "", this.$config.css || ""].join(" ");
+ var obj = this.$config;
+ var header = "";
+
+ if (obj.raw) {
+ content = typeof obj.raw === "string" ? obj.raw : "";
+ } else {
+ if (!content) {
+ content = "<div class='gantt_layout_content' " + (css ? " class='" + css + "' " : "") + " >" + (obj.html || "") + "</div>";
+ }
+
+ if (obj.header) {
+ var collapseIcon = obj.canCollapse ? "<div class='gantt_layout_header_arrow'></div>" : "";
+ header = "<div class='gantt_layout_header'>" + collapseIcon + "<div class='gantt_layout_header_content'>" + obj.header + "</div></div>";
+ }
+ }
+
+ return "<div class='gantt_layout_cell " + css + "' data-cell-id='" + this.$id + "'>" + header + content + "</div>";
+ };
+
+ Cell.prototype.$fill = function (node, parent) {
+ this.$view = node;
+ this.$parent = parent;
+ this.init();
+ };
+
+ Cell.prototype.getNode = function () {
+ return this.$view.querySelector("gantt_layout_cell") || this.$view;
+ };
+
+ Cell.prototype.init = function () {
+ // [NOT-GOOD] code is executed for each component, while it still has only one handler, it is no good
+ var self = this;
+
+ this._headerClickHandler = function (e) {
+ var cellId = domHelpers.locateAttribute(e, "data-cell-id");
+
+ if (cellId == self.$id) {
+ self.toggle();
+ }
+ };
+
+ var mouse = this.$gantt.$services.getService("mouseEvents");
+ mouse.delegate("click", "gantt_header_arrow", this._headerClickHandler);
+ this.callEvent("onReady", []);
+ };
+
+ Cell.prototype.toggle = function () {
+ this.$config.collapsed = !this.$config.collapsed;
+ this.resize();
+ };
+
+ Cell.prototype.getSize = function () {
+ var size = {
+ height: this.$config.height || 0,
+ width: this.$config.width || 0,
+ gravity: this.$config.gravity || 1,
+ minHeight: this.$config.minHeight || 0,
+ minWidth: this.$config.minWidth || 0,
+ maxHeight: this.$config.maxHeight || 100000000000,
+ maxWidth: this.$config.maxWidth || 100000000000
+ };
+
+ if (this.$config.collapsed) {
+ var mode = this.$config.mode === "x";
+ size[mode ? "width" : "height"] = size[mode ? "maxWidth" : "maxHeight"] = this.$config.headerHeight;
+ }
+
+ return size;
+ };
+
+ Cell.prototype.getContentSize = function () {
+ var width = this.$lastSize.contentX;
+
+ if (width !== width * 1) {
+ width = this.$lastSize.width;
+ }
+
+ var height = this.$lastSize.contentY;
+
+ if (height !== height * 1) {
+ height = this.$lastSize.height;
+ }
+
+ return {
+ width: width,
+ height: height
+ };
+ };
+
+ Cell.prototype._getBorderSizes = function () {
+ var borders = {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ horizontal: 0,
+ vertical: 0
+ };
+
+ if (this._currentBorders) {
+ if (this._currentBorders[this._borders.left]) {
+ borders.left = 1;
+ borders.horizontal++;
+ }
+
+ if (this._currentBorders[this._borders.right]) {
+ borders.right = 1;
+ borders.horizontal++;
+ }
+
+ if (this._currentBorders[this._borders.top]) {
+ borders.top = 1;
+ borders.vertical++;
+ }
+
+ if (this._currentBorders[this._borders.bottom]) {
+ borders.bottom = 1;
+ borders.vertical++;
+ }
+ }
+
+ return borders;
+ };
+
+ Cell.prototype.setSize = function (x, y) {
+ this.$view.style.width = x + "px";
+ this.$view.style.height = y + "px";
+
+ var borders = this._getBorderSizes();
+
+ var contentY = y - borders.vertical;
+ var contentX = x - borders.horizontal;
+ this.$lastSize = {
+ x: x,
+ y: y,
+ contentX: contentX,
+ contentY: contentY
+ };
+
+ if (this.$config.header) {
+ this._sizeHeader();
+ } else {
+ this._sizeContent();
+ }
+ };
+
+ Cell.prototype._borders = {
+ "left": "gantt_layout_cell_border_left",
+ "right": "gantt_layout_cell_border_right",
+ "top": "gantt_layout_cell_border_top",
+ "bottom": "gantt_layout_cell_border_bottom"
+ };
+
+ Cell.prototype._setBorders = function (css, view) {
+ if (!view) {
+ view = this;
+ }
+
+ var node = view.$view;
+
+ for (var i in this._borders) {
+ domHelpers.removeClassName(node, this._borders[i]);
+ }
+
+ if (typeof css == "string") {
+ css = [css];
+ }
+
+ var cssHash = {};
+
+ for (var i = 0; i < css.length; i++) {
+ domHelpers.addClassName(node, css[i]);
+ cssHash[css[i]] = true;
+ }
+
+ view._currentBorders = cssHash;
+ };
+
+ Cell.prototype._sizeContent = function () {
+ var content = this.$view.childNodes[0];
+
+ if (content && content.className == "gantt_layout_content") {
+ content.style.height = this.$lastSize.contentY + "px";
+ }
+ };
+
+ Cell.prototype._sizeHeader = function () {
+ var size = this.$lastSize;
+ size.contentY -= this.$config.headerHeight;
+ var header = this.$view.childNodes[0];
+ var content = this.$view.childNodes[1];
+ var xLayout = this.$config.mode === "x";
+
+ if (this.$config.collapsed) {
+ content.style.display = "none";
+
+ if (xLayout) {
+ header.className = "gantt_layout_header collapsed_x";
+ header.style.width = size.y + "px";
+ var d = Math.floor(size.y / 2 - size.x / 2);
+ header.style.transform = "rotate(90deg) translate(" + d + "px, " + d + "px)";
+ content.style.display = "none";
+ } else {
+ header.className = "gantt_layout_header collapsed_y";
+ }
+ } else {
+ if (xLayout) {
+ header.className = "gantt_layout_header";
+ } else {
+ header.className = "gantt_layout_header vertical";
+ }
+
+ header.style.width = 'auto';
+ header.style.transform = '';
+ content.style.display = "";
+ content.style.height = size.contentY + "px";
+ }
+
+ header.style.height = this.$config.headerHeight + "px";
+ };
+
+ return Cell;
+}();
+
+module.exports = Cell;
+
+/***/ }),
+
+/***/ "./sources/core/ui/layout/layout.js":
+/*!******************************************!*\
+ !*** ./sources/core/ui/layout/layout.js ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../utils/extends */ "./sources/utils/extends.js"),
+ domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js"),
+ Cell = __webpack_require__(/*! ./cell */ "./sources/core/ui/layout/cell.js");
+
+var Layout = function (_super) {
+ "use strict";
+
+ __extends(Layout, _super);
+
+ function Layout(parent, config, factory) {
+ var _this = _super.apply(this, arguments) || this;
+
+ if (parent) _this.$root = true;
+
+ _this._parseConfig(config);
+
+ _this.$name = "layout";
+ return _this;
+ }
+
+ Layout.prototype.destructor = function () {
+ if (this.$container && this.$view) {
+ domHelpers.removeNode(this.$view);
+ }
+
+ for (var i = 0; i < this.$cells.length; i++) {
+ var child = this.$cells[i];
+ child.destructor();
+ }
+
+ this.$cells = [];
+
+ _super.prototype.destructor.call(this);
+ };
+
+ Layout.prototype._resizeScrollbars = function (autosize, scrollbars) {
+ var scrollChanged = false;
+ var visibleScrollbars = [],
+ hiddenScrollbars = [];
+ var scrollbarsToHide = [];
+
+ function showScrollbar(scrollbar) {
+ scrollbar.$parent.show();
+ scrollChanged = true;
+ visibleScrollbars.push(scrollbar);
+ }
+
+ function hideScrollbar(scrollbar) {
+ scrollbar.$parent.hide();
+ scrollChanged = true;
+ hiddenScrollbars.push(scrollbar);
+ }
+
+ var scrollbar;
+
+ for (var i = 0; i < scrollbars.length; i++) {
+ scrollbar = scrollbars[i];
+
+ if (autosize[scrollbar.$config.scroll]) {
+ hideScrollbar(scrollbar);
+ } else if (scrollbar.shouldHide()) {
+ //hideScrollbar(scrollbar);
+ scrollbarsToHide.push(scrollbar);
+ } else if (scrollbar.shouldShow()) {
+ showScrollbar(scrollbar);
+ } else {
+ if (scrollbar.isVisible()) {
+ visibleScrollbars.push(scrollbar);
+ } else {
+ hiddenScrollbars.push(scrollbar);
+ }
+ }
+ }
+
+ var visibleGroups = {};
+
+ for (var i = 0; i < visibleScrollbars.length; i++) {
+ if (visibleScrollbars[i].$config.group) {
+ visibleGroups[visibleScrollbars[i].$config.group] = true;
+ }
+ } // GS-2220
+
+
+ scrollbarsToHide.forEach(function (scrollbar) {
+ if (!(scrollbar.$config.group && visibleGroups[scrollbar.$config.group])) {
+ hideScrollbar(scrollbar);
+ }
+ });
+
+ for (var i = 0; i < hiddenScrollbars.length; i++) {
+ scrollbar = hiddenScrollbars[i];
+
+ if (scrollbar.$config.group && visibleGroups[scrollbar.$config.group]) {
+ showScrollbar(scrollbar); // GS-707 If the scrollbar was hidden then showed, the container resize shouldn't happen because of that
+
+ for (var j = 0; j < visibleScrollbars.length; j++) {
+ if (visibleScrollbars[j] == scrollbar) {
+ this.$gantt.$scrollbarRepaint = true;
+ break;
+ }
+ }
+ }
+ }
+
+ return scrollChanged;
+ };
+
+ Layout.prototype._syncCellSizes = function (groupName, newSize) {
+ if (!groupName) return;
+ var groups = {};
+
+ this._eachChild(function (cell) {
+ if (cell.$config.group && cell.$name != "scrollbar" && cell.$name != "resizer") {
+ if (!groups[cell.$config.group]) {
+ groups[cell.$config.group] = [];
+ }
+
+ groups[cell.$config.group].push(cell);
+ }
+ });
+
+ if (groups[groupName]) {
+ this._syncGroupSize(groups[groupName], newSize);
+ }
+
+ return groups[groupName];
+ };
+
+ Layout.prototype._syncGroupSize = function (cells, newSize) {
+ if (!cells.length) return;
+ var property = cells[0].$parent._xLayout ? "width" : "height";
+ var direction = cells[0].$parent.getNextSibling(cells[0].$id) ? 1 : -1;
+ var newSizeValue = newSize.value;
+ var isGravity = newSize.isGravity;
+
+ for (var i = 0; i < cells.length; i++) {
+ var ownSize = cells[i].getSize();
+ var resizeSibling = direction > 0 ? cells[i].$parent.getNextSibling(cells[i].$id) : cells[i].$parent.getPrevSibling(cells[i].$id);
+
+ if (resizeSibling.$name == "resizer") {
+ resizeSibling = direction > 0 ? resizeSibling.$parent.getNextSibling(resizeSibling.$id) : resizeSibling.$parent.getPrevSibling(resizeSibling.$id);
+ }
+
+ var siblingSize = resizeSibling.getSize();
+
+ if (!isGravity) {
+ if (resizeSibling[property]) {
+ var totalGravity = ownSize.gravity + siblingSize.gravity;
+ var totalSize = ownSize[property] + siblingSize[property];
+ var k = totalGravity / totalSize;
+ cells[i].$config.gravity = k * newSizeValue;
+ resizeSibling.$config[property] = totalSize - newSizeValue;
+ resizeSibling.$config.gravity = totalGravity - k * newSizeValue;
+ } else {
+ cells[i].$config[property] = newSizeValue;
+ }
+ } else {
+ cells[i].$config.gravity = newSizeValue;
+ }
+
+ var mainGrid = this.$gantt.$ui.getView("grid");
+
+ if (mainGrid && cells[i].$content === mainGrid && !mainGrid.$config.scrollable && !isGravity) {
+ this.$gantt.config.grid_width = newSizeValue;
+ }
+ }
+ };
+
+ Layout.prototype.resize = function (startStage) {
+ var mainCall = false;
+
+ if (this.$root && !this._resizeInProgress) {
+ this.callEvent("onBeforeResize", []);
+ mainCall = true;
+ this._resizeInProgress = true;
+ }
+
+ _super.prototype.resize.call(this, true);
+
+ _super.prototype.resize.call(this, false);
+
+ if (mainCall) {
+ var contentViews = [];
+ contentViews = contentViews.concat(this.getCellsByType("viewCell"));
+ contentViews = contentViews.concat(this.getCellsByType("viewLayout"));
+ contentViews = contentViews.concat(this.getCellsByType("hostCell"));
+ var scrollbars = this.getCellsByType("scroller");
+
+ for (var i = 0; i < contentViews.length; i++) {
+ if (!contentViews[i].$config.hidden) contentViews[i].setContentSize();
+ }
+
+ var autosize = this._getAutosizeMode(this.$config.autosize);
+ /* // possible to rollback set content size when autisize is disabled, not sure if need to
+ contentViews.forEach(function(view){
+ const parent = view.$parent;
+ if(!autosize.x){
+ if(parent.$config.$originalWidthStored){
+ parent.$config.$originalWidthStored = false;
+ parent.$config.width = parent.$config.$originalWidth;
+ parent.$config.$originalWidth = undefined;
+ }
+ }
+
+ if(!autosize.y){
+ if(parent.$config.$originalHeightStored){
+ parent.$config.$originalHeightStored = false;
+ parent.$config.height = parent.$config.$originalHeight;
+ parent.$config.$originalHeight = undefined;
+ }
+ }
+ });*/
+
+
+ var scrollChanged = this._resizeScrollbars(autosize, scrollbars);
+
+ if (this.$config.autosize) {
+ this.autosize(this.$config.autosize);
+ contentViews.forEach(function (view) {
+ var parent = view.$parent;
+ var sizes = parent.getContentSize(autosize);
+
+ if (autosize.x) {
+ if (!parent.$config.$originalWidthStored) {
+ parent.$config.$originalWidthStored = true;
+ parent.$config.$originalWidth = parent.$config.width;
+ }
+
+ parent.$config.width = sizes.width;
+ }
+
+ if (autosize.y) {
+ if (!parent.$config.$originalHeightStored) {
+ parent.$config.$originalHeightStored = true;
+ parent.$config.$originalHeight = parent.$config.height;
+ }
+
+ parent.$config.height = sizes.height;
+ }
+ });
+ scrollChanged = true;
+ }
+
+ if (scrollChanged) {
+ this.resize();
+
+ for (var i = 0; i < contentViews.length; i++) {
+ if (!contentViews[i].$config.hidden) contentViews[i].setContentSize();
+ }
+ }
+
+ this.callEvent("onResize", []);
+ }
+
+ if (mainCall) {
+ this._resizeInProgress = false;
+ }
+ };
+
+ Layout.prototype._eachChild = function (code, cell) {
+ cell = cell || this;
+ code(cell);
+
+ if (cell.$cells) {
+ for (var i = 0; i < cell.$cells.length; i++) {
+ this._eachChild(code, cell.$cells[i]);
+ }
+ }
+ };
+
+ Layout.prototype.isChild = function (view) {
+ var res = false;
+
+ this._eachChild(function (child) {
+ if (child === view || child.$content === view) {
+ res = true;
+ }
+ });
+
+ return res;
+ };
+
+ Layout.prototype.getCellsByType = function (type) {
+ var res = [];
+
+ if (type === this.$name) {
+ res.push(this);
+ }
+
+ if (this.$content && this.$content.$name == type) {
+ res.push(this.$content);
+ }
+
+ if (this.$cells) {
+ for (var i = 0; i < this.$cells.length; i++) {
+ var children = Layout.prototype.getCellsByType.call(this.$cells[i], type);
+
+ if (children.length) {
+ res.push.apply(res, children);
+ }
+ }
+ }
+
+ return res;
+ };
+
+ Layout.prototype.getNextSibling = function (cellId) {
+ var index = this.cellIndex(cellId);
+
+ if (index >= 0 && this.$cells[index + 1]) {
+ return this.$cells[index + 1];
+ } else {
+ return null;
+ }
+ };
+
+ Layout.prototype.getPrevSibling = function (cellId) {
+ var index = this.cellIndex(cellId);
+
+ if (index >= 0 && this.$cells[index - 1]) {
+ return this.$cells[index - 1];
+ } else {
+ return null;
+ }
+ };
+
+ Layout.prototype.cell = function (id) {
+ for (var i = 0; i < this.$cells.length; i++) {
+ var child = this.$cells[i];
+
+ if (child.$id === id) {
+ return child;
+ }
+
+ var sub = child.cell(id);
+
+ if (sub) {
+ return sub;
+ }
+ }
+ };
+
+ Layout.prototype.cellIndex = function (id) {
+ for (var i = 0; i < this.$cells.length; i++) {
+ if (this.$cells[i].$id === id) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ Layout.prototype.moveView = function (view, ind) {
+ if (this.$cells[ind] !== view) {
+ return window.alert("Not implemented");
+ } else {
+ ind += this.$config.header ? 1 : 0;
+ var node = this.$view;
+
+ if (ind >= node.childNodes.length) {
+ node.appendChild(view.$view);
+ } else {
+ node.insertBefore(view.$view, node.childNodes[ind]);
+ }
+ }
+ };
+
+ Layout.prototype._parseConfig = function (config) {
+ this.$cells = [];
+ this._xLayout = !config.rows;
+ var cells = config.rows || config.cols || config.views;
+
+ for (var i = 0; i < cells.length; i++) {
+ var cell = cells[i];
+ cell.mode = this._xLayout ? "x" : "y";
+ var $content = this.$factory.initUI(cell, this);
+
+ if (!$content) {
+ cells.splice(i, 1);
+ i--;
+ } else {
+ $content.$parent = this;
+ this.$cells.push($content);
+ }
+ }
+ };
+
+ Layout.prototype.getCells = function () {
+ return this.$cells;
+ };
+
+ Layout.prototype.render = function () {
+ var view = domHelpers.insertNode(this.$container, this.$toHTML());
+ this.$fill(view, null);
+ this.callEvent("onReady", []);
+ this.resize(); // do simple repaint after the first call
+
+ this.render = this.resize;
+ };
+
+ Layout.prototype.$fill = function (node, parent) {
+ this.$view = node;
+ this.$parent = parent;
+ var cells = domHelpers.getChildNodes(node, "gantt_layout_cell");
+
+ for (var i = cells.length - 1; i >= 0; i--) {
+ var sub = this.$cells[i];
+ sub.$fill(cells[i], this); // initially hidden cell
+
+ if (sub.$config.hidden) {
+ sub.$view.parentNode.removeChild(sub.$view);
+ }
+ }
+ };
+
+ Layout.prototype.$toHTML = function () {
+ var mode = this._xLayout ? "x" : "y";
+ var html = [];
+
+ for (var i = 0; i < this.$cells.length; i++) {
+ html.push(this.$cells[i].$toHTML());
+ }
+
+ return _super.prototype.$toHTML.call(this, html.join(""), (this.$root ? "gantt_layout_root " : "") + "gantt_layout gantt_layout_" + mode);
+ };
+
+ Layout.prototype.getContentSize = function (mode) {
+ var contentWidth = 0,
+ contentHeight = 0;
+ var cellSize, cell, borders;
+
+ for (var i = 0; i < this.$cells.length; i++) {
+ cell = this.$cells[i];
+ if (cell.$config.hidden) continue;
+ cellSize = cell.getContentSize(mode);
+
+ if (cell.$config.view === "scrollbar" && mode[cell.$config.scroll]) {
+ cellSize.height = 0;
+ cellSize.width = 0;
+ }
+
+ if (cell.$config.resizer) {
+ if (this._xLayout) {
+ cellSize.height = 0;
+ } else {
+ cellSize.width = 0;
+ }
+ }
+
+ borders = cell._getBorderSizes();
+
+ if (this._xLayout) {
+ contentWidth += cellSize.width + borders.horizontal;
+ contentHeight = Math.max(contentHeight, cellSize.height + borders.vertical);
+ } else {
+ contentWidth = Math.max(contentWidth, cellSize.width + borders.horizontal);
+ contentHeight += cellSize.height + borders.vertical;
+ }
+ }
+
+ borders = this._getBorderSizes();
+ contentWidth += borders.horizontal;
+ contentHeight += borders.vertical; // GS-149 & GS-150: By default this code only increases the container sizes, because of that, the cell sizes
+ // are also increased. Keep this code here in the case if something goes wrong
+
+ /*
+ if(this.$root){
+ contentWidth += 1;
+ contentHeight += 1;
+ }
+ */
+
+ return {
+ width: contentWidth,
+ height: contentHeight
+ };
+ };
+
+ Layout.prototype._cleanElSize = function (value) {
+ return (value || "").toString().replace("px", "") * 1 || 0;
+ };
+
+ Layout.prototype._getBoxStyles = function (div) {
+ var computed = null;
+
+ if (window.getComputedStyle) {
+ computed = window.getComputedStyle(div, null);
+ } else {
+ //IE with elem.currentStyle does not calculate sizes from %, so will use the default approach
+ computed = {
+ "width": div.clientWidth,
+ "height": div.clientHeight
+ };
+ }
+
+ var properties = ["width", "height", "paddingTop", "paddingBottom", "paddingLeft", "paddingRight", "borderLeftWidth", "borderRightWidth", "borderTopWidth", "borderBottomWidth"];
+ var styles = {
+ boxSizing: computed.boxSizing == "border-box"
+ };
+
+ if (computed.MozBoxSizing) {
+ styles.boxSizing = computed.MozBoxSizing == "border-box";
+ }
+
+ for (var i = 0; i < properties.length; i++) {
+ styles[properties[i]] = computed[properties[i]] ? this._cleanElSize(computed[properties[i]]) : 0;
+ }
+
+ var box = {
+ horPaddings: styles.paddingLeft + styles.paddingRight + styles.borderLeftWidth + styles.borderRightWidth,
+ vertPaddings: styles.paddingTop + styles.paddingBottom + styles.borderTopWidth + styles.borderBottomWidth,
+ borderBox: styles.boxSizing,
+ innerWidth: styles.width,
+ innerHeight: styles.height,
+ outerWidth: styles.width,
+ outerHeight: styles.height
+ };
+
+ if (box.borderBox) {
+ box.innerWidth -= box.horPaddings;
+ box.innerHeight -= box.vertPaddings;
+ } else {
+ box.outerWidth += box.horPaddings;
+ box.outerHeight += box.vertPaddings;
+ }
+
+ return box;
+ };
+
+ Layout.prototype._getAutosizeMode = function (config) {
+ var res = {
+ x: false,
+ y: false
+ };
+
+ if (config === "xy") {
+ res.x = res.y = true;
+ } else if (config === "y" || config === true) {
+ res.y = true;
+ } else if (config === "x") {
+ res.x = true;
+ }
+
+ return res;
+ };
+
+ Layout.prototype.autosize = function (mode) {
+ var res = this._getAutosizeMode(mode);
+
+ var boxSizes = this._getBoxStyles(this.$container);
+
+ var contentSizes = this.getContentSize(mode);
+ var node = this.$container;
+
+ if (res.x) {
+ if (boxSizes.borderBox) {
+ contentSizes.width += boxSizes.horPaddings;
+ }
+
+ node.style.width = contentSizes.width + "px";
+ }
+
+ if (res.y) {
+ if (boxSizes.borderBox) {
+ contentSizes.height += boxSizes.vertPaddings;
+ }
+
+ node.style.height = contentSizes.height + "px";
+ }
+ };
+
+ Layout.prototype.getSize = function () {
+ this._sizes = [];
+ var width = 0;
+ var minWidth = 0;
+ var maxWidth = 100000000000;
+ var height = 0;
+ var maxHeight = 100000000000;
+ var minHeight = 0;
+
+ for (var i = 0; i < this.$cells.length; i++) {
+ var size = this._sizes[i] = this.$cells[i].getSize();
+
+ if (this.$cells[i].$config.hidden) {
+ continue;
+ }
+
+ if (this._xLayout) {
+ if (!size.width && size.minWidth) {
+ width += size.minWidth;
+ } else {
+ width += size.width;
+ }
+
+ maxWidth += size.maxWidth;
+ minWidth += size.minWidth;
+ height = Math.max(height, size.height);
+ maxHeight = Math.min(maxHeight, size.maxHeight); // min of maxHeight
+
+ minHeight = Math.max(minHeight, size.minHeight); // max of minHeight
+ } else {
+ if (!size.height && size.minHeight) {
+ height += size.minHeight;
+ } else {
+ height += size.height;
+ }
+
+ maxHeight += size.maxHeight;
+ minHeight += size.minHeight;
+ width = Math.max(width, size.width);
+ maxWidth = Math.min(maxWidth, size.maxWidth); // min of maxWidth
+
+ minWidth = Math.max(minWidth, size.minWidth); // max of minWidth
+ }
+ }
+
+ var self = _super.prototype.getSize.call(this); // maxWidth
+
+
+ if (self.maxWidth >= 100000) {
+ self.maxWidth = maxWidth;
+ } // maxHeight
+
+
+ if (self.maxHeight >= 100000) {
+ self.maxHeight = maxHeight;
+ } // minWidth
+
+
+ self.minWidth = self.minWidth !== self.minWidth ? 0 : self.minWidth; // || self.width || Math.max(minWidth, width);
+ // minHeight
+
+ self.minHeight = self.minHeight !== self.minHeight ? 0 : self.minHeight; //self.minHeight || self.height || Math.max(minHeight, height);
+ // sizes with paddings and margins
+
+ if (this._xLayout) {
+ self.minWidth += this.$config.margin * this.$cells.length || 0;
+ self.minWidth += this.$config.padding * 2 || 0;
+ self.minHeight += this.$config.padding * 2 || 0;
+ } else {
+ self.minHeight += this.$config.margin * this.$cells.length || 0;
+ self.minHeight += this.$config.padding * 2 || 0;
+ }
+
+ return self;
+ }; // calc total gravity and free space
+
+
+ Layout.prototype._calcFreeSpace = function (s, cell, xLayout) {
+ var min = xLayout ? cell.minWidth : cell.minHeight;
+ var max = xLayout ? cell.maxWidth : cell.maxWidth;
+ var side = s;
+
+ if (!side) {
+ side = Math.floor(this._free / this._gravity * cell.gravity);
+
+ if (side > max) {
+ side = max;
+ this._free -= side;
+ this._gravity -= cell.gravity;
+ }
+
+ if (side < min) {
+ side = min;
+ this._free -= side;
+ this._gravity -= cell.gravity;
+ }
+ } else {
+ if (side > max) {
+ side = max;
+ }
+
+ if (side < min) {
+ side = min;
+ }
+
+ this._free -= side;
+ }
+
+ return side;
+ };
+
+ Layout.prototype._calcSize = function (s, size, xLayout) {
+ var side = s;
+ var min = xLayout ? size.minWidth : size.minHeight;
+ var max = xLayout ? size.maxWidth : size.maxHeight;
+
+ if (!side) {
+ side = Math.floor(this._free / this._gravity * size.gravity);
+ }
+
+ if (side > max) {
+ side = max;
+ }
+
+ if (side < min) {
+ side = min;
+ }
+
+ return side;
+ };
+
+ Layout.prototype._configureBorders = function () {
+ if (this.$root) {
+ this._setBorders([this._borders.left, this._borders.top, this._borders.right, this._borders.bottom], this);
+ }
+
+ var borderClass = this._xLayout ? this._borders.right : this._borders.bottom;
+ var cells = this.$cells;
+ var lastVisibleIndex = cells.length - 1;
+
+ for (var i = lastVisibleIndex; i >= 0; i--) {
+ if (!cells[i].$config.hidden) {
+ lastVisibleIndex = i;
+ break;
+ }
+ }
+
+ for (var i = 0; i < cells.length; i++) {
+ if (cells[i].$config.hidden) {
+ continue;
+ }
+
+ var lastCell = i >= lastVisibleIndex;
+ var borderColorClass = "";
+
+ if (!lastCell && cells[i + 1]) {
+ if (cells[i + 1].$config.view == "scrollbar") {
+ if (this._xLayout) {
+ lastCell = true;
+ } else {
+ borderColorClass = "gantt_layout_cell_border_transparent";
+ }
+ }
+ }
+
+ this._setBorders(lastCell ? [] : [borderClass, borderColorClass], cells[i]);
+ }
+ };
+
+ Layout.prototype._updateCellVisibility = function () {
+ var oldVisibleCells = this._visibleCells || {};
+ var firstCall = !this._visibleCells;
+ var visibleCells = {};
+ var cell = null;
+ var parentVisibility = [];
+
+ for (var i = 0; i < this._sizes.length; i++) {
+ cell = this.$cells[i];
+
+ if (cell.$config.hide_empty) {
+ parentVisibility.push(cell);
+ }
+
+ if (!firstCall && cell.$config.hidden && oldVisibleCells[cell.$id]) {
+ cell._hide(true);
+ } else if (!cell.$config.hidden && !oldVisibleCells[cell.$id]) {
+ cell._hide(false);
+ }
+
+ if (!cell.$config.hidden) {
+ visibleCells[cell.$id] = true;
+ }
+ }
+
+ this._visibleCells = visibleCells; // GS-27. A way to hide the whole cell if all its children are hidden
+
+ for (var i = 0; i < parentVisibility.length; i++) {
+ var cell = parentVisibility[i];
+ var children = cell.$cells;
+ var hideCell = true;
+ children.forEach(function (child) {
+ if (!child.$config.hidden && !child.$config.resizer) {
+ hideCell = false;
+ }
+ });
+ cell.$config.hidden = hideCell;
+ }
+ };
+
+ Layout.prototype.setSize = function (x, y) {
+ this._configureBorders();
+
+ _super.prototype.setSize.call(this, x, y);
+
+ y = this.$lastSize.contentY;
+ x = this.$lastSize.contentX;
+ var padding = this.$config.padding || 0;
+ this.$view.style.padding = padding + "px";
+ this._gravity = 0;
+ this._free = this._xLayout ? x : y;
+ this._free -= padding * 2; // calc all gravity
+
+ var cell, size;
+
+ this._updateCellVisibility();
+
+ for (var i = 0; i < this._sizes.length; i++) {
+ cell = this.$cells[i];
+
+ if (cell.$config.hidden) {
+ continue;
+ }
+
+ var margin = this.$config.margin || 0;
+
+ if (cell.$name == "resizer" && !margin) {
+ margin = -1;
+ } // set margins to child cell
+
+
+ var cellView = cell.$view;
+ var marginSide = this._xLayout ? "marginRight" : "marginBottom";
+
+ if (i !== this.$cells.length - 1) {
+ cellView.style[marginSide] = margin + "px";
+ this._free -= margin; // calc free space without margin
+ }
+
+ size = this._sizes[i];
+
+ if (this._xLayout) {
+ if (!size.width) {
+ this._gravity += size.gravity;
+ }
+ } else {
+ if (!size.height) {
+ this._gravity += size.gravity;
+ }
+ }
+ }
+
+ for (var i = 0; i < this._sizes.length; i++) {
+ cell = this.$cells[i];
+
+ if (cell.$config.hidden) {
+ continue;
+ }
+
+ size = this._sizes[i];
+ var width = size.width;
+ var height = size.height;
+
+ if (this._xLayout) {
+ this._calcFreeSpace(width, size, true);
+ } else {
+ this._calcFreeSpace(height, size, false);
+ }
+ }
+
+ for (var i = 0; i < this.$cells.length; i++) {
+ cell = this.$cells[i];
+
+ if (cell.$config.hidden) {
+ continue;
+ }
+
+ size = this._sizes[i];
+ var dx = void 0;
+ var dy = void 0;
+
+ if (this._xLayout) {
+ dx = this._calcSize(size.width, size, true);
+ dy = y - padding * 2; // layout height without paddings
+ } else {
+ dx = x - padding * 2; // layout width without paddings
+
+ dy = this._calcSize(size.height, size, false);
+ }
+
+ cell.setSize(dx, dy);
+ }
+ };
+
+ return Layout;
+}(Cell);
+
+module.exports = Layout;
+
+/***/ }),
+
+/***/ "./sources/core/ui/layout/resizer_cell.gpl.js":
+/*!****************************************************!*\
+ !*** ./sources/core/ui/layout/resizer_cell.gpl.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = null;
+
+/***/ }),
+
+/***/ "./sources/core/ui/layout/scrollbar_cell.js":
+/*!**************************************************!*\
+ !*** ./sources/core/ui/layout/scrollbar_cell.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../utils/extends */ "./sources/utils/extends.js"),
+ domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js"),
+ utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js"),
+ env = __webpack_require__(/*! ../../../utils/env */ "./sources/utils/env.js"),
+ Cell = __webpack_require__(/*! ./cell */ "./sources/core/ui/layout/cell.js");
+
+var ScrollbarCell = function (_super) {
+ "use strict";
+
+ var SCROLL_MODIFIER_KEYS = ["altKey", "shiftKey", "metaKey"]; // it's no way to disable ctrl+wheel
+
+ __extends(ScrollbarCell, _super);
+
+ function ScrollbarCell(parent, config, factory, gantt) {
+ var _this = _super.apply(this, arguments) || this;
+
+ this.$config = utils.mixin(config, {
+ scroll: "x"
+ });
+ _this._scrollHorizontalHandler = utils.bind(_this._scrollHorizontalHandler, _this);
+ _this._scrollVerticalHandler = utils.bind(_this._scrollVerticalHandler, _this);
+ _this._outerScrollVerticalHandler = utils.bind(_this._outerScrollVerticalHandler, _this);
+ _this._outerScrollHorizontalHandler = utils.bind(_this._outerScrollHorizontalHandler, _this);
+ _this._mouseWheelHandler = utils.bind(_this._mouseWheelHandler, _this);
+ this.$config.hidden = true;
+ var size = gantt.config.scroll_size;
+
+ if (gantt.env.isIE) {
+ // full element height/width must be bigger than just a browser scrollbar,
+ // otherwise the scrollbar element won't be scrolled on click
+ size += 1;
+ }
+
+ if (this._isHorizontal()) {
+ _this.$config.height = size;
+ _this.$parent.$config.height = size;
+ } else {
+ _this.$config.width = size;
+ _this.$parent.$config.width = size;
+ }
+
+ this.$config.scrollPosition = 0;
+ _this.$name = "scroller";
+ return _this;
+ }
+
+ ScrollbarCell.prototype.init = function (container) {
+ container.innerHTML = this.$toHTML();
+ this.$view = container.firstChild;
+
+ if (!this.$view) {
+ this.init();
+ }
+
+ if (this._isVertical()) {
+ this._initVertical();
+ } else {
+ this._initHorizontal();
+ }
+
+ this._initMouseWheel();
+
+ this._initLinkedViews();
+ };
+
+ ScrollbarCell.prototype.$toHTML = function () {
+ var className = this._isHorizontal() ? "gantt_hor_scroll" : "gantt_ver_scroll";
+ return "<div class='gantt_layout_cell " + className + "'><div style='" + (this._isHorizontal() ? "width:2000px" : "height:2000px") + "'></div></div>";
+ };
+
+ ScrollbarCell.prototype._getRootParent = function () {
+ var parent = this.$parent;
+
+ while (parent && parent.$parent) {
+ parent = parent.$parent;
+ }
+
+ if (parent) {
+ return parent;
+ }
+ };
+
+ function eachCell(root, res) {
+ res.push(root);
+
+ if (root.$cells) {
+ for (var i = 0; i < root.$cells.length; i++) {
+ eachCell(root.$cells[i], res);
+ }
+ }
+ }
+
+ ScrollbarCell.prototype._eachView = function () {
+ var res = [];
+ eachCell(this._getRootParent(), res);
+ return res;
+ };
+
+ ScrollbarCell.prototype._getLinkedViews = function () {
+ var views = this._eachView();
+
+ var res = [];
+
+ for (var i = 0; i < views.length; i++) {
+ if (views[i].$config && (this._isVertical() && views[i].$config.scrollY == this.$id || this._isHorizontal() && views[i].$config.scrollX == this.$id)) {
+ res.push(views[i]);
+ }
+ }
+
+ return res;
+ };
+
+ ScrollbarCell.prototype._initHorizontal = function () {
+ this.$scroll_hor = this.$view;
+ this.$domEvents.attach(this.$view, "scroll", this._scrollHorizontalHandler);
+ };
+
+ ScrollbarCell.prototype._initLinkedViews = function () {
+ var views = this._getLinkedViews();
+
+ var css = this._isVertical() ? "gantt_layout_outer_scroll gantt_layout_outer_scroll_vertical" : "gantt_layout_outer_scroll gantt_layout_outer_scroll_horizontal";
+
+ for (var i = 0; i < views.length; i++) {
+ //views[i].$config.css = [views[i].$config.css || "", css].join(" ");
+ domHelpers.addClassName(views[i].$view || views[i].getNode(), css);
+ }
+ };
+
+ ScrollbarCell.prototype._initVertical = function () {
+ this.$scroll_ver = this.$view;
+ this.$domEvents.attach(this.$view, "scroll", this._scrollVerticalHandler);
+ };
+
+ ScrollbarCell.prototype._updateLinkedViews = function () {};
+
+ ScrollbarCell.prototype._initMouseWheel = function () {
+ var ff = env.isFF;
+ if (ff) this.$domEvents.attach(this._getRootParent().$view, "wheel", this._mouseWheelHandler, {
+ passive: false
+ });else this.$domEvents.attach(this._getRootParent().$view, "mousewheel", this._mouseWheelHandler, {
+ passive: false
+ });
+ };
+
+ ScrollbarCell.prototype.scrollHorizontally = function (left) {
+ if (this._scrolling) return;
+ this._scrolling = true;
+ this.$scroll_hor.scrollLeft = left;
+ this.$config.codeScrollLeft = left;
+ left = this.$scroll_hor.scrollLeft;
+
+ var views = this._getLinkedViews();
+
+ for (var i = 0; i < views.length; i++) {
+ if (views[i].scrollTo) {
+ views[i].scrollTo(left, undefined);
+ }
+ }
+
+ var oldSize = this.$config.scrollPosition;
+ this.$config.scrollPosition = left;
+ this.callEvent("onScroll", [oldSize, left, this.$config.scroll]);
+ this._scrolling = false;
+ };
+
+ ScrollbarCell.prototype.scrollVertically = function (top) {
+ if (this._scrolling) return;
+ this._scrolling = true;
+ this.$scroll_ver.scrollTop = top;
+ top = this.$scroll_ver.scrollTop;
+
+ var views = this._getLinkedViews();
+
+ for (var i = 0; i < views.length; i++) {
+ if (views[i].scrollTo) {
+ views[i].scrollTo(undefined, top);
+ }
+ }
+
+ var oldSize = this.$config.scrollPosition;
+ this.$config.scrollPosition = top;
+ this.callEvent("onScroll", [oldSize, top, this.$config.scroll]);
+ this._scrolling = false;
+ };
+
+ ScrollbarCell.prototype._isVertical = function () {
+ return this.$config.scroll == "y";
+ };
+
+ ScrollbarCell.prototype._isHorizontal = function () {
+ return this.$config.scroll == "x";
+ };
+
+ ScrollbarCell.prototype._scrollHorizontalHandler = function (e) {
+ if (this._isVertical() || this._scrolling) {
+ return;
+ } //in safari we can catch previous onscroll after setting new value from mouse-wheel event
+ //set delay to prevent value drifiting
+
+
+ if (new Date() - (this._wheel_time || 0) < 100) return true; //if (this.$gantt._touch_scroll_active) return;
+
+ var left = this.$scroll_hor.scrollLeft;
+ this.scrollHorizontally(left);
+ this._oldLeft = this.$scroll_hor.scrollLeft;
+ };
+
+ ScrollbarCell.prototype._outerScrollHorizontalHandler = function (e) {
+ if (this._isVertical()) {
+ return;
+ }
+ };
+
+ ScrollbarCell.prototype.show = function () {
+ this.$parent.show();
+ };
+
+ ScrollbarCell.prototype.hide = function () {
+ this.$parent.hide();
+ };
+
+ ScrollbarCell.prototype._getScrollSize = function () {
+ var scrollSize = 0;
+ var outerSize = 0;
+
+ var isHorizontal = this._isHorizontal();
+
+ var linked = this._getLinkedViews();
+
+ var view;
+ var scrollProperty = isHorizontal ? "scrollWidth" : "scrollHeight",
+ innerSizeProperty = isHorizontal ? "contentX" : "contentY";
+ var outerProperty = isHorizontal ? "x" : "y";
+
+ var offset = this._getScrollOffset();
+
+ for (var i = 0; i < linked.length; i++) {
+ view = linked[i];
+ if (!(view && view.$content && view.$content.getSize && !view.$config.hidden)) continue;
+ var sizes = view.$content.getSize();
+ var cellScrollSize;
+
+ if (sizes.hasOwnProperty(scrollProperty)) {
+ cellScrollSize = sizes[scrollProperty];
+ } else {
+ cellScrollSize = sizes[innerSizeProperty];
+ }
+
+ if (offset) {
+ // precalculated vertical/horizontal offsets of scrollbar to emulate 4.x look
+ if (sizes[innerSizeProperty] > sizes[outerProperty] && sizes[innerSizeProperty] > scrollSize && cellScrollSize > sizes[outerProperty] - offset + 2) {
+ scrollSize = cellScrollSize + (isHorizontal ? 0 : 2);
+ outerSize = sizes[outerProperty];
+ }
+ } else {
+ var nonScrollableSize = Math.max(sizes[innerSizeProperty] - cellScrollSize, 0);
+ var scrollableViewPortSize = Math.max(sizes[outerProperty] - nonScrollableSize, 0);
+ cellScrollSize = cellScrollSize + nonScrollableSize;
+
+ if (cellScrollSize > scrollableViewPortSize && cellScrollSize > scrollSize) {
+ //|| (cellScrollSize === scrollSize && sizes[outerProperty] < outerSize) // same scroll width but smaller scrollable view port
+ scrollSize = cellScrollSize;
+ outerSize = sizes[outerProperty];
+ }
+ }
+ }
+
+ return {
+ outerScroll: outerSize,
+ innerScroll: scrollSize
+ };
+ };
+
+ ScrollbarCell.prototype.scroll = function (position) {
+ if (this._isHorizontal()) {
+ this.scrollHorizontally(position);
+ } else {
+ this.scrollVertically(position);
+ }
+ };
+
+ ScrollbarCell.prototype.getScrollState = function () {
+ return {
+ visible: this.isVisible(),
+ direction: this.$config.scroll,
+ size: this.$config.outerSize,
+ scrollSize: this.$config.scrollSize || 0,
+ position: this.$config.scrollPosition || 0
+ };
+ };
+
+ ScrollbarCell.prototype.setSize = function (width, height) {
+ _super.prototype.setSize.apply(this, arguments);
+
+ var scrollSizes = this._getScrollSize();
+
+ var ownSize = (this._isVertical() ? height : width) - this._getScrollOffset() + (this._isHorizontal() ? 1 : 0);
+
+ if (scrollSizes.innerScroll && ownSize > scrollSizes.outerScroll) {
+ scrollSizes.innerScroll += ownSize - scrollSizes.outerScroll;
+ }
+
+ this.$config.scrollSize = scrollSizes.innerScroll;
+ this.$config.width = width;
+ this.$config.height = height;
+
+ this._setScrollSize(scrollSizes.innerScroll);
+ };
+
+ ScrollbarCell.prototype.isVisible = function () {
+ return !!(this.$parent && this.$parent.$view.parentNode);
+ };
+
+ ScrollbarCell.prototype.shouldShow = function () {
+ var scrollSizes = this._getScrollSize();
+
+ if (!scrollSizes.innerScroll && this.$parent && this.$parent.$view.parentNode) {
+ return false;
+ } else if (scrollSizes.innerScroll && !(this.$parent && this.$parent.$view.parentNode)) {
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ ScrollbarCell.prototype.shouldHide = function () {
+ var scrollSizes = this._getScrollSize();
+
+ if (!scrollSizes.innerScroll && this.$parent && this.$parent.$view.parentNode) {
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ ScrollbarCell.prototype.toggleVisibility = function () {
+ if (this.shouldHide()) {
+ this.hide();
+ } else if (this.shouldShow()) {
+ this.show();
+ }
+ };
+
+ ScrollbarCell.prototype._getScaleOffset = function (view) {
+ var offset = 0;
+
+ if (view && (view.$config.view == "timeline" || view.$config.view == "grid")) {
+ offset = view.$content.$getConfig().scale_height;
+ }
+
+ return offset;
+ };
+
+ ScrollbarCell.prototype._getScrollOffset = function () {
+ var offset = 0;
+
+ if (this._isVertical()) {
+ var parentLayout = this.$parent.$parent;
+ offset = Math.max(this._getScaleOffset(parentLayout.getPrevSibling(this.$parent.$id)), this._getScaleOffset(parentLayout.getNextSibling(this.$parent.$id)));
+ } else {
+ var linked = this._getLinkedViews();
+
+ for (var i = 0; i < linked.length; i++) {
+ var view = linked[i],
+ vparent = view.$parent;
+ var cells = vparent.$cells;
+ var last = cells[cells.length - 1];
+
+ if (last && last.$config.view == "scrollbar" && last.$config.hidden === false) {
+ offset = last.$config.width;
+ break;
+ }
+ }
+ }
+
+ return offset || 0;
+ };
+
+ ScrollbarCell.prototype._setScrollSize = function (size) {
+ var property = this._isHorizontal() ? "width" : "height";
+ var scrollbar = this._isHorizontal() ? this.$scroll_hor : this.$scroll_ver;
+
+ var offset = this._getScrollOffset();
+
+ var node = scrollbar.firstChild;
+
+ if (offset) {
+ if (this._isVertical()) {
+ this.$config.outerSize = this.$config.height - offset + 3;
+ scrollbar.style.height = this.$config.outerSize + "px";
+ scrollbar.style.top = offset - 1 + "px";
+ domHelpers.addClassName(scrollbar, this.$parent._borders.top);
+ domHelpers.addClassName(scrollbar.parentNode, "gantt_task_vscroll");
+ } else {
+ this.$config.outerSize = this.$config.width - offset + 1;
+ scrollbar.style.width = this.$config.outerSize + "px"; //domHelpers.addClassName(scrollbar, this.$parent._borders.right);
+ }
+ } else {
+ scrollbar.style.top = "auto";
+ domHelpers.removeClassName(scrollbar, this.$parent._borders.top);
+ domHelpers.removeClassName(scrollbar.parentNode, "gantt_task_vscroll");
+ this.$config.outerSize = this.$config.height;
+ }
+
+ node.style[property] = size + "px";
+ };
+
+ ScrollbarCell.prototype._scrollVerticalHandler = function (e) {
+ if (this._scrollHorizontalHandler() || this._scrolling) {
+ return;
+ } //if (this.$gantt._touch_scroll_active) return;
+
+
+ var top = this.$scroll_ver.scrollTop;
+ var prev = this._oldTop;
+ if (top == prev) return;
+ this.scrollVertically(top);
+ this._oldTop = this.$scroll_ver.scrollTop;
+ };
+
+ ScrollbarCell.prototype._outerScrollVerticalHandler = function (e) {
+ if (this._scrollHorizontalHandler()) {
+ return;
+ }
+ };
+
+ ScrollbarCell.prototype._checkWheelTarget = function (targetNode) {
+ var connectedViews = this._getLinkedViews().concat(this);
+
+ for (var i = 0; i < connectedViews.length; i++) {
+ var node = connectedViews[i].$view;
+
+ if (domHelpers.isChildOf(targetNode, node)) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ ScrollbarCell.prototype._mouseWheelHandler = function (e) {
+ var target = e.target || e.srcElement;
+ if (!this._checkWheelTarget(target)) return;
+ this._wheel_time = new Date();
+ var res = {};
+ var wheelSpeed = {
+ x: 1,
+ y: 1
+ };
+ var wheelSpeedConfig = this.$gantt.config.wheel_scroll_sensitivity;
+
+ if (typeof wheelSpeedConfig == "number" && !!wheelSpeedConfig) {
+ wheelSpeed = {
+ x: wheelSpeedConfig,
+ y: wheelSpeedConfig
+ };
+ } else if ({}.toString.apply(wheelSpeedConfig) == "[object Object]") {
+ wheelSpeed = {
+ x: wheelSpeedConfig.x,
+ y: wheelSpeedConfig.y
+ };
+ }
+
+ var ff = env.isFF;
+ var deltaX = ff ? e.deltaX : e.wheelDeltaX;
+ var deltaY = ff ? e.deltaY : e.wheelDelta;
+ var multiplier = -20;
+
+ if (ff) {
+ if (e.deltaMode !== 0) {
+ multiplier = -40;
+ } else {
+ multiplier = -10;
+ }
+ }
+
+ var wx = ff ? deltaX * multiplier * wheelSpeed.x : deltaX * 2 * wheelSpeed.x;
+ var wy = ff ? deltaY * multiplier * wheelSpeed.y : deltaY * wheelSpeed.y;
+ var horizontalScrollModifier = this.$gantt.config.horizontal_scroll_key;
+
+ if (horizontalScrollModifier !== false) {
+ if (SCROLL_MODIFIER_KEYS.indexOf(horizontalScrollModifier) >= 0) {
+ if (e[horizontalScrollModifier] && !(e.deltaX || e.wheelDeltaX)) {
+ // shift+mousewheel for horizontal scroll
+ wx = wy * 2;
+ wy = 0;
+ }
+ }
+ }
+
+ if (wx && Math.abs(wx) > Math.abs(wy)) {
+ if (this._isVertical()) {
+ return;
+ }
+
+ if (res.x) return true; //no horisontal scroll, must not block scrolling
+
+ if (!this.$scroll_hor || !this.$scroll_hor.offsetWidth) return true;
+ var dir = wx / -40;
+ var oldLeft = this._oldLeft;
+ var left = oldLeft + dir * 30;
+ this.scrollHorizontally(left);
+ this.$scroll_hor.scrollLeft = left; // not block scroll if position hasn't changed
+
+ if (oldLeft == this.$scroll_hor.scrollLeft) {
+ return true;
+ }
+
+ this._oldLeft = this.$scroll_hor.scrollLeft;
+ } else {
+ if (this._isHorizontal()) {
+ return;
+ }
+
+ if (res.y) return true; //no vertical scroll, must not block scrolling
+
+ if (!this.$scroll_ver || !this.$scroll_ver.offsetHeight) return true;
+ var dir = wy / -40;
+ if (typeof wy == "undefined") dir = e.detail;
+ var oldTop = this._oldTop;
+ var top = this.$scroll_ver.scrollTop + dir * 30; //if(!this.$gantt.config.prevent_default_scroll &&
+ // (this.$gantt._cached_scroll_pos && ((this.$gantt._cached_scroll_pos.y == top) || (this.$gantt._cached_scroll_pos.y <= 0 && top <= 0)))) return true;
+
+ this.scrollVertically(top);
+ this.$scroll_ver.scrollTop = top; // not block scroll if position hasn't changed
+
+ if (oldTop == this.$scroll_ver.scrollTop) {
+ return true;
+ }
+
+ this._oldTop = this.$scroll_ver.scrollTop;
+ }
+
+ if (e.preventDefault) e.preventDefault();
+ e.cancelBubble = true;
+ return false;
+ };
+
+ return ScrollbarCell;
+}(Cell);
+
+module.exports = ScrollbarCell;
+
+/***/ }),
+
+/***/ "./sources/core/ui/layout/view_cell.js":
+/*!*********************************************!*\
+ !*** ./sources/core/ui/layout/view_cell.js ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../utils/extends */ "./sources/utils/extends.js"),
+ utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js"),
+ Cell = __webpack_require__(/*! ./cell */ "./sources/core/ui/layout/cell.js");
+
+var ViewCell = function (_super) {
+ "use strict";
+
+ __extends(ViewCell, _super);
+
+ function ViewCell(parent, config, factory) {
+ var _this = _super.apply(this, arguments) || this;
+
+ if (config.view) {
+ if (config.id) {
+ // pass id to the nested view
+ this.$id = utils.uid();
+ }
+
+ var childConfig = utils.copy(config);
+ delete childConfig.config;
+ delete childConfig.templates;
+ this.$content = this.$factory.createView(config.view, this, childConfig, this);
+ if (!this.$content) return false;
+ }
+
+ _this.$name = "viewCell";
+ return _this;
+ }
+
+ ViewCell.prototype.destructor = function () {
+ this.clear();
+
+ _super.prototype.destructor.call(this);
+ };
+
+ ViewCell.prototype.clear = function () {
+ this.$initialized = false; // call destructor
+
+ if (this.$content) {
+ var method = this.$content.unload || this.$content.destructor;
+
+ if (method) {
+ method.call(this.$content);
+ }
+ }
+
+ _super.prototype.clear.call(this);
+ };
+
+ ViewCell.prototype.scrollTo = function (left, top) {
+ if (this.$content && this.$content.scrollTo) {
+ this.$content.scrollTo(left, top);
+ } else {
+ _super.prototype.scrollTo.call(this, left, top);
+ }
+ };
+
+ ViewCell.prototype._setContentSize = function (x, y) {
+ var borders = this._getBorderSizes();
+
+ if (typeof x === "number") {
+ var outerX = x + borders.horizontal;
+ this.$config.width = outerX;
+ }
+
+ if (typeof y === "number") {
+ var outerY = y + borders.vertical;
+ this.$config.height = outerY;
+ }
+ };
+
+ ViewCell.prototype.setSize = function (x, y) {
+ _super.prototype.setSize.call(this, x, y);
+
+ if (!this.$preResize && this.$content) {
+ if (!this.$initialized) {
+ this.$initialized = true;
+ var header = this.$view.childNodes[0];
+ var content = this.$view.childNodes[1];
+ if (!content) content = header;
+ /*if(this.$content.$config){
+ this.$content.$config.width = this.$lastSize.contentX;
+ this.$content.$config.height = this.$lastSize.contentY;
+ }*/
+
+ this.$content.init(content);
+ }
+ }
+ };
+
+ ViewCell.prototype.setContentSize = function () {
+ if (!this.$preResize && this.$content) {
+ if (this.$initialized) {
+ this.$content.setSize(this.$lastSize.contentX, this.$lastSize.contentY);
+ }
+ }
+ };
+
+ ViewCell.prototype.getContentSize = function () {
+ var size = _super.prototype.getContentSize.call(this);
+
+ if (this.$content && this.$initialized) {
+ var childSize = this.$content.getSize();
+ size.width = childSize.contentX === undefined ? childSize.width : childSize.contentX;
+ size.height = childSize.contentY === undefined ? childSize.height : childSize.contentY;
+ }
+
+ var borders = this._getBorderSizes();
+
+ size.width += borders.horizontal;
+ size.height += borders.vertical;
+ return size;
+ };
+
+ return ViewCell;
+}(Cell);
+
+module.exports = ViewCell;
+
+/***/ }),
+
+/***/ "./sources/core/ui/layout/view_layout.js":
+/*!***********************************************!*\
+ !*** ./sources/core/ui/layout/view_layout.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../utils/extends */ "./sources/utils/extends.js"),
+ Layout = __webpack_require__(/*! ./layout */ "./sources/core/ui/layout/layout.js"),
+ Cell = __webpack_require__(/*! ./cell */ "./sources/core/ui/layout/cell.js");
+
+var ViewLayout = function (_super) {
+ "use strict";
+
+ __extends(ViewLayout, _super);
+
+ function ViewLayout(parent, config, factory) {
+ var _this = _super.apply(this, arguments) || this;
+
+ for (var i = 0; i < _this.$cells.length; i++) {
+ _this.$cells[i].$config.hidden = i !== 0;
+ }
+
+ _this.$cell = _this.$cells[0];
+ _this.$name = "viewLayout";
+ return _this;
+ }
+
+ ViewLayout.prototype.cell = function (id) {
+ var cell = _super.prototype.cell.call(this, id);
+
+ if (!cell.$view) {
+ this.$fill(null, this);
+ }
+
+ return cell;
+ };
+
+ ViewLayout.prototype.moveView = function (view) {
+ var body = this.$view;
+
+ if (this.$cell) {
+ this.$cell.$config.hidden = true;
+ body.removeChild(this.$cell.$view);
+ }
+
+ this.$cell = view;
+ body.appendChild(view.$view);
+ };
+
+ ViewLayout.prototype.setSize = function (x, y) {
+ Cell.prototype.setSize.call(this, x, y);
+ };
+
+ ViewLayout.prototype.setContentSize = function () {
+ var size = this.$lastSize;
+ this.$cell.setSize(size.contentX, size.contentY);
+ };
+
+ ViewLayout.prototype.getSize = function () {
+ var sizes = _super.prototype.getSize.call(this);
+
+ if (this.$cell) {
+ var cellSize = this.$cell.getSize();
+
+ if (this.$config.byMaxSize) {
+ for (var i = 0; i < this.$cells.length; i++) {
+ var otherCell = this.$cells[i].getSize();
+
+ for (var cell in cellSize) {
+ cellSize[cell] = Math.max(cellSize[cell], otherCell[cell]);
+ }
+ }
+ }
+
+ for (var size in sizes) {
+ sizes[size] = sizes[size] || cellSize[size];
+ }
+
+ sizes.gravity = Math.max(sizes.gravity, cellSize.gravity);
+ }
+
+ return sizes;
+ };
+
+ return ViewLayout;
+}(Layout);
+
+module.exports = ViewLayout;
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/base_control.js":
+/*!***********************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/base_control.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function dummy() {
+ // eslint-disable-next-line
+ console.log("Method is not implemented.");
+}
+
+function BaseControl() {} // base methods will be runned in gantt context
+
+
+BaseControl.prototype.render = dummy; // arguments: sns
+
+BaseControl.prototype.set_value = dummy; // arguments: node, value, ev, sns(config)
+
+BaseControl.prototype.get_value = dummy; // arguments node, ev, sns(config)
+
+BaseControl.prototype.focus = dummy; // arguments: node
+
+module.exports = function (gantt) {
+ // we could send current instance of gantt to module
+ return BaseControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/checkbox_control.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/checkbox_control.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var helpers = __webpack_require__(/*! ../../../../utils/helpers */ "./sources/utils/helpers.js");
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function CheckboxControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(CheckboxControl, _super);
+
+ CheckboxControl.prototype.render = function (sns) {
+ var height = (sns.height || "23") + "px";
+ var html = "<div class='gantt_cal_ltext' style='height:" + height + ";'>";
+
+ if (sns.options && sns.options.length) {
+ for (var i = 0; i < sns.options.length; i++) {
+ html += "<label><input type='checkbox' value='" + sns.options[i].key + "' name='" + sns.name + "'>" + sns.options[i].label + "</label>";
+ }
+ } else {
+ sns.single_value = true;
+ html += "<label><input type='checkbox' name='" + sns.name + "'></label>";
+ }
+
+ html += "</div>";
+ return html;
+ };
+
+ CheckboxControl.prototype.set_value = function (node, value, ev, sns) {
+ var checkboxes = Array.prototype.slice.call(node.querySelectorAll("input[type=checkbox]"));
+
+ if (!node._dhx_onchange && sns.onchange) {
+ node.onchange = sns.onchange;
+ node._dhx_onchange = true;
+ }
+
+ if (sns.single_value) {
+ var box = checkboxes[0];
+ box.checked = !!value;
+ } else {
+ helpers.forEach(checkboxes, function (entry) {
+ entry.checked = value ? value.indexOf(entry.value) >= 0 : false;
+ });
+ }
+ };
+
+ CheckboxControl.prototype.get_value = function (node, task, sns) {
+ if (sns.single_value) {
+ var box = node.querySelector("input[type=checkbox]");
+ return box.checked;
+ } else {
+ return helpers.arrayMap(Array.prototype.slice.call(node.querySelectorAll("input[type=checkbox]:checked")), function (entry) {
+ return entry.value;
+ });
+ }
+ };
+
+ CheckboxControl.prototype.focus = function (node) {
+ gantt._focus(node.querySelector("input[type=checkbox]"));
+ };
+
+ return CheckboxControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/constraint_control.js":
+/*!*****************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/constraint_control.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+var htmlHelpers = __webpack_require__(/*! ../../utils/html_helpers */ "./sources/core/ui/utils/html_helpers.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function ConstraintControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(ConstraintControl, _super);
+
+ function isNonTimedConstraint(value) {
+ if (!value || value === gantt.config.constraint_types.ASAP || value === gantt.config.constraint_types.ALAP) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ function toggleTimeSelect(timeSelects, typeValue) {
+ var isNonTimed = isNonTimedConstraint(typeValue);
+
+ for (var i = 0; i < timeSelects.length; i++) {
+ timeSelects[i].disabled = isNonTimed;
+ }
+ }
+
+ ConstraintControl.prototype.render = function (sns) {
+ var height = (sns.height || 30) + "px";
+ var html = "<div class='gantt_cal_ltext gantt_section_" + sns.name + "' style='height:" + height + ";'>";
+ var options = [];
+
+ for (var i in gantt.config.constraint_types) {
+ options.push({
+ key: gantt.config.constraint_types[i],
+ label: gantt.locale.labels[gantt.config.constraint_types[i]]
+ });
+ }
+
+ sns.options = sns.options || options;
+ html += "<span data-constraint-type-select>" + htmlHelpers.getHtmlSelect(sns.options, [{
+ key: "data-type",
+ value: "constraint-type"
+ }]) + "</span>";
+ var timeLabel = gantt.locale.labels["constraint_date"] || "Constraint date";
+ html += "<label data-constraint-time-select>" + timeLabel + ": " + gantt.form_blocks.getTimePicker.call(this, sns) + "</label>";
+ html += "</div>";
+ return html;
+ };
+
+ ConstraintControl.prototype.set_value = function (node, value, task, config) {
+ var typeSelect = node.querySelector("[data-constraint-type-select] select");
+ var timeSelects = node.querySelectorAll("[data-constraint-time-select] select");
+ var map = config._time_format_order;
+
+ var mapping = gantt._resolve_default_mapping(config);
+
+ if (!typeSelect._eventsInitialized) {
+ typeSelect.addEventListener("change", function (e) {
+ toggleTimeSelect(timeSelects, e.target.value);
+ });
+ typeSelect._eventsInitialized = true;
+ }
+
+ var constraintDate = task[mapping.constraint_date] || new Date();
+
+ gantt.form_blocks._fill_lightbox_select(timeSelects, 0, constraintDate, map, config);
+
+ var constraintType = task[mapping.constraint_type] || gantt.getConstraintType(task);
+ typeSelect.value = constraintType;
+ toggleTimeSelect(timeSelects, constraintType);
+ };
+
+ ConstraintControl.prototype.get_value = function (node, task, config) {
+ var typeSelect = node.querySelector("[data-constraint-type-select] select");
+ var timeSelects = node.querySelectorAll("[data-constraint-time-select] select");
+ var constraintType = typeSelect.value;
+ var constraintDate = null;
+
+ if (!isNonTimedConstraint(constraintType)) {
+ constraintDate = gantt.form_blocks.getTimePickerValue(timeSelects, config);
+ }
+
+ return {
+ constraint_type: constraintType,
+ constraint_date: constraintDate
+ };
+ };
+
+ ConstraintControl.prototype.focus = function (node) {
+ gantt._focus(node.querySelector("select"));
+ };
+
+ return ConstraintControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/duration_control.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/duration_control.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+var DurationFormatterNumeric = __webpack_require__(/*! ../../../common/duration_formatter_numeric */ "./sources/core/common/duration_formatter_numeric.ts")["default"];
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function DurationControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ function getFormatter(config) {
+ return config.formatter || new DurationFormatterNumeric();
+ }
+
+ __extends(DurationControl, _super);
+
+ DurationControl.prototype.render = function (sns) {
+ var time = "<div class='gantt_time_selects'>" + gantt.form_blocks.getTimePicker.call(this, sns) + "</div>";
+ var label = " " + gantt.locale.labels[gantt.config.duration_unit + "s"] + " ";
+ var singleDate = sns.single_date ? " style='display:none'" : "";
+ var readonly = sns.readonly ? " disabled='disabled'" : "";
+
+ var ariaAttr = gantt._waiAria.lightboxDurationInputAttrString(sns);
+
+ var durationInputClass = "gantt_duration_value";
+
+ if (sns.formatter) {
+ label = "";
+ durationInputClass += " gantt_duration_value_formatted";
+ }
+
+ var duration = "<div class='gantt_duration' " + singleDate + ">" + "<input type='button' class='gantt_duration_dec' value='鈭�'" + readonly + ">" + "<input type='text' value='5days' class='" + durationInputClass + "'" + readonly + " " + ariaAttr + ">" + "<input type='button' class='gantt_duration_inc' value='+'" + readonly + ">" + label + "<span></span>" + "</div>";
+ var html = "<div style='height:" + (sns.height || 30) + "px;padding-top:0px;font-size:inherit;' class='gantt_section_time'>" + time + " " + duration + "</div>";
+ return html;
+ };
+
+ DurationControl.prototype.set_value = function (node, value, ev, config) {
+ var s = node.getElementsByTagName("select");
+ var inps = node.getElementsByTagName("input");
+ var duration = inps[1];
+ var btns = [inps[0], inps[2]];
+ var endspan = node.getElementsByTagName("span")[0];
+ var map = config._time_format_order;
+ var mapping;
+ var start_date;
+ var end_date;
+ var duration_val;
+
+ function _calc_date() {
+ var start_date = _getStartDate.call(gantt, node, config);
+
+ var duration = _getDuration.call(gantt, node, config);
+
+ var end_date = gantt.calculateEndDate({
+ start_date: start_date,
+ duration: duration,
+ task: ev
+ });
+ var template = gantt.templates.task_end_date || gantt.templates.task_date;
+ endspan.innerHTML = template(end_date);
+ }
+
+ function _change_duration(step) {
+ var value = duration.value;
+ value = getFormatter(config).parse(value);
+ if (window.isNaN(value)) value = 0;
+ value += step;
+ if (value < 1) value = 1;
+ duration.value = getFormatter(config).format(value);
+
+ _calc_date();
+ }
+
+ btns[0].onclick = gantt.bind(function () {
+ _change_duration(-1 * gantt.config.duration_step);
+ }, this);
+ btns[1].onclick = gantt.bind(function () {
+ _change_duration(1 * gantt.config.duration_step);
+ }, this);
+ s[0].onchange = _calc_date;
+ s[1].onchange = _calc_date;
+ s[2].onchange = _calc_date;
+ if (s[3]) s[3].onchange = _calc_date;
+ duration.onkeydown = gantt.bind(function (e) {
+ var code;
+ e = e || window.event;
+ code = e.charCode || e.keyCode || e.which;
+
+ if (code == gantt.constants.KEY_CODES.DOWN) {
+ _change_duration(-1 * gantt.config.duration_step);
+
+ return false;
+ }
+
+ if (code == gantt.constants.KEY_CODES.UP) {
+ _change_duration(1 * gantt.config.duration_step);
+
+ return false;
+ }
+
+ window.setTimeout(_calc_date, 1);
+ }, this);
+ duration.onchange = gantt.bind(_calc_date, this);
+ mapping = gantt._resolve_default_mapping(config);
+ if (typeof mapping === "string") mapping = {
+ start_date: mapping
+ };
+ start_date = ev[mapping.start_date] || new Date();
+ end_date = ev[mapping.end_date] || gantt.calculateEndDate({
+ start_date: start_date,
+ duration: 1,
+ task: ev
+ });
+ duration_val = Math.round(ev[mapping.duration]) || gantt.calculateDuration({
+ start_date: start_date,
+ end_date: end_date,
+ task: ev
+ });
+ duration_val = getFormatter(config).format(duration_val);
+
+ gantt.form_blocks._fill_lightbox_select(s, 0, start_date, map, config);
+
+ duration.value = duration_val;
+
+ _calc_date();
+ };
+
+ DurationControl.prototype.get_value = function (node, ev, config) {
+ var startDate = _getStartDate(node, config);
+
+ var duration = _getDuration(node, config);
+
+ var endDate = gantt.calculateEndDate({
+ start_date: startDate,
+ duration: duration,
+ task: ev
+ });
+
+ if (typeof gantt._resolve_default_mapping(config) == "string") {
+ return startDate;
+ }
+
+ return {
+ start_date: startDate,
+ end_date: endDate,
+ duration: duration
+ };
+ };
+
+ DurationControl.prototype.focus = function (node) {
+ gantt._focus(node.getElementsByTagName("select")[0]);
+ };
+
+ function _getStartDate(node, config) {
+ var s = node.getElementsByTagName("select");
+ var map = config._time_format_order;
+ var hours = 0;
+ var minutes = 0;
+
+ if (gantt.defined(map[3])) {
+ var input = s[map[3]];
+ var time = parseInt(input.value, 10);
+
+ if (isNaN(time) && input.hasAttribute("data-value")) {
+ time = parseInt(input.getAttribute("data-value"), 10);
+ }
+
+ hours = Math.floor(time / 60);
+ minutes = time % 60;
+ }
+
+ return new Date(s[map[2]].value, s[map[1]].value, s[map[0]].value, hours, minutes);
+ }
+
+ function _getDuration(node, config) {
+ var duration = node.getElementsByTagName("input")[1];
+ duration = getFormatter(config).parse(duration.value);
+ if (!duration || window.isNaN(duration)) duration = 1;
+ if (duration < 0) duration *= -1;
+ return duration;
+ }
+
+ return DurationControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/parent_control.js":
+/*!*************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/parent_control.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./select_control */ "./sources/core/ui/lightbox/controls/select_control.js")(gantt);
+
+ function ParentControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(ParentControl, _super);
+
+ ParentControl.prototype.render = function (sns) {
+ return _display(sns, false);
+ };
+
+ ParentControl.prototype.set_value = function (node, value, ev, config) {
+ // GS-1051. If the value is `0`, the set_value function in the select control won't select
+ // the first child because (0 || '') = '';
+ if (value === 0) value = "0";
+ var tmpDom = document.createElement("div");
+ tmpDom.innerHTML = _display(config, ev.id);
+ var newOptions = tmpDom.removeChild(tmpDom.firstChild);
+ node.onselect = null;
+ node.parentNode.replaceChild(newOptions, node);
+ return gantt.form_blocks.select.set_value.apply(gantt, [newOptions, value, ev, config]);
+ };
+
+ function _display(config, item_id) {
+ var tasks = [],
+ options = [];
+
+ if (item_id) {
+ tasks = gantt.getTaskByTime();
+
+ if (config.allow_root) {
+ tasks.unshift({
+ id: gantt.config.root_id,
+ text: config.root_label || ""
+ });
+ }
+
+ tasks = _filter(tasks, config, item_id);
+
+ if (config.sort) {
+ tasks.sort(config.sort);
+ }
+ }
+
+ var text = config.template || gantt.templates.task_text;
+
+ for (var i = 0; i < tasks.length; i++) {
+ var label = text.apply(gantt, [tasks[i].start_date, tasks[i].end_date, tasks[i]]);
+
+ if (label === undefined) {
+ label = "";
+ }
+
+ options.push({
+ key: tasks[i].id,
+ label: label
+ });
+ }
+
+ config.options = options;
+ config.map_to = config.map_to || "parent";
+ return gantt.form_blocks.select.render.apply(this, arguments);
+ }
+
+ function _filter(options, config, item_id) {
+ var filter = config.filter || function () {
+ return true;
+ };
+
+ options = options.slice(0);
+
+ for (var i = 0; i < options.length; i++) {
+ var task = options[i];
+
+ if (task.id == item_id || gantt.isChildOf(task.id, item_id) || filter(task.id, task) === false) {
+ options.splice(i, 1);
+ i--;
+ }
+ }
+
+ return options;
+ }
+
+ return ParentControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/radio_control.js":
+/*!************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/radio_control.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function RadioControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(RadioControl, _super);
+
+ RadioControl.prototype.render = function (sns) {
+ var height = (sns.height || "23") + "px";
+ var html = "<div class='gantt_cal_ltext' style='height:" + height + ";'>";
+
+ if (sns.options && sns.options.length) {
+ for (var i = 0; i < sns.options.length; i++) {
+ html += "<label><input type='radio' value='" + sns.options[i].key + "' name='" + sns.name + "'>" + sns.options[i].label + "</label>";
+ }
+ }
+
+ html += "</div>";
+ return html;
+ };
+
+ RadioControl.prototype.set_value = function (node, value, ev, sns) {
+ var radio;
+ if (!sns.options || !sns.options.length) return;
+ radio = node.querySelector("input[type=radio][value='" + value + "']") || node.querySelector("input[type=radio][value='" + sns.default_value + "']");
+ if (!radio) return;
+
+ if (!node._dhx_onchange && sns.onchange) {
+ node.onchange = sns.onchange;
+ node._dhx_onchange = true;
+ }
+
+ radio.checked = true;
+ };
+
+ RadioControl.prototype.get_value = function (node, ev) {
+ var result = node.querySelector("input[type=radio]:checked");
+ return result ? result.value : "";
+ };
+
+ RadioControl.prototype.focus = function (node) {
+ gantt._focus(node.querySelector("input[type=radio]"));
+ };
+
+ return RadioControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/select_control.js":
+/*!*************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/select_control.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+var htmlHelpers = __webpack_require__(/*! ../../utils/html_helpers */ "./sources/core/ui/utils/html_helpers.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function SelectControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(SelectControl, _super);
+
+ SelectControl.prototype.render = function (sns) {
+ var height = (sns.height || "23") + "px";
+ var html = "<div class='gantt_cal_ltext' style='height:" + height + ";'>";
+ html += htmlHelpers.getHtmlSelect(sns.options, [{
+ key: "style",
+ value: "width:100%;"
+ }, {
+ key: "title",
+ value: sns.name
+ }]);
+ html += "</div>";
+ return html;
+ };
+
+ SelectControl.prototype.set_value = function (node, value, ev, sns) {
+ var select = node.firstChild;
+
+ if (!select._dhx_onchange && sns.onchange) {
+ select.onchange = sns.onchange;
+ select._dhx_onchange = true;
+ }
+
+ if (typeof value === "undefined") value = (select.options[0] || {}).value;
+ select.value = value || "";
+ };
+
+ SelectControl.prototype.get_value = function (node) {
+ return node.firstChild.value;
+ };
+
+ SelectControl.prototype.focus = function (node) {
+ var a = node.firstChild;
+
+ gantt._focus(a, true);
+ };
+
+ return SelectControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/template_control.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/template_control.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function TemplateControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(TemplateControl, _super);
+
+ TemplateControl.prototype.render = function (sns) {
+ var height = (sns.height || "30") + "px";
+ return "<div class='gantt_cal_ltext gantt_cal_template' style='height:" + height + ";'></div>";
+ };
+
+ TemplateControl.prototype.set_value = function (node, value) {
+ node.innerHTML = value || "";
+ };
+
+ TemplateControl.prototype.get_value = function (node) {
+ return node.innerHTML || "";
+ };
+
+ TemplateControl.prototype.focus = function () {};
+
+ return TemplateControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/textarea_control.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/textarea_control.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function TextareaControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(TextareaControl, _super);
+
+ TextareaControl.prototype.render = function (sns) {
+ var height = (sns.height || "130") + "px";
+ return "<div class='gantt_cal_ltext' style='height:" + height + ";'><textarea></textarea></div>";
+ };
+
+ TextareaControl.prototype.set_value = function (node, value) {
+ gantt.form_blocks.textarea._get_input(node).value = value || "";
+ };
+
+ TextareaControl.prototype.get_value = function (node) {
+ return gantt.form_blocks.textarea._get_input(node).value;
+ };
+
+ TextareaControl.prototype.focus = function (node) {
+ var a = gantt.form_blocks.textarea._get_input(node);
+
+ gantt._focus(a, true);
+ };
+
+ TextareaControl.prototype._get_input = function (node) {
+ return node.querySelector("textarea");
+ };
+
+ return TextareaControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/time_control.js":
+/*!***********************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/time_control.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./base_control */ "./sources/core/ui/lightbox/controls/base_control.js")(gantt);
+
+ function TimeControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(TimeControl, _super);
+
+ TimeControl.prototype.render = function (sns) {
+ var time = gantt.form_blocks.getTimePicker.call(this, sns);
+ var html = "<div style='height:" + (sns.height || 30) + "px;padding-top:0px;font-size:inherit;text-align:center;' class='gantt_section_time'>";
+ html += time;
+
+ if (sns.single_date) {
+ time = gantt.form_blocks.getTimePicker.call(this, sns, true);
+ html += "<span></span>";
+ } else {
+ html += "<span style='font-weight:normal; font-size:10pt;'> – </span>";
+ }
+
+ html += time;
+ html += "</div>";
+ return html;
+ };
+
+ TimeControl.prototype.set_value = function (node, value, ev, config) {
+ var cfg = config;
+ var s = node.getElementsByTagName("select");
+ var map = config._time_format_order;
+
+ if (cfg.auto_end_date) {
+ var _update_lightbox_select = function _update_lightbox_select() {
+ start_date = new Date(s[map[2]].value, s[map[1]].value, s[map[0]].value, 0, 0);
+ end_date = gantt.calculateEndDate({
+ start_date: start_date,
+ duration: 1,
+ task: ev
+ });
+
+ gantt.form_blocks._fill_lightbox_select(s, map.size, end_date, map, cfg);
+ };
+
+ for (var i = 0; i < 4; i++) {
+ s[i].onchange = _update_lightbox_select;
+ }
+ }
+
+ var mapping = gantt._resolve_default_mapping(config);
+
+ if (typeof mapping === "string") mapping = {
+ start_date: mapping
+ };
+ var start_date = ev[mapping.start_date] || new Date();
+ var end_date = ev[mapping.end_date] || gantt.calculateEndDate({
+ start_date: start_date,
+ duration: 1,
+ task: ev
+ });
+
+ gantt.form_blocks._fill_lightbox_select(s, 0, start_date, map, cfg);
+
+ gantt.form_blocks._fill_lightbox_select(s, map.size, end_date, map, cfg);
+ };
+
+ TimeControl.prototype.get_value = function (node, ev, config) {
+ var selects = node.getElementsByTagName("select");
+ var startDate;
+ var map = config._time_format_order;
+
+ function _getEndDate(selects, map, startDate) {
+ var endDate = gantt.form_blocks.getTimePickerValue(selects, config, map.size); // GS-1010: We need to add a way to obtain exact end_date for validation
+
+ if (endDate <= startDate) {
+ // when end date seems wrong
+ if (config.autofix_end !== false || config.single_date) {
+ // auto correct it in two cases - when the auto correction is not disabled, or when we have 'single date' control and the user don't have the UI to specify the end date
+ return gantt.date.add(startDate, gantt._get_timepicker_step(), "minute");
+ }
+ }
+
+ return endDate;
+ }
+
+ startDate = gantt.form_blocks.getTimePickerValue(selects, config);
+
+ if (typeof gantt._resolve_default_mapping(config) === "string") {
+ return startDate;
+ }
+
+ return {
+ start_date: startDate,
+ end_date: _getEndDate(selects, map, startDate)
+ };
+ };
+
+ TimeControl.prototype.focus = function (node) {
+ gantt._focus(node.getElementsByTagName("select")[0]);
+ };
+
+ return TimeControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/controls/typeselect_control.js":
+/*!*****************************************************************!*\
+ !*** ./sources/core/ui/lightbox/controls/typeselect_control.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = __webpack_require__(/*! ../../../../utils/extends */ "./sources/utils/extends.js");
+
+module.exports = function (gantt) {
+ var _super = __webpack_require__(/*! ./select_control */ "./sources/core/ui/lightbox/controls/select_control.js")(gantt);
+
+ function TypeselectControl() {
+ var self = _super.apply(this, arguments) || this;
+ return self;
+ }
+
+ __extends(TypeselectControl, _super);
+
+ TypeselectControl.prototype.render = function (sns) {
+ var types = gantt.config.types,
+ locale = gantt.locale.labels,
+ options = [];
+
+ var filter = sns.filter || function (typeKey, typeValue) {
+ if (!types.placeholder || typeValue !== types.placeholder) {
+ return true;
+ }
+
+ return false;
+ };
+
+ for (var i in types) {
+ if (!filter(i, types[i]) === false) {
+ options.push({
+ key: types[i],
+ label: locale["type_" + i]
+ });
+ }
+ }
+
+ sns.options = options;
+ var oldOnChange = sns.onchange;
+
+ sns.onchange = function () {
+ gantt.changeLightboxType(this.value);
+
+ if (this.value === gantt.config.types.task) {
+ gantt._lightbox_new_type = "task";
+ }
+
+ if (typeof oldOnChange == 'function') {
+ oldOnChange.apply(this, arguments);
+ }
+ };
+
+ return _super.prototype.render.apply(this, arguments);
+ };
+
+ return TypeselectControl;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/index.js":
+/*!*******************************************!*\
+ !*** ./sources/core/ui/lightbox/index.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+module.exports = function (gantt) {
+ var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+ var helpers = __webpack_require__(/*! ../../../utils/helpers */ "./sources/utils/helpers.js");
+
+ var TemplateControl = __webpack_require__(/*! ./controls/template_control */ "./sources/core/ui/lightbox/controls/template_control.js")(gantt);
+
+ var TextareaControl = __webpack_require__(/*! ./controls/textarea_control */ "./sources/core/ui/lightbox/controls/textarea_control.js")(gantt);
+
+ var TimeControl = __webpack_require__(/*! ./controls/time_control */ "./sources/core/ui/lightbox/controls/time_control.js")(gantt);
+
+ var SelectControl = __webpack_require__(/*! ./controls/select_control */ "./sources/core/ui/lightbox/controls/select_control.js")(gantt);
+
+ var CheckboxControl = __webpack_require__(/*! ./controls/checkbox_control */ "./sources/core/ui/lightbox/controls/checkbox_control.js")(gantt);
+
+ var RadioControl = __webpack_require__(/*! ./controls/radio_control */ "./sources/core/ui/lightbox/controls/radio_control.js")(gantt);
+
+ var DurationControl = __webpack_require__(/*! ./controls/duration_control */ "./sources/core/ui/lightbox/controls/duration_control.js")(gantt);
+
+ var ParentControl = __webpack_require__(/*! ./controls/parent_control */ "./sources/core/ui/lightbox/controls/parent_control.js")(gantt);
+
+ var ResourcesControl = __webpack_require__(/*! ./controls/resources_control */ "./sources/core/ui/lightbox/controls/select_control.js")(gantt);
+
+ var ConstraintControl = __webpack_require__(/*! ./controls/constraint_control */ "./sources/core/ui/lightbox/controls/constraint_control.js")(gantt);
+
+ var TypeselectControl = __webpack_require__(/*! ./controls/typeselect_control */ "./sources/core/ui/lightbox/controls/typeselect_control.js")(gantt);
+
+ gantt._lightbox_methods = {};
+ gantt._lightbox_template = "<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span></div><div class='gantt_cal_larea'></div>"; // GS-1952. Attaching the lightbox to the BODY element is not considered secure.
+ // Attach it to Gantt container for Salesforce and other secure environments
+
+ gantt._lightbox_root = gantt.$root;
+
+ function setParentNode() {
+ var cspEnvironment = gantt.config.csp === true;
+ var salesforceEnvironment = !!window["Sfdc"] || !!window["$A"] || window["Aura"] || '$shadowResolver$' in document.body;
+
+ if (cspEnvironment || salesforceEnvironment) {
+ gantt._lightbox_root = gantt.$root;
+ } else {
+ gantt._lightbox_root = document.body;
+ }
+ } //TODO: gantt._lightbox_id is changed from data.js and accessed from autoscheduling, check if it can be removed from gantt object
+
+
+ var state = gantt.$services.getService("state");
+ state.registerProvider("lightbox", function () {
+ return {
+ lightbox: gantt._lightbox_id
+ };
+ });
+
+ gantt.showLightbox = function (id) {
+ if (!this.callEvent("onBeforeLightbox", [id])) return;
+ var task = this.getTask(id);
+ var box = this.getLightbox(this.getTaskType(task.type));
+
+ this._center_lightbox(box);
+
+ this.showCover();
+
+ this._fill_lightbox(id, box);
+
+ this._waiAria.lightboxVisibleAttr(box);
+
+ this.callEvent("onLightbox", [id]);
+ };
+
+ function _is_chart_visible(gantt) {
+ var timeline = gantt.$ui.getView("timeline");
+
+ if (timeline && timeline.isVisible()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ gantt._get_timepicker_step = function () {
+ if (this.config.round_dnd_dates) {
+ var step;
+
+ if (_is_chart_visible(this)) {
+ var scale = gantt.getScale();
+ step = helpers.getSecondsInUnit(scale.unit) * scale.step / 60; //timepicker step is measured in minutes
+ }
+
+ if (!step || step >= 60 * 24) {
+ step = this.config.time_step;
+ }
+
+ return step;
+ }
+
+ return this.config.time_step;
+ };
+
+ gantt.getLabel = function (property, key) {
+ var sections = this._get_typed_lightbox_config();
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i].map_to == property) {
+ var options = sections[i].options;
+
+ for (var j = 0; j < options.length; j++) {
+ if (options[j].key == key) {
+ return options[j].label;
+ }
+ }
+ }
+ }
+
+ return "";
+ };
+
+ gantt.updateCollection = function (list_name, collection) {
+ collection = collection.slice(0);
+ var list = gantt.serverList(list_name);
+ if (!list) return false;
+ list.splice(0, list.length);
+ list.push.apply(list, collection || []);
+ gantt.resetLightbox();
+ };
+
+ gantt.getLightboxType = function () {
+ return this.getTaskType(this._lightbox_type);
+ };
+
+ gantt.getLightbox = function (type) {
+ var lightboxDiv;
+ var fullWidth;
+ var html;
+ var sns;
+ var ds;
+ var classNames = "";
+ setParentNode();
+ if (type === undefined) type = this.getLightboxType();
+
+ if (!this._lightbox || this.getLightboxType() != this.getTaskType(type)) {
+ this._lightbox_type = this.getTaskType(type);
+ lightboxDiv = document.createElement("div");
+ classNames = "gantt_cal_light";
+ fullWidth = this._is_lightbox_timepicker();
+ if (gantt.config.wide_form || fullWidth) classNames += " gantt_cal_light_wide";
+
+ if (fullWidth) {
+ gantt.config.wide_form = true;
+ classNames += " gantt_cal_light_full";
+ }
+
+ lightboxDiv.className = classNames;
+ lightboxDiv.style.visibility = "hidden";
+ html = this._lightbox_template;
+ html += getHtmlButtons(this.config.buttons_left);
+ html += getHtmlButtons(this.config.buttons_right, true);
+ lightboxDiv.innerHTML = html;
+
+ gantt._waiAria.lightboxAttr(lightboxDiv);
+
+ if (gantt.config.drag_lightbox) {
+ lightboxDiv.firstChild.onmousedown = gantt._ready_to_dnd;
+
+ lightboxDiv.firstChild.onselectstart = function () {
+ return false;
+ };
+
+ lightboxDiv.firstChild.style.cursor = "pointer";
+
+ gantt._init_dnd_events();
+ } // GS-1428: If there is lightbox node, we need to remove it from the DOM
+
+
+ if (this._lightbox) {
+ this.resetLightbox();
+ }
+
+ gantt._lightbox_root.insertBefore(lightboxDiv, gantt._lightbox_root.firstChild);
+
+ this._lightbox = lightboxDiv;
+ sns = this._get_typed_lightbox_config(type);
+ html = this._render_sections(sns);
+ ds = lightboxDiv.querySelector("div.gantt_cal_larea"); //GS-1131. If gantt_cal_larea is displayed, Firefox renders buttons incorrectly;
+
+ var backup_overflow = ds.style.overflow;
+ ds.style.overflow = 'hidden';
+ ds.innerHTML = html;
+ bindLabelsToInputs(sns); //sizes
+
+ this.resizeLightbox();
+ ds.style.overflow = backup_overflow;
+
+ this._init_lightbox_events(this);
+
+ lightboxDiv.style.display = "none";
+ lightboxDiv.style.visibility = "visible";
+ }
+
+ return this._lightbox;
+ };
+
+ gantt._render_sections = function (sns) {
+ var html = "";
+
+ for (var i = 0; i < sns.length; i++) {
+ var block = this.form_blocks[sns[i].type];
+ if (!block) continue; //ignore incorrect blocks
+
+ sns[i].id = "area_" + this.uid();
+ var display = sns[i].hidden ? " style='display:none'" : "";
+ var button = "";
+
+ if (sns[i].button) {
+ button = "<div class='gantt_custom_button' data-index='" + i + "'><div class='gantt_custom_button_" + sns[i].button + "'></div><div class='gantt_custom_button_label'>" + this.locale.labels["button_" + sns[i].button] + "</div></div>";
+ }
+
+ if (this.config.wide_form) {
+ html += "<div class='gantt_wrap_section' " + display + ">";
+ }
+
+ html += "<div id='" + sns[i].id + "' class='gantt_cal_lsection'><label>" + button + this.locale.labels["section_" + sns[i].name] + "</label></div>" + block.render.call(this, sns[i]);
+ html += "</div>";
+ }
+
+ return html;
+ };
+
+ gantt.resizeLightbox = function () {
+ if (!this._lightbox) return;
+
+ var con = this._lightbox.querySelector(".gantt_cal_larea");
+
+ con.style.height = "0px";
+ con.style.height = con.scrollHeight + "px";
+ this._lightbox.style.height = con.scrollHeight + this.config.lightbox_additional_height + "px";
+ con.style.height = con.scrollHeight + "px"; //it is incredible , how ugly IE can be
+ };
+
+ gantt._center_lightbox = function (box) {
+ if (box) {
+ box.style.display = "block";
+ var scroll_top = window.pageYOffset || gantt._lightbox_root.scrollTop || document.documentElement.scrollTop;
+ var scroll_left = window.pageXOffset || gantt._lightbox_root.scrollLeft || document.documentElement.scrollLeft;
+ var view_height = window.innerHeight || document.documentElement.clientHeight;
+ if (scroll_top) // if vertical scroll on window
+ box.style.top = Math.round(scroll_top + Math.max((view_height - box.offsetHeight) / 2, 0)) + "px";else // vertical scroll on body
+ box.style.top = Math.round(Math.max((view_height - box.offsetHeight) / 2, 0) + 9) + "px"; // +9 for compatibility with auto tests
+ // not quite accurate but used for compatibility reasons
+
+ if (document.documentElement.scrollWidth > gantt._lightbox_root.offsetWidth) // if horizontal scroll on the window
+ box.style.left = Math.round(scroll_left + (gantt._lightbox_root.offsetWidth - box.offsetWidth) / 2) + "px";else // horizontal scroll on the body
+ box.style.left = Math.round((gantt._lightbox_root.offsetWidth - box.offsetWidth) / 2) + "px";
+ }
+ };
+
+ gantt.showCover = function () {
+ if (this._cover) return;
+ this._cover = document.createElement("DIV");
+ this._cover.className = "gantt_cal_cover";
+ var rootElement = gantt._lightbox_root || gantt.$root;
+ rootElement.appendChild(this._cover);
+ };
+
+ gantt.event(window, "deviceorientation", function () {
+ if (gantt.getState().lightbox) {
+ gantt._center_lightbox(gantt.getLightbox());
+ }
+ });
+
+ gantt._init_lightbox_events = function () {
+ gantt.lightbox_events = {};
+
+ gantt.lightbox_events.gantt_save_btn = function () {
+ gantt._save_lightbox();
+ };
+
+ gantt.lightbox_events.gantt_delete_btn = function () {
+ gantt._lightbox_new_type = null;
+ if (!gantt.callEvent("onLightboxDelete", [gantt._lightbox_id])) return;
+
+ if (gantt.isTaskExists(gantt._lightbox_id)) {
+ gantt.$click.buttons["delete"](gantt._lightbox_id);
+ } else {
+ gantt.hideLightbox();
+ }
+ };
+
+ gantt.lightbox_events.gantt_cancel_btn = function () {
+ gantt._cancel_lightbox();
+ };
+
+ gantt.lightbox_events["default"] = function (e, src) {
+ if (src.getAttribute("data-dhx-button")) {
+ gantt.callEvent("onLightboxButton", [src.className, src, e]);
+ } else {
+ var index, block, sec;
+ var className = domHelpers.getClassName(src);
+
+ if (className.indexOf("gantt_custom_button") != -1) {
+ if (className.indexOf("gantt_custom_button_") != -1) {
+ index = src.parentNode.getAttribute("data-index");
+ sec = src;
+
+ while (sec && domHelpers.getClassName(sec).indexOf("gantt_cal_lsection") == -1) {
+ sec = sec.parentNode;
+ }
+ } else {
+ index = src.getAttribute("data-index");
+ sec = src.parentNode;
+ src = src.firstChild;
+ }
+ }
+
+ var sections = gantt._get_typed_lightbox_config();
+
+ if (index) {
+ index = index * 1;
+ block = gantt.form_blocks[sections[index * 1].type];
+ block.button_click(index, src, sec, sec.nextSibling);
+ }
+ }
+ };
+
+ this.event(gantt.getLightbox(), "click", function (e) {
+ e = e || window.event;
+ var src = domHelpers.getTargetNode(e);
+ var className = domHelpers.getClassName(src);
+
+ if (!className) {
+ src = src.previousSibling;
+ className = domHelpers.getClassName(src);
+ }
+
+ if (src && className && className.indexOf("gantt_btn_set") === 0) {
+ src = src.firstChild;
+ className = domHelpers.getClassName(src);
+ }
+
+ if (src && className) {
+ var func = gantt.defined(gantt.lightbox_events[src.className]) ? gantt.lightbox_events[src.className] : gantt.lightbox_events["default"];
+ return func(e, src);
+ }
+
+ return false;
+ });
+
+ gantt.getLightbox().onkeydown = function (e) {
+ var event = e || window.event;
+ var target = e.target || e.srcElement;
+ var buttonTarget = domHelpers.getClassName(target).indexOf("gantt_btn_set") > -1;
+
+ switch ((e || event).keyCode) {
+ case gantt.constants.KEY_CODES.SPACE:
+ {
+ if ((e || event).shiftKey) return;
+
+ if (buttonTarget && target.click) {
+ target.click();
+ }
+
+ break;
+ }
+
+ case gantt.keys.edit_save:
+ if ((e || event).shiftKey) return;
+
+ if (buttonTarget && target.click) {
+ target.click();
+ } else {
+ gantt._save_lightbox();
+ }
+
+ break;
+
+ case gantt.keys.edit_cancel:
+ gantt._cancel_lightbox();
+
+ break;
+
+ default:
+ break;
+ }
+ };
+ };
+
+ gantt._cancel_lightbox = function () {
+ var task = this.getLightboxValues();
+ this.callEvent("onLightboxCancel", [this._lightbox_id, task.$new]);
+
+ if (gantt.isTaskExists(task.id) && task.$new) {
+ this.silent(function () {
+ gantt.$data.tasksStore.removeItem(task.id);
+
+ gantt._update_flags(task.id, null);
+ });
+ this.refreshData();
+ }
+
+ this.hideLightbox();
+ };
+
+ gantt._save_lightbox = function () {
+ var task = this.getLightboxValues();
+ if (!this.callEvent("onLightboxSave", [this._lightbox_id, task, !!task.$new])) return; // GS-2170. Do not recalculate the indexes and dates of other tasks
+ // as they will be recalculated in the `refreshData`
+
+ gantt.$data.tasksStore._skipTaskRecalculation = "lightbox";
+
+ if (task.$new) {
+ delete task.$new;
+ this.addTask(task, task.parent, this.getTaskIndex(task.id));
+ } else if (this.isTaskExists(task.id)) {
+ this.mixin(this.getTask(task.id), task, true);
+ this.refreshTask(task.id);
+ this.updateTask(task.id);
+ }
+
+ gantt.$data.tasksStore._skipTaskRecalculation = false;
+ this.refreshData(); // TODO: do we need any blockable events here to prevent closing lightbox?
+
+ this.hideLightbox();
+ };
+
+ gantt._resolve_default_mapping = function (section) {
+ var mapping = section.map_to;
+ var time_controls = {
+ "time": true,
+ "time_optional": true,
+ "duration": true,
+ "duration_optional": true
+ };
+
+ if (time_controls[section.type]) {
+ if (section.map_to == "auto") {
+ mapping = {
+ start_date: "start_date",
+ end_date: "end_date",
+ duration: "duration"
+ };
+ } else if (typeof section.map_to === "string") {
+ mapping = {
+ start_date: section.map_to
+ };
+ }
+ } else if (section.type === "constraint") {
+ if (!section.map_to || typeof section.map_to === "string") {
+ mapping = {
+ constraint_type: "constraint_type",
+ constraint_date: "constraint_date"
+ };
+ }
+ }
+
+ return mapping;
+ };
+
+ gantt.getLightboxValues = function () {
+ var task = {};
+
+ if (gantt.isTaskExists(this._lightbox_id)) {
+ task = this.mixin({}, this.getTask(this._lightbox_id));
+ }
+
+ var sns = this._get_typed_lightbox_config();
+
+ for (var i = 0; i < sns.length; i++) {
+ var node = gantt._lightbox_root.querySelector("#" + sns[i].id);
+
+ node = node ? node.nextSibling : node;
+ var block = this.form_blocks[sns[i].type];
+ if (!block) continue;
+ var res = block.get_value.call(this, node, task, sns[i]);
+
+ var map_to = gantt._resolve_default_mapping(sns[i]);
+
+ if (typeof map_to == "string" && map_to != "auto") {
+ task[map_to] = res;
+ } else if (_typeof(map_to) == "object") {
+ for (var property in map_to) {
+ if (map_to[property]) task[map_to[property]] = res[property];
+ }
+ }
+ } // GS-1282 We need to preserve the task type even if the lightbox doesn't have the typeselect section
+
+
+ if (gantt._lightbox_new_type == "task") {
+ task.type = gantt.config.types.task;
+ gantt._lightbox_new_type = null;
+ }
+
+ return task;
+ };
+
+ gantt.hideLightbox = function () {
+ var box = this.getLightbox();
+ if (box) box.style.display = "none";
+
+ this._waiAria.lightboxHiddenAttr(box);
+
+ this._lightbox_id = null;
+ this.hideCover();
+ this.callEvent("onAfterLightbox", []);
+ };
+
+ gantt.hideCover = function () {
+ if (this._cover) this._cover.parentNode.removeChild(this._cover);
+ this._cover = null;
+ };
+
+ gantt.resetLightbox = function () {
+ if (gantt._lightbox && !gantt._custom_lightbox) gantt._lightbox.parentNode.removeChild(gantt._lightbox);
+ gantt._lightbox = null;
+ gantt.hideCover();
+ };
+
+ gantt._set_lightbox_values = function (data, box) {
+ var task = data;
+ var s = box.getElementsByTagName("span");
+ var lightboxHeader = [];
+
+ if (gantt.templates.lightbox_header) {
+ lightboxHeader.push("");
+ lightboxHeader.push(gantt.templates.lightbox_header(task.start_date, task.end_date, task));
+ s[1].innerHTML = "";
+ s[2].innerHTML = gantt.templates.lightbox_header(task.start_date, task.end_date, task);
+ } else {
+ lightboxHeader.push(this.templates.task_time(task.start_date, task.end_date, task));
+ lightboxHeader.push(String(this.templates.task_text(task.start_date, task.end_date, task) || "").substr(0, 70)); //IE6 fix
+
+ s[1].innerHTML = this.templates.task_time(task.start_date, task.end_date, task);
+ s[2].innerHTML = String(this.templates.task_text(task.start_date, task.end_date, task) || "").substr(0, 70); //IE6 fix
+ }
+
+ s[1].innerHTML = lightboxHeader[0];
+ s[2].innerHTML = lightboxHeader[1];
+
+ gantt._waiAria.lightboxHeader(box, lightboxHeader.join(" "));
+
+ var sns = this._get_typed_lightbox_config(this.getLightboxType());
+
+ for (var i = 0; i < sns.length; i++) {
+ var section = sns[i];
+
+ if (!this.form_blocks[section.type]) {
+ continue; //skip incorrect sections, same check is done during rendering
+ }
+
+ var node = gantt._lightbox_root.querySelector("#" + section.id).nextSibling;
+
+ var block = this.form_blocks[section.type];
+
+ var map_to = gantt._resolve_default_mapping(sns[i]);
+
+ var value = this.defined(task[map_to]) ? task[map_to] : section.default_value;
+ block.set_value.call(gantt, node, value, task, section);
+ if (section.focus) block.focus.call(gantt, node);
+ }
+
+ if (gantt.isTaskExists(data.id)) {
+ gantt._lightbox_id = data.id;
+ }
+ };
+
+ gantt._fill_lightbox = function (id, box) {
+ var task = this.getTask(id);
+
+ this._set_lightbox_values(task, box);
+ };
+
+ gantt.getLightboxSection = function (name) {
+ var config = this._get_typed_lightbox_config();
+
+ var i = 0;
+
+ for (i; i < config.length; i++) {
+ if (config[i].name == name) break;
+ }
+
+ var section = config[i];
+ if (!section) return null;
+ if (!this._lightbox) this.getLightbox();
+
+ var header = gantt._lightbox_root.querySelector("#" + section.id);
+
+ var node = header.nextSibling;
+ var result = {
+ section: section,
+ header: header,
+ node: node,
+ getValue: function getValue(ev) {
+ return gantt.form_blocks[section.type].get_value.call(gantt, node, ev || {}, section);
+ },
+ setValue: function setValue(value, ev) {
+ return gantt.form_blocks[section.type].set_value.call(gantt, node, value, ev || {}, section);
+ }
+ };
+ var handler = this._lightbox_methods["get_" + section.type + "_control"];
+ return handler ? handler(result) : result;
+ };
+
+ gantt._lightbox_methods.get_template_control = function (result) {
+ result.control = result.node;
+ return result;
+ };
+
+ gantt._lightbox_methods.get_select_control = function (result) {
+ result.control = result.node.getElementsByTagName("select")[0];
+ return result;
+ };
+
+ gantt._lightbox_methods.get_textarea_control = function (result) {
+ result.control = result.node.getElementsByTagName("textarea")[0];
+ return result;
+ };
+
+ gantt._lightbox_methods.get_time_control = function (result) {
+ result.control = result.node.getElementsByTagName("select"); // array
+
+ return result;
+ };
+
+ gantt._init_dnd_events = function () {
+ var eventElement = gantt._lightbox_root;
+ this.event(eventElement, "mousemove", gantt._move_while_dnd);
+ this.event(eventElement, "mouseup", gantt._finish_dnd); // GS-1952: In Salesforce environment, the lightbox is attached to the Gantt container.
+ // So when Gantt is reinitialized, the events are no longer attached to the Gantt container.
+ // gantt._init_dnd_events = function () {
+ // };
+ };
+
+ gantt._move_while_dnd = function (event) {
+ if (gantt._dnd_start_lb) {
+ if (!document.gantt_unselectable) {
+ gantt._lightbox_root.className += " gantt_unselectable";
+ document.gantt_unselectable = true;
+ }
+
+ var lb = gantt.getLightbox();
+ var now = [event.pageX, event.pageY];
+ lb.style.top = gantt._lb_start[1] + now[1] - gantt._dnd_start_lb[1] + "px";
+ lb.style.left = gantt._lb_start[0] + now[0] - gantt._dnd_start_lb[0] + "px";
+ }
+ };
+
+ gantt._ready_to_dnd = function (event) {
+ var lb = gantt.getLightbox();
+ gantt._lb_start = [parseInt(lb.style.left, 10), parseInt(lb.style.top, 10)];
+ gantt._dnd_start_lb = [event.pageX, event.pageY];
+ };
+
+ gantt._finish_dnd = function () {
+ if (gantt._lb_start) {
+ gantt._lb_start = gantt._dnd_start_lb = false;
+ gantt._lightbox_root.className = gantt._lightbox_root.className.replace(" gantt_unselectable", "");
+ document.gantt_unselectable = false;
+ }
+ };
+
+ gantt._focus = function (node, select) {
+ if (node && node.focus) {
+ if (gantt.config.touch) {//do not focus editor, to prevent auto-zoom
+ } else {
+ try {
+ if (select && node.select) node.select();
+ node.focus();
+ } catch (e) {// silent errors
+ }
+ }
+ }
+ };
+
+ gantt.form_blocks = {
+ getTimePicker: function getTimePicker(sns, hidden) {
+ var html = "";
+ var cfg = this.config;
+ var i;
+ var options;
+ var ariaAttrs;
+ var readonly;
+ var display;
+ var settings = {
+ first: 0,
+ last: 24 * 60,
+ date: this.date.date_part(new Date(gantt._min_date.valueOf())),
+ timeFormat: getTimeFormat(sns)
+ }; // map: default order => real one
+
+ sns._time_format_order = {
+ size: 0
+ };
+
+ if (gantt.config.limit_time_select) {
+ settings.first = 60 * cfg.first_hour;
+ settings.last = 60 * cfg.last_hour + 1;
+ settings.date.setHours(cfg.first_hour);
+ }
+
+ for (i = 0; i < settings.timeFormat.length; i++) {
+ // adding spaces between selects
+ if (i > 0) {
+ html += " ";
+ }
+
+ options = getHtmlTimePickerOptions(sns, i, settings);
+
+ if (options) {
+ ariaAttrs = gantt._waiAria.lightboxSelectAttrString(settings.timeFormat[i]);
+ readonly = sns.readonly ? "disabled='disabled'" : "";
+ display = hidden ? " style='display:none' " : "";
+ html += "<select " + readonly + display + ariaAttrs + ">" + options + "</select>";
+ }
+ }
+
+ return html;
+ },
+ getTimePickerValue: function getTimePickerValue(selects, config, offset) {
+ var map = config._time_format_order;
+ var needSetTime = gantt.defined(map[3]);
+ var time;
+ var hours = 0;
+ var minutes = 0;
+ var mapOffset = offset || 0;
+
+ if (needSetTime) {
+ time = parseInt(selects[map[3] + mapOffset].value, 10);
+ hours = Math.floor(time / 60);
+ minutes = time % 60;
+ }
+
+ return new Date(selects[map[2] + mapOffset].value, selects[map[1] + mapOffset].value, selects[map[0] + mapOffset].value, hours, minutes);
+ },
+ _fill_lightbox_select: function _fill_lightbox_select(s, i, d, map) {
+ s[i + map[0]].value = d.getDate();
+ s[i + map[1]].value = d.getMonth();
+ s[i + map[2]].value = d.getFullYear();
+
+ if (gantt.defined(map[3])) {
+ var v = d.getHours() * 60 + d.getMinutes();
+ v = Math.round(v / gantt._get_timepicker_step()) * gantt._get_timepicker_step();
+ var input = s[i + map[3]];
+ input.value = v; //in case option not shown
+
+ input.setAttribute("data-value", v);
+ }
+ },
+ template: new TemplateControl(),
+ textarea: new TextareaControl(),
+ select: new SelectControl(),
+ time: new TimeControl(),
+ duration: new DurationControl(),
+ parent: new ParentControl(),
+ radio: new RadioControl(),
+ checkbox: new CheckboxControl(),
+ resources: new ResourcesControl(),
+ constraint: new ConstraintControl(),
+ typeselect: new TypeselectControl()
+ };
+
+ gantt._is_lightbox_timepicker = function () {
+ var s = this._get_typed_lightbox_config();
+
+ for (var i = 0; i < s.length; i++) {
+ if (s[i].name == "time" && s[i].type == "time") return true;
+ }
+
+ return false;
+ };
+
+ gantt._simple_confirm = function (message, title, callback, ok) {
+ if (!message) return callback();
+ var opts = {
+ text: message
+ };
+ if (title) opts.title = title;
+
+ if (ok) {
+ opts.ok = ok;
+ }
+
+ if (callback) {
+ opts.callback = function (result) {
+ if (result) callback();
+ };
+ }
+
+ gantt.confirm(opts);
+ };
+
+ function _get_type_name(type_value) {
+ for (var i in this.config.types) {
+ if (this.config.types[i] == type_value) {
+ return i;
+ }
+ }
+
+ return "task";
+ }
+
+ gantt._get_typed_lightbox_config = function (type) {
+ if (type === undefined) {
+ type = this.getLightboxType();
+ }
+
+ var field = _get_type_name.call(this, type);
+
+ if (gantt.config.lightbox[field + "_sections"]) {
+ return gantt.config.lightbox[field + "_sections"];
+ } else {
+ return gantt.config.lightbox.sections;
+ }
+ };
+
+ gantt._silent_redraw_lightbox = function (type) {
+ var oldType = this.getLightboxType();
+
+ if (this.getState().lightbox) {
+ var taskId = this.getState().lightbox;
+ var formData = this.getLightboxValues(),
+ task = this.copy(this.getTask(taskId));
+ this.resetLightbox();
+ var updTask = this.mixin(task, formData, true);
+ var box = this.getLightbox(type ? type : undefined);
+
+ this._center_lightbox(this.getLightbox());
+
+ this._set_lightbox_values(updTask, box);
+
+ this.showCover();
+ } else {
+ this.resetLightbox();
+ this.getLightbox(type ? type : undefined);
+ }
+
+ this.callEvent("onLightboxChange", [oldType, this.getLightboxType()]);
+ };
+
+ function bindLabelsToInputs(sns) {
+ var section;
+ var label;
+ var labelBlock;
+ var inputBlock;
+ var input;
+ var i;
+
+ for (i = 0; i < sns.length; i++) {
+ section = sns[i];
+ labelBlock = gantt._lightbox_root.querySelector("#" + section.id);
+ if (!section.id || !labelBlock) continue;
+ label = labelBlock.querySelector("label");
+ inputBlock = labelBlock.nextSibling;
+ if (!inputBlock) continue;
+ input = inputBlock.querySelector("input, select, textarea");
+
+ if (input) {
+ input.id = input.id || "input_" + gantt.uid();
+ section.inputId = input.id;
+ label.setAttribute("for", section.inputId);
+ }
+ }
+ }
+
+ function getHtmlButtons(buttons, floatRight) {
+ var button;
+ var ariaAttr;
+ var html = "";
+ var i;
+
+ for (i = 0; i < buttons.length; i++) {
+ // needed to migrate from 'dhx_something' to 'gantt_something' naming in a lightbox
+ button = gantt.config._migrate_buttons[buttons[i]] ? gantt.config._migrate_buttons[buttons[i]] : buttons[i];
+ ariaAttr = gantt._waiAria.lightboxButtonAttrString(button);
+ html += "<div " + ariaAttr + " class='gantt_btn_set gantt_left_btn_set " + button + "_set'" + (floatRight ? " style='float:right;'" : "") + "><div dhx_button='1' data-dhx-button='1' class='" + button + "'></div><div>" + gantt.locale.labels[button] + "</div></div>";
+ }
+
+ return html;
+ }
+
+ function getTimeFormat(sns) {
+ var scale;
+ var unit;
+ var result;
+ if (sns.time_format) return sns.time_format; // default order
+
+ result = ["%d", "%m", "%Y"];
+ scale = gantt.getScale();
+ unit = scale ? scale.unit : gantt.config.duration_unit;
+
+ if (helpers.getSecondsInUnit(unit) < helpers.getSecondsInUnit("day")) {
+ result.push("%H:%i");
+ }
+
+ return result;
+ }
+
+ function getHtmlTimePickerOptions(sns, index, settings) {
+ var range;
+ var offset;
+ var start_year;
+ var end_year;
+ var i;
+ var time;
+ var diff;
+ var tdate;
+ var html = "";
+
+ switch (settings.timeFormat[index]) {
+ case "%Y":
+ sns._time_format_order[2] = index;
+ sns._time_format_order.size++; //year
+
+ if (sns.year_range) {
+ if (!isNaN(sns.year_range)) {
+ range = sns.year_range;
+ } else if (sns.year_range.push) {
+ // if
+ start_year = sns.year_range[0];
+ end_year = sns.year_range[1];
+ }
+ }
+
+ range = range || 10;
+ offset = offset || Math.floor(range / 2);
+ start_year = start_year || settings.date.getFullYear() - offset;
+ end_year = end_year || gantt.getState().max_date.getFullYear() + offset;
+
+ for (i = start_year; i < end_year; i++) {
+ html += "<option value='" + i + "'>" + i + "</option>";
+ }
+
+ break;
+
+ case "%m":
+ sns._time_format_order[1] = index;
+ sns._time_format_order.size++; //month
+
+ for (i = 0; i < 12; i++) {
+ html += "<option value='" + i + "'>" + gantt.locale.date.month_full[i] + "</option>";
+ }
+
+ break;
+
+ case "%d":
+ sns._time_format_order[0] = index;
+ sns._time_format_order.size++; //days
+
+ for (i = 1; i < 32; i++) {
+ html += "<option value='" + i + "'>" + i + "</option>";
+ }
+
+ break;
+
+ case "%H:%i":
+ // var last = 24*60, first = 0;
+ sns._time_format_order[3] = index;
+ sns._time_format_order.size++; //hours
+
+ i = settings.first;
+ tdate = settings.date.getDate();
+ sns._time_values = [];
+
+ while (i < settings.last) {
+ time = gantt.templates.time_picker(settings.date);
+ html += "<option value='" + i + "'>" + time + "</option>";
+
+ sns._time_values.push(i);
+
+ settings.date.setTime(settings.date.valueOf() + gantt._get_timepicker_step() * 60 * 1000);
+ diff = settings.date.getDate() != tdate ? 1 : 0; // moved or not to the next day
+
+ i = diff * 24 * 60 + settings.date.getHours() * 60 + settings.date.getMinutes();
+ }
+
+ break;
+
+ default:
+ break;
+ }
+
+ return html;
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/lightbox/lightbox_optional_time.js":
+/*!************************************************************!*\
+ !*** ./sources/core/ui/lightbox/lightbox_optional_time.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt._extend_to_optional = function (lightbox_block) {
+ var duration = lightbox_block;
+ var optional_time = {
+ render: duration.render,
+ focus: duration.focus,
+ set_value: function set_value(node, value, task, section) {
+ var mapping = gantt._resolve_default_mapping(section);
+
+ if (!task[mapping.start_date] || mapping.start_date == "start_date" && this._isAllowedUnscheduledTask(task)) {
+ optional_time.disable(node, section);
+ var val = {};
+
+ for (var i in mapping) {
+ //take default values from the time control from task start/end dates
+ val[mapping[i]] = task[i];
+ }
+
+ return duration.set_value.call(gantt, node, value, val, section); //set default value
+ } else {
+ optional_time.enable(node, section);
+ return duration.set_value.call(gantt, node, value, task, section);
+ }
+ },
+ get_value: function get_value(node, task, section) {
+ if (section.disabled) {
+ return {
+ start_date: null
+ };
+ } else {
+ return duration.get_value.call(gantt, node, task, section);
+ }
+ },
+ update_block: function update_block(node, section) {
+ gantt.callEvent("onSectionToggle", [gantt._lightbox_id, section]);
+ node.style.display = section.disabled ? "none" : "block";
+
+ if (section.button) {
+ var button = node.previousSibling.querySelector(".gantt_custom_button_label"),
+ labels = gantt.locale.labels;
+ var button_text = section.disabled ? labels[section.name + "_enable_button"] : labels[section.name + "_disable_button"];
+ button.innerHTML = button_text;
+ }
+
+ gantt.resizeLightbox();
+ },
+ disable: function disable(node, section) {
+ section.disabled = true;
+ optional_time.update_block(node, section);
+ },
+ enable: function enable(node, section) {
+ section.disabled = false;
+ optional_time.update_block(node, section);
+ },
+ button_click: function button_click(index, el, section, container) {
+ if (gantt.callEvent("onSectionButton", [gantt._lightbox_id, section]) === false) {
+ return;
+ }
+
+ var config = gantt._get_typed_lightbox_config()[index];
+
+ if (config.disabled) {
+ optional_time.enable(container, config);
+ } else {
+ optional_time.disable(container, config);
+ }
+ }
+ };
+ return optional_time;
+ };
+
+ gantt.form_blocks.duration_optional = gantt._extend_to_optional(gantt.form_blocks.duration);
+ gantt.form_blocks.time_optional = gantt._extend_to_optional(gantt.form_blocks.time);
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/main_layout_initializer.js":
+/*!****************************************************!*\
+ !*** ./sources/core/ui/main_layout_initializer.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ./utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var initializer = function () {
+ return function (gantt) {
+ return {
+ getVerticalScrollbar: function getVerticalScrollbar() {
+ return gantt.$ui.getView("scrollVer");
+ },
+ getHorizontalScrollbar: function getHorizontalScrollbar() {
+ return gantt.$ui.getView("scrollHor");
+ },
+ _legacyGridResizerClass: function _legacyGridResizerClass(layout) {
+ var resizers = layout.getCellsByType("resizer");
+
+ for (var i = 0; i < resizers.length; i++) {
+ var r = resizers[i];
+ var gridResizer = false;
+ var prev = r.$parent.getPrevSibling(r.$id);
+
+ if (prev && prev.$config && prev.$config.id === "grid") {
+ gridResizer = true;
+ } else {
+ var next = r.$parent.getNextSibling(r.$id);
+
+ if (next && next.$config && next.$config.id === "grid") {
+ gridResizer = true;
+ }
+ }
+
+ if (gridResizer) {
+ r.$config.css = (r.$config.css ? r.$config.css + " " : "") + "gantt_grid_resize_wrap";
+ }
+ }
+ },
+ onCreated: function onCreated(layout) {
+ var first = true;
+
+ this._legacyGridResizerClass(layout);
+
+ layout.attachEvent("onBeforeResize", function () {
+ var mainTimeline = gantt.$ui.getView("timeline");
+ if (mainTimeline) mainTimeline.$config.hidden = mainTimeline.$parent.$config.hidden = !gantt.config.show_chart;
+ var mainGrid = gantt.$ui.getView("grid");
+ if (!mainGrid) return;
+
+ var colsWidth = mainGrid._getColsTotalWidth();
+
+ var hideGrid = !gantt.config.show_grid || !gantt.config.grid_width || colsWidth === 0;
+
+ if (first && !hideGrid && colsWidth !== false) {
+ gantt.config.grid_width = colsWidth;
+ }
+
+ mainGrid.$config.hidden = mainGrid.$parent.$config.hidden = hideGrid;
+
+ if (!mainGrid.$config.hidden) {
+ /* restrict grid width due to min_width, max_width, min_grid_column_width */
+ var grid_limits = mainGrid._getGridWidthLimits();
+
+ if (grid_limits[0] && gantt.config.grid_width < grid_limits[0]) gantt.config.grid_width = grid_limits[0];
+ if (grid_limits[1] && gantt.config.grid_width > grid_limits[1]) gantt.config.grid_width = grid_limits[1];
+
+ if (mainTimeline && gantt.config.show_chart) {
+ mainGrid.$config.width = gantt.config.grid_width - 1; // GS-1314: Don't let the non-scrollable grid to be larger than the container with the correct width
+
+ if (!mainGrid.$config.scrollable && mainGrid.$config.scrollY && gantt.$root.offsetWidth) {
+ var ganttContainerWidth = mainGrid.$gantt.$layout.$container.offsetWidth;
+ var verticalScrollbar = gantt.$ui.getView(mainGrid.$config.scrollY);
+ var verticalScrollbarWidth = verticalScrollbar.$config.width;
+ var gridOverflow = ganttContainerWidth - (mainGrid.$config.width + verticalScrollbarWidth);
+
+ if (gridOverflow < 0) {
+ mainGrid.$config.width += gridOverflow;
+ gantt.config.grid_width += gridOverflow;
+ }
+ }
+
+ if (!first) {
+ if (mainTimeline && !domHelpers.isChildOf(mainTimeline.$task, layout.$view)) {
+ // timeline is being displayed after being not visible, reset grid with from full screen
+ if (!mainGrid.$config.original_grid_width) {
+ var skinSettings = gantt.skins[gantt.skin];
+
+ if (skinSettings && skinSettings.config && skinSettings.config.grid_width) {
+ mainGrid.$config.original_grid_width = skinSettings.config.grid_width;
+ } else {
+ mainGrid.$config.original_grid_width = 0;
+ }
+ }
+
+ gantt.config.grid_width = mainGrid.$config.original_grid_width;
+ mainGrid.$parent.$config.width = gantt.config.grid_width;
+ } else {
+ mainGrid.$parent._setContentSize(mainGrid.$config.width, null);
+
+ gantt.$layout._syncCellSizes(mainGrid.$parent.$config.group, {
+ value: gantt.config.grid_width,
+ isGravity: false
+ });
+ }
+ } else {
+ mainGrid.$parent.$config.width = gantt.config.grid_width;
+
+ if (mainGrid.$parent.$config.group) {
+ gantt.$layout._syncCellSizes(mainGrid.$parent.$config.group, {
+ value: mainGrid.$parent.$config.width,
+ isGravity: false
+ });
+ }
+ }
+ } else {
+ if (mainTimeline && domHelpers.isChildOf(mainTimeline.$task, layout.$view)) {
+ // hiding timeline, remember grid with to restore it when timeline is displayed again
+ mainGrid.$config.original_grid_width = gantt.config.grid_width;
+ }
+
+ if (!first) {
+ mainGrid.$parent.$config.width = 0;
+ }
+ }
+ }
+
+ first = false;
+ });
+
+ this._initScrollStateEvents(layout);
+ },
+ _initScrollStateEvents: function _initScrollStateEvents(layout) {
+ gantt._getVerticalScrollbar = this.getVerticalScrollbar;
+ gantt._getHorizontalScrollbar = this.getHorizontalScrollbar;
+ var vertical = this.getVerticalScrollbar();
+ var horizontal = this.getHorizontalScrollbar();
+
+ if (vertical) {
+ vertical.attachEvent("onScroll", function (oldPos, newPos, dir) {
+ var scrollState = gantt.getScrollState();
+ gantt.callEvent("onGanttScroll", [scrollState.x, oldPos, scrollState.x, newPos]);
+ });
+ }
+
+ if (horizontal) {
+ horizontal.attachEvent("onScroll", function (oldPos, newPos, dir) {
+ var scrollState = gantt.getScrollState();
+ gantt.callEvent("onGanttScroll", [oldPos, scrollState.y, newPos, scrollState.y]); // if the grid doesn't fit the width, scroll the row container
+
+ var grid = gantt.$ui.getView("grid");
+
+ if (grid && grid.$grid_data && !grid.$config.scrollable) {
+ grid.$grid_data.style.left = grid.$grid.scrollLeft + "px";
+ grid.$grid_data.scrollLeft = grid.$grid.scrollLeft;
+ }
+ });
+ }
+
+ layout.attachEvent("onResize", function () {
+ if (vertical && !gantt.$scroll_ver) {
+ gantt.$scroll_ver = vertical.$scroll_ver;
+ }
+
+ if (horizontal && !gantt.$scroll_hor) {
+ gantt.$scroll_hor = horizontal.$scroll_hor;
+ }
+ });
+ },
+ _findGridResizer: function _findGridResizer(layout, grid) {
+ var resizers = layout.getCellsByType("resizer");
+ var gridFirst = true;
+ var gridResizer;
+
+ for (var i = 0; i < resizers.length; i++) {
+ var res = resizers[i];
+
+ res._getSiblings();
+
+ var prev = res._behind;
+ var next = res._front;
+
+ if (prev && prev.$content === grid || prev.isChild && prev.isChild(grid)) {
+ gridResizer = res;
+ gridFirst = true;
+ break;
+ } else if (next && next.$content === grid || next.isChild && next.isChild(grid)) {
+ gridResizer = res;
+ gridFirst = false;
+ break;
+ }
+ }
+
+ return {
+ resizer: gridResizer,
+ gridFirst: gridFirst
+ };
+ },
+ onInitialized: function onInitialized(layout) {
+ var grid = gantt.$ui.getView("grid");
+
+ var resizeInfo = this._findGridResizer(layout, grid); // expose grid resize events
+
+
+ if (resizeInfo.resizer) {
+ var gridFirst = resizeInfo.gridFirst,
+ next = resizeInfo.resizer;
+
+ if (next.$config.mode !== "x") {
+ return; // track only horizontal resize
+ }
+
+ var initialWidth;
+ next.attachEvent("onResizeStart", function (prevCellWidth, nextCellWidth) {
+ var grid = gantt.$ui.getView("grid");
+ var viewCell = grid ? grid.$parent : null;
+
+ if (viewCell) {
+ var limits = grid._getGridWidthLimits(); // min grid width is defined by min widths of its columns, unless grid has horizontal scroll
+
+
+ if (!grid.$config.scrollable) viewCell.$config.minWidth = limits[0];
+ viewCell.$config.maxWidth = limits[1];
+ }
+
+ initialWidth = gridFirst ? prevCellWidth : nextCellWidth;
+ return gantt.callEvent("onGridResizeStart", [initialWidth]);
+ });
+ next.attachEvent("onResize", function (newBehindSize, newFrontSize) {
+ var newSize = gridFirst ? newBehindSize : newFrontSize;
+ return gantt.callEvent("onGridResize", [initialWidth, newSize]);
+ });
+ next.attachEvent("onResizeEnd", function (oldBackSize, oldFrontSize, newBackSize, newFrontSize) {
+ var oldSize = gridFirst ? oldBackSize : oldFrontSize;
+ var newSize = gridFirst ? newBackSize : newFrontSize;
+ var grid = gantt.$ui.getView("grid");
+ var viewCell = grid ? grid.$parent : null;
+
+ if (viewCell) {
+ viewCell.$config.minWidth = undefined;
+ }
+
+ var res = gantt.callEvent("onGridResizeEnd", [oldSize, newSize]);
+
+ if (res && newSize !== 0) {
+ // new size may be numeric zero when cell size is defined by 'gravity', actual size will be calculated by layout later
+ gantt.config.grid_width = newSize;
+ }
+
+ return res;
+ });
+ }
+ },
+ onDestroyed: function onDestroyed(timeline) {}
+ };
+ };
+}();
+
+module.exports = initializer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/message.js":
+/*!************************************!*\
+ !*** ./sources/core/ui/message.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var domHelpers = __webpack_require__(/*! ./utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+module.exports = function (gantt) {
+ var boxAttribute = "data-dhxbox";
+ var _dhx_msg_cfg = null;
+
+ function callback(config, result) {
+ var usercall = config.callback;
+ modalBox.hide(config.box);
+ _dhx_msg_cfg = config.box = null;
+ if (usercall) usercall(result);
+ }
+
+ function modal_key(event) {
+ if (_dhx_msg_cfg) {
+ var code = event.which || event.keyCode;
+ var preventDefault = false;
+
+ if (messageBox.keyboard) {
+ if (code == 13 || code == 32) {
+ // default behavior is to confirm/submit popup on space/enter
+ // if browser focus is set on button element - do button click instead of default behavior
+ var target = event.target || event.srcElement;
+
+ if (domHelpers.getClassName(target).indexOf("gantt_popup_button") > -1 && target.click) {
+ target.click();
+ } else {
+ callback(_dhx_msg_cfg, true);
+ preventDefault = true;
+ }
+ }
+
+ if (code == 27) {
+ callback(_dhx_msg_cfg, false);
+ preventDefault = true;
+ }
+ }
+
+ if (preventDefault) {
+ if (event.preventDefault) {
+ event.preventDefault();
+ }
+
+ return !(event.cancelBubble = true);
+ }
+
+ return;
+ }
+ }
+
+ var eventElement = domHelpers.getRootNode(gantt.$root) || document;
+ gantt.event(eventElement, "keydown", modal_key, true);
+
+ function modality(mode) {
+ if (!modality.cover) {
+ modality.cover = document.createElement("div"); //necessary for IE only
+
+ modality.cover.onkeydown = modal_key;
+ modality.cover.className = "dhx_modal_cover";
+ document.body.appendChild(modality.cover);
+ }
+
+ modality.cover.style.display = mode ? "inline-block" : "none";
+ }
+
+ function button(text, className, result) {
+ var buttonAriaAttrs = gantt._waiAria.messageButtonAttrString(text);
+
+ var name = className.toLowerCase().replace(/ /g, "_");
+ var button_css = "gantt_" + name + "_button";
+ return "<div " + buttonAriaAttrs + " class='gantt_popup_button " + button_css + "' data-result='" + result + "' result='" + result + "' ><div>" + text + "</div></div>";
+ }
+
+ function info(text) {
+ if (!messageBox.area) {
+ messageBox.area = document.createElement("div");
+ messageBox.area.className = "gantt_message_area";
+ messageBox.area.style[messageBox.position] = "5px";
+ document.body.appendChild(messageBox.area);
+ }
+
+ messageBox.hide(text.id);
+ var message = document.createElement("div");
+ message.innerHTML = "<div>" + text.text + "</div>";
+ message.className = "gantt-info gantt-" + text.type;
+
+ message.onclick = function () {
+ messageBox.hide(text.id);
+ text = null;
+ };
+
+ gantt._waiAria.messageInfoAttr(message);
+
+ if (messageBox.position == "bottom" && messageBox.area.firstChild) messageBox.area.insertBefore(message, messageBox.area.firstChild);else messageBox.area.appendChild(message);
+ if (text.expire > 0) messageBox.timers[text.id] = window.setTimeout(function () {
+ // GS-1213: We need that when Gantt is destroyed
+ if (messageBox) messageBox.hide(text.id);
+ }, text.expire);
+ messageBox.pull[text.id] = message;
+ message = null;
+ return text.id;
+ }
+
+ function getFirstDefined() {
+ var values = [].slice.apply(arguments, [0]);
+
+ for (var i = 0; i < values.length; i++) {
+ if (values[i]) {
+ return values[i];
+ }
+ }
+ }
+
+ function _boxStructure(config, ok, cancel) {
+ var box = document.createElement("div");
+ var contentId = utils.uid();
+
+ gantt._waiAria.messageModalAttr(box, contentId);
+
+ box.className = " gantt_modal_box gantt-" + config.type;
+ box.setAttribute(boxAttribute, 1);
+ var inner = '';
+ if (config.width) box.style.width = config.width;
+ if (config.height) box.style.height = config.height;
+ if (config.title) inner += '<div class="gantt_popup_title">' + config.title + '</div>';
+ inner += '<div class="gantt_popup_text" id="' + contentId + '"><span>' + (config.content ? '' : config.text) + '</span></div><div class="gantt_popup_controls">';
+ if (ok) inner += button(getFirstDefined(config.ok, gantt.locale.labels.message_ok, "OK"), "ok", true);
+ if (cancel) inner += button(getFirstDefined(config.cancel, gantt.locale.labels.message_cancel, "Cancel"), "cancel", false);
+
+ if (config.buttons) {
+ for (var i = 0; i < config.buttons.length; i++) {
+ var btn = config.buttons[i];
+
+ if (_typeof(btn) == "object") {
+ // Support { label:"Save", css:"main_button", value:"save" }
+ var label = btn.label;
+ var css = btn.css || "gantt_" + btn.label.toLowerCase() + "_button";
+ var value = btn.value || i;
+ inner += button(label, css, value);
+ } else {
+ inner += button(btn, btn, i);
+ }
+ }
+ }
+
+ inner += '</div>';
+ box.innerHTML = inner;
+
+ if (config.content) {
+ var node = config.content;
+ if (typeof node == "string") node = document.getElementById(node);
+ if (node.style.display == 'none') node.style.display = "";
+ box.childNodes[config.title ? 1 : 0].appendChild(node);
+ }
+
+ box.onclick = function (event) {
+ var source = event.target || event.srcElement;
+ if (!source.className) source = source.parentNode;
+
+ if (domHelpers.closest(source, ".gantt_popup_button")) {
+ var result = source.getAttribute("data-result");
+ result = result == "true" || (result == "false" ? false : result);
+ callback(config, result);
+ }
+ };
+
+ config.box = box;
+ if (ok || cancel) _dhx_msg_cfg = config;
+ return box;
+ }
+
+ function _createBox(config, ok, cancel) {
+ var box = config.tagName ? config : _boxStructure(config, ok, cancel);
+ if (!config.hidden) modality(true);
+ document.body.appendChild(box);
+ var x = Math.abs(Math.floor(((window.innerWidth || document.documentElement.offsetWidth) - box.offsetWidth) / 2));
+ var y = Math.abs(Math.floor(((window.innerHeight || document.documentElement.offsetHeight) - box.offsetHeight) / 2));
+ if (config.position == "top") box.style.top = "-3px";else box.style.top = y + 'px';
+ box.style.left = x + 'px'; //necessary for IE only
+
+ box.onkeydown = modal_key;
+ modalBox.focus(box);
+ if (config.hidden) modalBox.hide(box);
+ gantt.callEvent("onMessagePopup", [box]);
+ return box;
+ }
+
+ function alertPopup(config) {
+ return _createBox(config, true, false);
+ }
+
+ function confirmPopup(config) {
+ return _createBox(config, true, true);
+ }
+
+ function boxPopup(config) {
+ return _createBox(config);
+ }
+
+ function box_params(text, type, callback) {
+ if (_typeof(text) != "object") {
+ if (typeof type == "function") {
+ callback = type;
+ type = "";
+ }
+
+ text = {
+ text: text,
+ type: type,
+ callback: callback
+ };
+ }
+
+ return text;
+ }
+
+ function params(text, type, expire, id) {
+ if (_typeof(text) != "object") text = {
+ text: text,
+ type: type,
+ expire: expire,
+ id: id
+ };
+ text.id = text.id || utils.uid();
+ text.expire = text.expire || messageBox.expire;
+ return text;
+ }
+
+ var alertBox = function alertBox() {
+ var text = box_params.apply(this, arguments);
+ text.type = text.type || "confirm";
+ return alertPopup(text);
+ };
+
+ var confirmBox = function confirmBox() {
+ var text = box_params.apply(this, arguments);
+ text.type = text.type || "alert";
+ return confirmPopup(text);
+ };
+
+ var modalBox = function modalBox() {
+ var text = box_params.apply(this, arguments);
+ text.type = text.type || "alert";
+ return boxPopup(text);
+ };
+
+ modalBox.hide = function (node) {
+ while (node && node.getAttribute && !node.getAttribute(boxAttribute)) {
+ node = node.parentNode;
+ }
+
+ if (node) {
+ node.parentNode.removeChild(node);
+ modality(false);
+ gantt.callEvent("onAfterMessagePopup", [node]);
+ }
+ };
+
+ modalBox.focus = function (node) {
+ setTimeout(function () {
+ var focusable = domHelpers.getFocusableNodes(node);
+
+ if (focusable.length) {
+ if (focusable[0].focus) focusable[0].focus();
+ }
+ }, 1);
+ };
+
+ var messageBox = function messageBox(text, type, expire, id) {
+ text = params.apply(this, arguments);
+ text.type = text.type || "info";
+ var subtype = text.type.split("-")[0];
+
+ switch (subtype) {
+ case "alert":
+ return alertPopup(text);
+
+ case "confirm":
+ return confirmPopup(text);
+
+ case "modalbox":
+ return boxPopup(text);
+
+ default:
+ return info(text);
+ }
+ };
+
+ messageBox.seed = new Date().valueOf();
+ messageBox.uid = utils.uid;
+ messageBox.expire = 4000;
+ messageBox.keyboard = true;
+ messageBox.position = "top";
+ messageBox.pull = {};
+ messageBox.timers = {};
+
+ messageBox.hideAll = function () {
+ for (var key in messageBox.pull) {
+ messageBox.hide(key);
+ }
+ };
+
+ messageBox.hide = function (id) {
+ var obj = messageBox.pull[id];
+
+ if (obj && obj.parentNode) {
+ window.setTimeout(function () {
+ obj.parentNode.removeChild(obj);
+ obj = null;
+ }, 2000);
+ obj.className += " hidden";
+ if (messageBox.timers[id]) window.clearTimeout(messageBox.timers[id]);
+ delete messageBox.pull[id];
+ }
+ };
+
+ var popups = [];
+ gantt.attachEvent("onMessagePopup", function (box) {
+ popups.push(box);
+ });
+ gantt.attachEvent("onAfterMessagePopup", function (box) {
+ for (var i = 0; i < popups.length; i++) {
+ if (popups[i] === box) {
+ popups.splice(i, 1);
+ i--;
+ }
+ }
+ });
+ gantt.attachEvent("onDestroy", function () {
+ if (modality.cover && modality.cover.parentNode) {
+ modality.cover.parentNode.removeChild(modality.cover);
+ }
+
+ for (var i = 0; i < popups.length; i++) {
+ if (popups[i].parentNode) {
+ popups[i].parentNode.removeChild(popups[i]);
+ }
+ }
+
+ popups = null;
+
+ if (messageBox.area && messageBox.area.parentNode) {
+ messageBox.area.parentNode.removeChild(messageBox.area);
+ }
+
+ messageBox = null;
+ });
+ return {
+ alert: alertBox,
+ confirm: confirmBox,
+ message: messageBox,
+ modalbox: modalBox
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/mouse.js":
+/*!**********************************!*\
+ !*** ./sources/core/ui/mouse.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ./utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var createMouseHandler = function (domHelpers) {
+ return function (gantt) {
+ var eventHandlers = {
+ "click": {},
+ "doubleclick": {},
+ "contextMenu": {}
+ };
+
+ function addEventTarget(event, className, handler, root) {
+ if (!eventHandlers[event][className]) {
+ eventHandlers[event][className] = [];
+ }
+
+ eventHandlers[event][className].push({
+ handler: handler,
+ root: root
+ });
+ }
+
+ function callHandler(eventName, className, root, args) {
+ var handlers = eventHandlers[eventName][className];
+
+ if (handlers) {
+ for (var i = 0; i < handlers.length; i++) {
+ if (!(root || handlers[i].root) || handlers[i].root === root) {
+ handlers[i].handler.apply(this, args);
+ }
+ }
+ }
+ }
+
+ function onClick(e) {
+ e = e || window.event;
+ var id = gantt.locate(e);
+ var handlers = findEventHandlers(e, eventHandlers.click);
+ var res = true;
+
+ if (id !== null) {
+ res = !gantt.checkEvent("onTaskClick") || gantt.callEvent("onTaskClick", [id, e]);
+ } else {
+ gantt.callEvent("onEmptyClick", [e]);
+ }
+
+ if (res) {
+ var default_action = callEventHandlers(handlers, e, id);
+ if (!default_action) return; // GS-1025: if we don't do that, the dropdown or date select will be closed for unselected tasks
+ // GS-1078: or for the built-in select inline editor
+
+ switch (e.target.nodeName) {
+ case "SELECT":
+ case 'INPUT':
+ return;
+ } //allow task selection when the multiselect plugin is not enabled
+
+
+ if (id && gantt.getTask(id) && !gantt._multiselect && gantt.config.select_task) {
+ gantt.selectTask(id);
+ }
+ }
+ }
+
+ function onContextMenu(e) {
+ e = e || window.event;
+ var src = e.target || e.srcElement,
+ taskId = gantt.locate(src),
+ linkId = gantt.locate(src, gantt.config.link_attribute);
+ var res = !gantt.checkEvent("onContextMenu") || gantt.callEvent("onContextMenu", [taskId, linkId, e]);
+
+ if (!res) {
+ if (e.preventDefault) e.preventDefault();else e.returnValue = false;
+ }
+
+ return res;
+ }
+
+ function findEventHandlers(e, hash) {
+ var trg = e.target || e.srcElement;
+ var handlers = [];
+
+ while (trg) {
+ var css = domHelpers.getClassName(trg);
+
+ if (css) {
+ css = css.split(" ");
+
+ for (var i = 0; i < css.length; i++) {
+ if (!css[i]) continue;
+
+ if (hash[css[i]]) {
+ var delegateHandlers = hash[css[i]];
+
+ for (var h = 0; h < delegateHandlers.length; h++) {
+ if (delegateHandlers[h].root) {
+ if (!domHelpers.isChildOf(trg, delegateHandlers[h].root)) {
+ continue;
+ }
+ }
+
+ handlers.push(delegateHandlers[h].handler);
+ }
+ }
+ }
+ }
+
+ trg = trg.parentNode;
+ }
+
+ return handlers;
+ }
+
+ function callEventHandlers(handlers, e, id) {
+ var res = true;
+
+ for (var i = 0; i < handlers.length; i++) {
+ var handlerResult = handlers[i].call(gantt, e, id, e.target || e.srcElement);
+ res = res && !(typeof handlerResult != "undefined" && handlerResult !== true);
+ }
+
+ return res;
+ }
+
+ function onDoubleClick(e) {
+ e = e || window.event;
+ var id = gantt.locate(e);
+ var handlers = findEventHandlers(e, eventHandlers.doubleclick); // when doubleclick fired not on task, id === null
+
+ var res = !gantt.checkEvent("onTaskDblClick") || id === null || gantt.callEvent("onTaskDblClick", [id, e]);
+
+ if (res) {
+ var default_action = callEventHandlers(handlers, e, id);
+ if (!default_action) return;
+
+ if (id !== null && gantt.getTask(id)) {
+ if (res && gantt.config.details_on_dblclick && !gantt.isReadonly(id)) {
+ gantt.showLightbox(id);
+ }
+ }
+ }
+ }
+
+ function onMouseMove(e) {
+ if (gantt.checkEvent("onMouseMove")) {
+ var id = gantt.locate(e);
+ gantt._last_move_event = e;
+ gantt.callEvent("onMouseMove", [id, e]);
+ }
+ }
+
+ function detach(eventName, className, handler, root) {
+ if (eventHandlers[eventName] && eventHandlers[eventName][className]) {
+ var handlers = eventHandlers[eventName];
+ var elementHandlers = handlers[className];
+
+ for (var i = 0; i < elementHandlers.length; i++) {
+ if (elementHandlers[i].root == root) {
+ elementHandlers.splice(i, 1);
+ i--;
+ }
+ }
+
+ if (!elementHandlers.length) {
+ delete handlers[className];
+ }
+ }
+ }
+
+ var domEvents = gantt._createDomEventScope();
+
+ function reset(node) {
+ domEvents.detachAll();
+
+ if (node) {
+ domEvents.attach(node, "click", onClick);
+ domEvents.attach(node, "dblclick", onDoubleClick);
+ domEvents.attach(node, "mousemove", onMouseMove);
+ domEvents.attach(node, "contextmenu", onContextMenu);
+ }
+ }
+
+ return {
+ reset: reset,
+ global: function global(event, classname, handler) {
+ addEventTarget(event, classname, handler, null);
+ },
+ delegate: addEventTarget,
+ detach: detach,
+ callHandler: callHandler,
+ onDoubleClick: onDoubleClick,
+ onMouseMove: onMouseMove,
+ onContextMenu: onContextMenu,
+ onClick: onClick,
+ destructor: function destructor() {
+ reset();
+ eventHandlers = null;
+ domEvents = null;
+ }
+ };
+ };
+}(domHelpers);
+
+module.exports = {
+ init: createMouseHandler
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/mouse_event_container.js":
+/*!**************************************************!*\
+ !*** ./sources/core/ui/mouse_event_container.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function create(gantt) {
+ var events = [];
+ return {
+ delegate: function delegate(event, className, handler, root) {
+ events.push([event, className, handler, root]);
+ var helper = gantt.$services.getService("mouseEvents");
+ helper.delegate(event, className, handler, root);
+ },
+ destructor: function destructor() {
+ var mouseEvents = gantt.$services.getService("mouseEvents");
+
+ for (var i = 0; i < events.length; i++) {
+ var h = events[i];
+ mouseEvents.detach(h[0], h[1], h[2], h[3]);
+ }
+
+ events = [];
+ }
+ };
+}
+
+module.exports = create;
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/autoscroll.js":
+/*!***********************************************!*\
+ !*** ./sources/core/ui/plugins/autoscroll.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var isHeadless = __webpack_require__(/*! ../../../utils/is_headless */ "./sources/utils/is_headless.js");
+
+module.exports = function (gantt) {
+ var scrollRange = 50,
+ scrollStep = 30,
+ scrollDelay = 10,
+ scrollSpeed = 50;
+ var interval = null,
+ isMove = false,
+ delayTimeout = null,
+ startPos = {
+ started: false
+ },
+ eventPos = {};
+
+ function isDisplayed(element) {
+ return element && domHelpers.isChildOf(element, gantt.$root) && element.offsetHeight;
+ }
+
+ function getAutoscrollContainer() {
+ var element;
+
+ if (isDisplayed(gantt.$task)) {
+ element = gantt.$task;
+ } else if (isDisplayed(gantt.$grid)) {
+ element = gantt.$grid;
+ } else {
+ element = gantt.$root;
+ }
+
+ return element;
+ }
+
+ function isScrollState() {
+ var dragMarker = !!document.querySelector(".gantt_drag_marker");
+ var isResize = !!document.querySelector(".gantt_drag_marker.gantt_grid_resize_area") || !!document.querySelector(".gantt_drag_marker.gantt_row_grid_resize_area");
+ var isLink = !!document.querySelector(".gantt_link_direction");
+ var state = gantt.getState();
+ var isClickDrag = state.autoscroll;
+ isMove = dragMarker && !isResize && !isLink;
+ return !(!state.drag_mode && !dragMarker || isResize) || isClickDrag;
+ }
+
+ function defineDelayTimeout(state) {
+ if (delayTimeout) {
+ clearTimeout(delayTimeout);
+ delayTimeout = null;
+ }
+
+ if (state) {
+ var speed = gantt.config.autoscroll_speed;
+ if (speed && speed < 10) // limit speed value to 10
+ speed = 10;
+ delayTimeout = setTimeout(function () {
+ interval = setInterval(tick, speed || scrollSpeed);
+ }, gantt.config.autoscroll_delay || scrollDelay);
+ }
+ }
+
+ function defineScrollInterval(state) {
+ if (state) {
+ defineDelayTimeout(true);
+
+ if (!startPos.started) {
+ startPos.x = eventPos.x;
+ startPos.y = eventPos.y;
+ startPos.started = true;
+ }
+ } else {
+ if (interval) {
+ clearInterval(interval);
+ interval = null;
+ }
+
+ defineDelayTimeout(false);
+ startPos.started = false;
+ }
+ }
+
+ function autoscrollInterval(event) {
+ var isScroll = isScrollState();
+
+ if ((interval || delayTimeout) && !isScroll) {
+ defineScrollInterval(false);
+ }
+
+ if (!gantt.config.autoscroll || !isScroll) {
+ return false;
+ }
+
+ eventPos = {
+ x: event.clientX,
+ y: event.clientY
+ }; // if it is a mobile device, we need to detect the touch event coords
+
+ if (event.type == "touchmove") {
+ eventPos.x = event.targetTouches[0].clientX;
+ eventPos.y = event.targetTouches[0].clientY;
+ }
+
+ if (!interval && isScroll) {
+ defineScrollInterval(true);
+ }
+ }
+
+ function tick() {
+ if (!isScrollState()) {
+ defineScrollInterval(false);
+ return false;
+ }
+
+ var container = getAutoscrollContainer();
+
+ if (!container) {
+ return;
+ } // GS-1150: if we reorder or resize something in the grid, we should obtain the grid container
+
+
+ var gridDrag = false;
+ var gridMarkers = [".gantt_drag_marker.gantt_grid_resize_area", ".gantt_drag_marker .gantt_row.gantt_row_task", ".gantt_drag_marker.gantt_grid_dnd_marker"];
+ gridMarkers.forEach(function (selector) {
+ gridDrag = gridDrag || !!document.querySelector(selector);
+ });
+
+ if (gridDrag) {
+ container = gantt.$grid;
+ }
+
+ var box = domHelpers.getNodePosition(container);
+ var posX = eventPos.x - box.x;
+ var posY = eventPos.y - box.y + window.scrollY; // GS-1315: window.scrollY here and below for the elements above Gantt
+
+ var scrollLeft = isMove ? 0 : need_scroll(posX, box.width, startPos.x - box.x);
+ var scrollTop = need_scroll(posY, box.height, startPos.y - box.y + window.scrollY);
+ var scrollState = gantt.getScrollState();
+ var currentScrollTop = scrollState.y,
+ scrollOuterHeight = scrollState.inner_height,
+ scrollInnerHeight = scrollState.height,
+ currentScrollLeft = scrollState.x,
+ scrollOuterWidth = scrollState.inner_width,
+ scrollInnerWidth = scrollState.width; // do scrolling only if we have scrollable area to do so
+
+ if (scrollTop && !scrollOuterHeight) {
+ scrollTop = 0;
+ } else if (scrollTop < 0 && !currentScrollTop) {
+ scrollTop = 0;
+ } else if (scrollTop > 0 && currentScrollTop + scrollOuterHeight >= scrollInnerHeight + 2) {
+ scrollTop = 0;
+ }
+
+ if (scrollLeft && !scrollOuterWidth) {
+ scrollLeft = 0;
+ } else if (scrollLeft < 0 && !currentScrollLeft) {
+ scrollLeft = 0;
+ } else if (scrollLeft > 0 && currentScrollLeft + scrollOuterWidth >= scrollInnerWidth) {
+ scrollLeft = 0;
+ }
+
+ var step = gantt.config.autoscroll_step;
+ if (step && step < 2) // limit step value to 2
+ step = 2;
+ scrollLeft = scrollLeft * (step || scrollStep);
+ scrollTop = scrollTop * (step || scrollStep);
+
+ if (scrollLeft || scrollTop) {
+ scroll(scrollLeft, scrollTop);
+ }
+ }
+
+ function need_scroll(pos, boxSize, startCoord) {
+ if (pos - scrollRange < 0 && pos < startCoord) return -1;else if (pos > boxSize - scrollRange && pos > startCoord) return 1;
+ return 0;
+ }
+
+ function scroll(left, top) {
+ var scrollState = gantt.getScrollState();
+ var scrollLeft = null,
+ scrollTop = null;
+
+ if (left) {
+ scrollLeft = scrollState.x + left;
+ scrollLeft = Math.min(scrollState.width, scrollLeft);
+ scrollLeft = Math.max(0, scrollLeft);
+ }
+
+ if (top) {
+ scrollTop = scrollState.y + top;
+ scrollTop = Math.min(scrollState.height, scrollTop);
+ scrollTop = Math.max(0, scrollTop);
+ }
+
+ gantt.scrollTo(scrollLeft, scrollTop);
+ }
+
+ gantt.attachEvent("onGanttReady", function () {
+ if (!isHeadless(gantt)) {
+ var eventElement = domHelpers.getRootNode(gantt.$root) || document.body;
+ gantt.eventRemove(eventElement, "mousemove", autoscrollInterval);
+ gantt.event(eventElement, "mousemove", autoscrollInterval);
+ gantt.eventRemove(eventElement, "touchmove", autoscrollInterval);
+ gantt.event(eventElement, "touchmove", autoscrollInterval);
+ gantt.eventRemove(eventElement, "pointermove", autoscrollInterval);
+ gantt.event(eventElement, "pointermove", autoscrollInterval);
+ }
+ });
+ gantt.attachEvent("onDestroy", function () {
+ defineScrollInterval(false);
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/column_grid_dnd/column_grid_dnd.ts":
+/*!********************************************************************!*\
+ !*** ./sources/core/ui/plugins/column_grid_dnd/column_grid_dnd.ts ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var domHelpers = __webpack_require__(/*! ../../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+var scrollable_grid_1 = __webpack_require__(/*! ./scrollable_grid */ "./sources/core/ui/plugins/column_grid_dnd/scrollable_grid.ts");
+var COLUMN_ID_ATTR_NAME = "data-column-id";
+var ColumnsGridDnd = /** @class */ (function () {
+ function ColumnsGridDnd(gantt, grid) {
+ var _this = this;
+ this._targetMarker = null;
+ this.calculateCurrentPosition = function (eventX) {
+ var gridBoundingRect = _this.$grid.$grid.getBoundingClientRect();
+ var maxLeft = gridBoundingRect.right;
+ var minLeft = gridBoundingRect.left;
+ var x = eventX;
+ if (x > maxLeft) {
+ x = maxLeft;
+ }
+ if (x < minLeft) {
+ x = minLeft;
+ }
+ return x;
+ };
+ this.$gantt = gantt;
+ this.$grid = grid;
+ }
+ ColumnsGridDnd.prototype.init = function () {
+ var DND = this.$gantt.$services.getService("dnd");
+ this._dnd = new DND(this.$grid.$grid_scale, { updates_per_second: 60 });
+ this._scrollableGrid = new scrollable_grid_1.default({
+ gantt: this.$gantt,
+ grid: this.$grid,
+ dnd: this._dnd,
+ getCurrentX: this.calculateCurrentPosition
+ });
+ this.attachEvents();
+ };
+ ColumnsGridDnd.prototype.attachEvents = function () {
+ var _this = this;
+ this._dnd.attachEvent("onBeforeDragStart", function (obj, e) {
+ _this._draggedCell = _this.$gantt.utils.dom.closest(e.target, ".gantt_grid_head_cell");
+ if (!_this._draggedCell) {
+ return;
+ }
+ var columns = _this.$grid.$getConfig().columns;
+ var columnName = _this._draggedCell.getAttribute(COLUMN_ID_ATTR_NAME);
+ var draggedColumn;
+ var draggedIndex;
+ columns.map(function (column, index) {
+ if (column.name === columnName) {
+ draggedColumn = column;
+ draggedIndex = index;
+ }
+ });
+ if (_this.$grid.callEvent("onBeforeColumnDragStart", [{ draggedColumn: draggedColumn, draggedIndex: draggedIndex }]) === false) {
+ return false;
+ }
+ if (!_this._draggedCell || !draggedColumn) {
+ return false;
+ }
+ _this._gridConfig = _this.$grid.$getConfig();
+ _this._originAutoscroll = _this.$gantt.config.autoscroll;
+ _this.$gantt.config.autoscroll = false;
+ return true;
+ });
+ this._dnd.attachEvent("onAfterDragStart", function (obj, e) {
+ if (!_this._draggedCell) {
+ return; // GS-1333: don't try to reorder a column when we resize it
+ }
+ _this._dnd.config.column = _this._draggedCell.getAttribute(COLUMN_ID_ATTR_NAME);
+ _this._dnd.config.marker.innerHTML = _this._draggedCell.outerHTML;
+ _this._dnd.config.marker.classList.add("gantt_column_drag_marker");
+ _this._dnd.config.marker.style.height = _this._gridConfig.scale_height + "px";
+ _this._dnd.config.marker.style.lineHeight = _this._gridConfig.scale_height + "px";
+ _this._draggedCell.classList.add("gantt_grid_head_cell_dragged");
+ });
+ this._dnd.attachEvent("onDragMove", function (obj, e) {
+ if (!_this._draggedCell) {
+ return;
+ }
+ _this._dragX = e.clientX;
+ var x = _this.calculateCurrentPosition(e.clientX);
+ var columnIndexes = _this.findColumnsIndexes();
+ var targetIndex = columnIndexes.targetIndex;
+ var draggedIndex = columnIndexes.draggedIndex;
+ var columns = _this.$grid.$getConfig().columns;
+ var draggedColumn = columns[draggedIndex];
+ var targetColumn = columns[targetIndex];
+ if (_this.$grid.callEvent("onColumnDragMove", [{ draggedColumn: draggedColumn, targetColumn: targetColumn, draggedIndex: draggedIndex, targetIndex: targetIndex }]) === false) {
+ _this.cleanTargetMarker();
+ return false;
+ }
+ _this.setMarkerPosition(x);
+ _this.drawTargetMarker(columnIndexes);
+ return true;
+ });
+ this._dnd.attachEvent("onDragEnd", function () {
+ if (!_this._draggedCell) {
+ return;
+ }
+ _this.$gantt.config.autoscroll = _this._originAutoscroll;
+ _this._draggedCell.classList.remove("gantt_grid_head_cell_dragged");
+ _this.cleanTargetMarker();
+ _this.reorderColumns();
+ });
+ };
+ ColumnsGridDnd.prototype.reorderColumns = function () {
+ var _a = this.findColumnsIndexes(), targetIndex = _a.targetIndex, draggedIndex = _a.draggedIndex;
+ var columns = this.$grid.$getConfig().columns;
+ var draggedColumn = columns[draggedIndex];
+ var targetColumn = columns[targetIndex];
+ if (this.$grid.callEvent("onBeforeColumnReorder", [{ draggedColumn: draggedColumn, targetColumn: targetColumn, draggedIndex: draggedIndex, targetIndex: targetIndex }]) === false) {
+ return;
+ }
+ if (targetIndex === draggedIndex) {
+ return;
+ }
+ columns.splice(draggedIndex, 1);
+ columns.splice(targetIndex, 0, draggedColumn);
+ this.$gantt.render();
+ this.$grid.callEvent("onAfterColumnReorder", [{ draggedColumn: draggedColumn, targetColumn: targetColumn, draggedIndex: draggedIndex, targetIndex: targetIndex }]);
+ };
+ ColumnsGridDnd.prototype.findColumnsIndexes = function () {
+ var draggedId = this._dnd.config.column;
+ var columns = this.$grid.$getConfig().columns;
+ var targetIndex;
+ var draggedIndex;
+ var xBefore;
+ var xAfter;
+ var currentColumn = { startX: 0, endX: 0 };
+ var start = 0;
+ var end = columns.length - 1;
+ var compare = function (a, b) { return a <= b; };
+ var next = function (index) { return ++index; };
+ if (this.$gantt.config.rtl) {
+ start = columns.length - 1;
+ end = 0;
+ compare = function (a, b) { return a >= b; };
+ next = function (index) { return --index; };
+ }
+ var columnRelativePos;
+ var relativeX = this._dragX - this.$grid.$grid.getBoundingClientRect().left + this._scrollableGrid.getCorrection();
+ for (var i = start; compare(i, end); i = next(i)) {
+ if (targetIndex !== undefined && draggedIndex !== undefined) {
+ break;
+ }
+ if (!columns[i].hide) {
+ currentColumn.startX = currentColumn.endX;
+ currentColumn.endX += columns[i].width;
+ // if drop on a column or drop after the last column
+ if (relativeX >= currentColumn.startX && (relativeX <= currentColumn.endX || !compare(next(i), end))) {
+ targetIndex = i;
+ xBefore = currentColumn.startX;
+ xAfter = currentColumn.endX;
+ columnRelativePos = (relativeX - currentColumn.startX) / (currentColumn.endX - currentColumn.startX);
+ }
+ if (draggedId === columns[i].name) {
+ draggedIndex = i;
+ }
+ }
+ }
+ return {
+ targetIndex: targetIndex,
+ draggedIndex: draggedIndex,
+ xBefore: xBefore,
+ xAfter: xAfter,
+ columnRelativePos: columnRelativePos
+ };
+ };
+ ColumnsGridDnd.prototype.setMarkerPosition = function (x, y) {
+ if (y === void 0) { y = 10; }
+ var marker = this._dnd.config.marker;
+ var gridOffset = this._dnd._obj.getBoundingClientRect();
+ marker.style.top = gridOffset.y + y + "px";
+ marker.style.left = x + "px";
+ };
+ ColumnsGridDnd.prototype.drawTargetMarker = function (_a) {
+ var targetIndex = _a.targetIndex, draggedIndex = _a.draggedIndex, xBefore = _a.xBefore, xAfter = _a.xAfter, columnRelativePos = _a.columnRelativePos;
+ if (!this._targetMarker) {
+ this._targetMarker = document.createElement("div");
+ domHelpers.addClassName(this._targetMarker, "gantt_grid_target_marker");
+ this._targetMarker.style.display = "none";
+ this._targetMarker.style.height = this._gridConfig.scale_height + "px";
+ }
+ // marker can be detached after gantt.render
+ if (!this._targetMarker.parentNode) {
+ this.$grid.$grid_scale.appendChild(this._targetMarker);
+ }
+ var nextPosition;
+ if (targetIndex > draggedIndex) {
+ nextPosition = xAfter;
+ }
+ else if (targetIndex < draggedIndex) {
+ nextPosition = xBefore;
+ }
+ else {
+ if (columnRelativePos > 0.5) {
+ nextPosition = xAfter;
+ }
+ else {
+ nextPosition = xBefore;
+ }
+ }
+ this._targetMarker.style.left = nextPosition + "px";
+ this._targetMarker.style.display = "block";
+ };
+ ColumnsGridDnd.prototype.cleanTargetMarker = function () {
+ if (this._targetMarker && this._targetMarker.parentNode) {
+ this.$grid.$grid_scale.removeChild(this._targetMarker);
+ }
+ this._targetMarker = null;
+ };
+ return ColumnsGridDnd;
+}());
+exports.ColumnsGridDnd = ColumnsGridDnd;
+
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/column_grid_dnd/index.ts":
+/*!**********************************************************!*\
+ !*** ./sources/core/ui/plugins/column_grid_dnd/index.ts ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var column_grid_dnd_1 = __webpack_require__(/*! ./column_grid_dnd */ "./sources/core/ui/plugins/column_grid_dnd/column_grid_dnd.ts");
+exports.default = column_grid_dnd_1.ColumnsGridDnd;
+
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/column_grid_dnd/scrollable_grid.ts":
+/*!********************************************************************!*\
+ !*** ./sources/core/ui/plugins/column_grid_dnd/scrollable_grid.ts ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var SENSITIVITY = 20;
+var TIMEOUT = 50;
+var SCROLLSTEP = 10;
+var ScrollableGrid = /** @class */ (function () {
+ function ScrollableGrid(params) {
+ this._scrollOrder = 0;
+ var gantt = params.gantt, grid = params.grid, dnd = params.dnd, getCurrentX = params.getCurrentX;
+ this.$gantt = gantt;
+ this.$grid = grid;
+ this._dnd = dnd;
+ this.getCurrentX = getCurrentX;
+ this._scrollView = this.$gantt.$ui.getView(this.$grid.$config.scrollX);
+ this.attachEvents();
+ }
+ ScrollableGrid.prototype.attachEvents = function () {
+ var _this = this;
+ if (this.isScrollable()) {
+ this._dnd.attachEvent("onDragMove", function (obj, e) {
+ var gridBoundingRect = _this.$grid.$grid.getBoundingClientRect();
+ var maxLeft = gridBoundingRect.right;
+ var minLeft = gridBoundingRect.left;
+ var currentX = _this.getCurrentX(e.clientX);
+ if (currentX >= maxLeft - SENSITIVITY) {
+ _this.autoscrollRight();
+ _this.autoscrollStart();
+ }
+ if (currentX <= minLeft + SENSITIVITY) {
+ _this.autoscrollLeft();
+ _this.autoscrollStart();
+ }
+ if (currentX < maxLeft - SENSITIVITY && currentX > minLeft + SENSITIVITY) {
+ _this.autoscrollStop();
+ }
+ return true;
+ });
+ this._dnd.attachEvent("onDragEnd", function () {
+ _this.autoscrollStop();
+ });
+ }
+ };
+ ScrollableGrid.prototype.autoscrollStart = function () {
+ var _this = this;
+ if (this._scrollOrder === 0) {
+ return;
+ }
+ var scrollStep = SCROLLSTEP * this._scrollOrder;
+ var scrollState = this._scrollView.getScrollState();
+ this._scrollView.scrollTo(scrollState.position + scrollStep);
+ setTimeout(function () { _this.autoscrollStart(); }, TIMEOUT);
+ };
+ ScrollableGrid.prototype.autoscrollRight = function () {
+ this._scrollOrder = 1;
+ };
+ ScrollableGrid.prototype.autoscrollLeft = function () {
+ this._scrollOrder = -1;
+ };
+ ScrollableGrid.prototype.autoscrollStop = function () {
+ this._scrollOrder = 0;
+ };
+ ScrollableGrid.prototype.getCorrection = function () {
+ if (!this.isScrollable()) {
+ return 0;
+ }
+ return this._scrollView.getScrollState().position;
+ };
+ ScrollableGrid.prototype.isScrollable = function () {
+ return !!this.$grid.$config.scrollable;
+ };
+ return ScrollableGrid;
+}());
+exports.default = ScrollableGrid;
+
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/dhtmlx_hooks.js":
+/*!*************************************************!*\
+ !*** ./sources/core/ui/plugins/dhtmlx_hooks.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+if (window.dhtmlx) {
+ if (!window.dhtmlx.attaches) window.dhtmlx.attaches = {};
+
+ window.dhtmlx.attaches.attachGantt = function (start, end, gantt) {
+ var obj = document.createElement("DIV");
+ gantt = gantt || window.gantt;
+ obj.id = "gantt_" + gantt.uid();
+ obj.style.width = "100%";
+ obj.style.height = "100%";
+ obj.cmp = "grid";
+ document.body.appendChild(obj);
+ this.attachObject(obj.id);
+ this.dataType = "gantt";
+ this.dataObj = gantt;
+ var that = this.vs[this.av];
+ that.grid = gantt;
+ gantt.init(obj.id, start, end);
+ obj.firstChild.style.border = "none";
+ that.gridId = obj.id;
+ that.gridObj = obj;
+ var method_name = "_viewRestore";
+ return this.vs[this[method_name]()].grid;
+ };
+}
+
+if (typeof window.dhtmlXCellObject != "undefined") {
+ window.dhtmlXCellObject.prototype.attachGantt = function (start, end, gantt) {
+ gantt = gantt || window.gantt;
+ var obj = document.createElement("DIV");
+ obj.id = "gantt_" + gantt.uid();
+ obj.style.width = "100%";
+ obj.style.height = "100%";
+ obj.cmp = "grid";
+ document.body.appendChild(obj);
+ this.attachObject(obj.id);
+ this.dataType = "gantt";
+ this.dataObj = gantt;
+ gantt.init(obj.id, start, end);
+ obj.firstChild.style.border = "none";
+ obj = null;
+ this.callEvent("_onContentAttach", []);
+ return this.dataObj;
+ };
+}
+
+module.exports = null;
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/index.js":
+/*!******************************************!*\
+ !*** ./sources/core/ui/plugins/index.js ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ if (!gantt.ext) {
+ gantt.ext = {};
+ }
+
+ var modules = [__webpack_require__(/*! ./autoscroll */ "./sources/core/ui/plugins/autoscroll.js"), __webpack_require__(/*! ./jquery_hooks */ "./sources/core/ui/plugins/jquery_hooks.js"), __webpack_require__(/*! ./dhtmlx_hooks */ "./sources/core/ui/plugins/dhtmlx_hooks.js")];
+
+ for (var i = 0; i < modules.length; i++) {
+ if (modules[i]) modules[i](gantt);
+ }
+
+ var TimelineZoom = __webpack_require__(/*! ./timeline_zoom */ "./sources/core/ui/plugins/timeline_zoom.ts")["default"];
+
+ gantt.ext.zoom = new TimelineZoom(gantt);
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/jquery_hooks.js":
+/*!*************************************************!*\
+ !*** ./sources/core/ui/plugins/jquery_hooks.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+if (window.jQuery) {
+ (function ($) {
+ var methods = [];
+
+ $.fn.dhx_gantt = function (config) {
+ config = config || {};
+
+ if (typeof config === 'string') {
+ if (methods[config]) {
+ return methods[config].apply(this, []);
+ } else {
+ $.error('Method ' + config + ' does not exist on jQuery.dhx_gantt');
+ }
+ } else {
+ var views = [];
+ this.each(function () {
+ if (this && this.getAttribute) {
+ if (!this.gantt && !(window.gantt.$root == this)) {
+ var newgantt = window.gantt.$container && window.Gantt ? window.Gantt.getGanttInstance() : window.gantt;
+
+ for (var key in config) {
+ if (key != "data") newgantt.config[key] = config[key];
+ }
+
+ newgantt.init(this);
+ if (config.data) newgantt.parse(config.data);
+ views.push(newgantt);
+ } else views.push(_typeof(this.gantt) == "object" ? this.gantt : window.gantt);
+ }
+ });
+ if (views.length === 1) return views[0];
+ return views;
+ }
+ };
+ })(window.jQuery);
+}
+
+module.exports = null;
+
+/***/ }),
+
+/***/ "./sources/core/ui/plugins/timeline_zoom.ts":
+/*!**************************************************!*\
+ !*** ./sources/core/ui/plugins/timeline_zoom.ts ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var env = __webpack_require__(/*! ../../../utils/env */ "./sources/utils/env.js");
+var eventable = __webpack_require__(/*! ../../../utils/eventable */ "./sources/utils/eventable.js");
+var USE_KEY = ["ctrlKey", "altKey", "shiftKey", "metaKey"];
+var _defaultScales = [
+ [
+ {
+ unit: "month",
+ date: "%M",
+ step: 1
+ },
+ {
+ unit: "day",
+ date: "%d",
+ step: 1
+ }
+ ],
+ [
+ {
+ unit: "day",
+ date: "%d %M",
+ step: 1
+ }
+ ],
+ [
+ {
+ unit: "day",
+ date: "%d %M",
+ step: 1
+ },
+ {
+ unit: "hour",
+ date: "%H:00",
+ step: 8
+ },
+ ],
+ [
+ {
+ unit: "day",
+ date: "%d %M",
+ step: 1
+ },
+ {
+ unit: "hour",
+ date: "%H:00",
+ step: 1
+ },
+ ],
+];
+var TimelineZoom = /** @class */ (function () {
+ function TimelineZoom(gantt) {
+ var _this = this;
+ this.zoomIn = function () {
+ var index = _this.getCurrentLevel() - 1;
+ if (index < 0) {
+ return;
+ }
+ _this.setLevel(index);
+ };
+ this.zoomOut = function () {
+ var index = _this.getCurrentLevel() + 1;
+ if (index > _this._levels.length - 1) {
+ return;
+ }
+ _this.setLevel(index);
+ };
+ this.getCurrentLevel = function () {
+ return _this._activeLevelIndex;
+ };
+ this.getLevels = function () {
+ return _this._levels;
+ };
+ this.setLevel = function (level) {
+ var zoomLevel = _this._getZoomIndexByName(level);
+ if (zoomLevel === -1) {
+ _this.$gantt.assert(zoomLevel !== -1, "Invalid zoom level for gantt.ext.zoom.setLevel. " + level + " is not an expected value.");
+ }
+ _this._setLevel(zoomLevel, 0);
+ };
+ this._getZoomIndexByName = function (levelName) {
+ var zoomLevel = -1;
+ if (typeof levelName === "string") {
+ if (!isNaN(Number(levelName)) && _this._levels[Number(levelName)]) {
+ zoomLevel = Number(levelName);
+ }
+ else {
+ for (var i = 0; i < _this._levels.length; i++) {
+ if (_this._levels[i].name === levelName) {
+ zoomLevel = i;
+ break;
+ }
+ }
+ }
+ }
+ else {
+ zoomLevel = levelName;
+ }
+ return zoomLevel;
+ };
+ this._getVisibleDate = function () {
+ // GS-1450. Don't try to get the visible date if there is no timeline
+ if (!_this.$gantt.$task) {
+ return null;
+ }
+ var scrollPos = _this.$gantt.getScrollState().x;
+ var viewPort = _this.$gantt.$task.offsetWidth;
+ _this._visibleDate = _this.$gantt.dateFromPos(scrollPos + viewPort / 2);
+ };
+ this._setLevel = function (level, cursorOffset) {
+ _this._activeLevelIndex = level;
+ var gantt = _this.$gantt;
+ var nextConfig = gantt.copy(_this._levels[_this._activeLevelIndex]);
+ var chartConfig = gantt.copy(nextConfig);
+ delete chartConfig.name;
+ gantt.mixin(gantt.config, chartConfig, true);
+ var isRendered = !!gantt.$root && !!gantt.$task;
+ if (isRendered) {
+ if (cursorOffset) {
+ var cursorDate = _this.$gantt.dateFromPos(cursorOffset + _this.$gantt.getScrollState().x);
+ _this.$gantt.render();
+ var newPosition = _this.$gantt.posFromDate(cursorDate);
+ _this.$gantt.scrollTo(newPosition - cursorOffset);
+ }
+ else {
+ var viewPort = _this.$gantt.$task.offsetWidth;
+ if (!_this._visibleDate) {
+ _this._getVisibleDate();
+ }
+ var middleDate = _this._visibleDate;
+ _this.$gantt.render();
+ var newPosition = _this.$gantt.posFromDate(middleDate);
+ _this.$gantt.scrollTo(newPosition - viewPort / 2);
+ }
+ _this.callEvent("onAfterZoom", [_this._activeLevelIndex, nextConfig]);
+ }
+ };
+ this._attachWheelEvent = function (config) {
+ var event = env.isFF ? "wheel" : "mousewheel";
+ var el;
+ if (typeof config.element === "function") {
+ el = config.element();
+ }
+ else {
+ el = config.element;
+ }
+ if (!el) {
+ return;
+ }
+ _this._domEvents.attach(el, event, _this.$gantt.bind(function (e) {
+ if (this._useKey) {
+ if (USE_KEY.indexOf(this._useKey) < 0) {
+ return false;
+ }
+ if (!e[this._useKey]) {
+ return false;
+ }
+ }
+ if (typeof this._handler === "function") {
+ this._handler.apply(this, [e]);
+ return true;
+ }
+ }, _this), { passive: false });
+ };
+ this._defaultHandler = function (e) {
+ var timelineOffset = _this.$gantt.$task.getBoundingClientRect().x;
+ var cursorOffset = e.clientX - timelineOffset;
+ var wheelY = _this.$gantt.env.isFF ? (e.deltaY * -40) : e.wheelDelta;
+ var wheelUp = false;
+ if (wheelY > 0) {
+ wheelUp = true;
+ }
+ e.preventDefault();
+ e.stopPropagation();
+ _this._setScaleSettings(wheelUp, cursorOffset);
+ };
+ this._setScaleDates = function () {
+ if (_this._initialStartDate && _this._initialEndDate) {
+ _this.$gantt.config.start_date = _this._initialStartDate;
+ _this.$gantt.config.end_date = _this._initialEndDate;
+ }
+ };
+ this.$gantt = gantt;
+ this._domEvents = this.$gantt._createDomEventScope();
+ }
+ TimelineZoom.prototype.init = function (config) {
+ var _this = this;
+ // GS-1354 and GS-1318. If we check the headless mode using the function,
+ // it will return false when Gantt is not initialized, but we may want to do it later
+ if (this.$gantt.env.isNode) {
+ return;
+ }
+ this._initialStartDate = config.startDate;
+ this._initialEndDate = config.endDate;
+ this._activeLevelIndex = config.activeLevelIndex ? config.activeLevelIndex : 0;
+ this._levels = this._mapScales(config.levels || _defaultScales);
+ this._handler = config.handler || this._defaultHandler;
+ this._minColumnWidth = config.minColumnWidth || 60;
+ this._maxColumnWidth = config.maxColumnWidth || 240;
+ this._widthStep = config.widthStep || 3 / 8 * config.minColumnWidth;
+ this._useKey = config.useKey;
+ if (!this._initialized) {
+ eventable(this);
+ this.$gantt.attachEvent("onGanttScroll", function () {
+ _this._getVisibleDate();
+ });
+ }
+ this._domEvents.detachAll();
+ if (config.trigger === "wheel") {
+ if (this.$gantt.$root) {
+ this._attachWheelEvent(config);
+ }
+ else {
+ this.$gantt.attachEvent("onGanttReady", function () {
+ _this._attachWheelEvent(config);
+ });
+ }
+ }
+ this._initialized = true;
+ this.setLevel(this._activeLevelIndex);
+ };
+ TimelineZoom.prototype._mapScales = function (levels) {
+ return levels.map(function (l) {
+ if (Array.isArray(l)) {
+ return {
+ scales: l
+ };
+ }
+ else {
+ return l;
+ }
+ });
+ };
+ TimelineZoom.prototype._setScaleSettings = function (wheelUp, cursorOffset) {
+ if (wheelUp) {
+ this._stepUp(cursorOffset);
+ }
+ else {
+ this._stepDown(cursorOffset);
+ }
+ };
+ TimelineZoom.prototype._stepUp = function (cursorOffset) {
+ if (this._activeLevelIndex >= this._levels.length - 1) {
+ return;
+ }
+ var nextLevel = this._activeLevelIndex;
+ this._setScaleDates();
+ if (this._widthStep) {
+ var newColumnWidth = this.$gantt.config.min_column_width + this._widthStep;
+ if (newColumnWidth > this._maxColumnWidth) {
+ newColumnWidth = this._minColumnWidth;
+ nextLevel++;
+ }
+ this.$gantt.config.min_column_width = newColumnWidth;
+ }
+ else {
+ nextLevel++;
+ }
+ this._setLevel(nextLevel, cursorOffset);
+ };
+ TimelineZoom.prototype._stepDown = function (cursorOffset) {
+ if (this._activeLevelIndex < 1) {
+ return;
+ }
+ var nextLevel = this._activeLevelIndex;
+ this._setScaleDates();
+ if (this._widthStep) {
+ var newColumnWidth = this.$gantt.config.min_column_width - this._widthStep;
+ if (newColumnWidth < this._minColumnWidth) {
+ newColumnWidth = this._maxColumnWidth;
+ nextLevel--;
+ }
+ this.$gantt.config.min_column_width = newColumnWidth;
+ }
+ else {
+ nextLevel--;
+ }
+ this._setLevel(nextLevel, cursorOffset);
+ };
+ return TimelineZoom;
+}());
+exports.default = TimelineZoom;
+
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/is_legacy_smart_render.js":
+/*!**********************************************************!*\
+ !*** ./sources/core/ui/render/is_legacy_smart_render.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ return gantt.config.smart_rendering && gantt._smart_render;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/layer_engine.js":
+/*!************************************************!*\
+ !*** ./sources/core/ui/render/layer_engine.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var renderFactoryProvider = __webpack_require__(/*! ./render_factory */ "./sources/core/ui/render/render_factory.js");
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js"),
+ domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js"),
+ isLegacyRender = __webpack_require__(/*! ./is_legacy_smart_render */ "./sources/core/ui/render/is_legacy_smart_render.js");
+
+var layerFactory = function layerFactory(gantt) {
+ var renderFactory = renderFactoryProvider(gantt);
+ return {
+ createGroup: function createGroup(getContainer, relativeRoot, defaultFilters, initLayer) {
+ var renderGroup = {
+ tempCollection: [],
+ renderers: {},
+ container: getContainer,
+ filters: [],
+ getLayers: function getLayers() {
+ this._add(); // add pending layers
+
+
+ var res = [];
+
+ for (var i in this.renderers) {
+ res.push(this.renderers[i]);
+ }
+
+ return res;
+ },
+ getLayer: function getLayer(id) {
+ return this.renderers[id];
+ },
+ _add: function _add(layer) {
+ if (layer) {
+ layer.id = layer.id || utils.uid();
+ this.tempCollection.push(layer);
+ }
+
+ var container = this.container();
+ var pending = this.tempCollection;
+
+ for (var i = 0; i < pending.length; i++) {
+ layer = pending[i];
+ if (!this.container() && !(layer && layer.container && domHelpers.isChildOf(layer.container, document.body))) continue;
+ var node = layer.container,
+ id = layer.id,
+ topmost = layer.topmost;
+
+ if (!node.parentNode) {
+ //insert on top or below the tasks
+ if (topmost) {
+ container.appendChild(node);
+ } else {
+ var rel = relativeRoot ? relativeRoot() : container.firstChild; // GS-1274: if we don't add the second check, Gantt stops working if
+ // we add the task layer without the timeline and switch to a layout with the timeline
+
+ if (rel && rel.parentNode == container) container.insertBefore(node, rel);else container.appendChild(node);
+ }
+ }
+
+ this.renderers[id] = renderFactory.getRenderer(id, layer, node);
+
+ if (initLayer) {
+ initLayer(layer, gantt);
+ }
+
+ this.tempCollection.splice(i, 1);
+ i--;
+ }
+ },
+ addLayer: function addLayer(config) {
+ if (config) {
+ if (typeof config == "function") {
+ config = {
+ renderer: config
+ };
+ }
+
+ if (config.filter === undefined) {
+ config.filter = mergeFilters(defaultFilters || []);
+ } else if (config.filter instanceof Array) {
+ config.filter.push(defaultFilters);
+ config.filter = mergeFilters(config.filter);
+ }
+
+ if (!config.container) {
+ config.container = document.createElement("div");
+ }
+
+ var self = this;
+
+ config.requestUpdate = function () {
+ if (gantt.config.smart_rendering && !isLegacyRender(gantt)) {
+ if (self.renderers[config.id]) {
+ self.onUpdateRequest(self.renderers[config.id]);
+ }
+ }
+ };
+ }
+
+ this._add(config);
+
+ return config ? config.id : undefined;
+ },
+ onUpdateRequest: function onUpdateRequest(layer) {},
+ eachLayer: function eachLayer(code) {
+ for (var i in this.renderers) {
+ code(this.renderers[i]);
+ }
+ },
+ removeLayer: function removeLayer(id) {
+ if (!this.renderers[id]) return;
+ this.renderers[id].destructor();
+ delete this.renderers[id];
+ },
+ clear: function clear() {
+ for (var i in this.renderers) {
+ this.renderers[i].destructor();
+ }
+
+ this.renderers = {};
+ } //,
+ //prepareConfig: prepareConfig
+
+ };
+ gantt.attachEvent("onDestroy", function () {
+ renderGroup.clear();
+ renderGroup = null;
+ });
+ return renderGroup;
+ }
+ };
+};
+
+function mergeFilters(filter_methods) {
+ if (!(filter_methods instanceof Array)) {
+ filter_methods = Array.prototype.slice.call(arguments, 0);
+ }
+
+ return function (obj) {
+ var res = true;
+
+ for (var i = 0, len = filter_methods.length; i < len; i++) {
+ var filter_method = filter_methods[i];
+
+ if (filter_method) {
+ res = res && filter_method(obj.id, obj) !== false;
+ }
+ }
+
+ return res;
+ };
+}
+
+module.exports = layerFactory;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/link_render.js":
+/*!***********************************************!*\
+ !*** ./sources/core/ui/render/link_render.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isInViewPort = __webpack_require__(/*! ./viewport/is_link_in_viewport */ "./sources/core/ui/render/viewport/is_link_in_viewport.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/factory/get_visible_link_range */ "./sources/core/ui/render/viewport/factory/get_visible_link_range.js");
+
+function createLinkRender(gantt) {
+ function _render_link_element(link, view, config) {
+ var source = gantt.getTask(link.source);
+
+ if (source.hide_bar) {
+ return;
+ }
+
+ var target = gantt.getTask(link.target);
+
+ if (target.hide_bar) {
+ return;
+ }
+
+ var pt = path_builder.get_endpoint(link, view, source, target);
+ var dy = pt.e_y - pt.y;
+ var dx = pt.e_x - pt.x;
+
+ if (!dx && !dy) {
+ return null;
+ }
+
+ var dots = path_builder.get_points(link, view, source, target);
+ var lines = drawer.get_lines(dots, view);
+ var div = document.createElement("div");
+ var css = "gantt_task_link";
+
+ if (link.color) {
+ css += " gantt_link_inline_color";
+ }
+
+ var cssTemplate = gantt.templates.link_class ? gantt.templates.link_class(link) : "";
+
+ if (cssTemplate) {
+ css += " " + cssTemplate;
+ }
+
+ if (config.highlight_critical_path && gantt.isCriticalLink) {
+ if (gantt.isCriticalLink(link)) css += " gantt_critical_link";
+ }
+
+ div.className = css;
+
+ if (view.$config.link_attribute) {
+ div.setAttribute(view.$config.link_attribute, link.id);
+ div.setAttribute("link_id", link.id);
+ }
+
+ for (var i = 0; i < lines.length; i++) {
+ if (i == lines.length - 1) {
+ lines[i].size -= config.link_arrow_size;
+ }
+
+ var el = drawer.render_line(lines[i], lines[i + 1], view, link.source);
+
+ if (link.color) {
+ el.firstChild.style.backgroundColor = link.color;
+ }
+
+ div.appendChild(el);
+ }
+
+ var direction = lines[lines.length - 1].direction;
+
+ var endpoint = _render_link_arrow(dots[dots.length - 1], direction, view, link.source);
+
+ if (link.color) {
+ endpoint.style.borderColor = link.color;
+ }
+
+ div.appendChild(endpoint);
+
+ gantt._waiAria.linkAttr(link, div);
+
+ return div;
+ }
+
+ function _render_link_arrow(point, direction, view, targetId) {
+ var config = view.$getConfig();
+ var div = document.createElement("div");
+ var top = point.y;
+ var left = point.x;
+ var size = config.link_arrow_size;
+ var className = "gantt_link_arrow gantt_link_arrow_" + direction;
+
+ switch (direction) {
+ case drawer.dirs.right:
+ top -= size / 2;
+ left -= size;
+ break;
+
+ case drawer.dirs.left:
+ top -= size / 2;
+ break;
+
+ case drawer.dirs.up:
+ left -= size;
+ break;
+
+ case drawer.dirs.down:
+ top += size * 2;
+ left -= size;
+ break;
+
+ default:
+ break;
+ }
+
+ div.style.cssText = ["top:" + top + "px", "left:" + left + 'px'].join(';');
+ div.className = className;
+ return div;
+ }
+
+ var drawer = {
+ current_pos: null,
+ dirs: {
+ "left": 'left',
+ "right": 'right',
+ "up": 'up',
+ "down": 'down'
+ },
+ path: [],
+ clear: function clear() {
+ this.current_pos = null;
+ this.path = [];
+ },
+ point: function point(pos) {
+ this.current_pos = gantt.copy(pos);
+ },
+ get_lines: function get_lines(dots) {
+ this.clear();
+ this.point(dots[0]);
+
+ for (var i = 1; i < dots.length; i++) {
+ this.line_to(dots[i]);
+ }
+
+ return this.get_path();
+ },
+ line_to: function line_to(pos) {
+ var next = gantt.copy(pos);
+ var prev = this.current_pos;
+
+ var line = this._get_line(prev, next);
+
+ this.path.push(line);
+ this.current_pos = next;
+ },
+ get_path: function get_path() {
+ return this.path;
+ },
+ get_wrapper_sizes: function get_wrapper_sizes(v, view, itemId) {
+ var config = view.$getConfig();
+ var res,
+ wrapper_size = config.link_wrapper_width,
+ y = v.y - wrapper_size / 2;
+
+ switch (v.direction) {
+ case this.dirs.left:
+ res = {
+ top: y,
+ height: wrapper_size,
+ lineHeight: wrapper_size,
+ left: v.x - v.size - wrapper_size / 2,
+ width: v.size + wrapper_size
+ };
+ break;
+
+ case this.dirs.right:
+ res = {
+ top: y,
+ lineHeight: wrapper_size,
+ height: wrapper_size,
+ left: v.x - wrapper_size / 2,
+ width: v.size + wrapper_size
+ };
+ break;
+
+ case this.dirs.up:
+ res = {
+ top: y - v.size,
+ lineHeight: v.size + wrapper_size,
+ height: v.size + wrapper_size,
+ left: v.x - wrapper_size / 2,
+ width: wrapper_size
+ };
+ break;
+
+ case this.dirs.down:
+ res = {
+ top: y
+ /*- wrapper_size/2*/
+ ,
+ lineHeight: v.size + wrapper_size,
+ height: v.size + wrapper_size,
+ left: v.x - wrapper_size / 2,
+ width: wrapper_size
+ };
+ break;
+
+ default:
+ break;
+ }
+
+ return res;
+ },
+ get_line_sizes: function get_line_sizes(v, view) {
+ var config = view.$getConfig();
+ var res,
+ line_size = config.link_line_width,
+ wrapper_size = config.link_wrapper_width,
+ size = v.size + line_size;
+
+ switch (v.direction) {
+ case this.dirs.left:
+ case this.dirs.right:
+ res = {
+ height: line_size,
+ width: size,
+ marginTop: (wrapper_size - line_size) / 2,
+ marginLeft: (wrapper_size - line_size) / 2
+ };
+ break;
+
+ case this.dirs.up:
+ case this.dirs.down:
+ res = {
+ height: size,
+ width: line_size,
+ marginTop: (wrapper_size - line_size) / 2,
+ marginLeft: (wrapper_size - line_size) / 2
+ };
+ break;
+
+ default:
+ break;
+ }
+
+ return res;
+ },
+ render_line: function render_line(v, end, view, itemId) {
+ var pos = this.get_wrapper_sizes(v, view, itemId);
+ var wrapper = document.createElement("div");
+ wrapper.style.cssText = ["top:" + pos.top + "px", "left:" + pos.left + "px", "height:" + pos.height + "px", "width:" + pos.width + "px"].join(';');
+ wrapper.className = "gantt_line_wrapper";
+ var innerPos = this.get_line_sizes(v, view);
+ var inner = document.createElement("div");
+ inner.style.cssText = ["height:" + innerPos.height + "px", "width:" + innerPos.width + "px", "margin-top:" + innerPos.marginTop + "px", "margin-left:" + innerPos.marginLeft + "px"].join(";");
+ inner.className = "gantt_link_line_" + v.direction;
+ wrapper.appendChild(inner);
+ return wrapper;
+ },
+ _get_line: function _get_line(from, to) {
+ var direction = this.get_direction(from, to);
+ var vect = {
+ x: from.x,
+ y: from.y,
+ direction: this.get_direction(from, to)
+ };
+
+ if (direction == this.dirs.left || direction == this.dirs.right) {
+ vect.size = Math.abs(from.x - to.x);
+ } else {
+ vect.size = Math.abs(from.y - to.y);
+ }
+
+ return vect;
+ },
+ get_direction: function get_direction(from, to) {
+ var direction = 0;
+
+ if (to.x < from.x) {
+ direction = this.dirs.left;
+ } else if (to.x > from.x) {
+ direction = this.dirs.right;
+ } else if (to.y > from.y) {
+ direction = this.dirs.down;
+ } else {
+ direction = this.dirs.up;
+ }
+
+ return direction;
+ }
+ };
+ var path_builder = {
+ path: [],
+ clear: function clear() {
+ this.path = [];
+ },
+ current: function current() {
+ return this.path[this.path.length - 1];
+ },
+ point: function point(next) {
+ if (!next) return this.current();
+ this.path.push(gantt.copy(next));
+ return next;
+ },
+ point_to: function point_to(direction, diff, point) {
+ if (!point) point = gantt.copy(this.point());else point = {
+ x: point.x,
+ y: point.y
+ };
+ var dir = drawer.dirs;
+
+ switch (direction) {
+ case dir.left:
+ point.x -= diff;
+ break;
+
+ case dir.right:
+ point.x += diff;
+ break;
+
+ case dir.up:
+ point.y -= diff;
+ break;
+
+ case dir.down:
+ point.y += diff;
+ break;
+
+ default:
+ break;
+ }
+
+ return this.point(point);
+ },
+ get_points: function get_points(link, view, source, target) {
+ var pt = this.get_endpoint(link, view, source, target);
+ var xy = gantt.config;
+ var dy = pt.e_y - pt.y;
+ var dx = pt.e_x - pt.x;
+ var dir = drawer.dirs;
+ var rowHeight = view.getItemHeight(link.source);
+ this.clear();
+ this.point({
+ x: pt.x,
+ y: pt.y
+ });
+ var shiftX = 2 * xy.link_arrow_size; //just random size for first line
+
+ var lineType = this.get_line_type(link, view.$getConfig());
+ var forward = pt.e_x > pt.x;
+
+ if (lineType.from_start && lineType.to_start) {
+ this.point_to(dir.left, shiftX);
+
+ if (forward) {
+ this.point_to(dir.down, dy);
+ this.point_to(dir.right, dx);
+ } else {
+ this.point_to(dir.right, dx);
+ this.point_to(dir.down, dy);
+ }
+
+ this.point_to(dir.right, shiftX);
+ } else if (!lineType.from_start && lineType.to_start) {
+ forward = pt.e_x > pt.x + 2 * shiftX;
+ this.point_to(dir.right, shiftX);
+
+ if (forward) {
+ dx -= shiftX;
+ this.point_to(dir.down, dy);
+ this.point_to(dir.right, dx);
+ } else {
+ dx -= 2 * shiftX;
+ var sign = dy > 0 ? 1 : -1;
+ this.point_to(dir.down, sign * (rowHeight / 2));
+ this.point_to(dir.right, dx);
+ this.point_to(dir.down, sign * (Math.abs(dy) - rowHeight / 2));
+ this.point_to(dir.right, shiftX);
+ }
+ } else if (!lineType.from_start && !lineType.to_start) {
+ this.point_to(dir.right, shiftX);
+
+ if (forward) {
+ this.point_to(dir.right, dx);
+ this.point_to(dir.down, dy);
+ } else {
+ this.point_to(dir.down, dy);
+ this.point_to(dir.right, dx);
+ }
+
+ this.point_to(dir.left, shiftX);
+ } else if (lineType.from_start && !lineType.to_start) {
+ forward = pt.e_x > pt.x - 2 * shiftX;
+ this.point_to(dir.left, shiftX);
+
+ if (!forward) {
+ dx += shiftX;
+ this.point_to(dir.down, dy);
+ this.point_to(dir.right, dx);
+ } else {
+ dx += 2 * shiftX;
+ var sign = dy > 0 ? 1 : -1;
+ this.point_to(dir.down, sign * (rowHeight / 2));
+ this.point_to(dir.right, dx);
+ this.point_to(dir.down, sign * (Math.abs(dy) - rowHeight / 2));
+ this.point_to(dir.left, shiftX);
+ }
+ }
+
+ return this.path;
+ },
+ get_line_type: function get_line_type(link, config) {
+ var types = config.links;
+ var from_start = false,
+ to_start = false;
+
+ if (link.type == types.start_to_start) {
+ from_start = to_start = true;
+ } else if (link.type == types.finish_to_finish) {
+ from_start = to_start = false;
+ } else if (link.type == types.finish_to_start) {
+ from_start = false;
+ to_start = true;
+ } else if (link.type == types.start_to_finish) {
+ from_start = true;
+ to_start = false;
+ } else {
+ gantt.assert(false, "Invalid link type");
+ }
+
+ if (config.rtl) {
+ from_start = !from_start;
+ to_start = !to_start;
+ }
+
+ return {
+ from_start: from_start,
+ to_start: to_start
+ };
+ },
+ get_endpoint: function get_endpoint(link, view, source, target) {
+ var config = view.$getConfig();
+ var lineType = this.get_line_type(link, config);
+ var from_start = lineType.from_start,
+ to_start = lineType.to_start;
+ var from = getMilestonePosition(source, view, config),
+ to = getMilestonePosition(target, view, config);
+ return {
+ x: from_start ? from.left : from.left + from.width,
+ e_x: to_start ? to.left : to.left + to.width,
+ y: from.top + from.rowHeight / 2 - 1,
+ e_y: to.top + to.rowHeight / 2 - 1
+ };
+ }
+ };
+
+ function getMilestonePosition(task, view, config) {
+ var pos = view.getItemPosition(task);
+
+ if (gantt.getTaskType(task.type) == config.types.milestone) {
+ var milestoneHeight = view.getBarHeight(task.id, true);
+ var milestoneWidth = Math.sqrt(2 * milestoneHeight * milestoneHeight);
+ pos.left -= milestoneWidth / 2;
+ pos.width = milestoneWidth;
+ }
+
+ return pos;
+ }
+
+ return {
+ render: _render_link_element,
+ update: null,
+ //getRectangle: getLinkRectangle
+ isInViewPort: isInViewPort,
+ getVisibleRange: getVisibleRange()
+ };
+}
+
+module.exports = createLinkRender;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/prerender/task_bg_placeholder.js":
+/*!*****************************************************************!*\
+ !*** ./sources/core/ui/render/prerender/task_bg_placeholder.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (items, gantt) {
+ var placeholderConfig = gantt.config.timeline_placeholder;
+ items = items || [];
+
+ if (placeholderConfig && items.filter(function (e) {
+ return e.id === 'timeline_placeholder_task';
+ }).length === 0) {
+ var state = gantt.getState();
+ var lastTaskId = null;
+ var start_date = state.min_date;
+ var end_date = state.max_date;
+
+ if (items.length) {
+ lastTaskId = items[items.length - 1].id;
+ }
+
+ var placeholderTask = {
+ start_date: start_date,
+ end_date: end_date,
+ row_height: placeholderConfig.height || 0,
+ id: "timeline_placeholder_task",
+ unscheduled: true,
+ lastTaskId: lastTaskId,
+ calendar_id: placeholderConfig.calendar || "global",
+ $source: [],
+ $target: []
+ };
+ items.push(placeholderTask);
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/render_factory.js":
+/*!**************************************************!*\
+ !*** ./sources/core/ui/render/render_factory.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var genericViewPortChecker = __webpack_require__(/*! ./viewport/is_in_viewport */ "./sources/core/ui/render/viewport/is_in_viewport.js");
+
+var isLegacyRender = __webpack_require__(/*! ./is_legacy_smart_render */ "./sources/core/ui/render/is_legacy_smart_render.js");
+
+var basicGetRectangle = __webpack_require__(/*! ./viewport/get_grid_row_rectangle */ "./sources/core/ui/render/viewport/get_grid_row_rectangle.js");
+
+var basicGetRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+var rendererFactory = function rendererFactory(gantt) {
+ //hash of dom elements is needed to redraw single bar/link
+ var task_area_pulls = {},
+ task_area_renderers = {};
+
+ function getView(layer) {
+ var view = null;
+
+ if (typeof layer.view === "string") {
+ view = gantt.$ui.getView(layer.view);
+ } else if (layer.view) {
+ view = layer.view;
+ }
+
+ return view;
+ }
+
+ function getRenderer(id, layer, node) {
+ if (task_area_renderers[id]) return task_area_renderers[id];
+ if (!layer.renderer) gantt.assert(false, "Invalid renderer call");
+ var renderMethod = null;
+ var updateMethod = null;
+ var getRectangle = null;
+ var renderCallbackMethod = null;
+ var specializedViewPortChecker = null;
+
+ if (typeof layer.renderer === "function") {
+ renderMethod = layer.renderer;
+ getRectangle = basicGetRectangle;
+ } else {
+ renderMethod = layer.renderer.render;
+ updateMethod = layer.renderer.update;
+ renderCallbackMethod = layer.renderer.onrender;
+
+ if (layer.renderer.isInViewPort) {
+ specializedViewPortChecker = layer.renderer.isInViewPort;
+ } else {
+ getRectangle = layer.renderer.getRectangle;
+ }
+
+ if (!getRectangle && getRectangle !== null) {
+ getRectangle = basicGetRectangle;
+ }
+ }
+
+ var filter = layer.filter;
+ if (node) node.setAttribute(gantt.config.layer_attribute, true);
+ task_area_renderers[id] = {
+ render_item: function render_item(item, container, viewPort, layerView, viewConfig) {
+ container = container || node;
+
+ if (filter) {
+ if (!filter(item)) {
+ this.remove_item(item.id);
+ return;
+ }
+ }
+
+ var view = layerView || getView(layer);
+ var config = viewConfig || (view ? view.$getConfig() : null);
+ var rendererViewPort = viewPort;
+
+ if (!rendererViewPort && config && config.smart_rendering) {
+ rendererViewPort = view.getViewPort();
+ }
+
+ var dom = null;
+
+ if (!isLegacyRender(gantt) && (getRectangle || specializedViewPortChecker) && rendererViewPort) {
+ var isVisible = false;
+
+ if (specializedViewPortChecker) {
+ isVisible = specializedViewPortChecker(item, rendererViewPort, view, config, gantt);
+ } else {
+ isVisible = genericViewPortChecker(rendererViewPort, getRectangle(item, view, config, gantt));
+ }
+
+ if (isVisible) {
+ dom = renderMethod.call(gantt, item, view, config, rendererViewPort);
+ }
+ } else {
+ dom = renderMethod.call(gantt, item, view, config, rendererViewPort);
+ }
+
+ this.append(item, dom, container);
+ var useBuffer = container.nodeType == 11; //DocumentFragment
+
+ if (renderCallbackMethod && !useBuffer && dom) {
+ renderCallbackMethod.call(gantt, item, dom, view);
+ }
+ },
+ clear: function clear(container) {
+ this.rendered = task_area_pulls[id] = {};
+ if (!layer.append) this.clear_container(container);
+ },
+ clear_container: function clear_container(container) {
+ container = container || node;
+
+ if (container) {
+ container.innerHTML = "";
+ }
+ },
+ get_visible_range: function get_visible_range(datastore) {
+ var view = getView(layer);
+ var viewport;
+ var viewConfig = view ? view.$getConfig() : null;
+
+ if (viewConfig && viewConfig.smart_rendering) {
+ viewport = view.getViewPort();
+ }
+
+ var range;
+
+ if (view && viewport) {
+ if (typeof layer.renderer === "function") {
+ range = basicGetRange(gantt, view, viewConfig, datastore, viewport);
+ } else if (layer.renderer && layer.renderer.getVisibleRange) {
+ range = layer.renderer.getVisibleRange(gantt, view, viewConfig, datastore, viewport);
+ }
+ }
+
+ if (!range) {
+ range = {
+ start: 0,
+ end: datastore.count()
+ };
+ }
+
+ return range;
+ },
+ prepare_data: function prepare_data(items) {
+ if (layer.renderer && layer.renderer.prepareData) {
+ return layer.renderer.prepareData(items, gantt, layer);
+ }
+ },
+ render_items: function render_items(items, container) {
+ container = container || node;
+ var buffer = document.createDocumentFragment();
+ this.clear(container);
+ var viewPort = null;
+ var view = getView(layer);
+ var viewConfig = view ? view.$getConfig() : null;
+
+ if (viewConfig && viewConfig.smart_rendering) {
+ viewPort = view.getViewPort();
+ }
+
+ for (var i = 0, vis = items.length; i < vis; i++) {
+ this.render_item(items[i], buffer, viewPort, view, viewConfig);
+ }
+
+ container.appendChild(buffer, container);
+ var itemsSearch = {};
+ items.forEach(function (item) {
+ itemsSearch[item.id] = item;
+ });
+ var renderedItems = {};
+
+ if (renderCallbackMethod) {
+ var newElements = {};
+
+ for (var i in this.rendered) {
+ if (!renderedItems[i]) {
+ newElements[i] = this.rendered[i];
+ renderCallbackMethod.call(gantt, itemsSearch[i], this.rendered[i], view);
+ }
+ }
+ }
+ },
+ update_items: function update_items(items, container) {
+ var view = getView(layer);
+ var viewConfig = view ? view.$getConfig() : null;
+
+ if (!view || !view.$getConfig().smart_rendering || isLegacyRender(gantt)) {
+ return;
+ }
+
+ if (!this.rendered) {
+ return;
+ }
+
+ if (!(getRectangle || specializedViewPortChecker)) {
+ return;
+ }
+
+ container = container || node;
+ var buffer = document.createDocumentFragment();
+ var viewPort = null;
+
+ if (view) {
+ viewPort = view.getViewPort();
+ }
+
+ var itemsSearch = {};
+ items.forEach(function (item) {
+ itemsSearch[item.id] = item;
+ });
+ var renderedItems = {};
+ var nodesToRemove = {};
+
+ for (var i in this.rendered) {
+ nodesToRemove[i] = true;
+ renderedItems[i] = true;
+ }
+
+ var renderCalledFor = {};
+
+ for (var i = 0, vis = items.length; i < vis; i++) {
+ var item = items[i];
+ var itemNode = this.rendered[item.id];
+ nodesToRemove[item.id] = false;
+
+ if (itemNode && itemNode.parentNode) {
+ var isVisible = false;
+
+ if (specializedViewPortChecker) {
+ isVisible = specializedViewPortChecker(item, viewPort, view, viewConfig, gantt);
+ } else {
+ isVisible = genericViewPortChecker(viewPort, getRectangle(item, view, viewConfig, gantt));
+ }
+
+ if (!isVisible) {
+ nodesToRemove[item.id] = true;
+ } else {
+ if (updateMethod) {
+ updateMethod.call(gantt, item, itemNode, view, viewConfig, viewPort);
+ }
+
+ this.restore(item, buffer);
+ }
+ } else {
+ renderCalledFor[items[i].id] = true;
+ this.render_item(items[i], buffer, viewPort, view, viewConfig);
+ }
+ }
+
+ for (var i in nodesToRemove) {
+ if (nodesToRemove[i]) {
+ this.hide(i);
+ }
+ }
+
+ if (buffer.childNodes.length) {
+ container.appendChild(buffer, container);
+ }
+
+ if (renderCallbackMethod) {
+ var newElements = {};
+
+ for (var i in this.rendered) {
+ if (!renderedItems[i] || renderCalledFor[i]) {
+ newElements[i] = this.rendered[i];
+ renderCallbackMethod.call(gantt, itemsSearch[i], this.rendered[i], view);
+ }
+ }
+ }
+ },
+ append: function append(item, node, container) {
+ if (!this.rendered) {
+ return;
+ }
+
+ if (!node) {
+ if (this.rendered[item.id]) {
+ this.remove_item(item.id);
+ }
+
+ return;
+ }
+
+ if (this.rendered[item.id] && this.rendered[item.id].parentNode) {
+ this.replace_item(item.id, node);
+ } else {
+ container.appendChild(node);
+ }
+
+ this.rendered[item.id] = node;
+ },
+ replace_item: function replace_item(item_id, newNode) {
+ var item = this.rendered[item_id];
+
+ if (item && item.parentNode) {
+ item.parentNode.replaceChild(newNode, item);
+ }
+
+ this.rendered[item_id] = newNode;
+ },
+ remove_item: function remove_item(item_id) {
+ this.hide(item_id);
+ delete this.rendered[item_id];
+ },
+ hide: function hide(item_id) {
+ var item = this.rendered[item_id];
+
+ if (item && item.parentNode) {
+ item.parentNode.removeChild(item);
+ }
+ },
+ restore: function restore(item, container) {
+ var dom = this.rendered[item.id];
+
+ if (dom) {
+ if (!dom.parentNode) {
+ this.append(item, dom, container || node);
+ }
+ } else {
+ this.render_item(item, container || node);
+ }
+ },
+ change_id: function change_id(oldid, newid) {
+ this.rendered[newid] = this.rendered[oldid];
+ delete this.rendered[oldid];
+ },
+ rendered: task_area_pulls[id],
+ node: node,
+ destructor: function destructor() {
+ this.clear();
+ delete task_area_renderers[id];
+ delete task_area_pulls[id];
+ }
+ };
+ return task_area_renderers[id];
+ }
+
+ function clearRenderers() {
+ for (var i in task_area_renderers) {
+ getRenderer(i).destructor();
+ }
+ }
+
+ return {
+ getRenderer: getRenderer,
+ clearRenderers: clearRenderers
+ };
+};
+
+module.exports = rendererFactory;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/resource_histogram_render.js":
+/*!*************************************************************!*\
+ !*** ./sources/core/ui/render/resource_histogram_render.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getRectangle = __webpack_require__(/*! ./viewport/get_bg_row_rectangle */ "./sources/core/ui/render/viewport/get_bg_row_rectangle.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+var getVisibleCellsRange = __webpack_require__(/*! ./viewport/get_visible_cells_range */ "./sources/core/ui/render/viewport/get_visible_cells_range.js");
+
+var isColumnVisible = __webpack_require__(/*! ./viewport/is_column_visible */ "./sources/core/ui/render/viewport/is_column_visible.js");
+
+var resourceTimetable = __webpack_require__(/*! ../../resource_timetable_builder */ "./sources/core/resource_timetable_builder.js");
+
+function renderBar(level, start, end, timeline) {
+ var top = (1 - (level * 1 || 0)) * 100;
+ var left = timeline.posFromDate(start);
+ var right = timeline.posFromDate(end);
+ var element = document.createElement("div");
+ element.className = "gantt_histogram_hor_bar";
+ element.style.top = top + '%';
+ element.style.left = left + "px";
+ element.style.width = right - left + 1 + "px";
+ return element;
+}
+
+function renderConnection(prevLevel, nextLevel, left) {
+ if (prevLevel === nextLevel) {
+ return null;
+ }
+
+ var top = 1 - Math.max(prevLevel, nextLevel);
+ var height = Math.abs(prevLevel - nextLevel);
+ var element = document.createElement("div");
+ element.className = "gantt_histogram_vert_bar";
+ element.style.top = top * 100 + "%";
+ element.style.height = height * 100 + "%";
+ element.style.left = left + "px";
+ return element;
+}
+
+function generateRenderResourceHistogram(gantt) {
+ var getResourceLoad = resourceTimetable(gantt);
+ var renderedHistogramCells = {};
+ var renderedHistogramRows = {};
+ var renderedHistogramCapacity = {};
+
+ function detachRenderedHistogramCell(id, index) {
+ var renderedRow = renderedHistogramCells[id];
+
+ if (renderedRow && renderedRow[index] && renderedRow[index].parentNode) {
+ renderedRow[index].parentNode.removeChild(renderedRow[index]);
+ }
+ }
+
+ function renderHistogramLine(capacity, timeline, maxCapacity, viewport) {
+ var scale = timeline.getScale();
+ var el = document.createElement("div");
+ var range = getVisibleCellsRange(scale, viewport);
+
+ for (var i = range.start; i <= range.end; i++) {
+ var colStart = scale.trace_x[i];
+ var colEnd = scale.trace_x[i + 1] || gantt.date.add(colStart, scale.step, scale.unit);
+ var col = scale.trace_x[i].valueOf();
+ var level = Math.min(capacity[col] / maxCapacity, 1) || 0; // do not render histogram for lines with below zero capacity, as it's reserved for folders
+
+ if (level < 0) {
+ return null;
+ }
+
+ var nextLevel = Math.min(capacity[colEnd.valueOf()] / maxCapacity, 1) || 0;
+ var bar = renderBar(level, colStart, colEnd, timeline);
+
+ if (bar) {
+ el.appendChild(bar);
+ }
+
+ var connection = renderConnection(level, nextLevel, timeline.posFromDate(colEnd));
+
+ if (connection) {
+ el.appendChild(connection);
+ }
+ }
+
+ return el;
+ }
+
+ function renderCapacityElement(resource, sizes, capacityMatrix, config, timeline, maxCapacity, viewport) {
+ var renderedElement = renderedHistogramCapacity[resource.id];
+
+ if (renderedElement && renderedElement.parentNode) {
+ renderedElement.parentNode.removeChild(renderedElement);
+ }
+
+ var capacityElement = renderHistogramLine(capacityMatrix, timeline, maxCapacity, viewport);
+
+ if (capacityElement && sizes) {
+ capacityElement.setAttribute("data-resource-id", resource.id);
+ capacityElement.setAttribute(timeline.$config.item_attribute, resource.id);
+ capacityElement.style.position = "absolute";
+ capacityElement.style.top = sizes.top + 1 + "px";
+ capacityElement.style.height = timeline.getItemHeight(resource.id) - 1 + "px";
+ capacityElement.style.left = 0;
+ }
+
+ return capacityElement;
+ }
+
+ function renderHistogramCell(resource, sizes, maxCapacity, config, templates, day, timeline) {
+ var css = templates.histogram_cell_class(day.start_date, day.end_date, resource, day.tasks, day.assignments);
+ var content = templates.histogram_cell_label(day.start_date, day.end_date, resource, day.tasks, day.assignments);
+ var fill = templates.histogram_cell_allocated(day.start_date, day.end_date, resource, day.tasks, day.assignments);
+ var height = timeline.getItemHeight(resource.id) - 1;
+
+ if (css || content) {
+ var el = document.createElement('div');
+ el.className = ["gantt_histogram_cell", css].join(" ");
+ el.setAttribute(timeline.$config.item_attribute, resource.id);
+ el.style.cssText = ['left:' + sizes.left + 'px', 'width:' + sizes.width + 'px', 'height:' + height + 'px', 'line-height:' + height + 'px', 'top:' + (sizes.top + 1) + 'px'].join(";");
+
+ if (content) {
+ content = "<div class='gantt_histogram_label'>" + content + "</div>";
+ }
+
+ if (fill) {
+ content = "<div class='gantt_histogram_fill' style='height:" + Math.min(fill / maxCapacity || 0, 1) * 100 + "%;'></div>" + content;
+ }
+
+ if (content) {
+ el.innerHTML = content;
+ }
+
+ return el;
+ }
+
+ return null;
+ }
+
+ function renderResourceHistogram(resource, timeline, config, viewport) {
+ var templates = timeline.$getTemplates();
+ var scale = timeline.getScale();
+ var timetable = getResourceLoad(resource, config.resource_property, scale, timeline);
+ var cells = [];
+ var capacityMatrix = {};
+ var maxCapacity = resource.capacity || timeline.$config.capacity || 24;
+ renderedHistogramCells[resource.id] = {};
+ renderedHistogramRows[resource.id] = null;
+ renderedHistogramCapacity[resource.id] = null;
+ var smartRendering = !!viewport; //no viewport means smart rendering is disabled
+
+ var range = getVisibleCellsRange(scale, viewport);
+
+ for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {
+ var day = timetable[columnIndex];
+
+ if (!day) {
+ continue;
+ }
+
+ if (smartRendering && !isColumnVisible(columnIndex, scale, viewport, gantt)) {
+ continue;
+ }
+
+ var capacity = templates.histogram_cell_capacity(day.start_date, day.end_date, resource, day.tasks, day.assignments);
+ capacityMatrix[day.start_date.valueOf()] = capacity || 0;
+ var sizes = timeline.getItemPosition(resource, day.start_date, day.end_date);
+ var el = renderHistogramCell(resource, sizes, maxCapacity, config, templates, day, timeline);
+
+ if (el) {
+ cells.push(el);
+ renderedHistogramCells[resource.id][columnIndex] = el;
+ }
+ }
+
+ var row = null;
+
+ if (cells.length) {
+ row = document.createElement("div");
+
+ for (var i = 0; i < cells.length; i++) {
+ row.appendChild(cells[i]);
+ }
+
+ var capacityElement = renderCapacityElement(resource, sizes, capacityMatrix, config, timeline, maxCapacity, viewport);
+
+ if (capacityElement) {
+ row.appendChild(capacityElement);
+ renderedHistogramCapacity[resource.id] = capacityElement;
+ }
+
+ renderedHistogramRows[resource.id] = row;
+ }
+
+ return row;
+ }
+
+ function updateResourceHistogram(resource, node, timeline, config, viewport) {
+ var templates = timeline.$getTemplates();
+ var scale = timeline.getScale();
+ var timetable = getResourceLoad(resource, config.resource_property, scale, timeline);
+ var maxCapacity = resource.capacity || timeline.$config.capacity || 24;
+ var capacityMatrix = {};
+ var smartRendering = !!viewport; //no viewport means smart rendering is disabled
+
+ var range = getVisibleCellsRange(scale, viewport);
+ var checkedColumns = {};
+
+ if (renderedHistogramCells && renderedHistogramCells[resource.id]) {
+ for (var i in renderedHistogramCells[resource.id]) {
+ checkedColumns[i] = i;
+ }
+ }
+
+ for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {
+ var day = timetable[columnIndex];
+ checkedColumns[columnIndex] = false;
+
+ if (!day) {
+ continue;
+ }
+
+ var capacity = templates.histogram_cell_capacity(day.start_date, day.end_date, resource, day.tasks, day.assignments);
+ capacityMatrix[day.start_date.valueOf()] = capacity || 0;
+ var sizes = timeline.getItemPosition(resource, day.start_date, day.end_date);
+
+ if (smartRendering && !isColumnVisible(columnIndex, scale, viewport, gantt)) {
+ detachRenderedHistogramCell(resource.id, columnIndex);
+ continue;
+ }
+
+ var renderedCell = renderedHistogramCells[resource.id];
+
+ if (!renderedCell || !renderedCell[columnIndex]) {
+ var el = renderHistogramCell(resource, sizes, maxCapacity, config, templates, day, timeline);
+
+ if (el) {
+ node.appendChild(el);
+ renderedHistogramCells[resource.id][columnIndex] = el;
+ }
+ } else if (renderedCell && renderedCell[columnIndex] && !renderedCell[columnIndex].parentNode) {
+ node.appendChild(renderedCell[columnIndex]);
+ }
+ }
+
+ for (var i in checkedColumns) {
+ if (checkedColumns[i] !== false) {
+ detachRenderedHistogramCell(resource.id, i);
+ }
+ }
+
+ var capacityElement = renderCapacityElement(resource, sizes, capacityMatrix, config, timeline, maxCapacity, viewport);
+
+ if (capacityElement) {
+ node.appendChild(capacityElement);
+ renderedHistogramCapacity[resource.id] = capacityElement;
+ }
+ }
+
+ return {
+ render: renderResourceHistogram,
+ update: updateResourceHistogram,
+ getRectangle: getRectangle,
+ getVisibleRange: getVisibleRange
+ };
+}
+
+module.exports = generateRenderResourceHistogram;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/resource_matrix_render.js":
+/*!**********************************************************!*\
+ !*** ./sources/core/ui/render/resource_matrix_render.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getRectangle = __webpack_require__(/*! ./viewport/get_bg_row_rectangle */ "./sources/core/ui/render/viewport/get_bg_row_rectangle.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+var getVisibleCellsRange = __webpack_require__(/*! ./viewport/get_visible_cells_range */ "./sources/core/ui/render/viewport/get_visible_cells_range.js");
+
+var isColumnVisible = __webpack_require__(/*! ./viewport/is_column_visible */ "./sources/core/ui/render/viewport/is_column_visible.js");
+
+var resourceTimetable = __webpack_require__(/*! ../../resource_timetable_builder */ "./sources/core/resource_timetable_builder.js");
+
+function generateRenderResourceLine(gantt) {
+ var getResourceLoad = resourceTimetable(gantt);
+ var renderedResourceLines = {};
+
+ function renderResourceLineCell(resource, day, templates, config, timeline) {
+ var css = templates.resource_cell_class(day.start_date, day.end_date, resource, day.tasks, day.assignments);
+ var content = templates.resource_cell_value(day.start_date, day.end_date, resource, day.tasks, day.assignments);
+ var height = timeline.getItemHeight(resource.id) - 1;
+
+ if (css || content) {
+ var sizes = timeline.getItemPosition(resource, day.start_date, day.end_date);
+ var el = document.createElement('div');
+ el.setAttribute(timeline.$config.item_attribute, resource.id);
+ el.className = ["gantt_resource_marker", css].join(" ");
+ el.style.cssText = ['left:' + sizes.left + 'px', 'width:' + sizes.width + 'px', 'height:' + height + 'px', 'line-height:' + height + 'px', 'top:' + sizes.top + 'px'].join(";");
+ if (content) el.innerHTML = content;
+ return el;
+ }
+
+ return null;
+ }
+
+ function detachRenderedResourceLine(id, index) {
+ if (renderedResourceLines[id] && renderedResourceLines[id][index] && renderedResourceLines[id][index].parentNode) {
+ renderedResourceLines[id][index].parentNode.removeChild(renderedResourceLines[id][index]);
+ }
+ }
+
+ function renderResourceLine(resource, timeline, config, viewport) {
+ var templates = timeline.$getTemplates();
+ var scale = timeline.getScale();
+ var timetable = getResourceLoad(resource, config.resource_property, timeline.getScale(), timeline);
+ var smartRendering = !!viewport; //no viewport means smart rendering is disabled
+
+ var cells = [];
+ renderedResourceLines[resource.id] = {};
+ var range = getVisibleCellsRange(scale, viewport);
+
+ for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {
+ var day = timetable[columnIndex];
+
+ if (!day) {
+ continue;
+ }
+
+ if (smartRendering && !isColumnVisible(columnIndex, scale, viewport, gantt)) {
+ continue;
+ }
+
+ var cell = renderResourceLineCell(resource, day, templates, config, timeline);
+
+ if (cell) {
+ cells.push(cell);
+ renderedResourceLines[resource.id][columnIndex] = cell;
+ }
+ }
+
+ var row = null;
+
+ if (cells.length) {
+ row = document.createElement("div");
+
+ for (var i = 0; i < cells.length; i++) {
+ row.appendChild(cells[i]);
+ }
+ }
+
+ return row;
+ }
+
+ function updateResourceLine(resource, node, timeline, config, viewport) {
+ var templates = timeline.$getTemplates();
+ var scale = timeline.getScale();
+ var timetable = getResourceLoad(resource, config.resource_property, timeline.getScale(), timeline);
+ var range = getVisibleCellsRange(scale, viewport);
+ var checkedColumns = {};
+
+ if (renderedResourceLines && renderedResourceLines[resource.id]) {
+ for (var i in renderedResourceLines[resource.id]) {
+ checkedColumns[i] = i;
+ }
+ }
+
+ for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {
+ var day = timetable[columnIndex];
+ checkedColumns[columnIndex] = false;
+
+ if (!day) {
+ continue;
+ }
+
+ if (!isColumnVisible(columnIndex, scale, viewport, gantt)) {
+ detachRenderedResourceLine(resource.id, columnIndex);
+ continue;
+ }
+
+ if (!renderedResourceLines[resource.id] || !renderedResourceLines[resource.id][columnIndex]) {
+ var cell = renderResourceLineCell(resource, day, templates, config, timeline);
+
+ if (cell) {
+ node.appendChild(cell);
+ renderedResourceLines[resource.id][columnIndex] = cell;
+ }
+ } else if (renderedResourceLines[resource.id] && renderedResourceLines[resource.id][columnIndex] && !renderedResourceLines[resource.id][columnIndex].parentNode) {
+ node.appendChild(renderedResourceLines[resource.id][columnIndex]);
+ }
+ }
+
+ for (var i in checkedColumns) {
+ if (checkedColumns[i] !== false) {
+ detachRenderedResourceLine(resource.id, i);
+ }
+ }
+ }
+
+ return {
+ render: renderResourceLine,
+ update: updateResourceLine,
+ getRectangle: getRectangle,
+ getVisibleRange: getVisibleRange
+ };
+}
+
+module.exports = generateRenderResourceLine;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/task_bar_render.js":
+/*!***************************************************!*\
+ !*** ./sources/core/ui/render/task_bar_render.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function createTaskRenderer(gantt) {
+ function _render_task_element(task, view, config) {
+ var config = view.$getConfig();
+ var painters = config.type_renderers;
+ var renderer = painters[gantt.getTaskType(task.type)],
+ defaultRenderer = _task_default_render;
+
+ if (!renderer) {
+ return defaultRenderer.call(gantt, task, view, config);
+ } else {
+ return renderer.call(gantt, task, function (task) {
+ return defaultRenderer.call(gantt, task, view, config);
+ }, view);
+ }
+ }
+
+ function _task_default_render(task, view, config) {
+ if (gantt._isAllowedUnscheduledTask(task)) return;
+
+ if (!gantt._isTaskInTimelineLimits(task)) {
+ return;
+ }
+
+ var pos = view.getItemPosition(task);
+ var cfg = config,
+ templates = view.$getTemplates();
+ var taskType = gantt.getTaskType(task.type);
+ var height = view.getBarHeight(task.id, taskType == cfg.types.milestone);
+ var controlsMargin = 0;
+
+ if (taskType == cfg.types.milestone) {
+ controlsMargin = (height - pos.height) / 2;
+ }
+
+ var padd = Math.floor((view.getItemHeight(task.id) - height) / 2); // if(task.type == cfg.types.milestone){
+ // padd -= 1;
+ // }
+ // if (taskType == cfg.types.milestone && cfg.link_line_width > 1) {
+ // //little adjust milestone position, so horisontal corners would match link arrow when thickness of link line is more than 1px
+ // padd += 1;
+ // }
+
+ if (taskType == cfg.types.milestone) {
+ pos.left -= Math.round(height / 2);
+ pos.width = height;
+ }
+
+ var div = document.createElement("div");
+ var width = Math.round(pos.width);
+
+ if (view.$config.item_attribute) {
+ div.setAttribute(view.$config.item_attribute, task.id);
+ div.setAttribute(view.$config.bind + "_id", task.id); // 'task_id'/'resource_id' for backward compatibility
+ }
+
+ if (cfg.show_progress && taskType != cfg.types.milestone) {
+ _render_task_progress(task, div, width, cfg, templates);
+ } //use separate div to display content above progress bar
+
+
+ var content = _render_task_content(task, width, templates);
+
+ if (task.textColor) {
+ content.style.color = task.textColor;
+ }
+
+ div.appendChild(content);
+
+ var css = _combine_item_class("gantt_task_line", templates.task_class(task.start_date, task.end_date, task), task.id, view);
+
+ if (task.color || task.progressColor || task.textColor) {
+ css += " gantt_task_inline_color";
+ }
+
+ if (pos.width < 20) {
+ css += " gantt_thin_task";
+ }
+
+ div.className = css;
+ var styles = ["left:" + pos.left + "px", "top:" + (padd + pos.top) + 'px', "height:" + (taskType == cfg.types.milestone ? pos.height : height) + 'px', "line-height:" + Math.max(height < 30 ? height - 2 : height, 0) + 'px', "width:" + width + 'px'];
+
+ if (task.color) {
+ styles.push("background-color:" + task.color);
+ }
+
+ if (task.textColor) {
+ styles.push("color:" + task.textColor);
+ }
+
+ div.style.cssText = styles.join(";");
+
+ var side = _render_leftside_content(task, cfg, templates, controlsMargin);
+
+ if (side) div.appendChild(side);
+ side = _render_rightside_content(task, cfg, templates, controlsMargin);
+ if (side) div.appendChild(side);
+
+ gantt._waiAria.setTaskBarAttr(task, div);
+
+ var state = gantt.getState();
+
+ if (!gantt.isReadonly(task)) {
+ if (cfg.drag_resize && !gantt.isSummaryTask(task) && taskType != cfg.types.milestone) {
+ _render_pair(div, "gantt_task_drag", task, function (css) {
+ var el = document.createElement("div");
+ el.className = css;
+ return el;
+ }, cfg);
+ }
+
+ if (cfg.drag_links && cfg.show_links) {
+ _render_pair(div, "gantt_link_control", task, function (css) {
+ var outer = document.createElement("div");
+ outer.className = css;
+ outer.style.cssText = ["height:" + height + 'px', "line-height:" + height + 'px'].join(";");
+ var inner = document.createElement("div");
+ inner.className = "gantt_link_point";
+ var showLinkPoints = false;
+
+ if (state.link_source_id && cfg.touch) {
+ showLinkPoints = true;
+ }
+
+ inner.style.display = showLinkPoints ? "block" : "";
+ outer.appendChild(inner);
+ return outer;
+ }, cfg, controlsMargin);
+ }
+ }
+
+ return div;
+ }
+
+ function _render_side_content(task, template, cssClass, marginStyle) {
+ if (!template) return null;
+ var text = template(task.start_date, task.end_date, task);
+ if (!text) return null;
+ var content = document.createElement("div");
+ content.className = "gantt_side_content " + cssClass;
+ content.innerHTML = text;
+
+ if (marginStyle) {
+ content.style[marginStyle.type] = Math.abs(marginStyle.value) + "px";
+ }
+
+ return content;
+ }
+
+ function _render_leftside_content(task, cfg, templates, margin) {
+ var css = "gantt_left " + _get_link_crossing_css(!cfg.rtl ? true : false, task, cfg);
+
+ var marginStyle = null;
+
+ if (margin) {
+ marginStyle = {
+ type: "marginRight",
+ value: margin
+ };
+ }
+
+ return _render_side_content(task, templates.leftside_text, css, marginStyle);
+ }
+
+ function _render_rightside_content(task, cfg, templates, margin) {
+ var css = "gantt_right " + _get_link_crossing_css(!cfg.rtl ? false : true, task, cfg);
+
+ var marginStyle = null;
+
+ if (margin) {
+ marginStyle = {
+ type: "marginLeft",
+ value: margin
+ };
+ }
+
+ return _render_side_content(task, templates.rightside_text, css, marginStyle);
+ }
+
+ function _get_link_crossing_css(left, task) {
+ var cond = _get_conditions(left);
+
+ for (var i in cond) {
+ var links = task[i];
+
+ for (var ln = 0; ln < links.length; ln++) {
+ var link = gantt.getLink(links[ln]);
+
+ for (var tp = 0; tp < cond[i].length; tp++) {
+ if (link.type == cond[i][tp]) {
+ return "gantt_link_crossing";
+ }
+ }
+ }
+ }
+
+ return "";
+ }
+
+ function _render_task_content(task, width, templates) {
+ var content = document.createElement("div");
+
+ if (gantt.getTaskType(task.type) != gantt.config.types.milestone) {
+ content.innerHTML = templates.task_text(task.start_date, task.end_date, task);
+ } else if (gantt.getTaskType(task.type) == gantt.config.types.milestone && width) {
+ content.style.height = content.style.width = width + "px";
+ }
+
+ content.className = "gantt_task_content"; //content.style.width = width + 'px';
+
+ return content;
+ }
+
+ function _render_task_progress(task, element, maxWidth, cfg, templates) {
+ var done = task.progress * 1 || 0;
+ maxWidth = Math.max(maxWidth - 2, 0); //2px for borders
+
+ var pr = document.createElement("div");
+ var width = Math.round(maxWidth * done);
+ width = Math.min(maxWidth, width);
+
+ if (task.progressColor) {
+ pr.style.backgroundColor = task.progressColor;
+ pr.style.opacity = 1;
+ }
+
+ pr.style.width = width + 'px';
+ pr.className = "gantt_task_progress";
+ pr.innerHTML = templates.progress_text(task.start_date, task.end_date, task);
+
+ if (cfg.rtl) {
+ pr.style.position = "absolute";
+ pr.style.right = "0px";
+ }
+
+ var wrapper = document.createElement("div");
+ wrapper.className = "gantt_task_progress_wrapper";
+ wrapper.appendChild(pr);
+ element.appendChild(wrapper);
+
+ if (gantt.config.drag_progress && !gantt.isReadonly(task)) {
+ var drag = document.createElement("div");
+ var markerPos = width;
+
+ if (cfg.rtl) {
+ markerPos = maxWidth - width;
+ }
+
+ drag.style.left = markerPos + 'px';
+ drag.className = "gantt_task_progress_drag";
+ pr.appendChild(drag);
+ element.appendChild(drag);
+ }
+ }
+
+ function _get_conditions(leftside) {
+ if (leftside) {
+ return {
+ $source: [gantt.config.links.start_to_start],
+ $target: [gantt.config.links.start_to_start, gantt.config.links.finish_to_start]
+ };
+ } else {
+ return {
+ $source: [gantt.config.links.finish_to_start, gantt.config.links.finish_to_finish],
+ $target: [gantt.config.links.finish_to_finish]
+ };
+ }
+ }
+
+ function _combine_item_class(basic, template, itemId, view) {
+ var cfg = view.$getConfig();
+ var css = [basic];
+ if (template) css.push(template);
+ var state = gantt.getState();
+ var task = gantt.getTask(itemId);
+
+ if (gantt.getTaskType(task.type) == cfg.types.milestone) {
+ css.push("gantt_milestone");
+ } else if (gantt.getTaskType(task.type) == cfg.types.project) {
+ css.push("gantt_project");
+ }
+
+ css.push("gantt_bar_" + gantt.getTaskType(task.type));
+ if (gantt.isSummaryTask(task)) css.push("gantt_dependent_task");
+
+ if (gantt.isSplitTask(task) && (cfg.open_split_tasks && !task.$open || !cfg.open_split_tasks)) {
+ css.push("gantt_split_parent");
+ }
+
+ if (cfg.select_task && gantt.isSelectedTask(itemId)) {
+ css.push("gantt_selected");
+ }
+
+ if (itemId == state.drag_id) {
+ css.push("gantt_drag_" + state.drag_mode);
+
+ if (state.touch_drag) {
+ css.push("gantt_touch_" + state.drag_mode);
+ }
+ }
+
+ if (state.link_source_id == itemId) css.push("gantt_link_source");
+ if (state.link_target_id == itemId) css.push("gantt_link_target");
+
+ if (cfg.highlight_critical_path && gantt.isCriticalTask) {
+ if (gantt.isCriticalTask(task)) css.push("gantt_critical_task");
+ }
+
+ if (state.link_landing_area && state.link_target_id && state.link_source_id && state.link_target_id != state.link_source_id && (state.link_target_id == itemId || state.link_source_id == itemId)) {
+ var from_id = state.link_source_id;
+ var from_start = state.link_from_start;
+ var to_start = state.link_to_start;
+ var allowDrag = gantt.isLinkAllowed(from_id, itemId, from_start, to_start);
+ var dragClass = "";
+
+ if (allowDrag) {
+ if (to_start) dragClass = "link_start_allow";else dragClass = "link_finish_allow";
+ } else {
+ if (to_start) dragClass = "link_start_deny";else dragClass = "link_finish_deny";
+ }
+
+ css.push(dragClass);
+ }
+
+ return css.join(" ");
+ }
+
+ function _render_pair(parent, css, task, content, config, margin) {
+ var state = gantt.getState();
+ var className, element;
+
+ if (+task.start_date >= +state.min_date) {
+ className = [css, config.rtl ? "task_right" : "task_left", "task_start_date"];
+ element = content(className.join(" "));
+ element.setAttribute("data-bind-property", "start_date");
+
+ if (margin) {
+ element.style.marginLeft = margin + "px";
+ }
+
+ parent.appendChild(element);
+ }
+
+ if (+task.end_date <= +state.max_date) {
+ className = [css, config.rtl ? "task_left" : "task_right", "task_end_date"];
+ element = content(className.join(" "));
+ element.setAttribute("data-bind-property", "end_date");
+
+ if (margin) {
+ element.style.marginRight = margin + "px";
+ }
+
+ parent.appendChild(element);
+ }
+ }
+
+ return _render_task_element;
+}
+
+module.exports = createTaskRenderer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/task_bar_smart_render.js":
+/*!*********************************************************!*\
+ !*** ./sources/core/ui/render/task_bar_smart_render.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isInViewPort = __webpack_require__(/*! ./viewport/is_bar_in_viewport */ "./sources/core/ui/render/viewport/is_bar_in_viewport.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+var createBaseBarRender = __webpack_require__(/*! ./task_bar_render */ "./sources/core/ui/render/task_bar_render.js");
+
+module.exports = function createTaskRenderer(gantt) {
+ var defaultRender = createBaseBarRender(gantt);
+ return {
+ render: defaultRender,
+ update: null,
+ //getRectangle: getBarRectangle
+ isInViewPort: isInViewPort,
+ getVisibleRange: getVisibleRange
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/task_bg_render.js":
+/*!**************************************************!*\
+ !*** ./sources/core/ui/render/task_bg_render.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getRowRectangle = __webpack_require__(/*! ./viewport/get_bg_row_rectangle */ "./sources/core/ui/render/viewport/get_bg_row_rectangle.js");
+
+var isLegacyRender = __webpack_require__(/*! ./is_legacy_smart_render */ "./sources/core/ui/render/is_legacy_smart_render.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+var getVisibleCellsRange = __webpack_require__(/*! ./viewport/get_visible_cells_range */ "./sources/core/ui/render/viewport/get_visible_cells_range.js");
+
+var isColumnVisible = __webpack_require__(/*! ./viewport/is_column_visible */ "./sources/core/ui/render/viewport/is_column_visible.js");
+
+var bgPlaceholder = __webpack_require__(/*! ./prerender/task_bg_placeholder */ "./sources/core/ui/render/prerender/task_bg_placeholder.js");
+
+function createTaskBgRender(gantt) {
+ var renderedCells = {};
+ var visibleCells = {};
+
+ function isRendered(item, columnIndex) {
+ if (renderedCells[item.id][columnIndex] && renderedCells[item.id][columnIndex].parentNode) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ function detachRenderedCell(itemId, columnIndex) {
+ if (renderedCells[itemId] && renderedCells[itemId][columnIndex] && renderedCells[itemId][columnIndex].parentNode) {
+ renderedCells[itemId][columnIndex].parentNode.removeChild(renderedCells[itemId][columnIndex]);
+ }
+ }
+
+ function getCellClassTemplate(view) {
+ var templates = view.$getTemplates();
+ var cssTemplate;
+
+ if (typeof templates.task_cell_class !== "undefined") {
+ cssTemplate = templates.task_cell_class; // eslint-disable-next-line no-console
+
+ var log = console.warn || console.log;
+ log('gantt.templates.task_cell_class template is deprecated and will be removed soon. Please use gantt.templates.timeline_cell_class instead.');
+ } else {
+ cssTemplate = templates.timeline_cell_class;
+ }
+
+ return cssTemplate;
+ }
+
+ function getCellContentTemplate(view) {
+ var templates = view.$getTemplates();
+ var contentTemplate = templates.timeline_cell_content;
+ return contentTemplate;
+ }
+
+ function renderCells(item, node, view, config, viewPort) {
+ var cfg = view.getScale();
+ var count = cfg.count;
+ var cssTemplate = getCellClassTemplate(view);
+ var contentTemplate = getCellContentTemplate(view);
+
+ if (config.show_task_cells) {
+ if (!renderedCells[item.id]) {
+ renderedCells[item.id] = {};
+ }
+
+ if (!visibleCells[item.id]) {
+ visibleCells[item.id] = {};
+ }
+
+ var range = getVisibleCellsRange(cfg, viewPort);
+
+ for (var i in visibleCells[item.id]) {
+ var index = visibleCells[item.id][i];
+
+ if (Number(index) < range.start || Number(index) > range.end) {
+ detachRenderedCell(item.id, index);
+ }
+ }
+
+ visibleCells[item.id] = {}; // TODO: do not iterate all cell, only ones in the viewport and once that are already rendered
+
+ for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {
+ var cell = renderOneCell(cfg, columnIndex, item, viewPort, count, cssTemplate, contentTemplate, config);
+
+ if (!cell && isRendered(item, columnIndex)) {
+ detachRenderedCell(item.id, columnIndex);
+ } else if (cell && !cell.parentNode) {
+ node.appendChild(cell);
+ }
+ }
+ }
+ }
+
+ function renderOneCell(scale, columnIndex, item, viewPort, count, cssTemplate, contentTemplate, config) {
+ var width = scale.width[columnIndex],
+ cssclass = "";
+
+ if (isColumnVisible(columnIndex, scale, viewPort, gantt)) {
+ //do not render skipped columns
+ var cssTemplateContent = cssTemplate(item, scale.trace_x[columnIndex]);
+ var htmlTemplateContent = "";
+
+ if (contentTemplate) {
+ // for backward compatibility, contentTemplate was added in 7.2.0+, will be undefined if someone used copy of old config/template object
+ htmlTemplateContent = contentTemplate(item, scale.trace_x[columnIndex]);
+ }
+
+ if (config.static_background) {
+ // if cell render in static background is not allowed, or if it's a blank cell
+ var customCell = !!(cssTemplateContent || htmlTemplateContent);
+
+ if (!(config.static_background_cells && customCell)) {
+ return null;
+ }
+ }
+
+ if (renderedCells[item.id][columnIndex]) {
+ visibleCells[item.id][columnIndex] = columnIndex;
+ return renderedCells[item.id][columnIndex];
+ }
+
+ var cell = document.createElement("div");
+ cell.style.width = width + "px";
+ cssclass = "gantt_task_cell" + (columnIndex == count - 1 ? " gantt_last_cell" : "");
+
+ if (cssTemplateContent) {
+ cssclass += " " + cssTemplateContent;
+ }
+
+ cell.className = cssclass;
+
+ if (htmlTemplateContent) {
+ cell.innerHTML = htmlTemplateContent;
+ }
+
+ cell.style.position = "absolute";
+ cell.style.left = scale.left[columnIndex] + "px";
+ renderedCells[item.id][columnIndex] = cell;
+ visibleCells[item.id][columnIndex] = columnIndex;
+ return cell;
+ }
+
+ return null;
+ }
+
+ function _render_bg_line(item, view, config, viewPort) {
+ var templates = view.$getTemplates();
+ var cfg = view.getScale();
+ var count = cfg.count;
+
+ if (config.static_background && !config.static_background_cells) {
+ return null;
+ }
+
+ var row = document.createElement("div");
+ var cellCssTemplate = getCellClassTemplate(view);
+ var cellHtmlTemplate = getCellContentTemplate(view);
+ var range;
+
+ if (!viewPort || !config.smart_rendering || isLegacyRender(gantt)) {
+ range = {
+ start: 0,
+ end: count - 1
+ };
+ } else {
+ range = getVisibleCellsRange(cfg, viewPort.x);
+ }
+
+ if (config.show_task_cells) {
+ renderedCells[item.id] = {};
+ visibleCells[item.id] = {};
+
+ for (var columnIndex = range.start; columnIndex <= range.end; columnIndex++) {
+ var cell = renderOneCell(cfg, columnIndex, item, viewPort, count, cellCssTemplate, cellHtmlTemplate, config);
+
+ if (cell) {
+ row.appendChild(cell);
+ }
+ }
+ } // GS-291. The odd class should be assigned correctly
+
+
+ var store = view.$config.rowStore;
+ var odd = store.getIndexById(item.id) % 2 !== 0;
+ var cssTemplate = templates.task_row_class(item.start_date, item.end_date, item);
+ var css = "gantt_task_row" + (odd ? " odd" : "") + (cssTemplate ? ' ' + cssTemplate : '');
+
+ if (store.isSelected(item.id)) {
+ css += " gantt_selected";
+ }
+
+ row.className = css;
+
+ if (config.smart_rendering) {
+ row.style.position = "absolute";
+ row.style.top = view.getItemTop(item.id) + "px";
+ row.style.width = "100%";
+ } else {
+ row.style.position = "relative";
+ }
+
+ row.style.height = view.getItemHeight(item.id) + "px";
+
+ if (item.id == "timeline_placeholder_task") {
+ var placeholderTop = 0;
+
+ if (item.lastTaskId) {
+ var lastTaskTop = view.getItemTop(item.lastTaskId);
+ var lastTaskHeight = view.getItemHeight(item.lastTaskId);
+ placeholderTop = lastTaskTop + lastTaskHeight;
+ }
+
+ var maxHeight = item.row_height || view.$task_data.offsetHeight;
+ var placeholderHeight = maxHeight - placeholderTop; // So that it won't exceed the placeholder timeline height
+
+ if (placeholderHeight < 0) {
+ placeholderHeight = 0;
+ }
+
+ if (config.smart_rendering) {
+ row.style.top = placeholderTop + "px";
+ }
+
+ row.style.height = placeholderHeight + "px";
+ }
+
+ if (view.$config.item_attribute) {
+ row.setAttribute(view.$config.item_attribute, item.id);
+ row.setAttribute(view.$config.bind + "_id", item.id); // 'task_id'/'resource_id' for backward compatibility
+ }
+
+ return row;
+ }
+
+ return {
+ render: _render_bg_line,
+ update: renderCells,
+ getRectangle: getRowRectangle,
+ getVisibleRange: getVisibleRange,
+ prepareData: bgPlaceholder
+ };
+}
+
+module.exports = createTaskBgRender;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/task_grid_line_render.js":
+/*!*********************************************************!*\
+ !*** ./sources/core/ui/render/task_grid_line_render.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var helpers = __webpack_require__(/*! ../../../utils/helpers */ "./sources/utils/helpers.js");
+
+var getRowRectangle = __webpack_require__(/*! ./viewport/get_grid_row_rectangle */ "./sources/core/ui/render/viewport/get_grid_row_rectangle.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+function createGridLineRender(gantt) {
+ function _render_grid_item(item, view, config, viewport) {
+ var columns = view.getGridColumns();
+ var templates = view.$getTemplates();
+ var store = view.$config.rowStore;
+ var cells = [];
+ var has_child;
+
+ for (var i = 0; i < columns.length; i++) {
+ var last = i == columns.length - 1;
+ var col = columns[i];
+ var cell;
+ var value;
+ var textValue;
+
+ if (col.name == "add") {
+ var aria = gantt._waiAria.gridAddButtonAttrString(col);
+
+ value = "<div " + aria + " class='gantt_add'></div>";
+ textValue = "";
+ } else {
+ if (col.template) value = col.template(item);else value = item[col.name];
+
+ if (helpers.isDate(value)) {
+ value = templates.date_grid(value, item, col.name);
+ }
+
+ if (value === null || value === undefined) {
+ value = "";
+ }
+
+ textValue = value;
+ value = "<div class='gantt_tree_content'>" + value + "</div>";
+ }
+
+ var css = "gantt_cell" + (last ? " gantt_last_cell" : "");
+ var tree = [];
+
+ if (col.tree) {
+ css += " gantt_cell_tree";
+
+ for (var j = 0; j < item.$level; j++) {
+ tree.push(templates.grid_indent(item));
+ }
+
+ has_child = store.hasChild(item.id) && !(gantt.isSplitTask(item) && !gantt.config.open_split_tasks);
+
+ if (has_child) {
+ tree.push(templates.grid_open(item));
+ tree.push(templates.grid_folder(item));
+ } else {
+ tree.push(templates.grid_blank(item));
+ tree.push(templates.grid_file(item));
+ }
+ }
+
+ var style = "width:" + (col.width - (last ? 1 : 0)) + "px;";
+
+ if (this.defined(col.align)) {
+ var flexAlign = {
+ right: "flex-end",
+ left: "flex-start",
+ center: "center"
+ };
+ var justifyContent = flexAlign[col.align];
+ style += "text-align:" + col.align + ";justify-content:" + justifyContent + ";";
+ }
+
+ var aria = gantt._waiAria.gridCellAttrString(col, textValue, item);
+
+ tree.push(value);
+ cell = "<div class='" + css + "' data-column-index='" + i + "' data-column-name='" + col.name + "' style='" + style + "' " + aria + ">" + tree.join("") + "</div>";
+ cells.push(cell);
+ } // GS-291. The odd class should be assigned correctly
+
+
+ css = "";
+ var storeName = store.$config.name;
+
+ switch (storeName) {
+ case "task":
+ css = gantt.getGlobalTaskIndex(item.id) % 2 === 0 ? "" : " odd";
+ break;
+
+ case "resource":
+ css = store.visibleOrder.indexOf(item.id) % 2 === 0 ? "" : " odd";
+ break;
+ }
+
+ css += item.$transparent ? " gantt_transparent" : "";
+ css += item.$dataprocessor_class ? " " + item.$dataprocessor_class : "";
+
+ if (templates.grid_row_class) {
+ var css_template = templates.grid_row_class.call(gantt, item.start_date, item.end_date, item);
+ if (css_template) css += " " + css_template;
+ }
+
+ if (store.isSelected(item.id)) {
+ css += " gantt_selected";
+ }
+
+ var el = document.createElement("div");
+ el.className = "gantt_row" + css + " gantt_row_" + gantt.getTaskType(item.type);
+ var height = view.getItemHeight(item.id);
+ el.style.height = height + "px";
+ el.style.lineHeight = height + "px";
+
+ if (config.smart_rendering) {
+ el.style.position = "absolute";
+ el.style.left = "0px";
+ el.style.top = view.getItemTop(item.id) + "px";
+ }
+
+ if (view.$config.item_attribute) {
+ el.setAttribute(view.$config.item_attribute, item.id);
+ el.setAttribute(view.$config.bind + "_id", item.id); // 'task_id'/'resource_id' for backward compatibility
+ }
+
+ gantt._waiAria.taskRowAttr(item, el);
+
+ el.innerHTML = cells.join("");
+ return el;
+ }
+
+ function onrender(item, rowNode, view) {
+ var columns = view.getGridColumns();
+
+ for (var i = 0; i < columns.length; i++) {
+ var column = columns[i];
+
+ if (column.onrender) {
+ // find cell node for current column
+ var cellNode = rowNode.querySelector("[data-column-name=" + column.name + "]");
+
+ if (cellNode) {
+ var content = column.onrender(item, cellNode);
+
+ if (content && typeof content === "string") {
+ cellNode.innerHTML = content;
+ } else if (content && _typeof(content) === "object") {
+ // render object to node using additional functionality
+ if (gantt.config.external_render) {
+ var adapter = gantt.config.external_render;
+
+ if (adapter.isElement(content)) {
+ adapter.renderElement(content, cellNode);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ render: _render_grid_item,
+ update: null,
+ getRectangle: getRowRectangle,
+ getVisibleRange: getVisibleRange,
+ onrender: onrender
+ };
+}
+
+module.exports = createGridLineRender;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/task_grid_row_resize_render.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/render/task_grid_row_resize_render.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getRowRectangle = __webpack_require__(/*! ./viewport/get_grid_row_rectangle */ "./sources/core/ui/render/viewport/get_grid_row_rectangle.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+function createGridTaskRowResizerRender(gantt) {
+ function _render_grid_item(item, view, viewport) {
+ var config = view.$getConfig();
+ var resize_el = document.createElement("div");
+ resize_el.className = "gantt_task_grid_row_resize_wrap";
+ resize_el.style.top = view.getItemTop(item.id) + view.getItemHeight(item.id) + "px";
+ resize_el.innerHTML = "<div class='gantt_task_grid_row_resize' role='cell'></div>";
+ resize_el.setAttribute(config.task_grid_row_resizer_attribute, item.id);
+
+ gantt._waiAria.rowResizerAttr(resize_el);
+
+ return resize_el;
+ }
+
+ return {
+ render: _render_grid_item,
+ update: null,
+ getRectangle: getRowRectangle,
+ getVisibleRange: getVisibleRange
+ };
+}
+
+module.exports = createGridTaskRowResizerRender;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/task_rollup_render.js":
+/*!******************************************************!*\
+ !*** ./sources/core/ui/render/task_rollup_render.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createBaseBarRender = __webpack_require__(/*! ./task_bar_render */ "./sources/core/ui/render/task_bar_render.js");
+
+var isInViewPort = __webpack_require__(/*! ./viewport/is_bar_in_viewport */ "./sources/core/ui/render/viewport/is_bar_in_viewport.js");
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+function createTaskRenderer(gantt) {
+ var defaultRender = createBaseBarRender(gantt);
+ var renderedNodes = {};
+
+ function checkVisibility(child, viewPort, timeline, config, gantt) {
+ var isVisible = true; // GS-2123. Don't render rollup tasks that are outside the viewport
+
+ if (config.smart_rendering) {
+ isVisible = isInViewPort(child, viewPort, timeline, config, gantt);
+ }
+
+ return isVisible;
+ }
+
+ function generateChildElement(task, child, timeline, sizes) {
+ var childCopy = gantt.copy(gantt.getTask(child.id));
+ childCopy.$rendered_at = task.id; // a way to filter rollup tasks:
+
+ var displayRollup = gantt.callEvent("onBeforeRollupTaskDisplay", [childCopy.id, childCopy, task.id]);
+
+ if (displayRollup === false) {
+ return;
+ }
+
+ var element = defaultRender(childCopy, timeline);
+
+ if (!element) {
+ return;
+ }
+
+ var height = timeline.getBarHeight(task.id, child.type == gantt.config.types.milestone);
+ var padding = Math.floor((timeline.getItemHeight(task.id) - height) / 2);
+ element.style.top = sizes.top + padding + "px";
+ element.classList.add("gantt_rollup_child");
+ element.setAttribute("data-rollup-parent-id", task.id);
+ return element;
+ }
+
+ function getKey(childId, renderParentId) {
+ return childId + "_" + renderParentId;
+ }
+
+ function renderRollupTask(task, timeline, config, viewPort) {
+ if (task.rollup !== false && task.$rollup && task.$rollup.length) {
+ var el = document.createElement('div'),
+ sizes = gantt.getTaskPosition(task); // vertical position is not important for the rollup tasks as long as the parent is rendered
+
+ viewPort.y = 0;
+ viewPort.y_end = gantt.$task_bg.scrollHeight;
+ task.$rollup.forEach(function (itemId) {
+ if (!gantt.isTaskExists(itemId)) {
+ return;
+ }
+
+ var child = gantt.getTask(itemId);
+ var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);
+
+ if (!isVisible) {
+ return;
+ }
+
+ var element = generateChildElement(task, child, timeline, sizes);
+
+ if (element) {
+ renderedNodes[getKey(child.id, task.id)] = element;
+ el.appendChild(element);
+ } else {
+ renderedNodes[getKey(child.id, task.id)] = false;
+ }
+ });
+ return el;
+ }
+
+ return false;
+ }
+
+ function repaintRollupTask(task, itemNode, timeline, config, viewPort) {
+ var el = document.createElement("div"),
+ sizes = gantt.getTaskPosition(task); // vertical position is not important for the rollup tasks as long as the parent is rendered
+
+ viewPort.y = 0;
+ viewPort.y_end = gantt.$task_bg.scrollHeight;
+ task.$rollup.forEach(function (itemId) {
+ var child = gantt.getTask(itemId);
+ var rollupKey = getKey(child.id, task.id);
+ var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);
+
+ if (isVisible !== !!renderedNodes[rollupKey]) {
+ if (isVisible) {
+ var element = generateChildElement(task, child, timeline, sizes);
+ renderedNodes[rollupKey] = element || false;
+ } else {
+ renderedNodes[rollupKey] = false;
+ }
+ }
+
+ if (!!renderedNodes[rollupKey]) {
+ el.appendChild(renderedNodes[rollupKey]);
+ }
+
+ itemNode.innerHTML = "";
+ itemNode.appendChild(el);
+ });
+ }
+
+ return {
+ render: renderRollupTask,
+ update: repaintRollupTask,
+ //getRectangle: getBarRectangle
+ isInViewPort: isInViewPort,
+ getVisibleRange: getVisibleRange
+ };
+}
+
+module.exports = createTaskRenderer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/task_split_render.js":
+/*!*****************************************************!*\
+ !*** ./sources/core/ui/render/task_split_render.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createBaseBarRender = __webpack_require__(/*! ./task_bar_render */ "./sources/core/ui/render/task_bar_render.js"); //const isInViewPort = require("./viewport/is_split_task_in_viewport");
+
+
+var getVisibleRange = __webpack_require__(/*! ./viewport/get_visible_bars_range */ "./sources/core/ui/render/viewport/get_visible_bars_range.js");
+
+var isInViewPortParent = __webpack_require__(/*! ./viewport/is_split_task_in_viewport */ "./sources/core/ui/render/viewport/is_split_task_in_viewport.js");
+
+var isInViewPortChild = __webpack_require__(/*! ./viewport/is_bar_in_viewport */ "./sources/core/ui/render/viewport/is_bar_in_viewport.js");
+
+function createTaskRenderer(gantt) {
+ var defaultRender = createBaseBarRender(gantt);
+ var renderedNodes = {};
+
+ function checkVisibility(child, viewPort, timeline, config, gantt) {
+ var isVisible = !child.hide_bar; // GS-1195. Don't render split tasks that are outside the viewport
+
+ if (config.smart_rendering && isVisible) {
+ isVisible = isInViewPortChild(child, viewPort, timeline, config, gantt);
+ }
+
+ return isVisible;
+ }
+
+ function generateChildElement(task, child, timeline, sizes) {
+ if (child.hide_bar) {
+ return;
+ }
+
+ var isProject = gantt.isSummaryTask(child);
+
+ if (isProject) {
+ gantt.resetProjectDates(child);
+ }
+
+ var childCopy = gantt.copy(gantt.getTask(child.id));
+ childCopy.$rendered_at = task.id; // a way to filter split tasks:
+
+ var showSplitTask = gantt.callEvent("onBeforeSplitTaskDisplay", [childCopy.id, childCopy, task.id]);
+
+ if (showSplitTask === false) {
+ return;
+ }
+
+ var element = defaultRender(childCopy, timeline);
+ if (!element) return;
+ var height = timeline.getBarHeight(task.id, child.type == gantt.config.types.milestone);
+ var padding = Math.floor((timeline.getItemHeight(task.id) - height) / 2);
+ element.style.top = sizes.top + padding + "px";
+ element.classList.add("gantt_split_child");
+
+ if (isProject) {
+ element.classList.add("gantt_split_subproject");
+ }
+
+ return element;
+ }
+
+ function getKey(childId, renderParentId) {
+ return childId + "_" + renderParentId;
+ }
+
+ function shouldUseSplitRendering(task, config) {
+ return gantt.isSplitTask(task) && (config.open_split_tasks && !task.$open || !config.open_split_tasks) && gantt.hasChild(task.id);
+ }
+
+ function renderSplitTask(task, timeline, config, viewPort) {
+ if (shouldUseSplitRendering(task, config)) {
+ var el = document.createElement('div'),
+ sizes = gantt.getTaskPosition(task);
+
+ if (gantt.hasChild(task.id)) {
+ gantt.eachTask(function (child) {
+ var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);
+
+ if (!isVisible) {
+ return;
+ }
+
+ var element = generateChildElement(task, child, timeline, sizes);
+
+ if (element) {
+ renderedNodes[getKey(child.id, task.id)] = element;
+ el.appendChild(element);
+ } else {
+ renderedNodes[getKey(child.id, task.id)] = false;
+ }
+ }, task.id);
+ }
+
+ return el;
+ }
+
+ return false;
+ }
+
+ function repaintSplitTask(task, itemNode, timeline, config, viewPort) {
+ if (shouldUseSplitRendering(task, config)) {
+ var el = document.createElement("div"),
+ sizes = gantt.getTaskPosition(task);
+ gantt.eachTask(function (child) {
+ var splitKey = getKey(child.id, task.id);
+ var isVisible = checkVisibility(child, viewPort, timeline, config, gantt);
+
+ if (isVisible !== !!renderedNodes[splitKey]) {
+ if (isVisible) {
+ var element = generateChildElement(task, child, timeline, sizes);
+ renderedNodes[splitKey] = element || false;
+ } else {
+ renderedNodes[splitKey] = false;
+ }
+ }
+
+ if (!!renderedNodes[splitKey]) {
+ el.appendChild(renderedNodes[splitKey]);
+ }
+
+ itemNode.innerHTML = "";
+ itemNode.appendChild(el);
+ }, task.id);
+ }
+ }
+
+ return {
+ render: renderSplitTask,
+ update: repaintSplitTask,
+ isInViewPort: isInViewPortParent,
+ getVisibleRange: getVisibleRange
+ };
+}
+
+module.exports = createTaskRenderer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/factory/get_visible_link_range.js":
+/*!***************************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/factory/get_visible_link_range.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getLinkRectangle = __webpack_require__(/*! ../get_link_rectangle */ "./sources/core/ui/render/viewport/get_link_rectangle.js");
+
+module.exports = function () {
+ var coordinates = [];
+ var calculated = false;
+
+ function clearCache() {
+ coordinates = [];
+ calculated = false;
+ }
+
+ function buildCache(datastore, view, gantt) {
+ var config = view.$getConfig();
+ var visibleItems = datastore.getVisibleItems(); //datastore.eachItem(function(link){
+
+ visibleItems.forEach(function (link) {
+ var rec = getLinkRectangle(link, view, config, gantt);
+
+ if (!rec) {
+ return;
+ }
+
+ coordinates.push({
+ id: link.id,
+ rec: rec
+ });
+ });
+ coordinates.sort(function (a, b) {
+ if (a.rec.right < b.rec.right) {
+ return -1;
+ } else {
+ return 1;
+ }
+ });
+ calculated = true;
+ }
+
+ var initialized = false;
+
+ function init(datastore) {
+ if (initialized) {
+ return;
+ }
+
+ initialized = true;
+ datastore.attachEvent("onPreFilter", clearCache);
+ datastore.attachEvent("onStoreUpdated", clearCache);
+ datastore.attachEvent("onClearAll", clearCache);
+ datastore.attachEvent("onBeforeStoreUpdate", clearCache);
+ }
+
+ return function getVisibleLinksRange(gantt, view, config, datastore, viewport) {
+ init(datastore);
+
+ if (!calculated) {
+ buildCache(datastore, view, gantt);
+ }
+
+ var visibleBoxes = [];
+
+ for (var i = 0; i < coordinates.length; i++) {
+ var item = coordinates[i];
+ var box = item.rec;
+
+ if (box.right < viewport.x) {
+ continue;
+ }
+
+ if (box.left < viewport.x_end && box.right > viewport.x && box.top < viewport.y_end && box.bottom > viewport.y) {
+ visibleBoxes.push(item.id);
+ }
+ }
+
+ return {
+ ids: visibleBoxes
+ };
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/get_bar_rectangle.js":
+/*!**************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/get_bar_rectangle.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (item, view, config) {
+ if (!item.start_date || !item.end_date) {
+ return null;
+ }
+
+ var padding = 200;
+ var startCoord = view.posFromDate(item.start_date);
+ var endCoord = view.posFromDate(item.end_date);
+ var left = Math.min(startCoord, endCoord) - padding;
+ var right = Math.max(startCoord, endCoord) + padding;
+ return {
+ top: view.getItemTop(item.id),
+ height: view.getItemHeight(item.id),
+ left: left,
+ width: right - left
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/get_bg_row_rectangle.js":
+/*!*****************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/get_bg_row_rectangle.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (item, view, config) {
+ return {
+ top: view.getItemTop(item.id),
+ height: view.getItemHeight(item.id),
+ left: 0,
+ right: Infinity
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/get_grid_row_rectangle.js":
+/*!*******************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/get_grid_row_rectangle.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (item, view, config) {
+ return {
+ top: view.getItemTop(item.id),
+ height: view.getItemHeight(item.id),
+ left: 0,
+ right: Infinity
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/get_link_rectangle.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/get_link_rectangle.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var barRectangle = __webpack_require__(/*! ./get_bar_rectangle */ "./sources/core/ui/render/viewport/get_bar_rectangle.js");
+
+module.exports = function getLinkBox(item, view, config, gantt) {
+ if (!gantt.isTaskExists(item.source)) {
+ return null;
+ }
+
+ if (!gantt.isTaskExists(item.target)) {
+ return null;
+ }
+
+ var sourceBox = barRectangle(gantt.getTask(item.source), view, gantt);
+ var targetBox = barRectangle(gantt.getTask(item.target), view, gantt);
+
+ if (!sourceBox || !targetBox) {
+ return null;
+ }
+
+ var padding = 100;
+ var left = Math.min(sourceBox.left, targetBox.left) - padding;
+ var right = Math.max(sourceBox.left + sourceBox.width, targetBox.left + targetBox.width) + padding;
+ var top = Math.min(sourceBox.top, targetBox.top) - padding;
+ var bottom = Math.max(sourceBox.top + sourceBox.height, targetBox.top + targetBox.height) + padding;
+ return {
+ top: top,
+ height: bottom - top,
+ bottom: bottom,
+ left: left,
+ width: right - left,
+ right: right
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/get_visible_bars_range.js":
+/*!*******************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/get_visible_bars_range.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function getVisibleTasksRange(gantt, view, config, datastore, viewport) {
+ var buffer = 1;
+ var start = view.getItemIndexByTopPosition(viewport.y) || 0;
+ var end = view.getItemIndexByTopPosition(viewport.y_end) || datastore.count();
+ var indexStart = Math.max(0, start - buffer);
+ var indexEnd = Math.min(datastore.count(), end + buffer);
+ return {
+ start: indexStart,
+ end: indexEnd
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/get_visible_cells_range.js":
+/*!********************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/get_visible_cells_range.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function getVisibleCellsRange(scale, viewport) {
+ var firstCellIndex = 0;
+ var lastCellIndex = scale.left.length - 1;
+
+ if (viewport) {
+ for (var i = 0; i < scale.left.length; i++) {
+ var left = scale.left[i];
+
+ if (left < viewport.x) {
+ firstCellIndex = i;
+ }
+
+ if (left > viewport.x_end) {
+ lastCellIndex = i;
+ break;
+ }
+ }
+ }
+
+ return {
+ start: firstCellIndex,
+ end: lastCellIndex
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/is_bar_in_viewport.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/is_bar_in_viewport.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// optimized checker for task bars smart rendering
+// first check the vertical position since it's easier to calculate
+module.exports = function isBarInViewport(item, viewport, view, config, gantt) {
+ if (!item.start_date || !item.end_date) {
+ return null;
+ }
+
+ var top = view.getItemTop(item.id);
+ var height = view.getItemHeight(item.id);
+
+ if (top > viewport.y_end || top + height < viewport.y) {
+ return false;
+ }
+
+ var padding = 200;
+ var startCoord = view.posFromDate(item.start_date);
+ var endCoord = view.posFromDate(item.end_date);
+ var left = Math.min(startCoord, endCoord) - padding;
+ var right = Math.max(startCoord, endCoord) + padding;
+
+ if (left > viewport.x_end || right < viewport.x) {
+ return false;
+ }
+
+ return true;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/is_column_visible.js":
+/*!**************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/is_column_visible.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isLegacyRender = __webpack_require__(/*! ../is_legacy_smart_render */ "./sources/core/ui/render/is_legacy_smart_render.js");
+
+module.exports = function isColumnVisible(columnIndex, scale, viewPort, gantt) {
+ var width = scale.width[columnIndex];
+
+ if (width <= 0) {
+ return false;
+ }
+
+ if (!gantt.config.smart_rendering || isLegacyRender(gantt)) {
+ return true;
+ }
+
+ var cellLeftCoord = scale.left[columnIndex] - width;
+ var cellRightCoord = scale.left[columnIndex] + width;
+ return cellLeftCoord <= viewPort.x_end && cellRightCoord >= viewPort.x; //do not render skipped columns
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/is_in_viewport.js":
+/*!***********************************************************!*\
+ !*** ./sources/core/ui/render/viewport/is_in_viewport.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (viewport, box) {
+ if (!box) {
+ return false;
+ }
+
+ if (box.left > viewport.x_end || box.left + box.width < viewport.x) {
+ return false;
+ }
+
+ if (box.top > viewport.y_end || box.top + box.height < viewport.y) {
+ return false;
+ }
+
+ return true;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/is_link_in_viewport.js":
+/*!****************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/is_link_in_viewport.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// optimized checker for links smart rendering
+// first check the vertical position since it's easier to calculate
+module.exports = function isLinkInViewPort(item, viewport, view, config, gantt) {
+ var source = view.$gantt.getTask(item.source);
+ var target = view.$gantt.getTask(item.target); // check vertical visibility first since it's a lighter check
+
+ var sourceTop = view.getItemTop(source.id);
+ var sourceHeight = view.getItemHeight(source.id);
+ var targetTop = view.getItemTop(target.id);
+ var targetHeight = view.getItemHeight(target.id);
+
+ if (viewport.y > sourceTop + sourceHeight && viewport.y > targetTop + targetHeight) {
+ return false;
+ }
+
+ if (viewport.y_end < targetTop && viewport.y_end < sourceTop) {
+ return false;
+ }
+
+ var padding = 100;
+ var sourceLeft = view.posFromDate(source.start_date);
+ var sourceRight = view.posFromDate(source.end_date);
+ var targetLeft = view.posFromDate(target.start_date);
+ var targetRight = view.posFromDate(target.end_date);
+
+ if (sourceLeft > sourceRight) {
+ // rtl
+ var tmp = sourceRight;
+ sourceRight = sourceLeft;
+ sourceLeft = tmp;
+ }
+
+ if (targetLeft > targetRight) {
+ // rtl
+ var tmp = targetRight;
+ targetRight = targetLeft;
+ targetLeft = tmp;
+ }
+
+ sourceLeft += -padding; // add buffer for custom elements
+
+ sourceRight += padding;
+ targetLeft += -padding; // add buffer for custom elements
+
+ targetRight += padding;
+
+ if (viewport.x > sourceRight && viewport.x > targetRight) {
+ return false;
+ }
+
+ if (viewport.x_end < sourceLeft && viewport.x_end < targetLeft) {
+ return false;
+ }
+
+ return true;
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/render/viewport/is_split_task_in_viewport.js":
+/*!**********************************************************************!*\
+ !*** ./sources/core/ui/render/viewport/is_split_task_in_viewport.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isBarInViewport = __webpack_require__(/*! ./is_bar_in_viewport */ "./sources/core/ui/render/viewport/is_bar_in_viewport.js");
+
+module.exports = function isSplitTaskInViewport(item, viewport, view, config, gantt) {
+ if (!gantt.isSplitTask(item)) {
+ return false;
+ }
+
+ var range = gantt.getSubtaskDates(item.id);
+ return isBarInViewport({
+ id: item.id,
+ start_date: range.start_date,
+ end_date: range.end_date,
+ parent: item.parent
+ }, viewport, view, gantt);
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/resize_listener.js":
+/*!********************************************!*\
+ !*** ./sources/core/ui/resize_listener.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function addResizeListener(gantt) {
+ var containerStyles = window.getComputedStyle(gantt.$root);
+
+ if (containerStyles.getPropertyValue("position") == "static") {
+ gantt.$root.style.position = "relative";
+ }
+
+ var resizeWatcher = document.createElement('iframe');
+ resizeWatcher.className = "gantt_container_resize_watcher";
+ resizeWatcher.tabIndex = -1;
+
+ if (gantt.config.wai_aria_attributes) {
+ resizeWatcher.setAttribute("role", "none");
+ resizeWatcher.setAttribute("aria-hidden", true);
+ }
+
+ var salesforce_environment = !!window["Sfdc"] || !!window["$A"] || window["Aura"];
+
+ if (salesforce_environment) {
+ gantt.config.container_resize_method = "timeout";
+ } // in some environments (namely, in SalesForce) iframe.contentWindow is not available
+
+
+ gantt.$root.appendChild(resizeWatcher);
+
+ if (resizeWatcher.contentWindow) {
+ listenWindowResize(gantt, resizeWatcher.contentWindow);
+ } else {
+ // if so - ditch the iframe and fallback to listening the main window resize
+ gantt.$root.removeChild(resizeWatcher);
+ listenWindowResize(gantt, window);
+ }
+}
+
+function listenWindowResize(gantt, window) {
+ var resizeTimeout = gantt.config.container_resize_timeout || 20;
+ var resizeDelay;
+
+ if (gantt.config.container_resize_method == "timeout") {
+ lowlevelResizeWatcher();
+ } else {
+ try {
+ gantt.event(window, "resize", function () {
+ if (gantt.$scrollbarRepaint) {
+ gantt.$scrollbarRepaint = null;
+ } else {
+ repaintGantt();
+ }
+ });
+ } catch (e) {
+ lowlevelResizeWatcher();
+ }
+ }
+
+ function repaintGantt() {
+ clearTimeout(resizeDelay);
+ resizeDelay = setTimeout(function () {
+ if (!gantt.$destroyed) {
+ gantt.render();
+ }
+ }, resizeTimeout);
+ }
+
+ var previousHeight = gantt.$root.offsetHeight;
+ var previousWidth = gantt.$root.offsetWidth;
+
+ function lowlevelResizeWatcher() {
+ if (gantt.$root.offsetHeight != previousHeight || gantt.$root.offsetWidth != previousWidth) {
+ repaintGantt();
+ }
+
+ previousHeight = gantt.$root.offsetHeight;
+ previousWidth = gantt.$root.offsetWidth;
+ setTimeout(lowlevelResizeWatcher, resizeTimeout);
+ }
+}
+
+module.exports = addResizeListener;
+
+/***/ }),
+
+/***/ "./sources/core/ui/row_position_fixed_height.js":
+/*!******************************************************!*\
+ !*** ./sources/core/ui/row_position_fixed_height.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function createHelper(view) {
+ var cachedRowHeight = -1;
+ var canUseSimpleCalc = -1;
+ return {
+ resetCache: function resetCache() {
+ cachedRowHeight = -1;
+ canUseSimpleCalc = -1;
+ },
+ _getRowHeight: function _getRowHeight() {
+ if (cachedRowHeight === -1) {
+ cachedRowHeight = view.$getConfig().row_height;
+ }
+
+ return cachedRowHeight;
+ },
+ _refreshState: function _refreshState() {
+ this.resetCache();
+ canUseSimpleCalc = true;
+ var store = view.$config.rowStore;
+
+ if (!store) {
+ return;
+ }
+
+ var globalRowHeight = this._getRowHeight();
+
+ for (var i = 0; i < store.fullOrder.length; i++) {
+ var item = store.getItem(store.fullOrder[i]); // GS-1491: ignore the task when it is filtered:
+
+ if (!item) {
+ continue;
+ }
+
+ if (item.row_height && item.row_height !== globalRowHeight) {
+ canUseSimpleCalc = false;
+ break;
+ }
+ }
+ },
+ canUseSimpleCalculation: function canUseSimpleCalculation() {
+ if (canUseSimpleCalc === -1) {
+ this._refreshState();
+ }
+
+ return canUseSimpleCalc;
+ },
+
+ /**
+ * Get top coordinate by row index (order)
+ * @param {number} index
+ */
+ getRowTop: function getRowTop(index) {
+ var store = view.$config.rowStore;
+
+ if (!store) {
+ return 0;
+ }
+
+ return index * this._getRowHeight();
+ },
+
+ /**
+ * Get height of the item by item id
+ * @param {*} itemId
+ */
+ getItemHeight: function getItemHeight(itemId) {
+ return this._getRowHeight();
+ },
+
+ /**
+ * Get total height of items
+ */
+ getTotalHeight: function getTotalHeight() {
+ if (view.$config.rowStore) {
+ var store = view.$config.rowStore;
+ return store.countVisible() * this._getRowHeight();
+ } else {
+ return 0;
+ }
+ },
+
+ /**
+ * Get item by top position
+ * @param {*} top
+ */
+ getItemIndexByTopPosition: function getItemIndexByTopPosition(top) {
+ if (view.$config.rowStore) {
+ return Math.floor(top / this._getRowHeight());
+ } else {
+ return 0;
+ }
+ }
+ };
+}
+
+module.exports = createHelper;
+
+/***/ }),
+
+/***/ "./sources/core/ui/row_position_mixin.js":
+/*!***********************************************!*\
+ !*** ./sources/core/ui/row_position_mixin.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var quickPositionHelperFactory = __webpack_require__(/*! ./row_position_fixed_height */ "./sources/core/ui/row_position_fixed_height.js");
+
+function createMixin(view) {
+ var getItemTopCache = {};
+ var getRowTopCache = {};
+ var getItemHeightCache = null;
+ var totalHeightCache = -1;
+ var getItemHeightCacheState = null;
+ var quickPosition = quickPositionHelperFactory(view);
+ return {
+ _resetTopPositionHeight: function _resetTopPositionHeight() {
+ getItemTopCache = {};
+ getRowTopCache = {};
+ quickPosition.resetCache();
+ },
+ _resetHeight: function _resetHeight() {
+ var store = this.$config.rowStore;
+ var newState = this.getCacheStateTotalHeight(store);
+
+ if (!getItemHeightCacheState) {
+ getItemHeightCacheState = newState;
+ } else if (this.shouldClearHeightCache(getItemHeightCacheState, newState)) {
+ getItemHeightCacheState = newState;
+ getItemHeightCache = null;
+ }
+
+ totalHeightCache = -1;
+ quickPosition.resetCache();
+ },
+
+ /**
+ * Get top coordinate by row index (order)
+ * @param {number} index
+ */
+ getRowTop: function getRowTop(index) {
+ if (quickPosition.canUseSimpleCalculation()) {
+ return quickPosition.getRowTop(index);
+ }
+
+ var store = this.$config.rowStore;
+
+ if (!store) {
+ return 0;
+ }
+
+ if (getRowTopCache[index] !== undefined) {
+ return getRowTopCache[index];
+ } else {
+ var all = store.getIndexRange();
+ var top = 0;
+ var result = 0;
+
+ for (var i = 0; i < all.length; i++) {
+ getRowTopCache[i] = top;
+ top += this.getItemHeight(all[i].id);
+
+ if (i < index) {
+ result = top;
+ }
+ }
+
+ return result;
+ }
+ },
+
+ /**
+ * Get top coordinate by item id
+ * @param {*} task_id
+ */
+ getItemTop: function getItemTop(taskId) {
+ if (this.$config.rowStore) {
+ if (getItemTopCache[taskId] !== undefined) {
+ return getItemTopCache[taskId];
+ }
+
+ var store = this.$config.rowStore;
+ if (!store) return 0;
+ var itemIndex = store.getIndexById(taskId);
+
+ if (itemIndex === -1 && store.getParent && store.exists(taskId)) {
+ var parentId = store.getParent(taskId);
+
+ if (store.exists(parentId)) {
+ // if task is not found in list - maybe it's parent is a split task and we should use parents index instead
+ var parent = store.getItem(parentId);
+
+ if (this.$gantt.isSplitTask(parent)) {
+ return this.getItemTop(parentId);
+ }
+ }
+ }
+
+ getItemTopCache[taskId] = this.getRowTop(itemIndex);
+ return getItemTopCache[taskId];
+ } else {
+ return 0;
+ }
+ },
+
+ /**
+ * Get height of the item by item id
+ * @param {*} itemId
+ */
+ getItemHeight: function getItemHeight(itemId) {
+ if (quickPosition.canUseSimpleCalculation()) {
+ return quickPosition.getItemHeight(itemId);
+ }
+
+ if (!getItemHeightCache && this.$config.rowStore) {
+ this._fillHeightCache(this.$config.rowStore);
+ }
+
+ if (getItemHeightCache[itemId] !== undefined) {
+ return getItemHeightCache[itemId];
+ }
+
+ var defaultHeight = this.$getConfig().row_height;
+
+ if (this.$config.rowStore) {
+ var store = this.$config.rowStore;
+ if (!store) return defaultHeight;
+ var item = store.getItem(itemId);
+ return getItemHeightCache[itemId] = item && item.row_height || defaultHeight;
+ } else {
+ return defaultHeight;
+ }
+ },
+ _fillHeightCache: function _fillHeightCache(store) {
+ if (!store) {
+ return;
+ }
+
+ getItemHeightCache = {};
+ var defaultHeight = this.$getConfig().row_height;
+ store.eachItem(function (item) {
+ return getItemHeightCache[item.id] = item && item.row_height || defaultHeight;
+ });
+ },
+ getCacheStateTotalHeight: function getCacheStateTotalHeight(store) {
+ var globalHeight = this.$getConfig().row_height;
+ var itemHeightCache = {};
+ var items = [];
+ var sumHeight = 0;
+
+ if (store) {
+ store.eachItem(function (item) {
+ items.push(item);
+ itemHeightCache[item.id] = item.row_height;
+ sumHeight += item.row_height || globalHeight;
+ });
+ }
+
+ return {
+ globalHeight: globalHeight,
+ items: items,
+ count: items.length,
+ sumHeight: sumHeight
+ };
+ },
+ shouldClearHeightCache: function shouldClearHeightCache(oldState, newState) {
+ if (oldState.count != newState.count) {
+ return true;
+ }
+
+ if (oldState.globalHeight != newState.globalHeight) {
+ return true;
+ }
+
+ if (oldState.sumHeight != newState.sumHeight) {
+ return true;
+ }
+
+ for (var i in oldState.items) {
+ var newValue = newState.items[i];
+
+ if (newValue !== undefined && newValue != oldState.items[i]) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ /**
+ * Get total height of items
+ */
+ getTotalHeight: function getTotalHeight() {
+ if (quickPosition.canUseSimpleCalculation()) {
+ return quickPosition.getTotalHeight();
+ }
+
+ if (totalHeightCache != -1) {
+ return totalHeightCache;
+ }
+
+ if (this.$config.rowStore) {
+ var store = this.$config.rowStore;
+
+ this._fillHeightCache(store);
+
+ var getHeight = this.getItemHeight.bind(this);
+ var visibleItems = store.getVisibleItems();
+ var totalHeight = 0;
+ visibleItems.forEach(function (item) {
+ totalHeight += getHeight(item.id);
+ });
+ totalHeightCache = totalHeight;
+ return totalHeight;
+ } else {
+ return 0;
+ }
+ },
+
+ /**
+ * Get item by top position
+ * @param {*} top
+ */
+ getItemIndexByTopPosition: function getItemIndexByTopPosition(top) {
+ if (this.$config.rowStore) {
+ if (quickPosition.canUseSimpleCalculation()) {
+ return quickPosition.getItemIndexByTopPosition(top);
+ }
+
+ var store = this.$config.rowStore;
+
+ for (var i = 0; i < store.countVisible(); i++) {
+ var current = this.getRowTop(i);
+ var next = this.getRowTop(i + 1);
+
+ if (!next) {
+ var taskId = store.getIdByIndex(i);
+ next = current + this.getItemHeight(taskId);
+ }
+
+ if (top >= current && top < next) {
+ return i;
+ }
+ } // GS-1723: If we iterated all tasks and didn't find the position, the target is below all other tasks
+
+
+ return store.countVisible() + 2;
+ } else {
+ return 0;
+ }
+ }
+ };
+}
+
+module.exports = createMixin;
+
+/***/ }),
+
+/***/ "./sources/core/ui/skin.js":
+/*!*********************************!*\
+ !*** ./sources/core/ui/skin.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _configure(col, data, force) {
+ for (var key in data) {
+ if (typeof col[key] == "undefined" || force) col[key] = data[key];
+ }
+}
+
+function _get_skin(force, gantt) {
+ var skin = gantt.skin;
+
+ if (!skin || force) {
+ var links = document.getElementsByTagName("link");
+
+ for (var i = 0; i < links.length; i++) {
+ var res = links[i].href.match("dhtmlxgantt_([a-z_]+).css");
+
+ if (res) {
+ if (gantt.skins[res[1]] || !skin) {
+ skin = res[1];
+ break;
+ }
+ }
+ }
+ }
+
+ gantt.skin = skin || "terrace";
+ var skinset = gantt.skins[gantt.skin] || gantt.skins["terrace"]; //apply skin related settings
+
+ _configure(gantt.config, skinset.config, force);
+
+ var config = gantt.getGridColumns();
+ if (config[1] && !gantt.defined(config[1].width)) config[1].width = skinset._second_column_width;
+ if (config[2] && !gantt.defined(config[2].width)) config[2].width = skinset._third_column_width;
+
+ for (var i = 0; i < config.length; i++) {
+ var column = config[i];
+
+ if (column.name == "add") {
+ if (!column.width) {
+ column.width = 44;
+ }
+
+ if (!(gantt.defined(column.min_width) && gantt.defined(column.max_width))) {
+ column.min_width = column.min_width || column.width;
+ column.max_width = column.max_width || column.width;
+ }
+
+ if (column.min_width) column.min_width = +column.min_width;
+ if (column.max_width) column.max_width = +column.max_width;
+
+ if (column.width) {
+ column.width = +column.width;
+ column.width = column.min_width && column.min_width > column.width ? column.min_width : column.width;
+ column.width = column.max_width && column.max_width < column.width ? column.max_width : column.width;
+ }
+ }
+ }
+
+ if (skinset.config.task_height) {
+ gantt.config.task_height = skinset.config.task_height || "full";
+ }
+
+ if (skinset.config.bar_height) {
+ gantt.config.bar_height = skinset.config.bar_height || "full";
+ }
+
+ if (skinset._lightbox_template) gantt._lightbox_template = skinset._lightbox_template;
+
+ if (skinset._redefine_lightbox_buttons) {
+ gantt.config.buttons_right = skinset._redefine_lightbox_buttons["buttons_right"];
+ gantt.config.buttons_left = skinset._redefine_lightbox_buttons["buttons_left"];
+ }
+
+ gantt.resetLightbox();
+}
+
+module.exports = function (gantt) {
+ if (!gantt.resetSkin) {
+ gantt.resetSkin = function () {
+ this.skin = "";
+
+ _get_skin(true, this);
+ };
+
+ gantt.skins = {};
+ gantt.attachEvent("onGanttLayoutReady", function () {
+ _get_skin(false, this);
+ });
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/timeline/links_dnd.js":
+/*!***********************************************!*\
+ !*** ./sources/core/ui/timeline/links_dnd.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var initLinksDND = function initLinksDND(timeline, gantt) {
+ var _link_landing,
+ _link_target_task,
+ _link_target_task_start,
+ _link_source_task,
+ _link_source_task_start,
+ markerDefaultOffset = 10,
+ scrollDefaultSize = 18;
+
+ function getVisibleMilestoneWidth(taskId) {
+ var origWidth = timeline.getBarHeight(taskId, true); //m-s have square shape
+
+ return Math.round(Math.sqrt(2 * origWidth * origWidth)) - 2;
+ }
+
+ function isMilestone(task) {
+ return gantt.getTaskType(task.type) == gantt.config.types.milestone;
+ }
+
+ function getDndState() {
+ return {
+ link_source_id: _link_source_task,
+ link_target_id: _link_target_task,
+ link_from_start: _link_source_task_start,
+ link_to_start: _link_target_task_start,
+ link_landing_area: _link_landing
+ };
+ }
+
+ var services = gantt.$services;
+ var state = services.getService("state");
+ var DnD = services.getService("dnd");
+ state.registerProvider("linksDnD", getDndState);
+ var start_marker = "task_start_date",
+ end_marker = "task_end_date",
+ link_edge_marker = "gantt_link_point",
+ link_landing_hover_area = "gantt_link_control";
+ var dnd = new DnD(timeline.$task_bars, {
+ sensitivity: 0,
+ updates_per_second: 60,
+ mousemoveContainer: gantt.$root,
+ selector: "." + link_edge_marker,
+ preventDefault: true
+ });
+ dnd.attachEvent("onBeforeDragStart", gantt.bind(function (obj, e) {
+ var target = e.target || e.srcElement;
+ resetDndState();
+ if (gantt.getState("tasksDnd").drag_id) return false;
+
+ if (domHelpers.locateClassName(target, link_edge_marker)) {
+ if (domHelpers.locateClassName(target, start_marker)) _link_source_task_start = true;
+ var sid = gantt.locate(e);
+ _link_source_task = sid;
+ var t = gantt.getTask(sid);
+
+ if (gantt.isReadonly(t)) {
+ resetDndState();
+ return false;
+ }
+
+ var shift = 0;
+ this._dir_start = getLinePos(t, !!_link_source_task_start, shift, timeline.$getConfig(), true);
+ return true;
+ } else {
+ return false;
+ }
+ }, this));
+ dnd.attachEvent("onAfterDragStart", gantt.bind(function (obj, e) {
+ if (gantt.config.touch) {
+ gantt.refreshData();
+ }
+
+ updateMarkedHtml(dnd.config.marker);
+ }, this));
+
+ function getLinePos(task, to_start, shift, cfg, isStart) {
+ var taskPos = getMilestonePosition(task, function (task) {
+ return gantt.getTaskPosition(task);
+ }, cfg);
+ var pos = {
+ x: taskPos.x,
+ y: taskPos.y
+ };
+
+ if (!to_start) {
+ pos.x = taskPos.xEnd;
+ } //var pos = gantt._get_task_pos(task, !!to_start);
+
+
+ pos.y += gantt.getTaskHeight(task.id) / 2;
+ var offset = isMilestone(task) && isStart ? 2 : 0;
+ shift = shift || 0;
+ if (cfg.rtl) shift = shift * -1;
+ pos.x += (to_start ? -1 : 1) * shift - offset;
+ return pos;
+ }
+
+ function getMilestonePosition(task, getTaskPosition, cfg) {
+ var pos = getTaskPosition(task);
+ var res = {
+ x: pos.left,
+ y: pos.top,
+ width: pos.width,
+ height: pos.height
+ };
+
+ if (cfg.rtl) {
+ res.xEnd = res.x;
+ res.x = res.xEnd + res.width;
+ } else {
+ res.xEnd = res.x + res.width;
+ }
+
+ res.yEnd = res.y + res.height;
+
+ if (gantt.getTaskType(task.type) == gantt.config.types.milestone) {
+ var milestoneWidth = getVisibleMilestoneWidth(task.id);
+ res.x += (!cfg.rtl ? -1 : 1) * (milestoneWidth / 2);
+ res.xEnd += (!cfg.rtl ? 1 : -1) * (milestoneWidth / 2); //pos.x -= milestoneWidth / 2;
+ //pos.xEnd += milestoneWidth / 2;
+
+ res.width = pos.xEnd - pos.x;
+ }
+
+ return res;
+ }
+
+ function getVieportSize() {
+ var root = gantt.$root;
+ return {
+ right: root.offsetWidth,
+ bottom: root.offsetHeight
+ };
+ }
+
+ function getMarkerSize(marker) {
+ var width = 0,
+ height = 0;
+
+ if (marker) {
+ width = marker.offsetWidth || 0;
+ height = marker.offsetHeight || 0;
+ }
+
+ return {
+ width: width,
+ height: height
+ };
+ }
+
+ function getPosition(e, marker) {
+ var oldPos = dnd.getPosition(e);
+ var markerSize = getMarkerSize(marker);
+ var viewportSize = getVieportSize();
+ var offsetX = gantt.config.tooltip_offset_x || markerDefaultOffset;
+ var offsetY = gantt.config.tooltip_offset_y || markerDefaultOffset;
+ var scrollSize = gantt.config.scroll_size || scrollDefaultSize; // GS-1315: Add offset if there are elements above Gantt
+
+ var ganttOffsetY = gantt.$container.getBoundingClientRect().y + window.scrollY;
+ var position = {
+ y: oldPos.y + offsetY,
+ x: oldPos.x + offsetX,
+ bottom: oldPos.y + markerSize.height + offsetY + scrollSize,
+ right: oldPos.x + markerSize.width + offsetX + scrollSize
+ };
+
+ if (position.bottom > viewportSize.bottom + ganttOffsetY) {
+ position.y = viewportSize.bottom + ganttOffsetY - markerSize.height - offsetY;
+ }
+
+ if (position.right > viewportSize.right) {
+ position.x = viewportSize.right - markerSize.width - offsetX;
+ }
+
+ return position;
+ }
+
+ dnd.attachEvent("onDragMove", gantt.bind(function (obj, e) {
+ var dd = dnd.config;
+ var pos = getPosition(e, dd.marker);
+ advanceMarker(dd.marker, pos);
+ var landing = !!domHelpers.locateClassName(e, link_landing_hover_area);
+ var prevTarget = _link_target_task;
+ var prevLanding = _link_landing;
+ var prevToStart = _link_target_task_start;
+ var targ = gantt.locate(e),
+ to_start = true; // can drag and drop link to another gantt on the page, such links are not supported
+
+ var eventTarget = domHelpers.getTargetNode(e);
+ var sameGantt = domHelpers.isChildOf(eventTarget, gantt.$root);
+
+ if (!sameGantt) {
+ landing = false;
+ targ = null;
+ }
+
+ if (landing) {
+ //refreshTask
+ to_start = !domHelpers.locateClassName(e, end_marker);
+ landing = !!targ;
+ }
+
+ _link_target_task = targ;
+ _link_landing = landing;
+ _link_target_task_start = to_start;
+
+ if (landing) {
+ var t = gantt.getTask(targ);
+ var config = timeline.$getConfig();
+ var node = domHelpers.locateClassName(e, link_landing_hover_area);
+ var shift = 0;
+
+ if (node) {
+ shift = Math.floor(node.offsetWidth / 2);
+ }
+
+ this._dir_end = getLinePos(t, !!_link_target_task_start, shift, config);
+ } else {
+ this._dir_end = domHelpers.getRelativeEventPosition(e, timeline.$task_data);
+
+ if (gantt.env.isEdge) {
+ // to fix margin collapsing
+ this._dir_end.y += window.scrollY;
+ }
+ }
+
+ var targetChanged = !(prevLanding == landing && prevTarget == targ && prevToStart == to_start);
+
+ if (targetChanged) {
+ if (prevTarget) gantt.refreshTask(prevTarget, false);
+ if (targ) gantt.refreshTask(targ, false);
+ }
+
+ if (targetChanged) {
+ updateMarkedHtml(dd.marker);
+ }
+
+ showDirectingLine(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y);
+ return true;
+ }, this));
+ dnd.attachEvent("onDragEnd", gantt.bind(function () {
+ var drag = getDndState();
+
+ if (drag.link_source_id && drag.link_target_id && drag.link_source_id != drag.link_target_id) {
+ var type = gantt._get_link_type(drag.link_from_start, drag.link_to_start);
+
+ var link = {
+ source: drag.link_source_id,
+ target: drag.link_target_id,
+ type: type
+ };
+
+ if (link.type && gantt.isLinkAllowed(link)) {
+ if (gantt.callEvent("onLinkCreated", [link])) {
+ gantt.addLink(link);
+ }
+ }
+ }
+
+ resetDndState();
+
+ if (gantt.config.touch) {
+ gantt.refreshData();
+ } else {
+ if (drag.link_source_id) gantt.refreshTask(drag.link_source_id, false);
+ if (drag.link_target_id) gantt.refreshTask(drag.link_target_id, false);
+ }
+
+ removeDirectionLine();
+ }, this));
+
+ function updateMarkedHtml(marker) {
+ var link = getDndState();
+ var css = ["gantt_link_tooltip"];
+
+ if (link.link_source_id && link.link_target_id) {
+ if (gantt.isLinkAllowed(link.link_source_id, link.link_target_id, link.link_from_start, link.link_to_start)) {
+ css.push("gantt_allowed_link");
+ } else {
+ css.push("gantt_invalid_link");
+ }
+ }
+
+ var className = gantt.templates.drag_link_class(link.link_source_id, link.link_from_start, link.link_target_id, link.link_to_start);
+ if (className) css.push(className);
+ var html = "<div class='" + className + "'>" + gantt.templates.drag_link(link.link_source_id, link.link_from_start, link.link_target_id, link.link_to_start) + "</div>";
+ marker.innerHTML = html;
+ }
+
+ function advanceMarker(marker, pos) {
+ marker.style.left = pos.x + "px";
+ marker.style.top = pos.y + "px";
+ }
+
+ function resetDndState() {
+ _link_source_task = _link_source_task_start = _link_target_task = null;
+ _link_target_task_start = true;
+ }
+
+ function showDirectingLine(s_x, s_y, e_x, e_y) {
+ var div = getDirectionLine();
+ var link = getDndState();
+ var css = ["gantt_link_direction"];
+
+ if (gantt.templates.link_direction_class) {
+ css.push(gantt.templates.link_direction_class(link.link_source_id, link.link_from_start, link.link_target_id, link.link_to_start));
+ }
+
+ var dist = Math.sqrt(Math.pow(e_x - s_x, 2) + Math.pow(e_y - s_y, 2));
+ dist = Math.max(0, dist - 3);
+ if (!dist) return;
+ div.className = css.join(" ");
+ var tan = (e_y - s_y) / (e_x - s_x),
+ angle = Math.atan(tan);
+
+ if (coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 2) {
+ angle += Math.PI;
+ } else if (coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 3) {
+ angle -= Math.PI;
+ }
+
+ var sin = Math.sin(angle),
+ cos = Math.cos(angle),
+ top = Math.round(s_y),
+ left = Math.round(s_x);
+ var style = ["-webkit-transform: rotate(" + angle + "rad)", "-moz-transform: rotate(" + angle + "rad)", "-ms-transform: rotate(" + angle + "rad)", "-o-transform: rotate(" + angle + "rad)", "transform: rotate(" + angle + "rad)", "width:" + Math.round(dist) + "px"];
+
+ if (window.navigator.userAgent.indexOf("MSIE 8.0") != -1) {
+ //ms-filter breaks styles in ie9, so add it only for 8th
+ style.push("-ms-filter: \"" + ieTransform(sin, cos) + "\"");
+ var shiftLeft = Math.abs(Math.round(s_x - e_x)),
+ shiftTop = Math.abs(Math.round(e_y - s_y)); //fix rotation axis
+
+ switch (coordinateCircleQuarter(s_x, e_x, s_y, e_y)) {
+ case 1:
+ top -= shiftTop;
+ break;
+
+ case 2:
+ left -= shiftLeft;
+ top -= shiftTop;
+ break;
+
+ case 3:
+ left -= shiftLeft;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ style.push("top:" + top + "px");
+ style.push("left:" + left + "px");
+ div.style.cssText = style.join(";");
+ }
+
+ function ieTransform(sin, cos) {
+ return "progid:DXImageTransform.Microsoft.Matrix(" + "M11 = " + cos + "," + "M12 = -" + sin + "," + "M21 = " + sin + "," + "M22 = " + cos + "," + "SizingMethod = 'auto expand'" + ")";
+ }
+
+ function coordinateCircleQuarter(sX, eX, sY, eY) {
+ if (eX >= sX) {
+ if (eY <= sY) {
+ return 1;
+ } else {
+ return 4;
+ }
+ } else {
+ if (eY <= sY) {
+ return 2;
+ } else {
+ return 3;
+ }
+ }
+ }
+
+ function getDirectionLine() {
+ if (!dnd._direction || !dnd._direction.parentNode) {
+ dnd._direction = document.createElement("div");
+ timeline.$task_links.appendChild(dnd._direction);
+ }
+
+ return dnd._direction;
+ }
+
+ function removeDirectionLine() {
+ if (dnd._direction) {
+ if (dnd._direction.parentNode) //the event line can be detached because of data refresh
+ dnd._direction.parentNode.removeChild(dnd._direction);
+ dnd._direction = null;
+ }
+ }
+
+ gantt.attachEvent("onGanttRender", gantt.bind(function () {
+ if (dnd._direction) {
+ showDirectingLine(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y);
+ }
+ }, this));
+};
+
+module.exports = {
+ createLinkDND: function createLinkDND() {
+ return {
+ init: initLinksDND
+ };
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/timeline/main_timeline_initializer.js":
+/*!***************************************************************!*\
+ !*** ./sources/core/ui/timeline/main_timeline_initializer.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js"),
+ taskDnD = __webpack_require__(/*! ./tasks_dnd */ "./sources/core/ui/timeline/tasks_dnd.js"),
+ linkDnD = __webpack_require__(/*! ./links_dnd */ "./sources/core/ui/timeline/links_dnd.js"),
+ domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var initializer = function () {
+ return function (gantt) {
+ var services = gantt.$services;
+ return {
+ onCreated: function onCreated(timeline) {
+ var config = timeline.$config;
+ config.bind = utils.defined(config.bind) ? config.bind : "task";
+ config.bindLinks = utils.defined(config.bindLinks) ? config.bindLinks : "link";
+ timeline._linksDnD = linkDnD.createLinkDND();
+ timeline._tasksDnD = taskDnD.createTaskDND();
+
+ timeline._tasksDnD.extend(timeline);
+
+ this._mouseDelegates = __webpack_require__(/*! ../mouse_event_container */ "./sources/core/ui/mouse_event_container.js")(gantt);
+ },
+ onInitialized: function onInitialized(timeline) {
+ this._attachDomEvents(gantt);
+
+ this._attachStateProvider(gantt, timeline);
+
+ timeline._tasksDnD.init(timeline, gantt);
+
+ timeline._linksDnD.init(timeline, gantt);
+
+ if (timeline.$config.id == "timeline") {
+ this.extendDom(timeline);
+ }
+ },
+ onDestroyed: function onDestroyed(timeline) {
+ this._clearDomEvents(gantt);
+
+ this._clearStateProvider(gantt);
+
+ if (timeline._tasksDnD) {
+ timeline._tasksDnD.destructor();
+ }
+ },
+ extendDom: function extendDom(timeline) {
+ gantt.$task = timeline.$task;
+ gantt.$task_scale = timeline.$task_scale;
+ gantt.$task_data = timeline.$task_data;
+ gantt.$task_bg = timeline.$task_bg;
+ gantt.$task_links = timeline.$task_links;
+ gantt.$task_bars = timeline.$task_bars;
+ },
+ _clearDomEvents: function _clearDomEvents() {
+ this._mouseDelegates.destructor();
+
+ this._mouseDelegates = null;
+ },
+ _attachDomEvents: function _attachDomEvents(gantt) {
+ function _delete_link_handler(id, e) {
+ if (id && this.callEvent("onLinkDblClick", [id, e])) {
+ var link = this.getLink(id);
+ if (this.isReadonly(link)) return;
+ var title = "";
+ var question = this.locale.labels.link + " " + this.templates.link_description(this.getLink(id)) + " " + this.locale.labels.confirm_link_deleting;
+ window.setTimeout(function () {
+ gantt._simple_confirm(question, title, function () {
+ gantt.deleteLink(id);
+ });
+ }, this.config.touch ? 300 : 1);
+ }
+ }
+
+ this._mouseDelegates.delegate("click", "gantt_task_link", gantt.bind(function (e, trg) {
+ var id = this.locate(e, this.config.link_attribute);
+
+ if (id) {
+ this.callEvent("onLinkClick", [id, e]);
+ }
+ }, gantt), this.$task);
+
+ this._mouseDelegates.delegate("click", "gantt_scale_cell", gantt.bind(function (e, trg) {
+ var pos = domHelpers.getRelativeEventPosition(e, gantt.$task_data);
+ var date = gantt.dateFromPos(pos.x);
+ var coll = Math.floor(gantt.columnIndexByDate(date));
+ var coll_date = gantt.getScale().trace_x[coll];
+ gantt.callEvent("onScaleClick", [e, coll_date]);
+ }, gantt), this.$task);
+
+ this._mouseDelegates.delegate("doubleclick", "gantt_task_link", gantt.bind(function (e, id, trg) {
+ var id = this.locate(e, gantt.config.link_attribute);
+
+ _delete_link_handler.call(this, id, e);
+ }, gantt), this.$task);
+
+ this._mouseDelegates.delegate("doubleclick", "gantt_link_point", gantt.bind(function (e, id, trg) {
+ var id = this.locate(e),
+ task = this.getTask(id);
+ var link = null;
+
+ if (trg.parentNode && domHelpers.getClassName(trg.parentNode)) {
+ if (domHelpers.getClassName(trg.parentNode).indexOf("_left") > -1) {
+ link = task.$target[0];
+ } else {
+ link = task.$source[0];
+ }
+ }
+
+ if (link) _delete_link_handler.call(this, link, e);
+ return false;
+ }, gantt), this.$task);
+ },
+ _attachStateProvider: function _attachStateProvider(gantt, timeline) {
+ var self = timeline;
+ var state = services.getService("state");
+ state.registerProvider("tasksTimeline", function () {
+ return {
+ scale_unit: self._tasks ? self._tasks.unit : undefined,
+ scale_step: self._tasks ? self._tasks.step : undefined
+ };
+ });
+ },
+ _clearStateProvider: function _clearStateProvider() {
+ var state = services.getService("state");
+ state.unregisterProvider("tasksTimeline");
+ }
+ };
+ };
+}();
+
+module.exports = initializer;
+
+/***/ }),
+
+/***/ "./sources/core/ui/timeline/scales.js":
+/*!********************************************!*\
+ !*** ./sources/core/ui/timeline/scales.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js");
+
+function ScaleHelper(gantt) {
+ var dateHelper = gantt.date;
+ var services = gantt.$services;
+ return {
+ getSum: function getSum(sizes, from, to) {
+ if (to === undefined) to = sizes.length - 1;
+ if (from === undefined) from = 0;
+ var summ = 0;
+
+ for (var i = from; i <= to; i++) {
+ summ += sizes[i];
+ }
+
+ return summ;
+ },
+ setSumWidth: function setSumWidth(sum_width, scale, from, to) {
+ var parts = scale.width;
+ if (to === undefined) to = parts.length - 1;
+ if (from === undefined) from = 0;
+ var length = to - from + 1;
+ if (from > parts.length - 1 || length <= 0 || to > parts.length - 1) return;
+ var oldWidth = this.getSum(parts, from, to);
+ var diff = sum_width - oldWidth;
+ this.adjustSize(diff, parts, from, to);
+ this.adjustSize(-diff, parts, to + 1);
+ scale.full_width = this.getSum(parts);
+ },
+ splitSize: function splitSize(width, count) {
+ var arr = [];
+
+ for (var i = 0; i < count; i++) {
+ arr[i] = 0;
+ }
+
+ this.adjustSize(width, arr);
+ return arr;
+ },
+ adjustSize: function adjustSize(width, parts, from, to) {
+ if (!from) from = 0;
+ if (to === undefined) to = parts.length - 1;
+ var length = to - from + 1;
+ var full = this.getSum(parts, from, to);
+
+ for (var i = from; i <= to; i++) {
+ var share = Math.floor(width * (full ? parts[i] / full : 1 / length));
+ full -= parts[i];
+ width -= share;
+ length--;
+ parts[i] += share;
+ }
+
+ parts[parts.length - 1] += width;
+ },
+ sortScales: function sortScales(scales) {
+ function cellSize(unit, step) {
+ var d = new Date(1970, 0, 1);
+ return dateHelper.add(d, step, unit) - d;
+ }
+
+ scales.sort(function (a, b) {
+ if (cellSize(a.unit, a.step) < cellSize(b.unit, b.step)) {
+ return 1;
+ } else if (cellSize(a.unit, a.step) > cellSize(b.unit, b.step)) {
+ return -1;
+ } else {
+ return 0;
+ }
+ });
+
+ for (var i = 0; i < scales.length; i++) {
+ scales[i].index = i;
+ }
+ },
+ _isLegacyMode: function _isLegacyMode(config) {
+ var scaleConfig = config || gantt.config;
+ return scaleConfig.scale_unit || scaleConfig.date_scale || scaleConfig.subscales;
+ },
+ _prepareScaleObject: function _prepareScaleObject(scale) {
+ var format = scale.format;
+
+ if (!format) {
+ format = scale.template || scale.date || "%d %M";
+ }
+
+ if (typeof format === "string") {
+ format = gantt.date.date_to_str(format);
+ }
+
+ return {
+ unit: scale.unit || "day",
+ step: scale.step || 1,
+ format: format,
+ css: scale.css
+ };
+ },
+ primaryScale: function primaryScale(config) {
+ var templates = services.getService("templateLoader");
+
+ var legacyMode = this._isLegacyMode(config);
+
+ var scaleConfig = config || gantt.config;
+ var result;
+
+ if (legacyMode) {
+ templates.initTemplate("date_scale", undefined, undefined, scaleConfig, gantt.config.templates);
+ result = {
+ unit: gantt.config.scale_unit,
+ step: gantt.config.step,
+ template: gantt.templates.date_scale,
+ date: gantt.config.date_scale,
+ css: gantt.templates.scale_cell_class
+ };
+ } else {
+ var primaryScale = scaleConfig.scales[0];
+ result = {
+ unit: primaryScale.unit,
+ step: primaryScale.step,
+ template: primaryScale.template,
+ format: primaryScale.format,
+ date: primaryScale.date,
+ css: primaryScale.css || gantt.templates.scale_cell_class
+ };
+ }
+
+ return this._prepareScaleObject(result);
+ },
+ getSubScales: function getSubScales(config) {
+ var legacyMode = this._isLegacyMode(config);
+
+ var scaleConfig = config || gantt.config;
+ var scales;
+
+ if (legacyMode) {
+ scales = scaleConfig.subscales || [];
+ } else {
+ scales = scaleConfig.scales.slice(1);
+ }
+
+ return scales.map(function (scale) {
+ return this._prepareScaleObject(scale);
+ }.bind(this));
+ },
+ prepareConfigs: function prepareConfigs(scales, min_coll_width, container_width, scale_height, minDate, maxDate, rtl) {
+ var heights = this.splitSize(scale_height, scales.length);
+ var full_width = container_width;
+ var configs = [];
+
+ for (var i = scales.length - 1; i >= 0; i--) {
+ var main_scale = i == scales.length - 1;
+ var cfg = this.initScaleConfig(scales[i], minDate, maxDate);
+
+ if (main_scale) {
+ this.processIgnores(cfg);
+ }
+
+ this.initColSizes(cfg, min_coll_width, full_width, heights[i]);
+ this.limitVisibleRange(cfg);
+
+ if (main_scale) {
+ full_width = cfg.full_width;
+ }
+
+ configs.unshift(cfg);
+ }
+
+ for (var i = 0; i < configs.length - 1; i++) {
+ this.alineScaleColumns(configs[configs.length - 1], configs[i]);
+ }
+
+ for (var i = 0; i < configs.length; i++) {
+ if (rtl) {
+ this.reverseScale(configs[i]);
+ }
+
+ this.setPosSettings(configs[i]);
+ }
+
+ return configs;
+ },
+ reverseScale: function reverseScale(scale) {
+ scale.width = scale.width.reverse();
+ scale.trace_x = scale.trace_x.reverse();
+ var indexes = scale.trace_indexes;
+ scale.trace_indexes = {};
+ scale.trace_index_transition = {};
+ scale.rtl = true;
+
+ for (var i = 0; i < scale.trace_x.length; i++) {
+ scale.trace_indexes[scale.trace_x[i].valueOf()] = i;
+ scale.trace_index_transition[indexes[scale.trace_x[i].valueOf()]] = i;
+ }
+
+ return scale;
+ },
+ setPosSettings: function setPosSettings(config) {
+ for (var i = 0, len = config.trace_x.length; i < len; i++) {
+ config.left.push((config.width[i - 1] || 0) + (config.left[i - 1] || 0));
+ }
+ },
+ _ignore_time_config: function _ignore_time_config(date, scale) {
+ if (gantt.config.skip_off_time) {
+ var skip = true;
+ var probe = date; // check dates in case custom scale unit, e.g. {unit: "month", step: 3}
+
+ for (var i = 0; i < scale.step; i++) {
+ if (i) {
+ probe = dateHelper.add(date, i, scale.unit);
+ }
+
+ skip = skip && !this.isWorkTime(probe, scale.unit);
+ }
+
+ return skip;
+ }
+
+ return false;
+ },
+ //defined in an extension
+ processIgnores: function processIgnores(config) {
+ config.ignore_x = {};
+ config.display_count = config.count;
+ },
+ initColSizes: function initColSizes(config, min_col_width, full_width, line_height) {
+ var cont_width = full_width;
+ config.height = line_height;
+ var column_count = config.display_count === undefined ? config.count : config.display_count;
+ if (!column_count) column_count = 1;
+ config.col_width = Math.floor(cont_width / column_count);
+
+ if (min_col_width) {
+ if (config.col_width < min_col_width) {
+ config.col_width = min_col_width;
+ cont_width = config.col_width * column_count;
+ }
+ }
+
+ config.width = [];
+ var ignores = config.ignore_x || {};
+
+ for (var i = 0; i < config.trace_x.length; i++) {
+ if (ignores[config.trace_x[i].valueOf()] || config.display_count == config.count) {
+ config.width[i] = 0;
+ } else {
+ // width of month columns should be proportional month duration
+ var width = 1;
+
+ if (config.unit == "month") {
+ var days = Math.round((dateHelper.add(config.trace_x[i], config.step, config.unit) - config.trace_x[i]) / (1000 * 60 * 60 * 24));
+ width = days;
+ }
+
+ config.width[i] = width;
+ }
+ }
+
+ this.adjustSize(cont_width - this.getSum(config.width)
+ /* 1 width per column from the code above */
+ , config.width);
+ config.full_width = this.getSum(config.width);
+ },
+ initScaleConfig: function initScaleConfig(config, min_date, max_date) {
+ var cfg = utils.mixin({
+ count: 0,
+ col_width: 0,
+ full_width: 0,
+ height: 0,
+ width: [],
+ left: [],
+ trace_x: [],
+ trace_indexes: {},
+ min_date: new Date(min_date),
+ max_date: new Date(max_date)
+ }, config);
+ this.eachColumn(config.unit, config.step, min_date, max_date, function (date) {
+ cfg.count++;
+ cfg.trace_x.push(new Date(date));
+ cfg.trace_indexes[date.valueOf()] = cfg.trace_x.length - 1;
+ });
+ cfg.trace_x_ascending = cfg.trace_x.slice();
+ return cfg;
+ },
+ iterateScales: function iterateScales(lower_scale, upper_scale, from, to, callback) {
+ var upper_dates = upper_scale.trace_x;
+ var lower_dates = lower_scale.trace_x;
+ var prev = from || 0;
+ var end = to || lower_dates.length - 1;
+ var prevUpper = 0;
+
+ for (var up = 1; up < upper_dates.length; up++) {
+ var target_index = lower_scale.trace_indexes[+upper_dates[up]];
+
+ if (target_index !== undefined && target_index <= end) {
+ if (callback) {
+ callback.apply(this, [prevUpper, up, prev, target_index]);
+ }
+
+ prev = target_index;
+ prevUpper = up;
+ continue;
+ }
+ }
+ },
+ alineScaleColumns: function alineScaleColumns(lower_scale, upper_scale, from, to) {
+ this.iterateScales(lower_scale, upper_scale, from, to, function (upper_start, upper_end, lower_start, lower_end) {
+ var targetWidth = this.getSum(lower_scale.width, lower_start, lower_end - 1);
+ var actualWidth = this.getSum(upper_scale.width, upper_start, upper_end - 1);
+
+ if (actualWidth != targetWidth) {
+ this.setSumWidth(targetWidth, upper_scale, upper_start, upper_end - 1);
+ }
+ });
+ },
+ eachColumn: function eachColumn(unit, step, min_date, max_date, callback) {
+ var start = new Date(min_date),
+ end = new Date(max_date);
+
+ if (dateHelper[unit + "_start"]) {
+ start = dateHelper[unit + "_start"](start);
+ }
+
+ var curr = new Date(start);
+
+ if (+curr >= +end) {
+ end = dateHelper.add(curr, step, unit);
+ }
+
+ while (+curr < +end) {
+ callback.call(this, new Date(curr));
+ var tzOffset = curr.getTimezoneOffset();
+ curr = dateHelper.add(curr, step, unit);
+ curr = gantt._correct_dst_change(curr, tzOffset, step, unit);
+ if (dateHelper[unit + '_start']) curr = dateHelper[unit + "_start"](curr);
+ }
+ },
+ limitVisibleRange: function limitVisibleRange(cfg) {
+ var dates = cfg.trace_x;
+ var left = 0,
+ right = cfg.width.length - 1;
+ var diff = 0;
+
+ if (+dates[0] < +cfg.min_date && left != right) {
+ var width = Math.floor(cfg.width[0] * ((dates[1] - cfg.min_date) / (dates[1] - dates[0])));
+ diff += cfg.width[0] - width;
+ cfg.width[0] = width;
+ dates[0] = new Date(cfg.min_date);
+ }
+
+ var last = dates.length - 1;
+ var lastDate = dates[last];
+ var outDate = dateHelper.add(lastDate, cfg.step, cfg.unit);
+
+ if (+outDate > +cfg.max_date && last > 0) {
+ var width = cfg.width[last] - Math.floor(cfg.width[last] * ((outDate - cfg.max_date) / (outDate - lastDate)));
+ diff += cfg.width[last] - width;
+ cfg.width[last] = width;
+ }
+
+ if (diff) {
+ var full = this.getSum(cfg.width);
+ var shared = 0;
+
+ for (var i = 0; i < cfg.width.length; i++) {
+ var share = Math.floor(diff * (cfg.width[i] / full));
+ cfg.width[i] += share;
+ shared += share;
+ }
+
+ this.adjustSize(diff - shared, cfg.width);
+ }
+ }
+ };
+}
+
+module.exports = ScaleHelper;
+
+/***/ }),
+
+/***/ "./sources/core/ui/timeline/tasks_canvas_render.gpl.js":
+/*!*************************************************************!*\
+ !*** ./sources/core/ui/timeline/tasks_canvas_render.gpl.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var createStaticBgHelper = function createStaticBgHelper() {
+ return {
+ render: function render() {},
+ destroy: function destroy() {}
+ };
+};
+
+module.exports = {
+ create: function create() {
+ return createStaticBgHelper();
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/timeline/tasks_dnd.js":
+/*!***********************************************!*\
+ !*** ./sources/core/ui/timeline/tasks_dnd.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var domHelpers = __webpack_require__(/*! ../utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js");
+
+var timeout = __webpack_require__(/*! ../../../utils/timeout */ "./sources/utils/timeout.js");
+
+var helpers = __webpack_require__(/*! ../../../utils/helpers */ "./sources/utils/helpers.js");
+
+function createTaskDND(timeline, gantt) {
+ var services = gantt.$services;
+ return {
+ drag: null,
+ dragMultiple: {},
+ _events: {
+ before_start: {},
+ before_finish: {},
+ after_finish: {}
+ },
+ _handlers: {},
+ init: function init() {
+ this._domEvents = gantt._createDomEventScope();
+ this.clear_drag_state();
+ var drag = gantt.config.drag_mode;
+ this.set_actions();
+ var stateService = services.getService("state");
+ stateService.registerProvider("tasksDnd", utils.bind(function () {
+ return {
+ drag_id: this.drag ? this.drag.id : undefined,
+ drag_mode: this.drag ? this.drag.mode : undefined,
+ drag_from_start: this.drag ? this.drag.left : undefined
+ };
+ }, this));
+ var evs = {
+ "before_start": "onBeforeTaskDrag",
+ "before_finish": "onBeforeTaskChanged",
+ "after_finish": "onAfterTaskDrag"
+ }; //for now, all drag operations will trigger the same events
+
+ for (var stage in this._events) {
+ for (var mode in drag) {
+ this._events[stage][mode] = evs[stage];
+ }
+ }
+
+ this._handlers[drag.move] = this._move;
+ this._handlers[drag.resize] = this._resize;
+ this._handlers[drag.progress] = this._resize_progress;
+ },
+ set_actions: function set_actions() {
+ var data = timeline.$task_data;
+
+ this._domEvents.attach(data, "mousemove", gantt.bind(function (e) {
+ this.on_mouse_move(e);
+ }, this));
+
+ this._domEvents.attach(data, "mousedown", gantt.bind(function (e) {
+ this.on_mouse_down(e);
+ }, this));
+
+ this._domEvents.attach(document.body, "mouseup", gantt.bind(function (e) {
+ this.on_mouse_up(e);
+ }, this));
+ },
+ clear_drag_state: function clear_drag_state() {
+ this.drag = {
+ id: null,
+ mode: null,
+ pos: null,
+ start_x: null,
+ start_y: null,
+ obj: null,
+ left: null
+ };
+ this.dragMultiple = {};
+ },
+ _resize: function _resize(task, shift, drag) {
+ var cfg = timeline.$getConfig();
+
+ var coords_x = this._drag_task_coords(task, drag);
+
+ if (drag.left) {
+ task.start_date = gantt.dateFromPos(coords_x.start + shift);
+
+ if (!task.start_date) {
+ task.start_date = new Date(gantt.getState().min_date);
+ }
+ } else {
+ task.end_date = gantt.dateFromPos(coords_x.end + shift);
+
+ if (!task.end_date) {
+ task.end_date = new Date(gantt.getState().max_date);
+ }
+ }
+
+ var minDurationInUnits = this._calculateMinDuration(cfg.min_duration, cfg.duration_unit);
+
+ if (task.end_date - task.start_date < cfg.min_duration) {
+ if (drag.left) task.start_date = gantt.calculateEndDate(task.end_date, -minDurationInUnits, cfg.duration_unit, task);else task.end_date = gantt.calculateEndDate(task.start_date, minDurationInUnits, cfg.duration_unit, task);
+ }
+
+ gantt._init_task_timing(task);
+ },
+ _calculateMinDuration: function _calculateMinDuration(duration, unit) {
+ var inMs = {
+ "minute": 60000,
+ "hour": 3600000,
+ "day": 86400000,
+ "week": 604800000,
+ "month": 2419200000,
+ "year": 31356000000
+ };
+ return Math.ceil(duration / inMs[unit]);
+ },
+ _resize_progress: function _resize_progress(task, shift, drag) {
+ var coords_x = this._drag_task_coords(task, drag);
+
+ var config = timeline.$getConfig();
+ var diffValue = !config.rtl ? drag.pos.x - coords_x.start : coords_x.start - drag.pos.x;
+ var diff = Math.max(0, diffValue);
+ task.progress = Math.min(1, diff / Math.abs(coords_x.end - coords_x.start));
+ },
+ _find_max_shift: function _find_max_shift(dragItems, shift) {
+ var correctShift;
+
+ for (var i in dragItems) {
+ var drag = dragItems[i];
+ var task = gantt.getTask(drag.id);
+
+ var coords_x = this._drag_task_coords(task, drag);
+
+ var minX = gantt.posFromDate(new Date(gantt.getState().min_date));
+ var maxX = gantt.posFromDate(new Date(gantt.getState().max_date));
+
+ if (coords_x.end + shift > maxX) {
+ var maxShift = maxX - coords_x.end;
+
+ if (maxShift < correctShift || correctShift === undefined) {
+ correctShift = maxShift;
+ }
+ } else if (coords_x.start + shift < minX) {
+ var minShift = minX - coords_x.start;
+
+ if (minShift > correctShift || correctShift === undefined) {
+ correctShift = minShift;
+ }
+ }
+ }
+
+ return correctShift;
+ },
+ _move: function _move(task, shift, drag, multipleDragShift) {
+ var coords_x = this._drag_task_coords(task, drag);
+
+ var new_start = null,
+ new_end = null; // GS-454: If we drag multiple tasks, rely on the dates instead of timeline coordinates
+
+ if (multipleDragShift) {
+ new_start = new Date(+drag.obj.start_date + multipleDragShift), new_end = new Date(+drag.obj.end_date + multipleDragShift);
+ } else {
+ new_start = gantt.dateFromPos(coords_x.start + shift), new_end = gantt.dateFromPos(coords_x.end + shift);
+ }
+
+ if (!new_start) {
+ task.start_date = new Date(gantt.getState().min_date);
+ task.end_date = gantt.dateFromPos(gantt.posFromDate(task.start_date) + (coords_x.end - coords_x.start));
+ } else if (!new_end) {
+ task.end_date = new Date(gantt.getState().max_date);
+ task.start_date = gantt.dateFromPos(gantt.posFromDate(task.end_date) - (coords_x.end - coords_x.start));
+ } else {
+ task.start_date = new_start;
+ task.end_date = new_end;
+ }
+ },
+ _drag_task_coords: function _drag_task_coords(t, drag) {
+ var start = drag.obj_s_x = drag.obj_s_x || gantt.posFromDate(t.start_date);
+ var end = drag.obj_e_x = drag.obj_e_x || gantt.posFromDate(t.end_date);
+ return {
+ start: start,
+ end: end
+ };
+ },
+ _mouse_position_change: function _mouse_position_change(oldPos, newPos) {
+ var dx = oldPos.x - newPos.x,
+ dy = oldPos.y - newPos.y;
+ return Math.sqrt(dx * dx + dy * dy);
+ },
+ _is_number: function _is_number(n) {
+ return !isNaN(parseFloat(n)) && isFinite(n);
+ },
+ on_mouse_move: function on_mouse_move(e) {
+ if (this.drag.start_drag) {
+ var pos = domHelpers.getRelativeEventPosition(e, gantt.$task_data);
+ var sX = this.drag.start_drag.start_x,
+ sY = this.drag.start_drag.start_y;
+
+ if (Date.now() - this.drag.timestamp > 50 || this._is_number(sX) && this._is_number(sY) && this._mouse_position_change({
+ x: sX,
+ y: sY
+ }, pos) > 20) {
+ this._start_dnd(e);
+ }
+ }
+
+ var drag = this.drag;
+
+ if (drag.mode) {
+ if (!timeout(this, 40)) //limit update frequency
+ return;
+
+ this._update_on_move(e);
+ }
+ },
+ _update_item_on_move: function _update_item_on_move(shift, id, mode, drag, e, multipleDragShift) {
+ var task = gantt.getTask(id);
+ var original = gantt.mixin({}, task);
+ var copy = gantt.mixin({}, task);
+
+ this._handlers[mode].apply(this, [copy, shift, drag, multipleDragShift]);
+
+ gantt.mixin(task, copy, true); //gantt._update_parents(drag.id, true);
+
+ gantt.callEvent("onTaskDrag", [task.id, mode, copy, original, e]);
+ gantt.mixin(task, copy, true);
+ gantt.refreshTask(id);
+ },
+ _update_on_move: function _update_on_move(e) {
+ var drag = this.drag;
+ var config = timeline.$getConfig();
+
+ if (drag.mode) {
+ var pos = domHelpers.getRelativeEventPosition(e, timeline.$task_data);
+ if (drag.pos && drag.pos.x == pos.x) return;
+ drag.pos = pos;
+ var curr_date = gantt.dateFromPos(pos.x);
+ if (!curr_date || isNaN(curr_date.getTime())) return;
+ var shift = pos.x - drag.start_x;
+ var task = gantt.getTask(drag.id);
+
+ if (this._handlers[drag.mode]) {
+ if (drag.mode === config.drag_mode.move) {
+ var dragHash = {};
+
+ if (this._isMultiselect()) {
+ var selectedTasksIds = gantt.getSelectedTasks();
+
+ if (selectedTasksIds.indexOf(drag.id) >= 0) {
+ dragHash = this.dragMultiple;
+ }
+ }
+
+ var dragProject = false;
+
+ if (gantt.isSummaryTask(task) && gantt.config.drag_project) {
+ var initialDrag = {};
+ initialDrag[drag.id] = utils.copy(drag);
+ dragProject = true;
+ dragHash = utils.mixin(initialDrag, this.dragMultiple);
+ }
+
+ var maxShift = this._find_max_shift(dragHash, shift);
+
+ if (maxShift !== undefined) {
+ shift = maxShift;
+ }
+
+ this._update_item_on_move(shift, drag.id, drag.mode, drag, e);
+
+ for (var i in dragHash) {
+ var childDrag = dragHash[i];
+
+ if (dragProject && childDrag.id != drag.id) {
+ gantt._bulk_dnd = true;
+ } // GS-454: Calculate the date shift in milliseconds instead of pixels
+
+
+ if (maxShift === undefined && (dragProject || Object.keys(dragHash).length > 1)) {
+ var shiftDate = gantt.dateFromPos(drag.start_x);
+ var multipleDragShift = curr_date - shiftDate;
+ }
+
+ this._update_item_on_move(shift, childDrag.id, childDrag.mode, childDrag, e, multipleDragShift);
+ }
+
+ gantt._bulk_dnd = false;
+ } else {
+ // for resize and progress
+ this._update_item_on_move(shift, drag.id, drag.mode, drag, e);
+ }
+
+ gantt._update_parents(drag.id);
+ }
+ }
+ },
+ on_mouse_down: function on_mouse_down(e, src) {
+ // on Mac we do not get onmouseup event when clicking right mouse button leaving us in dnd state
+ // let's ignore right mouse button then
+ if (e.button == 2 && e.button !== undefined) return;
+ var config = timeline.$getConfig();
+ var id = gantt.locate(e);
+ var task = null;
+
+ if (gantt.isTaskExists(id)) {
+ task = gantt.getTask(id);
+ }
+
+ if (gantt.isReadonly(task) || this.drag.mode) return;
+ this.clear_drag_state();
+ src = src || e.target || e.srcElement;
+ var className = domHelpers.getClassName(src);
+
+ var drag = this._get_drag_mode(className, src);
+
+ if (!className || !drag) {
+ if (src.parentNode) return this.on_mouse_down(e, src.parentNode);else return;
+ }
+
+ if (!drag) {
+ if (gantt.checkEvent("onMouseDown") && gantt.callEvent("onMouseDown", [className.split(" ")[0]])) {
+ if (src.parentNode) return this.on_mouse_down(e, src.parentNode);
+ }
+ } else {
+ if (drag.mode && drag.mode != config.drag_mode.ignore && config["drag_" + drag.mode]) {
+ id = gantt.locate(src);
+ task = gantt.copy(gantt.getTask(id) || {});
+
+ if (gantt.isReadonly(task)) {
+ this.clear_drag_state();
+ return false;
+ }
+
+ if (gantt.isSummaryTask(task) && !config.drag_project && drag.mode != config.drag_mode.progress) {
+ //only progress drag is allowed for tasks with flexible duration
+ this.clear_drag_state();
+ return;
+ }
+
+ drag.id = id;
+ var pos = domHelpers.getRelativeEventPosition(e, gantt.$task_data);
+ drag.start_x = pos.x;
+ drag.start_y = pos.y;
+ drag.obj = task;
+ this.drag.start_drag = drag;
+ this.drag.timestamp = Date.now();
+ } else this.clear_drag_state();
+ }
+ },
+ _fix_dnd_scale_time: function _fix_dnd_scale_time(task, drag) {
+ var config = timeline.$getConfig();
+ var unit = gantt.getScale().unit,
+ step = gantt.getScale().step;
+
+ if (!config.round_dnd_dates) {
+ unit = 'minute';
+ step = config.time_step;
+ }
+
+ function fixStart(task) {
+ if (!gantt.config.correct_work_time) return;
+ var config = timeline.$getConfig();
+ if (!gantt.isWorkTime(task.start_date, undefined, task)) task.start_date = gantt.calculateEndDate({
+ start_date: task.start_date,
+ duration: -1,
+ unit: config.duration_unit,
+ task: task
+ });
+ }
+
+ function fixEnd(task) {
+ if (!gantt.config.correct_work_time) return;
+ var config = timeline.$getConfig();
+ if (!gantt.isWorkTime(new Date(task.end_date - 1), undefined, task)) task.end_date = gantt.calculateEndDate({
+ start_date: task.end_date,
+ duration: 1,
+ unit: config.duration_unit,
+ task: task
+ });
+ }
+
+ if (drag.mode == config.drag_mode.resize) {
+ if (drag.left) {
+ task.start_date = gantt.roundDate({
+ date: task.start_date,
+ unit: unit,
+ step: step
+ });
+ fixStart(task);
+ } else {
+ task.end_date = gantt.roundDate({
+ date: task.end_date,
+ unit: unit,
+ step: step
+ });
+ fixEnd(task);
+ }
+ } else if (drag.mode == config.drag_mode.move) {
+ task.start_date = gantt.roundDate({
+ date: task.start_date,
+ unit: unit,
+ step: step
+ });
+ fixStart(task);
+ task.end_date = gantt.calculateEndDate(task);
+ }
+ },
+ _fix_working_times: function _fix_working_times(task, drag) {
+ var config = timeline.$getConfig();
+ var drag = drag || {
+ mode: config.drag_mode.move
+ };
+
+ if (drag.mode == config.drag_mode.resize) {
+ if (drag.left) {
+ task.start_date = gantt.getClosestWorkTime({
+ date: task.start_date,
+ dir: 'future',
+ task: task
+ });
+ } else {
+ task.end_date = gantt.getClosestWorkTime({
+ date: task.end_date,
+ dir: 'past',
+ task: task
+ });
+ }
+ } else if (drag.mode == config.drag_mode.move) {
+ gantt.correctTaskWorkTime(task);
+ }
+ },
+ _finalize_mouse_up: function _finalize_mouse_up(taskId, config, drag, e) {
+ var task = gantt.getTask(taskId);
+
+ if (config.work_time && config.correct_work_time) {
+ this._fix_working_times(task, drag);
+ }
+
+ this._fix_dnd_scale_time(task, drag);
+
+ if (!this._fireEvent("before_finish", drag.mode, [taskId, drag.mode, gantt.copy(drag.obj), e])) {
+ //drag.obj._dhx_changed = false;
+ this.clear_drag_state();
+
+ if (taskId == drag.id) {
+ drag.obj._dhx_changed = false;
+ gantt.mixin(task, drag.obj, true);
+ }
+
+ gantt.refreshTask(task.id);
+ } else {
+ var drag_id = taskId;
+
+ gantt._init_task_timing(task);
+
+ this.clear_drag_state();
+ gantt.updateTask(task.id);
+
+ this._fireEvent("after_finish", drag.mode, [drag_id, drag.mode, e]);
+ }
+ },
+ on_mouse_up: function on_mouse_up(e) {
+ var drag = this.drag;
+
+ if (drag.mode && drag.id) {
+ var config = timeline.$getConfig(); //drop
+
+ var task = gantt.getTask(drag.id);
+ var dragMultiple = this.dragMultiple;
+ var finalizingBulkMove = false;
+ var moveCount = 0;
+
+ if (drag.mode === config.drag_mode.move) {
+ if (gantt.isSummaryTask(task) && config.drag_project || this._isMultiselect()) {
+ finalizingBulkMove = true;
+ moveCount = Object.keys(dragMultiple).length;
+ }
+ }
+
+ var doFinalize = function doFinalize() {
+ if (finalizingBulkMove) {
+ for (var i in dragMultiple) {
+ this._finalize_mouse_up(dragMultiple[i].id, config, dragMultiple[i], e);
+ }
+ }
+
+ this._finalize_mouse_up(drag.id, config, drag, e);
+ };
+
+ if (finalizingBulkMove && moveCount > 10) {
+ // 10 - arbitrary threshold for bulk dnd at which we start doing complete repaint to refresh
+ gantt.batchUpdate(function () {
+ doFinalize.call(this);
+ }.bind(this));
+ } else {
+ doFinalize.call(this);
+ }
+ }
+
+ this.clear_drag_state();
+ },
+ _get_drag_mode: function _get_drag_mode(className, el) {
+ var config = timeline.$getConfig();
+ var modes = config.drag_mode;
+ var classes = (className || "").split(" ");
+ var classname = classes[0];
+ var drag = {
+ mode: null,
+ left: null
+ };
+
+ switch (classname) {
+ case "gantt_task_line":
+ case "gantt_task_content":
+ drag.mode = modes.move;
+ break;
+
+ case "gantt_task_drag":
+ drag.mode = modes.resize;
+ var dragProperty = el.getAttribute("data-bind-property");
+
+ if (dragProperty == "start_date") {
+ drag.left = true;
+ } else {
+ drag.left = false;
+ }
+
+ break;
+
+ case "gantt_task_progress_drag":
+ drag.mode = modes.progress;
+ break;
+
+ case "gantt_link_control":
+ case "gantt_link_point":
+ drag.mode = modes.ignore;
+ break;
+
+ default:
+ drag = null;
+ break;
+ }
+
+ return drag;
+ },
+ _start_dnd: function _start_dnd(e) {
+ var drag = this.drag = this.drag.start_drag;
+ delete drag.start_drag;
+ var cfg = timeline.$getConfig();
+ var id = drag.id;
+
+ if (!cfg["drag_" + drag.mode] || !gantt.callEvent("onBeforeDrag", [id, drag.mode, e]) || !this._fireEvent("before_start", drag.mode, [id, drag.mode, e])) {
+ this.clear_drag_state();
+ } else {
+ delete drag.start_drag;
+ var task = gantt.getTask(id);
+
+ if (gantt.isReadonly(task)) {
+ this.clear_drag_state();
+ return;
+ }
+
+ if (this._isMultiselect()) {
+ // for don't move selected tasks when drag unselected task
+ var selectedTasksIds = gantt.getSelectedTasks();
+
+ if (selectedTasksIds.indexOf(drag.id) >= 0) {
+ helpers.forEach(selectedTasksIds, gantt.bind(function (taskId) {
+ var selectedTask = gantt.getTask(taskId);
+
+ if (gantt.isSummaryTask(selectedTask) && gantt.config.drag_project && drag.mode == cfg.drag_mode.move) {
+ this._addSubtasksToDragMultiple(selectedTask.id);
+ }
+
+ this.dragMultiple[taskId] = gantt.mixin({
+ id: selectedTask.id,
+ obj: gantt.copy(selectedTask)
+ }, this.drag);
+ }, this));
+ }
+ } // for move unselected summary
+
+
+ if (gantt.isSummaryTask(task) && gantt.config.drag_project && drag.mode == cfg.drag_mode.move) {
+ this._addSubtasksToDragMultiple(task.id);
+ }
+
+ gantt.callEvent("onTaskDragStart", []);
+ }
+ },
+ _fireEvent: function _fireEvent(stage, mode, params) {
+ gantt.assert(this._events[stage], "Invalid stage:{" + stage + "}");
+ var trigger = this._events[stage][mode];
+ gantt.assert(trigger, "Unknown after drop mode:{" + mode + "}");
+ gantt.assert(params, "Invalid event arguments");
+ if (!gantt.checkEvent(trigger)) return true;
+ return gantt.callEvent(trigger, params);
+ },
+ round_task_dates: function round_task_dates(task) {
+ var drag_state = this.drag;
+ var config = timeline.$getConfig();
+
+ if (!drag_state) {
+ drag_state = {
+ mode: config.drag_mode.move
+ };
+ }
+
+ this._fix_dnd_scale_time(task, drag_state);
+ },
+ destructor: function destructor() {
+ this._domEvents.detachAll();
+ },
+ _isMultiselect: function _isMultiselect() {
+ return gantt.config.drag_multiple && !!(gantt.getSelectedTasks && gantt.getSelectedTasks().length > 0);
+ },
+ _addSubtasksToDragMultiple: function _addSubtasksToDragMultiple(summaryId) {
+ gantt.eachTask(function (child) {
+ this.dragMultiple[child.id] = gantt.mixin({
+ id: child.id,
+ obj: gantt.copy(child)
+ }, this.drag);
+ }, summaryId, this);
+ }
+ };
+}
+
+function initTaskDND() {
+ var _tasks_dnd;
+
+ return {
+ extend: function extend(timeline) {
+ timeline.roundTaskDates = function (task) {
+ _tasks_dnd.round_task_dates(task);
+ };
+ },
+ init: function init(timeline, gantt) {
+ _tasks_dnd = createTaskDND(timeline, gantt); // TODO: entry point for touch handlers, move touch to timeline
+
+ timeline._tasks_dnd = _tasks_dnd;
+ return _tasks_dnd.init(gantt);
+ },
+ destructor: function destructor() {
+ if (_tasks_dnd) {
+ _tasks_dnd.destructor();
+
+ _tasks_dnd = null;
+ }
+ }
+ };
+}
+
+module.exports = {
+ createTaskDND: initTaskDND
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/timeline/timeline.js":
+/*!**********************************************!*\
+ !*** ./sources/core/ui/timeline/timeline.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ScaleHelper = __webpack_require__(/*! ./scales_ignore */ "./sources/core/ui/timeline/scales.js");
+
+var eventable = __webpack_require__(/*! ../../../utils/eventable */ "./sources/utils/eventable.js");
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js");
+
+var helpers = __webpack_require__(/*! ../../../utils/helpers */ "./sources/utils/helpers.js");
+
+var topPositionMixin = __webpack_require__(/*! ../row_position_mixin */ "./sources/core/ui/row_position_mixin.js");
+
+var canvasRender = __webpack_require__(/*! ./tasks_canvas_render */ "./sources/core/ui/timeline/tasks_canvas_render.gpl.js");
+
+var Timeline = function Timeline(parent, config, factory, gantt) {
+ this.$config = utils.mixin({}, config || {});
+ this.$scaleHelper = new ScaleHelper(gantt);
+ this.$gantt = gantt;
+ this._posFromDateCache = {};
+ this._timelineDragScroll = null;
+ utils.mixin(this, topPositionMixin(this));
+ eventable(this);
+};
+
+Timeline.prototype = {
+ init: function init(container) {
+ container.innerHTML += "<div class='gantt_task' style='width:inherit;height:inherit;'></div>";
+ this.$task = container.childNodes[0];
+ this.$task.innerHTML = "<div class='gantt_task_scale'></div><div class='gantt_data_area'></div>";
+ this.$task_scale = this.$task.childNodes[0];
+ this.$task_data = this.$task.childNodes[1];
+ this.$task_data.innerHTML = "<div class='gantt_task_bg'></div><div class='gantt_links_area'></div><div class='gantt_bars_area'></div>";
+ this.$task_bg = this.$task_data.childNodes[0];
+ this.$task_links = this.$task_data.childNodes[1];
+ this.$task_bars = this.$task_data.childNodes[2];
+ this._tasks = {
+ col_width: 0,
+ width: [],
+ // width of each column
+ full_width: 0,
+ // width of all columns
+ trace_x: [],
+ rendered: {}
+ };
+ var config = this.$getConfig();
+ var attr = config[this.$config.bind + "_attribute"];
+ var linksAttr = config[this.$config.bindLinks + "_attribute"];
+
+ if (!attr && this.$config.bind) {
+ attr = "data-" + this.$config.bind + "-id";
+ }
+
+ if (!linksAttr && this.$config.bindLinks) {
+ linksAttr = "data-" + this.$config.bindLinks + "-id";
+ }
+
+ this.$config.item_attribute = attr || null;
+ this.$config.link_attribute = linksAttr || null;
+
+ var layers = this._createLayerConfig();
+
+ if (!this.$config.layers) {
+ this.$config.layers = layers.tasks;
+ }
+
+ if (!this.$config.linkLayers) {
+ this.$config.linkLayers = layers.links;
+ }
+
+ this._attachLayers(this.$gantt);
+
+ this.callEvent("onReady", []); //this.refresh();
+
+ if (this.$gantt.ext.dragTimeline) {
+ this._timelineDragScroll = this.$gantt.ext.dragTimeline.create();
+
+ this._timelineDragScroll.attach(this);
+ }
+ },
+ setSize: function setSize(width, height) {
+ var config = this.$getConfig();
+
+ if (width * 1 === width) {
+ this.$config.width = width;
+ }
+
+ if (height * 1 === height) {
+ this.$config.height = height;
+ var dataHeight = Math.max(this.$config.height - config.scale_height);
+ this.$task_data.style.height = dataHeight + 'px';
+ }
+
+ this.refresh();
+ this.$task_bg.style.backgroundImage = "";
+
+ if (config.smart_rendering && this.$config.rowStore) {
+ this.$task_bg.style.height = this.getTotalHeight() + "px";
+ } else {
+ this.$task_bg.style.height = "";
+ }
+
+ var scale = this._tasks; //timeline area layers
+
+ var data_els = this.$task_data.childNodes;
+
+ for (var i = 0, len = data_els.length; i < len; i++) {
+ var el = data_els[i];
+ if (el.hasAttribute("data-layer") && el.style) el.style.width = scale.full_width + "px";
+ }
+ },
+ isVisible: function isVisible() {
+ if (this.$parent && this.$parent.$config) {
+ return !this.$parent.$config.hidden;
+ } else {
+ return this.$task.offsetWidth;
+ }
+ },
+ getSize: function getSize() {
+ var config = this.$getConfig();
+ var store = this.$config.rowStore;
+ var contentHeight = store ? this.getTotalHeight() : 0,
+ contentWidth = this.isVisible() ? this._tasks.full_width : 0;
+ return {
+ x: this.isVisible() ? this.$config.width : 0,
+ y: this.isVisible() ? this.$config.height : 0,
+ contentX: this.isVisible() ? contentWidth : 0,
+ contentY: this.isVisible() ? config.scale_height + contentHeight : 0,
+ scrollHeight: this.isVisible() ? contentHeight : 0,
+ scrollWidth: this.isVisible() ? contentWidth : 0
+ };
+ },
+ scrollTo: function scrollTo(left, top) {
+ if (!this.isVisible()) return;
+ var scrolled = false;
+ this.$config.scrollTop = this.$config.scrollTop || 0;
+ this.$config.scrollLeft = this.$config.scrollLeft || 0;
+
+ if (top * 1 === top) {
+ this.$config.scrollTop = top;
+ this.$task_data.scrollTop = this.$config.scrollTop;
+ scrolled = true;
+ }
+
+ if (left * 1 === left) {
+ this.$task.scrollLeft = left;
+ this.$config.scrollLeft = this.$task.scrollLeft;
+
+ this._refreshScales();
+
+ scrolled = true;
+ }
+
+ if (scrolled) {
+ this.callEvent("onScroll", [this.$config.scrollLeft, this.$config.scrollTop]);
+ }
+ },
+ _refreshScales: function _refreshScales() {
+ if (!this.isVisible()) return;
+ var config = this.$getConfig();
+ if (!config.smart_scales) return;
+ var viewPort = this.getViewPort();
+ var scales = this._scales;
+ this.$task_scale.innerHTML = this._getScaleChunkHtml(scales, viewPort.x, viewPort.x_end);
+ },
+ getViewPort: function getViewPort() {
+ var scrollLeft = this.$config.scrollLeft || 0;
+ var scrollTop = this.$config.scrollTop || 0;
+ var height = this.$config.height || 0;
+ var width = this.$config.width || 0;
+ return {
+ y: scrollTop,
+ y_end: scrollTop + height,
+ x: scrollLeft,
+ x_end: scrollLeft + width,
+ height: height,
+ width: width
+ };
+ },
+ _createLayerConfig: function _createLayerConfig() {
+ var self = this;
+
+ var taskFilter = function taskFilter() {
+ return self.isVisible();
+ };
+
+ var barVisible = function barVisible(id, task) {
+ return !task.hide_bar;
+ };
+
+ var taskLayers = [{
+ expose: true,
+ renderer: this.$gantt.$ui.layers.taskBar(),
+ container: this.$task_bars,
+ filter: [taskFilter, barVisible]
+ }, {
+ renderer: this.$gantt.$ui.layers.taskSplitBar(),
+ filter: [taskFilter],
+ container: this.$task_bars,
+ append: true
+ }, {
+ renderer: this.$gantt.$ui.layers.taskRollupBar(),
+ filter: [taskFilter],
+ container: this.$task_bars,
+ append: true
+ }, {
+ renderer: this.$gantt.$ui.layers.taskBg(),
+ container: this.$task_bg,
+ filter: [//function(){
+ // return !self.$getConfig().static_background;
+ //},
+ taskFilter]
+ }];
+ var linkLayers = [{
+ expose: true,
+ renderer: this.$gantt.$ui.layers.link(),
+ container: this.$task_links,
+ filter: [taskFilter]
+ }];
+ return {
+ tasks: taskLayers,
+ links: linkLayers
+ };
+ },
+ _attachLayers: function _attachLayers(gantt) {
+ this._taskLayers = [];
+ this._linkLayers = [];
+ var self = this;
+ var layers = this.$gantt.$services.getService("layers");
+
+ if (this.$config.bind) {
+ this._bindStore();
+
+ var taskRenderer = layers.getDataRender(this.$config.bind);
+
+ if (!taskRenderer) {
+ taskRenderer = layers.createDataRender({
+ name: this.$config.bind,
+ defaultContainer: function defaultContainer() {
+ return self.$task_data;
+ }
+ });
+ }
+
+ taskRenderer.container = function () {
+ return self.$task_data;
+ };
+
+ var taskLayers = this.$config.layers;
+
+ for (var i = 0; taskLayers && i < taskLayers.length; i++) {
+ var layer = taskLayers[i];
+
+ if (typeof layer == "string") {
+ layer = this.$gantt.$ui.layers[layer]();
+ }
+
+ if (typeof layer == "function" || layer && layer.render && layer.update) {
+ layer = {
+ renderer: layer
+ };
+ }
+
+ layer.view = this;
+ var bar_layer = taskRenderer.addLayer(layer);
+
+ this._taskLayers.push(bar_layer);
+
+ if (layer.expose) {
+ this._taskRenderer = taskRenderer.getLayer(bar_layer);
+ }
+ }
+
+ this._initStaticBackgroundRender();
+ }
+
+ if (this.$config.bindLinks) {
+ self.$config.linkStore = self.$gantt.getDatastore(self.$config.bindLinks);
+ var linkRenderer = layers.getDataRender(this.$config.bindLinks);
+
+ if (!linkRenderer) {
+ linkRenderer = layers.createDataRender({
+ name: this.$config.bindLinks,
+ defaultContainer: function defaultContainer() {
+ return self.$task_data;
+ }
+ });
+ }
+
+ var linkLayers = this.$config.linkLayers;
+
+ for (var i = 0; linkLayers && i < linkLayers.length; i++) {
+ if (typeof layer == "string") {
+ layer = this.$gantt.$ui.layers[layer]();
+ }
+
+ var layer = linkLayers[i];
+ layer.view = this; // layer.getViewPort = getViewPort;
+ // subscribeSmartRender(layer);
+
+ var linkLayer = linkRenderer.addLayer(layer);
+
+ this._taskLayers.push(linkLayer);
+
+ if (linkLayers[i].expose) {
+ this._linkRenderer = linkRenderer.getLayer(linkLayer);
+ }
+ }
+ }
+ },
+ _initStaticBackgroundRender: function _initStaticBackgroundRender() {
+ var self = this;
+ var staticRender = canvasRender.create();
+ var store = self.$config.rowStore;
+ if (!store) return;
+ this._staticBgHandler = store.attachEvent("onStoreUpdated", function (id, item, mode) {
+ if (id !== null) {
+ return;
+ }
+
+ if (!self.isVisible()) return;
+ var config = self.$getConfig();
+
+ if (config.static_background || config.timeline_placeholder) {
+ var store = self.$gantt.getDatastore(self.$config.bind);
+ var staticBgContainer = self.$task_bg_static;
+
+ if (!staticBgContainer) {
+ staticBgContainer = document.createElement("div");
+ staticBgContainer.className = "gantt_task_bg";
+ self.$task_bg_static = staticBgContainer;
+
+ if (self.$task_bg.nextSibling) {
+ self.$task_data.insertBefore(staticBgContainer, self.$task_bg.nextSibling);
+ } else {
+ self.$task_data.appendChild(staticBgContainer);
+ }
+ }
+
+ if (store) {
+ var staticBackgroundHeight = self.getTotalHeight();
+
+ if (config.timeline_placeholder) {
+ staticBackgroundHeight = config.timeline_placeholder.height || self.$task_data.offsetHeight || 99999;
+ }
+
+ staticRender.render(staticBgContainer, config, self.getScale(), staticBackgroundHeight, self.getItemHeight(item ? item.id : null));
+ }
+ } else if (config.static_background) {
+ if (self.$task_bg_static && self.$task_bg_static.parentNode) {
+ self.$task_bg_static.parentNode.removeChild(self.$task_bg_static);
+ }
+ }
+ });
+ this.attachEvent("onDestroy", function () {
+ staticRender.destroy();
+ });
+
+ this._initStaticBackgroundRender = function () {}; //init once
+
+ },
+ _clearLayers: function _clearLayers(gantt) {
+ var layers = this.$gantt.$services.getService("layers");
+ var taskRenderer = layers.getDataRender(this.$config.bind);
+ var linkRenderer = layers.getDataRender(this.$config.bindLinks);
+
+ if (this._taskLayers) {
+ for (var i = 0; i < this._taskLayers.length; i++) {
+ taskRenderer.removeLayer(this._taskLayers[i]);
+ }
+ }
+
+ if (this._linkLayers) {
+ for (var i = 0; i < this._linkLayers.length; i++) {
+ linkRenderer.removeLayer(this._linkLayers[i]);
+ }
+ }
+
+ this._linkLayers = [];
+ this._taskLayers = [];
+ },
+ _render_tasks_scales: function _render_tasks_scales() {
+ var config = this.$getConfig();
+ var scales_html = "",
+ outer_width = 0,
+ scale_height = 0;
+ var state = this.$gantt.getState();
+
+ if (this.isVisible()) {
+ var helpers = this.$scaleHelper;
+
+ var scales = this._getScales();
+
+ scale_height = config.scale_height;
+ var availWidth = this.$config.width;
+
+ if (config.autosize == "x" || config.autosize == "xy") {
+ availWidth = Math.max(config.autosize_min_width, 0);
+ }
+
+ var cfgs = helpers.prepareConfigs(scales, config.min_column_width, availWidth, scale_height - 1, state.min_date, state.max_date, config.rtl);
+ var cfg = this._tasks = cfgs[cfgs.length - 1];
+ this._scales = cfgs;
+ this._posFromDateCache = {};
+ scales_html = this._getScaleChunkHtml(cfgs, 0, this.$config.width);
+ outer_width = cfg.full_width + "px"; //cfg.full_width + (this._scroll_sizes().y ? scrollSizes.scroll_size : 0) + "px";
+
+ scale_height += "px";
+ }
+
+ this.$task_scale.style.height = scale_height;
+ this.$task_data.style.width = this.$task_scale.style.width = outer_width;
+ this.$task_scale.innerHTML = scales_html;
+ },
+ _getScaleChunkHtml: function _get_scale_chunk_html(scales, fromPos, toPos) {
+ var templates = this.$gantt.templates;
+ var html = [];
+ var css = templates.scale_row_class;
+
+ for (var i = 0; i < scales.length; i++) {
+ var cssClass = "gantt_scale_line";
+ var tplClass = css(scales[i]);
+
+ if (tplClass) {
+ cssClass += " " + tplClass;
+ }
+
+ html.push("<div class=\"" + cssClass + "\" style=\"height:" + scales[i].height + "px;position:relative;line-height:" + scales[i].height + "px\">" + this._prepareScaleHtml(scales[i], fromPos, toPos) + "</div>");
+ }
+
+ return html.join("");
+ },
+ _prepareScaleHtml: function _prepare_scale_html(config, fromPos, toPos) {
+ var globalConfig = this.$getConfig();
+ var globalTemplates = this.$gantt.templates;
+ var cells = [];
+ var date = null,
+ css = null;
+ var content = config.format || config.template || config.date;
+
+ if (typeof content === "string") {
+ content = this.$gantt.date.date_to_str(content);
+ }
+
+ var startIndex = 0,
+ endIndex = config.count;
+
+ if (globalConfig.smart_scales && !isNaN(fromPos) && !isNaN(toPos)) {
+ startIndex = helpers.findBinary(config.left, fromPos);
+ endIndex = helpers.findBinary(config.left, toPos) + 1;
+ }
+
+ css = config.css || function () {};
+
+ if (!config.css && globalConfig.inherit_scale_class) {
+ css = globalTemplates.scale_cell_class;
+ }
+
+ for (var i = startIndex; i < endIndex; i++) {
+ if (!config.trace_x[i]) break;
+ date = new Date(config.trace_x[i]);
+ var value = content.call(this, date),
+ width = config.width[i],
+ height = config.height,
+ left = config.left[i],
+ style = "",
+ template = "",
+ cssclass = "";
+
+ if (width) {
+ var position = globalConfig.smart_scales ? "position:absolute;left:" + left + "px" : "";
+ style = "width:" + width + "px;height:" + height + "px;" + position;
+ cssclass = "gantt_scale_cell" + (i == config.count - 1 ? " gantt_last_cell" : "");
+ template = css.call(this, date);
+ if (template) cssclass += " " + template;
+
+ var ariaAttr = this.$gantt._waiAria.getTimelineCellAttr(value);
+
+ var cell = "<div class='" + cssclass + "'" + ariaAttr + " style='" + style + "'>" + value + "</div>";
+ cells.push(cell);
+ } else {//do not render ignored cells
+ }
+ }
+
+ return cells.join("");
+ },
+ dateFromPos: function dateFromPos(x) {
+ var scale = this._tasks;
+
+ if (x < 0 || x > scale.full_width || !scale.full_width) {
+ return null;
+ }
+
+ var ind = helpers.findBinary(this._tasks.left, x);
+ var summ = this._tasks.left[ind];
+ var col_width = scale.width[ind] || scale.col_width;
+ var part = 0;
+
+ if (col_width) {
+ part = (x - summ) / col_width;
+
+ if (scale.rtl) {
+ part = 1 - part;
+ }
+ }
+
+ var unit = 0;
+
+ if (part) {
+ unit = this._getColumnDuration(scale, scale.trace_x[ind]);
+ }
+
+ var date = new Date(scale.trace_x[ind].valueOf() + Math.round(part * unit));
+ return date;
+ },
+ posFromDate: function posFromDate(date) {
+ if (!this.isVisible()) return 0;
+
+ if (!date) {
+ return 0;
+ }
+
+ var dateValue = String(date.valueOf());
+
+ if (this._posFromDateCache[dateValue] !== undefined) {
+ return this._posFromDateCache[dateValue];
+ }
+
+ var ind = this.columnIndexByDate(date);
+ this.$gantt.assert(ind >= 0, "Invalid day index");
+ var wholeCells = Math.floor(ind);
+ var partCell = ind % 1;
+
+ var pos = this._tasks.left[Math.min(wholeCells, this._tasks.width.length - 1)];
+
+ if (wholeCells == this._tasks.width.length) pos += this._tasks.width[this._tasks.width.length - 1]; //for(var i=1; i <= wholeCells; i++)
+ // pos += gantt._tasks.width[i-1];
+
+ if (partCell) {
+ if (wholeCells < this._tasks.width.length) {
+ pos += this._tasks.width[wholeCells] * (partCell % 1);
+ } else {
+ pos += 1;
+ }
+ }
+
+ var roundPos = Math.round(pos);
+ this._posFromDateCache[dateValue] = roundPos;
+ return Math.round(roundPos);
+ },
+ _getNextVisibleColumn: function _getNextVisibleColumn(startIndex, columns, ignores) {
+ // iterate columns to the right
+ var date = +columns[startIndex];
+ var visibleDateIndex = startIndex;
+
+ while (ignores[date]) {
+ visibleDateIndex++;
+ date = +columns[visibleDateIndex];
+ }
+
+ return visibleDateIndex;
+ },
+ _getPrevVisibleColumn: function _getPrevVisibleColumn(startIndex, columns, ignores) {
+ // iterate columns to the left
+ var date = +columns[startIndex];
+ var visibleDateIndex = startIndex;
+
+ while (ignores[date]) {
+ visibleDateIndex--;
+ date = +columns[visibleDateIndex];
+ }
+
+ return visibleDateIndex;
+ },
+ _getClosestVisibleColumn: function _getClosestVisibleColumn(startIndex, columns, ignores) {
+ var visibleDateIndex = this._getNextVisibleColumn(startIndex, columns, ignores);
+
+ if (!columns[visibleDateIndex]) {
+ visibleDateIndex = this._getPrevVisibleColumn(startIndex, columns, ignores);
+ }
+
+ return visibleDateIndex;
+ },
+ columnIndexByDate: function columnIndexByDate(date) {
+ var pos = new Date(date).valueOf();
+ var days = this._tasks.trace_x_ascending,
+ ignores = this._tasks.ignore_x;
+ var state = this.$gantt.getState();
+
+ if (pos <= state.min_date) {
+ if (this._tasks.rtl) {
+ return days.length;
+ } else {
+ return 0;
+ }
+ }
+
+ if (pos >= state.max_date) {
+ if (this._tasks.rtl) {
+ return 0;
+ } else {
+ return days.length;
+ }
+ }
+
+ var dateIndex = helpers.findBinary(days, pos);
+
+ var visibleIndex = this._getClosestVisibleColumn(dateIndex, days, ignores);
+
+ var visibleDate = days[visibleIndex];
+ var transition = this._tasks.trace_index_transition;
+
+ if (!visibleDate) {
+ if (transition) {
+ return transition[0];
+ } else {
+ return 0;
+ }
+ }
+
+ var part = (date - days[visibleIndex]) / this._getColumnDuration(this._tasks, days[visibleIndex]);
+
+ if (transition) {
+ return transition[visibleIndex] + (1 - part);
+ } else {
+ return visibleIndex + part;
+ }
+ },
+ getItemPosition: function getItemPosition(task, start_date, end_date) {
+ var xLeft, xRight, width;
+
+ if (this._tasks.rtl) {
+ xRight = this.posFromDate(start_date || task.start_date);
+ xLeft = this.posFromDate(end_date || task.end_date);
+ } else {
+ xLeft = this.posFromDate(start_date || task.start_date);
+ xRight = this.posFromDate(end_date || task.end_date);
+ }
+
+ width = Math.max(xRight - xLeft, 0);
+ var y = this.getItemTop(task.id);
+ var height = this.getBarHeight(task.id);
+ var rowHeight = this.getItemHeight(task.id);
+ return {
+ left: xLeft,
+ top: y,
+ height: height,
+ width: width,
+ rowHeight: rowHeight
+ };
+ },
+ getBarHeight: function getBarHeight(taskId, isMilestoneRender) {
+ var config = this.$getConfig();
+ var task = this.$config.rowStore.getItem(taskId); // height of the bar item
+
+ var height = task.task_height || task.bar_height || config.bar_height || config.task_height;
+ var rowHeight = this.getItemHeight(taskId);
+
+ if (height == "full") {
+ var offset = config.task_height_offset || 5;
+ height = rowHeight - offset;
+ } //item height cannot be bigger than row height
+
+
+ height = Math.min(height, rowHeight);
+
+ if (isMilestoneRender) {
+ // to get correct height for addapting Milestone to the row
+ height = Math.round(height / Math.sqrt(2));
+ }
+
+ return Math.max(height, 0);
+ },
+ getScale: function getScale() {
+ return this._tasks;
+ },
+ _getScales: function _get_scales() {
+ var config = this.$getConfig();
+ var helpers = this.$scaleHelper;
+ var scales = [helpers.primaryScale(config)].concat(helpers.getSubScales(config));
+ helpers.sortScales(scales);
+ return scales;
+ },
+ _getColumnDuration: function _get_coll_duration(scale, date) {
+ return this.$gantt.date.add(date, scale.step, scale.unit) - date;
+ },
+ _bindStore: function _bindStore() {
+ if (this.$config.bind) {
+ var rowStore = this.$gantt.getDatastore(this.$config.bind);
+ this.$config.rowStore = rowStore;
+
+ if (rowStore && !rowStore._timelineCacheAttached) {
+ var self = this;
+ rowStore._timelineCacheAttached = rowStore.attachEvent("onBeforeFilter", function () {
+ self._resetTopPositionHeight();
+ });
+ }
+ }
+ },
+ _unbindStore: function _unbindStore() {
+ if (this.$config.bind) {
+ var rowStore = this.$gantt.getDatastore(this.$config.bind);
+
+ if (rowStore && rowStore._timelineCacheAttached) {
+ rowStore.detachEvent(rowStore._timelineCacheAttached);
+ rowStore._timelineCacheAttached = false;
+ }
+ }
+ },
+ refresh: function refresh() {
+ this._bindStore();
+
+ if (this.$config.bindLinks) {
+ this.$config.linkStore = this.$gantt.getDatastore(this.$config.bindLinks);
+ }
+
+ this._resetTopPositionHeight();
+
+ this._resetHeight();
+
+ this._initStaticBackgroundRender();
+
+ this._render_tasks_scales();
+ },
+ destructor: function destructor() {
+ var gantt = this.$gantt;
+
+ this._clearLayers(gantt);
+
+ this._unbindStore();
+
+ this.$task = null;
+ this.$task_scale = null;
+ this.$task_data = null;
+ this.$task_bg = null;
+ this.$task_links = null;
+ this.$task_bars = null;
+ this.$gantt = null;
+
+ if (this.$config.rowStore) {
+ this.$config.rowStore.detachEvent(this._staticBgHandler);
+ this.$config.rowStore = null;
+ }
+
+ if (this.$config.linkStore) {
+ this.$config.linkStore = null;
+ }
+
+ if (this._timelineDragScroll) {
+ this._timelineDragScroll.destructor();
+
+ this._timelineDragScroll = null;
+ }
+
+ this.callEvent("onDestroy", []);
+ this.detachAllEvents();
+ }
+};
+module.exports = Timeline;
+
+/***/ }),
+
+/***/ "./sources/core/ui/touch.js":
+/*!**********************************!*\
+ !*** ./sources/core/ui/touch.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.config.touch_drag = 500; //nearly immediate dnd
+
+ gantt.config.touch = true;
+ gantt.config.touch_feedback = true;
+ gantt.config.touch_feedback_duration = 1;
+ gantt._prevent_touch_scroll = false;
+
+ gantt._touch_feedback = function () {
+ if (gantt.config.touch_feedback) {
+ if (navigator.vibrate) navigator.vibrate(gantt.config.touch_feedback_duration);
+ }
+ };
+
+ gantt.attachEvent("onGanttReady", gantt.bind(function () {
+ if (this.config.touch != "force") this.config.touch = this.config.touch && (navigator.userAgent.indexOf("Mobile") != -1 || navigator.userAgent.indexOf("iPad") != -1 || navigator.userAgent.indexOf("Android") != -1 || navigator.userAgent.indexOf("Touch") != -1) || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;
+
+ if (this.config.touch) {
+ var touchEventsSupported = true;
+
+ try {
+ document.createEvent("TouchEvent");
+ } catch (e) {
+ touchEventsSupported = false;
+ }
+
+ if (touchEventsSupported) {
+ this._touch_events(["touchmove", "touchstart", "touchend"], function (ev) {
+ if (ev.touches && ev.touches.length > 1) return null;
+ if (ev.touches[0]) return {
+ target: ev.target,
+ pageX: ev.touches[0].pageX,
+ pageY: ev.touches[0].pageY,
+ clientX: ev.touches[0].clientX,
+ clientY: ev.touches[0].clientY
+ };else return ev;
+ }, function () {
+ return false;
+ });
+ } else if (window.navigator.pointerEnabled) {
+ this._touch_events(["pointermove", "pointerdown", "pointerup"], function (ev) {
+ if (ev.pointerType == "mouse") return null;
+ return ev;
+ }, function (ev) {
+ return !ev || ev.pointerType == "mouse";
+ });
+ } else if (window.navigator.msPointerEnabled) {
+ this._touch_events(["MSPointerMove", "MSPointerDown", "MSPointerUp"], function (ev) {
+ if (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE) return null;
+ return ev;
+ }, function (ev) {
+ return !ev || ev.pointerType == ev.MSPOINTER_TYPE_MOUSE;
+ });
+ }
+ }
+ }, gantt));
+
+ function findTargetView(event) {
+ var allViews = gantt.$layout.getCellsByType("viewCell");
+
+ for (var i = 0; i < allViews.length; i++) {
+ var box = allViews[i].$view.getBoundingClientRect();
+
+ if (event.clientX >= box.left && event.clientX <= box.right && event.clientY <= box.bottom && event.clientY >= box.top) {
+ return allViews[i];
+ }
+ }
+ }
+
+ function getScrollState(view) {
+ var scrollX = view.$config.scrollX ? gantt.$ui.getView(view.$config.scrollX) : null;
+ var scrollY = view.$config.scrollY ? gantt.$ui.getView(view.$config.scrollY) : null;
+ var scrollState = {
+ x: null,
+ y: null
+ };
+
+ if (scrollX) {
+ var state = scrollX.getScrollState();
+
+ if (state.visible) {
+ scrollState.x = scrollX.$view.scrollLeft;
+ }
+ }
+
+ if (scrollY) {
+ var state = scrollY.getScrollState();
+
+ if (state.visible) {
+ scrollState.y = scrollY.$view.scrollTop;
+ }
+ }
+
+ return scrollState;
+ }
+
+ function scrollView(view, left, top) {
+ var scrollX = view.$config.scrollX ? gantt.$ui.getView(view.$config.scrollX) : null;
+ var scrollY = view.$config.scrollY ? gantt.$ui.getView(view.$config.scrollY) : null;
+
+ if (scrollX) {
+ scrollX.scrollTo(left, null);
+ }
+
+ if (scrollY) {
+ scrollY.scrollTo(null, top);
+ }
+ }
+
+ function getTaskDND() {
+ var tasksDnD;
+
+ if (gantt.$ui.getView("timeline")) {
+ tasksDnD = gantt.$ui.getView("timeline")._tasks_dnd;
+ }
+
+ return tasksDnD;
+ }
+
+ var touchHandlers = []; //we can't use native scrolling, as we need to sync momentum between different parts
+ //so we will block native scroll and use the custom one
+ //in future we can add custom momentum
+
+ gantt._touch_events = function (names, accessor, ignore) {
+ //webkit on android need to be handled separately
+ var dblclicktime = 0;
+ var actionMode = false;
+ var scrollMode = false;
+ var actionStart = null;
+ var scrollState;
+ var longTapTimer = null;
+ var currentDndId = null;
+ var dndNodes = [];
+ var targetView = null;
+
+ for (var i = 0; i < touchHandlers.length; i++) {
+ gantt.eventRemove(touchHandlers[i][0], touchHandlers[i][1], touchHandlers[i][2]);
+ }
+
+ touchHandlers = []; //touch move
+
+ touchHandlers.push([gantt.$container, names[0], function (e) {
+ var tasksDnD = getTaskDND();
+ if (ignore(e)) return; //ignore common and scrolling moves
+
+ if (!actionMode) return;
+ if (longTapTimer) clearTimeout(longTapTimer);
+ var source = accessor(e);
+
+ if (tasksDnD && (tasksDnD.drag.id || tasksDnD.drag.start_drag)) {
+ tasksDnD.on_mouse_move(source);
+ if (e.preventDefault) e.preventDefault();
+ e.cancelBubble = true;
+ return false;
+ }
+
+ if (!gantt._prevent_touch_scroll) {
+ if (source && actionStart) {
+ var dx = actionStart.pageX - source.pageX;
+ var dy = actionStart.pageY - source.pageY;
+
+ if (!scrollMode && (Math.abs(dx) > 5 || Math.abs(dy) > 5)) {
+ scrollMode = true; //gantt._touch_scroll_active = scroll_mode = true;
+
+ dblclicktime = 0;
+
+ if (targetView) {
+ scrollState = getScrollState(targetView);
+ } else {
+ scrollState = gantt.getScrollState();
+ }
+ }
+
+ if (scrollMode) {
+ var newScrollState;
+ var scrollX = scrollState.x + dx;
+ var scrollY = scrollState.y + dy;
+
+ if (targetView) {
+ scrollView(targetView, scrollX, scrollY);
+ newScrollState = getScrollState(targetView);
+ } else {
+ gantt.scrollTo(scrollX, scrollY);
+ newScrollState = gantt.getScrollState();
+ }
+
+ if (scrollState.x != newScrollState.x && dy > 2 * dx || scrollState.y != newScrollState.y && dx > 2 * dy) {
+ return block_action(e);
+ }
+ }
+ }
+
+ return block_action(e);
+ }
+
+ return true;
+ }]); //block touch context menu in IE10
+
+ touchHandlers.push([this.$container, "contextmenu", function (e) {
+ if (actionMode) return block_action(e);
+ }]); //touch start
+
+ touchHandlers.push([this.$container, names[1], function (e) {
+ // block pull-to-refresh
+ if (document && document.body) {
+ document.body.classList.add("gantt_touch_active");
+ }
+
+ if (ignore(e)) return;
+
+ if (e.touches && e.touches.length > 1) {
+ actionMode = false;
+ return;
+ }
+
+ actionStart = accessor(e);
+ targetView = findTargetView(actionStart);
+
+ if (!gantt._locate_css(actionStart, "gantt_hor_scroll") && !gantt._locate_css(actionStart, "gantt_ver_scroll")) {
+ actionMode = true;
+ }
+
+ var tasksDnD = getTaskDND(); //long tap
+
+ longTapTimer = setTimeout(function () {
+ var taskId = gantt.locate(actionStart);
+
+ if (tasksDnD && taskId && !gantt._locate_css(actionStart, "gantt_link_control") && !gantt._locate_css(actionStart, "gantt_grid_data")) {
+ tasksDnD.on_mouse_down(actionStart);
+
+ if (tasksDnD.drag && tasksDnD.drag.start_drag) {
+ cloneTaskRendered(taskId);
+
+ tasksDnD._start_dnd(actionStart);
+
+ gantt._touch_drag = true;
+ gantt.refreshTask(taskId);
+
+ gantt._touch_feedback();
+ }
+ }
+
+ longTapTimer = null;
+ }, gantt.config.touch_drag);
+ }]); //touch end
+
+ touchHandlers.push([this.$container, names[2], function (e) {
+ if (document && document.body) {
+ document.body.classList.remove("gantt_touch_active");
+ }
+
+ if (ignore(e)) return;
+ if (longTapTimer) clearTimeout(longTapTimer);
+ gantt._touch_drag = false;
+ actionMode = false;
+ var source = accessor(e);
+ var tasksDnD = getTaskDND();
+ if (tasksDnD) tasksDnD.on_mouse_up(source);
+
+ if (currentDndId && gantt.isTaskExists(currentDndId)) {
+ gantt.refreshTask(currentDndId);
+
+ if (dndNodes.length) {
+ dndNodes.forEach(function (node) {
+ if (node.parentNode) {
+ node.parentNode.removeChild(node);
+ }
+ });
+
+ gantt._touch_feedback();
+ }
+ } //gantt._touch_scroll_active = action_mode = scroll_mode = false;
+
+
+ actionMode = scrollMode = false;
+ dndNodes = [];
+ currentDndId = null; //dbl-tap handling
+
+ if (actionStart && dblclicktime) {
+ var now = new Date();
+
+ if (now - dblclicktime < 500) {
+ var mouseEvents = gantt.$services.getService("mouseEvents");
+ mouseEvents.onDoubleClick(actionStart);
+ block_action(e);
+ } else dblclicktime = now;
+ } else {
+ dblclicktime = new Date();
+ }
+ }]);
+
+ for (var i = 0; i < touchHandlers.length; i++) {
+ gantt.event(touchHandlers[i][0], touchHandlers[i][1], touchHandlers[i][2]);
+ } //common helper, prevents event
+
+
+ function block_action(e) {
+ if (e && e.preventDefault) {
+ e.preventDefault();
+ }
+
+ e.cancelBubble = true;
+ return false;
+ }
+
+ function cloneTaskRendered(taskId) {
+ var renders = gantt._getTaskLayers();
+
+ var task = gantt.getTask(taskId);
+
+ if (task && gantt.isTaskVisible(taskId)) {
+ currentDndId = taskId;
+
+ for (var i = 0; i < renders.length; i++) {
+ task = renders[i].rendered[taskId];
+
+ if (task && task.getAttribute(gantt.config.task_attribute) && task.getAttribute(gantt.config.task_attribute) == taskId) {
+ var copy = task.cloneNode(true);
+ dndNodes.push(task);
+ renders[i].rendered[taskId] = copy;
+ task.style.display = "none";
+ copy.className += " gantt_drag_move ";
+ task.parentNode.appendChild(copy); //return copy;
+ }
+ }
+ }
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/ui_factory.js":
+/*!***************************************!*\
+ !*** ./sources/core/ui/ui_factory.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js"),
+ configurable = __webpack_require__(/*! ./configurable */ "./sources/core/ui/configurable.js");
+
+var uiFactory = function createFactory(gantt) {
+ var views = {};
+
+ function ui(cell, parentView) {
+ var content;
+ var view = "cell";
+
+ if (cell.view) {
+ view = "viewcell";
+ } else if (cell.resizer) {
+ view = "resizer";
+ } else if (cell.rows || cell.cols) {
+ view = "layout";
+ } else if (cell.views) {
+ view = "multiview";
+ }
+
+ content = createView.call(this, view, null, cell, parentView);
+ return content;
+ }
+
+ var createdViews = {};
+
+ function createView(name, parent, config, parentView) {
+ var creator = views[name];
+ if (!creator || !creator.create) return false;
+
+ if (name == "resizer" && !config.mode) {
+ if (parentView.$config.cols) {
+ config.mode = "x";
+ } else {
+ config.mode = "y";
+ }
+ }
+
+ if (name == "viewcell" && config.view == "scrollbar" && !config.scroll) {
+ if (parentView.$config.cols) {
+ config.scroll = "y";
+ } else {
+ config.scroll = "x";
+ }
+ }
+
+ var config = utils.copy(config);
+
+ if (!config.id && !createdViews[config.view]) {
+ config.id = config.view;
+ }
+
+ if (config.id && !config.css) {
+ config.css = config.id + "_cell";
+ }
+
+ var view = new creator.create(parent, config, this, gantt);
+
+ if (creator.configure) {
+ creator.configure(view);
+ }
+
+ configurable(view, parentView);
+
+ if (!view.$id) {
+ view.$id = config.id || gantt.uid();
+ }
+
+ if (!view.$parent && _typeof(parent) == "object") {
+ view.$parent = parent;
+ }
+
+ if (!view.$config) {
+ view.$config = config;
+ }
+
+ if (createdViews[view.$id]) {
+ view.$id = gantt.uid();
+ }
+
+ createdViews[view.$id] = view;
+ return view;
+ }
+
+ function reset() {
+ createdViews = {};
+ }
+
+ function register(name, viewConstructor, configure) {
+ views[name] = {
+ create: viewConstructor,
+ configure: configure
+ };
+ }
+
+ function getView(id) {
+ return createdViews[id];
+ }
+
+ var factory = {
+ initUI: ui,
+ reset: reset,
+ registerView: register,
+ createView: createView,
+ getView: getView
+ };
+ return factory;
+};
+
+module.exports = {
+ createFactory: uiFactory
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/utils/dom_event_scope.js":
+/*!**************************************************!*\
+ !*** ./sources/core/ui/utils/dom_event_scope.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js");
+
+function createScope(addEvent, removeEvent) {
+ addEvent = addEvent || utils.event;
+ removeEvent = removeEvent || utils.eventRemove;
+ var handlers = [];
+ var eventScope = {
+ attach: function attach(el, event, callback, capture) {
+ handlers.push({
+ element: el,
+ event: event,
+ callback: callback,
+ capture: capture
+ });
+ addEvent(el, event, callback, capture);
+ },
+ detach: function detach(el, event, callback, capture) {
+ removeEvent(el, event, callback, capture);
+
+ for (var i = 0; i < handlers.length; i++) {
+ var handler = handlers[i];
+
+ if (handler.element === el && handler.event === event && handler.callback === callback && handler.capture === capture) {
+ handlers.splice(i, 1);
+ i--;
+ }
+ }
+ },
+ detachAll: function detachAll() {
+ var staticArray = handlers.slice(); // original handlers array can be spliced on every iteration
+
+ for (var i = 0; i < staticArray.length; i++) {
+ var handler = staticArray[i];
+ eventScope.detach(handler.element, handler.event, handler.callback, handler.capture);
+ eventScope.detach(handler.element, handler.event, handler.callback, undefined);
+ eventScope.detach(handler.element, handler.event, handler.callback, false);
+ eventScope.detach(handler.element, handler.event, handler.callback, true);
+ }
+
+ handlers.splice(0, handlers.length);
+ },
+ extend: function extend() {
+ return createScope(this.event, this.eventRemove);
+ }
+ };
+ return eventScope;
+}
+
+module.exports = createScope;
+
+/***/ }),
+
+/***/ "./sources/core/ui/utils/dom_helpers.js":
+/*!**********************************************!*\
+ !*** ./sources/core/ui/utils/dom_helpers.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+//returns position of html element on the page
+function elementPosition(elem) {
+ var top = 0,
+ left = 0,
+ right = 0,
+ bottom = 0;
+
+ if (elem.getBoundingClientRect) {
+ //HTML5 method
+ var box = elem.getBoundingClientRect();
+ var body = document.body;
+ var docElem = document.documentElement || document.body.parentNode || document.body;
+ var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
+ var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
+ var clientTop = docElem.clientTop || body.clientTop || 0;
+ var clientLeft = docElem.clientLeft || body.clientLeft || 0;
+ top = box.top + scrollTop - clientTop;
+ left = box.left + scrollLeft - clientLeft;
+ right = document.body.offsetWidth - box.right;
+ bottom = document.body.offsetHeight - box.bottom;
+ } else {
+ //fallback to naive approach
+ while (elem) {
+ top = top + parseInt(elem.offsetTop, 10);
+ left = left + parseInt(elem.offsetLeft, 10);
+ elem = elem.offsetParent;
+ }
+
+ right = document.body.offsetWidth - elem.offsetWidth - left;
+ bottom = document.body.offsetHeight - elem.offsetHeight - top;
+ }
+
+ return {
+ y: Math.round(top),
+ x: Math.round(left),
+ width: elem.offsetWidth,
+ height: elem.offsetHeight,
+ right: Math.round(right),
+ bottom: Math.round(bottom)
+ };
+}
+
+function isVisible(node) {
+ var display = false,
+ visibility = false;
+
+ if (window.getComputedStyle) {
+ var style = window.getComputedStyle(node, null);
+ display = style["display"];
+ visibility = style["visibility"];
+ } else if (node.currentStyle) {
+ display = node.currentStyle["display"];
+ visibility = node.currentStyle["visibility"];
+ }
+
+ return display != "none" && visibility != "hidden";
+}
+
+function hasNonNegativeTabIndex(node) {
+ return !isNaN(node.getAttribute("tabindex")) && node.getAttribute("tabindex") * 1 >= 0;
+}
+
+function hasHref(node) {
+ var canHaveHref = {
+ "a": true,
+ "area": true
+ };
+
+ if (canHaveHref[node.nodeName.loLowerCase()]) {
+ return !!node.getAttribute("href");
+ }
+
+ return true;
+}
+
+function isEnabled(node) {
+ var canDisable = {
+ "input": true,
+ "select": true,
+ "textarea": true,
+ "button": true,
+ "object": true
+ };
+
+ if (canDisable[node.nodeName.toLowerCase()]) {
+ return !node.hasAttribute("disabled");
+ }
+
+ return true;
+}
+
+function getFocusableNodes(root) {
+ var nodes = root.querySelectorAll(["a[href]", "area[href]", "input", "select", "textarea", "button", "iframe", "object", "embed", "[tabindex]", "[contenteditable]"].join(", "));
+ var nodesArray = Array.prototype.slice.call(nodes, 0);
+
+ for (var i = 0; i < nodesArray.length; i++) {
+ nodesArray[i].$position = i; // we remember original nodes order,
+ // so when we sort them by tabindex we ensure order of nodes with same tabindex is preserved,
+ // since some browsers do unstable sort
+ } // use tabindex to sort focusable nodes
+
+
+ nodesArray.sort(function (a, b) {
+ if (a.tabIndex === 0 && b.tabIndex !== 0) {
+ return 1;
+ }
+
+ if (a.tabIndex !== 0 && b.tabIndex === 0) {
+ return -1;
+ }
+
+ if (a.tabIndex === b.tabIndex) {
+ // ensure we do stable sort
+ return a.$position - b.$position;
+ }
+
+ if (a.tabIndex < b.tabIndex) {
+ return -1;
+ }
+
+ return 1;
+ });
+
+ for (var i = 0; i < nodesArray.length; i++) {
+ var node = nodesArray[i];
+ var isValid = (hasNonNegativeTabIndex(node) || isEnabled(node) || hasHref(node)) && isVisible(node);
+
+ if (!isValid) {
+ nodesArray.splice(i, 1);
+ i--;
+ }
+ }
+
+ return nodesArray;
+}
+
+function getScrollSize() {
+ var div = document.createElement("div");
+ div.style.cssText = "visibility:hidden;position:absolute;left:-1000px;width:100px;padding:0px;margin:0px;height:110px;min-height:100px;overflow-y:scroll;";
+ document.body.appendChild(div);
+ var width = div.offsetWidth - div.clientWidth;
+ document.body.removeChild(div);
+ return width;
+}
+
+function getClassName(node) {
+ if (!node) return "";
+ var className = node.className || "";
+ if (className.baseVal) //'className' exist but not a string - IE svg element in DOM
+ className = className.baseVal;
+ if (!className.indexOf) className = "";
+ return _trimString(className);
+}
+
+function addClassName(node, className) {
+ if (className && node.className.indexOf(className) === -1) {
+ node.className += " " + className;
+ }
+}
+
+function removeClassName(node, name) {
+ name = name.split(" ");
+
+ for (var i = 0; i < name.length; i++) {
+ var regEx = new RegExp("\\s?\\b" + name[i] + "\\b(?![-_.])", "");
+ node.className = node.className.replace(regEx, "");
+ }
+}
+
+function hasClass(element, className) {
+ if ('classList' in element) {
+ return element.classList.contains(className);
+ } else {
+ return new RegExp("\\b" + className + "\\b").test(element.className);
+ }
+}
+
+function toNode(node) {
+ if (typeof node === "string") {
+ return document.getElementById(node) || document.querySelector(node) || document.body;
+ }
+
+ return node || document.body;
+}
+
+var _slave;
+
+function insert(node, newone) {
+ if (!_slave) {
+ _slave = document.createElement("div");
+ }
+
+ _slave.innerHTML = newone;
+ var child = _slave.firstChild;
+ node.appendChild(child);
+ return child;
+}
+
+function remove(node) {
+ if (node && node.parentNode) {
+ node.parentNode.removeChild(node);
+ }
+}
+
+function getChildren(node, css) {
+ var ch = node.childNodes;
+ var len = ch.length;
+ var out = [];
+
+ for (var i = 0; i < len; i++) {
+ var obj = ch[i];
+
+ if (obj.className && obj.className.indexOf(css) !== -1) {
+ out.push(obj);
+ }
+ }
+
+ return out;
+}
+
+function getTargetNode(e) {
+ var trg;
+ if (e.tagName) trg = e;else {
+ e = e || window.event;
+ trg = e.target || e.srcElement;
+
+ if (trg.shadowRoot && e.composedPath) {
+ trg = e.composedPath()[0];
+ }
+ }
+ return trg;
+}
+
+function locateAttribute(e, attribute) {
+ if (!attribute) return;
+ var trg = getTargetNode(e);
+
+ while (trg) {
+ if (trg.getAttribute) {
+ //text nodes has not getAttribute
+ var test = trg.getAttribute(attribute);
+ if (test) return trg;
+ }
+
+ trg = trg.parentNode;
+ }
+
+ return null;
+}
+
+function _trimString(str) {
+ var func = String.prototype.trim || function () {
+ return this.replace(/^\s+|\s+$/g, "");
+ };
+
+ return func.apply(str);
+}
+
+function locateClassName(e, classname, strict) {
+ var trg = getTargetNode(e);
+ var css = "";
+ if (strict === undefined) strict = true;
+
+ while (trg) {
+ css = getClassName(trg);
+
+ if (css) {
+ var ind = css.indexOf(classname);
+
+ if (ind >= 0) {
+ if (!strict) return trg; //check that we have exact match
+
+ var left = ind === 0 || !_trimString(css.charAt(ind - 1));
+ var right = ind + classname.length >= css.length || !_trimString(css.charAt(ind + classname.length));
+ if (left && right) return trg;
+ }
+ }
+
+ trg = trg.parentNode;
+ }
+
+ return null;
+}
+/*
+event position relatively to DOM element
+ */
+
+
+function getRelativeEventPosition(ev, node) {
+ var d = document.documentElement;
+ var box = elementPosition(node);
+ return {
+ x: ev.clientX + d.scrollLeft - d.clientLeft - box.x + node.scrollLeft,
+ y: ev.clientY + d.scrollTop - d.clientTop - box.y + node.scrollTop
+ };
+}
+
+function isChildOf(child, parent) {
+ if (!child || !parent) {
+ return false;
+ }
+
+ while (child && child != parent) {
+ child = child.parentNode;
+ }
+
+ return child === parent;
+}
+
+function closest(element, selector) {
+ if (element.closest) {
+ return element.closest(selector);
+ } else if (element.matches || element.msMatchesSelector || element.webkitMatchesSelector) {
+ var el = element;
+ if (!document.documentElement.contains(el)) return null;
+
+ do {
+ var method = el.matches || el.msMatchesSelector || el.webkitMatchesSelector;
+ if (method.call(el, selector)) return el;
+ el = el.parentElement || el.parentNode;
+ } while (el !== null && el.nodeType === 1);
+
+ return null;
+ } else {
+ // eslint-disable-next-line no-console
+ console.error("Your browser is not supported");
+ return null;
+ }
+}
+
+function isShadowDomSupported() {
+ return document.head.createShadowRoot || document.head.attachShadow;
+}
+/**
+ * Returns element that has the browser focus, or null if no element has focus.
+ * Works with shadow DOM, so it's prefereed to use this function instead of document.activeElement directly.
+ * @returns HTMLElement
+ */
+
+
+function getActiveElement() {
+ var activeElement = document.activeElement;
+
+ if (activeElement.shadowRoot) {
+ activeElement = activeElement.shadowRoot.activeElement;
+ }
+
+ if (activeElement === document.body && document.getSelection) {
+ activeElement = document.getSelection().focusNode || document.body;
+ }
+
+ return activeElement;
+}
+/**
+ * Returns document.body or the host node of the ShadowRoot, if the element is attached to ShadowDom
+ * @param {HTMLElement} element
+ * @returns HTMLElement
+ */
+
+
+function getRootNode(element) {
+ if (!element) {
+ return document.body;
+ }
+
+ if (!isShadowDomSupported()) {
+ return document.body;
+ }
+
+ while (element.parentNode && (element = element.parentNode)) {
+ if (element instanceof ShadowRoot) {
+ return element.host;
+ }
+ }
+
+ return document.body;
+}
+
+function hasShadowParent(element) {
+ return !!getRootNode(element);
+}
+
+module.exports = {
+ getNodePosition: elementPosition,
+ getFocusableNodes: getFocusableNodes,
+ getScrollSize: getScrollSize,
+ getClassName: getClassName,
+ addClassName: addClassName,
+ removeClassName: removeClassName,
+ insertNode: insert,
+ removeNode: remove,
+ getChildNodes: getChildren,
+ toNode: toNode,
+ locateClassName: locateClassName,
+ locateAttribute: locateAttribute,
+ getTargetNode: getTargetNode,
+ getRelativeEventPosition: getRelativeEventPosition,
+ isChildOf: isChildOf,
+ hasClass: hasClass,
+ closest: closest,
+ getRootNode: getRootNode,
+ hasShadowParent: hasShadowParent,
+ isShadowDomSupported: isShadowDomSupported,
+ getActiveElement: getActiveElement
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui/utils/html_helpers.js":
+/*!***********************************************!*\
+ !*** ./sources/core/ui/utils/html_helpers.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var helpers = __webpack_require__(/*! ../../../utils/helpers */ "./sources/utils/helpers.js");
+
+var htmlHelpers = {
+ getHtmlSelect: function getHtmlSelect(options, attributes, value) {
+ var innerHTML = "";
+
+ var _this = this;
+
+ options = options || [];
+ helpers.forEach(options, function (entry) {
+ var _attributes = [{
+ key: "value",
+ value: entry.key
+ }];
+
+ if (value == entry.key) {
+ _attributes[_attributes.length] = {
+ key: "selected",
+ value: "selected"
+ };
+ }
+
+ if (entry.attributes) {
+ _attributes = _attributes.concat(entry.attributes);
+ }
+
+ innerHTML += _this.getHtmlOption({
+ innerHTML: entry.label
+ }, _attributes);
+ });
+ return _getHtmlContainer("select", {
+ innerHTML: innerHTML
+ }, attributes);
+ },
+ getHtmlOption: function getHtmlOption(options, attributes) {
+ return _getHtmlContainer("option", options, attributes);
+ },
+ getHtmlButton: function getHtmlButton(options, attributes) {
+ return _getHtmlContainer("button", options, attributes);
+ },
+ getHtmlDiv: function getHtmlDiv(options, attributes) {
+ return _getHtmlContainer("div", options, attributes);
+ },
+ getHtmlLabel: function getHtmlLabel(options, attributes) {
+ return _getHtmlContainer("label", options, attributes);
+ },
+ getHtmlInput: function getHtmlInput(attributes) {
+ return "<input" + _getHtmlAttributes(attributes || []) + ">";
+ }
+};
+
+function _getHtmlContainer(tag, options, attributes) {
+ var html;
+ options = options || [];
+ html = "<" + tag + _getHtmlAttributes(attributes || []) + ">" + (options.innerHTML || "") + "</" + tag + ">";
+ return html;
+}
+
+function _getHtmlAttributes(attributes) {
+ var html = "";
+ helpers.forEach(attributes, function (entry) {
+ html += " " + entry.key + "='" + entry.value + "'";
+ });
+ return html;
+}
+
+module.exports = htmlHelpers;
+
+/***/ }),
+
+/***/ "./sources/core/ui/wai_aria.js":
+/*!*************************************!*\
+ !*** ./sources/core/ui/wai_aria.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ // TODO: why eslint fails on regexp?
+ // eslint-disable-next-line no-control-regex
+ var htmlTags = new RegExp("<(?:.|\n)*?>", "gm");
+ var extraSpaces = new RegExp(" +", "gm");
+
+ function stripHTMLLite(htmlText) {
+ return (htmlText + "").replace(htmlTags, " ").replace(extraSpaces, " ");
+ }
+
+ var singleQuotes = new RegExp("'", "gm");
+
+ function escapeQuotes(text) {
+ return (text + "").replace(singleQuotes, "'");
+ }
+
+ gantt._waiAria = {
+ getAttributeString: function getAttributeString(attr) {
+ var attributes = [" "];
+
+ for (var i in attr) {
+ var text = escapeQuotes(stripHTMLLite(attr[i]));
+ attributes.push(i + "='" + text + "'");
+ }
+
+ attributes.push(" ");
+ return attributes.join(" ");
+ },
+ getTimelineCellAttr: function getTimelineCellAttr(dateString) {
+ return gantt._waiAria.getAttributeString({
+ "aria-label": dateString
+ });
+ },
+ _taskCommonAttr: function _taskCommonAttr(task, div) {
+ if (!(task.start_date && task.end_date)) return;
+ div.setAttribute("aria-label", stripHTMLLite(gantt.templates.tooltip_text(task.start_date, task.end_date, task)));
+
+ if (task.$dataprocessor_class) {
+ div.setAttribute("aria-busy", true);
+ }
+ },
+ setTaskBarAttr: function setTaskBarAttr(task, div) {
+ this._taskCommonAttr(task, div); // task bars are complex elements that should be treated as a single element
+
+
+ div.setAttribute("role", "img");
+
+ if (!gantt.isReadonly(task) && gantt.config.drag_move) {
+ if (task.id != gantt.getState("tasksDnd").drag_id) {
+ div.setAttribute("aria-grabbed", false);
+ } else {
+ div.setAttribute("aria-grabbed", true);
+ }
+ }
+ },
+ taskRowAttr: function taskRowAttr(task, div) {
+ this._taskCommonAttr(task, div);
+
+ if (!gantt.isReadonly(task) && gantt.config.order_branch) {
+ div.setAttribute("aria-grabbed", false);
+ }
+
+ div.setAttribute("role", "row"); // selected attribute should be added only to the grid because
+ // other parts don't have the keyboard navigation
+
+ div.setAttribute("aria-selected", gantt.isSelectedTask(task.id) ? "true" : "false"); // allowed values start from 1, set 1 for non-tree datastores
+
+ div.setAttribute("aria-level", task.$level + 1 || 1);
+
+ if (gantt.hasChild(task.id)) {
+ div.setAttribute("aria-expanded", task.$open ? "true" : "false");
+ }
+ },
+ linkAttr: function linkAttr(link, div) {
+ var linkTypes = gantt.config.links;
+ var toStart = link.type == linkTypes.finish_to_start || link.type == linkTypes.start_to_start;
+ var fromStart = link.type == linkTypes.start_to_start || link.type == linkTypes.start_to_finish;
+ var content = gantt.locale.labels.link + " " + gantt.templates.drag_link(link.source, fromStart, link.target, toStart); // links are complex elements that should be treated as a single element
+
+ div.setAttribute("role", "img");
+ div.setAttribute("aria-label", stripHTMLLite(content));
+
+ if (gantt.isReadonly(link)) {
+ div.setAttribute("aria-readonly", true);
+ }
+ },
+ gridSeparatorAttr: function gridSeparatorAttr(div) {
+ // the only valid role for the grid header
+ div.setAttribute("role", "columnheader");
+ },
+ rowResizerAttr: function rowResizerAttr(div) {
+ // the only valid role for the grid header
+ div.setAttribute("role", "row");
+ },
+ lightboxHiddenAttr: function lightboxHiddenAttr(div) {
+ div.setAttribute("aria-hidden", "true");
+ },
+ lightboxVisibleAttr: function lightboxVisibleAttr(div) {
+ div.setAttribute("aria-hidden", "false");
+ },
+ lightboxAttr: function lightboxAttr(div) {
+ div.setAttribute("role", "dialog");
+ div.setAttribute("aria-hidden", "true");
+ div.firstChild.setAttribute("role", "heading");
+ div.firstChild.setAttribute("aria-level", "1");
+ },
+ lightboxButtonAttrString: function lightboxButtonAttrString(buttonName) {
+ return this.getAttributeString({
+ "role": "button",
+ "aria-label": gantt.locale.labels[buttonName],
+ "tabindex": "0"
+ });
+ },
+ lightboxHeader: function lightboxHeader(div, headerText) {
+ div.setAttribute("aria-label", headerText);
+ },
+ lightboxSelectAttrString: function lightboxSelectAttrString(time_option) {
+ var label = "";
+
+ switch (time_option) {
+ case "%Y":
+ label = gantt.locale.labels.years;
+ break;
+
+ case "%m":
+ label = gantt.locale.labels.months;
+ break;
+
+ case "%d":
+ label = gantt.locale.labels.days;
+ break;
+
+ case "%H:%i":
+ label = gantt.locale.labels.hours + gantt.locale.labels.minutes;
+ break;
+
+ default:
+ break;
+ }
+
+ return gantt._waiAria.getAttributeString({
+ "aria-label": label
+ });
+ },
+ lightboxDurationInputAttrString: function lightboxDurationInputAttrString(section) {
+ return this.getAttributeString({
+ "aria-label": gantt.locale.labels.column_duration,
+ "aria-valuemin": "0",
+ "role": "spinbutton"
+ });
+ },
+ inlineEditorAttr: function inlineEditorAttr(div) {
+ div.setAttribute("role", "row");
+ },
+ gridAttrString: function gridAttrString() {
+ return [" role='treegrid'", gantt.config.multiselect ? "aria-multiselectable='true'" : "aria-multiselectable='false'", " "].join(" ");
+ },
+ gridScaleRowAttrString: function gridScaleRowAttrString() {
+ return "role='row'";
+ },
+ gridScaleCellAttrString: function gridScaleCellAttrString(column, label) {
+ var attrs = "";
+
+ if (column.name == "add") {
+ // a more precise role is button, but it is not valid for the grid header
+ attrs = this.getAttributeString({
+ "role": "columnheader",
+ "aria-label": gantt.locale.labels.new_task
+ });
+ } else {
+ var attributes = {
+ "role": "columnheader",
+ "aria-label": label
+ };
+
+ if (gantt._sort && gantt._sort.name == column.name) {
+ if (gantt._sort.direction == "asc") {
+ attributes["aria-sort"] = "ascending";
+ } else {
+ attributes["aria-sort"] = "descending";
+ }
+ }
+
+ attrs = this.getAttributeString(attributes);
+ }
+
+ return attrs;
+ },
+ gridDataAttrString: function gridDataAttrString() {
+ return "role='rowgroup'";
+ },
+ reorderMarkerAttr: function reorderMarkerAttr(div) {
+ div.setAttribute("role", "grid");
+ div.firstChild.removeAttribute("aria-level");
+ div.firstChild.setAttribute("aria-grabbed", "true");
+ },
+ gridCellAttrString: function gridCellAttrString(column, textValue, task) {
+ var attributes = {
+ "role": "gridcell",
+ "aria-label": textValue
+ };
+
+ if (!column.editor || gantt.isReadonly(task)) {
+ attributes["aria-readonly"] = true;
+ }
+
+ return this.getAttributeString(attributes);
+ },
+ gridAddButtonAttrString: function gridAddButtonAttrString(column) {
+ return this.getAttributeString({
+ "role": "button",
+ "aria-label": gantt.locale.labels.new_task
+ });
+ },
+ messageButtonAttrString: function messageButtonAttrString(buttonLabel) {
+ return "tabindex='0' role='button' aria-label='" + buttonLabel + "'";
+ },
+ messageInfoAttr: function messageInfoAttr(div) {
+ div.setAttribute("role", "alert"); //div.setAttribute("tabindex", "-1");
+ },
+ messageModalAttr: function messageModalAttr(div, uid) {
+ div.setAttribute("role", "dialog");
+
+ if (uid) {
+ div.setAttribute("aria-labelledby", uid);
+ } // div.setAttribute("tabindex", "-1");
+
+ },
+ quickInfoAttr: function quickInfoAttr(div) {
+ div.setAttribute("role", "dialog");
+ },
+ quickInfoHeaderAttrString: function quickInfoHeaderAttrString() {
+ return " role='heading' aria-level='1' ";
+ },
+ quickInfoHeader: function quickInfoHeader(div, header) {
+ div.setAttribute("aria-label", header);
+ },
+ quickInfoButtonAttrString: function quickInfoButtonAttrString(label) {
+ return gantt._waiAria.getAttributeString({
+ "role": "button",
+ "aria-label": label,
+ "tabindex": "0"
+ });
+ },
+ tooltipAttr: function tooltipAttr(div) {
+ div.setAttribute("role", "tooltip");
+ },
+ tooltipVisibleAttr: function tooltipVisibleAttr(div) {
+ div.setAttribute("aria-hidden", "false");
+ },
+ tooltipHiddenAttr: function tooltipHiddenAttr(div) {
+ div.setAttribute("aria-hidden", "true");
+ }
+ };
+
+ function isDisabled() {
+ return !gantt.config.wai_aria_attributes;
+ }
+
+ for (var i in gantt._waiAria) {
+ gantt._waiAria[i] = function (payload) {
+ return function () {
+ if (isDisabled()) {
+ return "";
+ }
+
+ return payload.apply(this, arguments);
+ };
+ }(gantt._waiAria[i]);
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/ui_core.js":
+/*!*********************************!*\
+ !*** ./sources/core/ui_core.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var utils = __webpack_require__(/*! ../utils/utils */ "./sources/utils/utils.js");
+
+ var env = __webpack_require__(/*! ../utils/env */ "./sources/utils/env.js");
+
+ var isHeadless = __webpack_require__(/*! ../utils/is_headless */ "./sources/utils/is_headless.js");
+
+ if (!env.isNode) {
+ var domHelpers = __webpack_require__(/*! ./ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+ var codeHelpers = __webpack_require__(/*! ../utils/helpers */ "./sources/utils/helpers.js");
+
+ gantt.utils = {
+ arrayFind: codeHelpers.arrayFind,
+ dom: domHelpers
+ };
+
+ var domEvents = __webpack_require__(/*! ./ui/utils/dom_event_scope */ "./sources/core/ui/utils/dom_event_scope.js")();
+
+ gantt.event = domEvents.attach;
+ gantt.eventRemove = domEvents.detach;
+ gantt._eventRemoveAll = domEvents.detachAll;
+ gantt._createDomEventScope = domEvents.extend;
+ utils.mixin(gantt, __webpack_require__(/*! ./ui/message */ "./sources/core/ui/message.js")(gantt));
+
+ var uiApi = __webpack_require__(/*! ./ui/index */ "./sources/core/ui/index.js").init(gantt);
+
+ gantt.$ui = uiApi.factory;
+ gantt.$ui.layers = uiApi.render;
+ gantt.$mouseEvents = uiApi.mouseEvents;
+ gantt.$services.setService("mouseEvents", function () {
+ return gantt.$mouseEvents;
+ });
+ gantt.mixin(gantt, uiApi.layersApi);
+
+ __webpack_require__(/*! ./data_task_layers */ "./sources/core/data_task_layers.gpl.js")(gantt);
+
+ gantt.$services.setService("layers", function () {
+ return uiApi.layersService;
+ });
+
+ var createLayoutFacade = __webpack_require__(/*! ./facades/layout */ "./sources/core/facades/layout.js");
+
+ gantt.mixin(gantt, createLayoutFacade());
+
+ __webpack_require__(/*! ./ui/skin */ "./sources/core/ui/skin.js")(gantt);
+
+ __webpack_require__(/*! ../css/skins/skyblue */ "./sources/css/skins/skyblue.js")(gantt);
+
+ __webpack_require__(/*! ../css/skins/meadow */ "./sources/css/skins/meadow.js")(gantt);
+
+ __webpack_require__(/*! ../css/skins/terrace */ "./sources/css/skins/terrace.js")(gantt);
+
+ __webpack_require__(/*! ../css/skins/broadway */ "./sources/css/skins/broadway.js")(gantt);
+
+ __webpack_require__(/*! ../css/skins/material */ "./sources/css/skins/material.js")(gantt);
+
+ __webpack_require__(/*! ../css/skins/contrast_black */ "./sources/css/skins/contrast_black.js")(gantt);
+
+ __webpack_require__(/*! ../css/skins/contrast_white */ "./sources/css/skins/contrast_white.js")(gantt);
+
+ __webpack_require__(/*! ./ui/plugins */ "./sources/core/ui/plugins/index.js")(gantt);
+
+ __webpack_require__(/*! ./ui/touch */ "./sources/core/ui/touch.js")(gantt);
+
+ __webpack_require__(/*! ./ui/lightbox */ "./sources/core/ui/lightbox/index.js")(gantt);
+
+ __webpack_require__(/*! ./ui/lightbox/lightbox_optional_time */ "./sources/core/ui/lightbox/lightbox_optional_time.js")(gantt);
+
+ __webpack_require__(/*! ./ui/wai_aria */ "./sources/core/ui/wai_aria.js")(gantt);
+
+ gantt.locate = function (e) {
+ var trg = domHelpers.getTargetNode(e); // ignore empty rows/cells of the timeline
+
+ if (domHelpers.closest(trg, ".gantt_task_row")) {
+ return null;
+ }
+
+ var targetAttribute = arguments[1] || this.config.task_attribute;
+ var node = domHelpers.locateAttribute(trg, targetAttribute);
+
+ if (node) {
+ return node.getAttribute(targetAttribute);
+ } else {
+ return null;
+ }
+ };
+
+ gantt._locate_css = function (e, classname, strict) {
+ return domHelpers.locateClassName(e, classname, strict);
+ };
+
+ gantt._locateHTML = function (e, attribute) {
+ return domHelpers.locateAttribute(e, attribute || this.config.task_attribute);
+ };
+ }
+
+ gantt.attachEvent("onParse", function () {
+ if (!isHeadless(gantt)) {
+ gantt.attachEvent("onGanttRender", function () {
+ if (gantt.config.initial_scroll) {
+ var firstTask = gantt.getTaskByIndex(0);
+ var id = firstTask ? firstTask.id : gantt.config.root_id; // GS-1450. Don't scroll to the task if there is no timeline
+
+ if (gantt.isTaskExists(id) && gantt.$task && gantt.utils.dom.isChildOf(gantt.$task, gantt.$container)) {
+ gantt.showTask(id);
+ }
+ }
+ }, {
+ once: true
+ });
+ }
+ });
+ gantt.attachEvent("onBeforeGanttReady", function () {
+ if (!this.config.scroll_size) this.config.scroll_size = domHelpers.getScrollSize() || 1;
+
+ if (!isHeadless(gantt)) {
+ // detach listeners before clearing old DOM, possible IE errors when accessing detached nodes
+ this._eventRemoveAll();
+
+ this.$mouseEvents.reset();
+ this.resetLightbox();
+ }
+ }); // GS-1261: scroll the views to the right side when RTL is enabled
+
+ gantt.attachEvent("onGanttReady", function () {
+ if (!isHeadless(gantt) && gantt.config.rtl) {
+ gantt.$layout.getCellsByType("viewCell").forEach(function (cell) {
+ var attachedScrollbar = cell.$config.scrollX;
+ if (!attachedScrollbar) return;
+ var scrollbar = gantt.$ui.getView(attachedScrollbar);
+ if (scrollbar) scrollbar.scrollTo(scrollbar.$config.scrollSize, 0);
+ });
+ }
+ }); // GS-1649: check if extensions are connected via files
+
+ gantt.attachEvent("onGanttReady", function () {
+ if (!isHeadless(gantt)) {
+ var activePlugins = gantt.plugins();
+ var availablePlugins = {
+ auto_scheduling: gantt.autoSchedule,
+ click_drag: gantt.ext.clickDrag,
+ critical_path: gantt.isCriticalTask,
+ drag_timeline: gantt.ext.dragTimeline,
+ export_api: gantt.exportToPDF,
+ fullscreen: gantt.ext.fullscreen,
+ grouping: gantt.groupBy,
+ keyboard_navigation: gantt.ext.keyboardNavigation,
+ marker: gantt.addMarker,
+ multiselect: gantt.eachSelectedTask,
+ overlay: gantt.ext.overlay,
+ quick_info: gantt.templates.quick_info_content,
+ tooltip: gantt.ext.tooltips,
+ undo: gantt.undo
+ };
+
+ for (var plugin in availablePlugins) {
+ if (availablePlugins[plugin] && !activePlugins[plugin]) {
+ // eslint-disable-next-line no-console
+ console.warn("You connected the '".concat(plugin, "' extension via an obsolete file. \nTo fix it, you need to remove the obsolete file and connect the extension via the plugins method: https://docs.dhtmlx.com/gantt/api__gantt_plugins.html"));
+ }
+ }
+ }
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/core/worktime/calendar_arguments_helper.js":
+/*!************************************************************!*\
+ !*** ./sources/core/worktime/calendar_arguments_helper.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var helpers = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js");
+
+function IsWorkTimeArgument(date, unit, task, id, calendar) {
+ this.date = date;
+ this.unit = unit;
+ this.task = task;
+ this.id = id;
+ this.calendar = calendar;
+ return this;
+}
+
+function ClosestWorkTimeArgument(date, dir, unit, task, id, calendar) {
+ this.date = date;
+ this.dir = dir;
+ this.unit = unit;
+ this.task = task;
+ this.id = id;
+ this.calendar = calendar;
+ return this;
+}
+
+function CalculateEndDateArgument(start_date, duration, unit, step, task, id, calendar) {
+ this.start_date = start_date;
+ this.duration = duration;
+ this.unit = unit;
+ this.step = step;
+ this.task = task;
+ this.id = id;
+ this.calendar = calendar;
+ return this;
+}
+
+function GetDurationArgument(start, end, task, calendar) {
+ this.start_date = start;
+ this.end_date = end;
+ this.task = task;
+ this.calendar = calendar;
+ this.unit = null;
+ this.step = null;
+ return this;
+}
+
+var calendarArgumentsHelper = function calendarArgumentsHelper(gantt) {
+ return {
+ getWorkHoursArguments: function getWorkHoursArguments() {
+ var config = arguments[0];
+
+ if (helpers.isDate(config)) {
+ config = {
+ date: config
+ };
+ } else {
+ config = utils.mixin({}, config);
+ }
+
+ if (!helpers.isValidDate(config.date)) {
+ gantt.assert(false, "Invalid date argument for getWorkHours method");
+ throw new Error("Invalid date argument for getWorkHours method");
+ }
+
+ return config;
+ },
+ setWorkTimeArguments: function setWorkTimeArguments() {
+ return arguments[0];
+ },
+ unsetWorkTimeArguments: function unsetWorkTimeArguments() {
+ return arguments[0];
+ },
+ isWorkTimeArguments: function isWorkTimeArguments() {
+ var config = arguments[0];
+
+ if (config instanceof IsWorkTimeArgument) {
+ return config;
+ }
+
+ var processedConfig;
+
+ if (!config.date) {
+ //IsWorkTimeArgument(date, unit, task, id, calendar)
+ processedConfig = new IsWorkTimeArgument(arguments[0], arguments[1], arguments[2], null, arguments[3]);
+ } else {
+ processedConfig = new IsWorkTimeArgument(config.date, config.unit, config.task, null, config.calendar);
+ }
+
+ processedConfig.unit = processedConfig.unit || gantt.config.duration_unit;
+
+ if (!helpers.isValidDate(processedConfig.date)) {
+ gantt.assert(false, "Invalid date argument for isWorkTime method");
+ throw new Error("Invalid date argument for isWorkTime method");
+ }
+
+ return processedConfig;
+ },
+ getClosestWorkTimeArguments: function getClosestWorkTimeArguments(arg) {
+ var config = arguments[0];
+ if (config instanceof ClosestWorkTimeArgument) return config;
+ var processedConfig;
+
+ if (helpers.isDate(config)) {
+ processedConfig = new ClosestWorkTimeArgument(config);
+ } else {
+ processedConfig = new ClosestWorkTimeArgument(config.date, config.dir, config.unit, config.task, null, //config.id,
+ config.calendar);
+ }
+
+ if (config.id) {
+ processedConfig.task = config;
+ }
+
+ processedConfig.dir = config.dir || 'any';
+ processedConfig.unit = config.unit || gantt.config.duration_unit;
+
+ if (!helpers.isValidDate(processedConfig.date)) {
+ gantt.assert(false, "Invalid date argument for getClosestWorkTime method");
+ throw new Error("Invalid date argument for getClosestWorkTime method");
+ }
+
+ return processedConfig;
+ },
+ _getStartEndConfig: function _getStartEndConfig(param) {
+ var argumentType = GetDurationArgument;
+ var config;
+ if (param instanceof argumentType) return param;
+
+ if (helpers.isDate(param)) {
+ config = new argumentType(arguments[0], arguments[1], arguments[2], arguments[3]);
+ } else {
+ config = new argumentType(param.start_date, param.end_date, param.task);
+
+ if (param.id !== null && param.id !== undefined) {
+ config.task = param;
+ }
+ }
+
+ config.unit = config.unit || gantt.config.duration_unit;
+ config.step = config.step || gantt.config.duration_step;
+ config.start_date = config.start_date || config.start || config.date;
+
+ if (!helpers.isValidDate(config.start_date)) {
+ gantt.assert(false, "Invalid start_date argument for getDuration method");
+ throw new Error("Invalid start_date argument for getDuration method");
+ }
+
+ if (!helpers.isValidDate(config.end_date)) {
+ gantt.assert(false, "Invalid end_date argument for getDuration method");
+ throw new Error("Invalid end_date argument for getDuration method");
+ }
+
+ return config;
+ },
+ getDurationArguments: function getDurationArguments(start, end, unit, step) {
+ return this._getStartEndConfig.apply(this, arguments);
+ },
+ hasDurationArguments: function hasDurationArguments(start, end, unit, step) {
+ return this._getStartEndConfig.apply(this, arguments);
+ },
+ calculateEndDateArguments: function calculateEndDateArguments(start, duration, unit, step) {
+ var config = arguments[0];
+ if (config instanceof CalculateEndDateArgument) return config;
+ var processedConfig; //CalculateEndDateArgument(start_date, duration, unit, step, task, id, calendar)
+
+ if (helpers.isDate(config)) {
+ processedConfig = new CalculateEndDateArgument(arguments[0], arguments[1], arguments[2], undefined, arguments[3], undefined, arguments[4]);
+ } else {
+ processedConfig = new CalculateEndDateArgument(config.start_date, config.duration, config.unit, config.step, config.task, null, //config.id,
+ config.calendar);
+ }
+
+ if (config.id !== null && config.id !== undefined) {
+ processedConfig.task = config; // received a task object as an argument
+ // ignore 'unit' and 'step' properties in this case, since it's likely a part of data model of a task
+
+ processedConfig.unit = null;
+ processedConfig.step = null;
+ }
+
+ processedConfig.unit = processedConfig.unit || gantt.config.duration_unit;
+ processedConfig.step = processedConfig.step || gantt.config.duration_step;
+
+ if (!helpers.isValidDate(processedConfig.start_date)) {
+ gantt.assert(false, "Invalid start_date argument for calculateEndDate method");
+ throw new Error("Invalid start_date argument for calculateEndDate method");
+ }
+
+ return processedConfig;
+ }
+ };
+};
+
+module.exports = calendarArgumentsHelper;
+
+/***/ }),
+
+/***/ "./sources/core/worktime/calendar_manager.js":
+/*!***************************************************!*\
+ !*** ./sources/core/worktime/calendar_manager.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+var createArgumentsHelper = __webpack_require__(/*! ./calendar_arguments_helper */ "./sources/core/worktime/calendar_arguments_helper.js");
+
+var CalendarMergeHelper = __webpack_require__(/*! ./strategy/work_calendar_merger */ "./sources/core/worktime/strategy/work_calendar_merger.js");
+
+var CalendarWorkTimeStrategy = __webpack_require__(/*! ./strategy/calendar_strategy */ "./sources/core/worktime/strategy/calendar_strategy.js");
+
+var legacyResourceCalendarConfig = __webpack_require__(/*! ./legacy_resource_config */ "./sources/core/worktime/legacy_resource_config.js");
+
+var dynamicResourceCalendars = __webpack_require__(/*! ./dynamic_resource_calendars */ "./sources/core/worktime/dynamic_resource_calendars.js")();
+
+function CalendarManager(gantt) {
+ this.$gantt = gantt;
+ this._calendars = {};
+ this._legacyConfig = undefined;
+ this.$gantt.attachEvent("onGanttReady", function () {
+ if (this.$gantt.config.resource_calendars) {
+ this._isLegacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(this.$gantt.config.resource_calendars);
+ }
+ }.bind(this));
+ this.$gantt.attachEvent("onBeforeGanttReady", function () {
+ this.createDefaultCalendars();
+ }.bind(this));
+ this.$gantt.attachEvent("onBeforeGanttRender", function () {
+ this.createDefaultCalendars();
+ }.bind(this));
+}
+
+CalendarManager.prototype = {
+ _calendars: {},
+ _convertWorkTimeSettings: function _convertWorkTimeSettings(settings) {
+ var days = settings.days;
+
+ if (days && !settings.dates) {
+ settings.dates = settings.dates || {};
+
+ for (var i = 0; i < days.length; i++) {
+ settings.dates[i] = days[i];
+
+ if (!(days[i] instanceof Array)) {
+ settings.dates[i] = !!days[i];
+ }
+ }
+ }
+
+ delete settings.days;
+ return settings;
+ },
+ mergeCalendars: function mergeCalendars() {
+ var calendars = [];
+ var args = arguments;
+
+ if (Array.isArray(args[0])) {
+ calendars = args[0].slice();
+ } else {
+ for (var i = 0; i < arguments.length; i++) {
+ calendars.push(arguments[i]);
+ }
+ }
+
+ var mergeHelper = new CalendarMergeHelper();
+ var result;
+ calendars.forEach(function (calendar) {
+ if (!result) {
+ result = calendar;
+ } else {
+ result = this._createCalendarFromConfig(mergeHelper.merge(result, calendar));
+ }
+ }.bind(this));
+ return this.createCalendar(result);
+ },
+ _createCalendarFromConfig: function _createCalendarFromConfig(config) {
+ var apiCore = new CalendarWorkTimeStrategy(this.$gantt, createArgumentsHelper(this.$gantt));
+ apiCore.id = String(utils.uid());
+
+ var preparedConfig = this._convertWorkTimeSettings(config);
+
+ if (preparedConfig.customWeeks) {
+ for (var i in preparedConfig.customWeeks) {
+ preparedConfig.customWeeks[i] = this._convertWorkTimeSettings(preparedConfig.customWeeks[i]);
+ }
+ }
+
+ apiCore._setConfig(preparedConfig);
+
+ return apiCore;
+ },
+ createCalendar: function createCalendar(parentCalendar) {
+ var settings;
+
+ if (!parentCalendar) {
+ parentCalendar = {};
+ }
+
+ if (parentCalendar.getConfig) {
+ settings = utils.copy(parentCalendar.getConfig());
+ } else if (parentCalendar.worktime) {
+ settings = utils.copy(parentCalendar.worktime);
+ } else {
+ settings = utils.copy(parentCalendar);
+ }
+
+ var defaults = utils.copy(this.defaults.fulltime.worktime);
+ utils.mixin(settings, defaults);
+ return this._createCalendarFromConfig(settings);
+ },
+ getCalendar: function getCalendar(id) {
+ id = id || "global";
+ var calendar = this._calendars[id];
+
+ if (!calendar) {
+ this.createDefaultCalendars();
+ calendar = this._calendars[id];
+ }
+
+ return calendar;
+ },
+ getCalendars: function getCalendars() {
+ var res = [];
+
+ for (var i in this._calendars) {
+ res.push(this.getCalendar(i));
+ }
+
+ return res;
+ },
+ _getOwnCalendar: function _getOwnCalendar(task) {
+ var config = this.$gantt.config;
+
+ if (task[config.calendar_property]) {
+ return this.getCalendar(task[config.calendar_property]);
+ }
+
+ if (config.resource_calendars) {
+ var calendar;
+ var calendarId;
+ var resourceProperty;
+
+ if (this._legacyConfig === false) {
+ resourceProperty = config.resource_property;
+ } else {
+ resourceProperty = legacyResourceCalendarConfig.getResourceProperty(config);
+ }
+
+ if (Array.isArray(task[resourceProperty])) {
+ // if multiple resources are attached to the task - merge their calendars
+ if (config.dynamic_resource_calendars) {
+ calendarId = dynamicResourceCalendars.getCalendarIdFromMultipleResources(task[resourceProperty], this);
+ }
+ } else {
+ if (this._legacyConfig === undefined) {
+ this._legacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(config.resource_calendars);
+ }
+
+ if (this._legacyConfig) {
+ var calendarId = legacyResourceCalendarConfig.getCalendarIdFromLegacyConfig(task, config.resource_calendars);
+ } else if (resourceProperty && task[resourceProperty] && config.resource_calendars[task[resourceProperty]]) {
+ var calendar = this.getResourceCalendar(task[resourceProperty]);
+ }
+ }
+
+ if (calendarId) {
+ calendar = this.getCalendar(calendarId);
+ }
+
+ if (calendar) {
+ return calendar;
+ }
+ }
+
+ return null;
+ },
+
+ /**
+ * Returns calendar assigned to the specified resource.
+ * Returns the global calendar if no custom calendar is associated with the resource.
+ * @param {(string|number|Object)} resource - resource object or resource id
+ * @returns {object} Calendar object
+ */
+ getResourceCalendar: function getResourceCalendar(resource) {
+ if (resource === null || resource === undefined) {
+ return this.getCalendar();
+ }
+
+ var resourceId = null; // if task id is provided
+
+ if (typeof resource === "number" || typeof resource === "string") {
+ resourceId = resource;
+ } else {
+ resourceId = resource.id || resource.key;
+ }
+
+ var config = this.$gantt.config;
+ var calendarsConfig = config.resource_calendars;
+ var calendarId = null;
+
+ if (calendarsConfig) {
+ if (this._legacyConfig === undefined) {
+ this._legacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(config.resource_calendars);
+ }
+
+ if (this._legacyConfig) {
+ for (var field in calendarsConfig) {
+ if (calendarsConfig[field][resourceId]) {
+ calendarId = calendarsConfig[field][resourceId];
+ break;
+ }
+ }
+ } else {
+ var calendarId = calendarsConfig[resourceId];
+ }
+
+ if (calendarId) {
+ return this.getCalendar(calendarId);
+ }
+ }
+
+ return this.getCalendar();
+ },
+
+ /**
+ * Returns the calendar assigned to a task.
+ * - Returns a calendar assigned via task[gantt.config.calendar_property] if specified.
+ * - Returns a calendar assigned to the task resource if specified.
+ * - Returns the global calendar otherwise.
+ * @param {(string|number|Object)} task - task object or task id
+ * @returns {object} Calendar object
+ */
+ getTaskCalendar: function getTaskCalendar(task) {
+ var gantt = this.$gantt;
+ var taskObject;
+
+ if (task === null || task === undefined) {
+ return this.getCalendar();
+ } // if task id is provided
+
+
+ if ((typeof task === "number" || typeof task === "string") && gantt.isTaskExists(task)) {
+ taskObject = gantt.getTask(task);
+ } else {
+ taskObject = task;
+ }
+
+ if (!taskObject) {
+ return this.getCalendar();
+ }
+
+ var calendar = this._getOwnCalendar(taskObject);
+
+ var groupMode = !!gantt.getState().group_mode;
+
+ if (!calendar && gantt.config.inherit_calendar && gantt.isTaskExists(taskObject.parent)) {
+ // GS-1579 group mode overrides tree hierarchy, iterate using `.parent` property, instead of using eachParent iterator
+ var currentTask = taskObject;
+
+ while (gantt.isTaskExists(currentTask.parent)) {
+ currentTask = gantt.getTask(currentTask.parent);
+
+ if (gantt.isSummaryTask(currentTask)) {
+ calendar = this._getOwnCalendar(currentTask);
+
+ if (calendar) {
+ break;
+ }
+ }
+ }
+
+ if (groupMode && !calendar) {
+ // if group mode and inherit_calendars is enabled - preserve previously applied parent calendar
+ // we may need it when groupBy parses grouped data, old parent may be not loaded yet
+ if (task.$effective_calendar) {
+ calendar = this.getCalendar(task.$effective_calendar);
+ }
+ }
+ }
+
+ return calendar || this.getCalendar();
+ },
+ addCalendar: function addCalendar(calendar) {
+ // puts new calendar to Global Storage - gantt.calendarManager._calendars {}
+ if (!this.isCalendar(calendar)) {
+ var id = calendar.id;
+ calendar = this.createCalendar(calendar);
+ calendar.id = id;
+ } // validate/check if empty calendar
+
+
+ if (!calendar._tryChangeCalendarSettings(function () {})) {
+ this.$gantt.callEvent("onCalendarError", [{
+ message: "Invalid calendar settings, no worktime available"
+ }, calendar]);
+ return null;
+ } else {
+ var config = this.$gantt.config;
+ calendar.id = calendar.id || utils.uid();
+ this._calendars[calendar.id] = calendar;
+ if (!config.worktimes) config.worktimes = {};
+ config.worktimes[calendar.id] = calendar.getConfig();
+ return calendar.id;
+ }
+ },
+ deleteCalendar: function deleteCalendar(calendar) {
+ var config = this.$gantt.config;
+ if (!calendar) return false;
+
+ if (this._calendars[calendar]) {
+ delete this._calendars[calendar];
+ if (config.worktimes && config.worktimes[calendar]) delete config.worktimes[calendar];
+ return true;
+ } else {
+ return false;
+ }
+ },
+ restoreConfigCalendars: function restoreConfigCalendars(configs) {
+ for (var i in configs) {
+ if (this._calendars[i]) continue;
+ var settings = configs[i];
+ var calendar = this.createCalendar(settings);
+ calendar.id = i;
+ this.addCalendar(calendar);
+ }
+ },
+ defaults: {
+ global: {
+ id: "global",
+ worktime: {
+ hours: [8, 12, 13, 17],
+ days: [0, 1, 1, 1, 1, 1, 0]
+ }
+ },
+ fulltime: {
+ id: "fulltime",
+ worktime: {
+ hours: [0, 24],
+ days: [1, 1, 1, 1, 1, 1, 1]
+ }
+ }
+ },
+ createDefaultCalendars: function createDefaultCalendars() {
+ var config = this.$gantt.config;
+ this.restoreConfigCalendars(this.defaults);
+ this.restoreConfigCalendars(config.worktimes);
+ },
+ isCalendar: function isCalendar(possibleCalendar) {
+ // because we don't have any way to check without dependency to CalendarWorkTimeStrategy
+ var props = [possibleCalendar.isWorkTime, possibleCalendar.setWorkTime, possibleCalendar.getWorkHours, possibleCalendar.unsetWorkTime, possibleCalendar.getClosestWorkTime, possibleCalendar.calculateDuration, possibleCalendar.hasDuration, possibleCalendar.calculateEndDate];
+ return props.every(function (entry) {
+ return entry instanceof Function;
+ });
+ }
+};
+module.exports = CalendarManager;
+
+/***/ }),
+
+/***/ "./sources/core/worktime/dynamic_resource_calendars.js":
+/*!*************************************************************!*\
+ !*** ./sources/core/worktime/dynamic_resource_calendars.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function () {
+ function getResourcesCalendarKey(resourceAssignments) {
+ return resourceAssignments.map(function (res) {
+ if (res && res.resource_id) {
+ return res.resource_id;
+ } else {
+ return res;
+ }
+ }).sort().join("-");
+ }
+
+ var dynamicCalendars = {};
+
+ function mergeResourceCalendars(resourceAssignments, manager) {
+ return manager.mergeCalendars(resourceAssignments.map(function (assignment) {
+ var resourceId = assignment && assignment.resource_id ? assignment.resource_id : assignment;
+ return manager.getResourceCalendar(resourceId);
+ }));
+ }
+
+ function getCalendarIdFromMultipleResources(resourceAssignments, manager) {
+ var key = getResourcesCalendarKey(resourceAssignments);
+
+ if (!resourceAssignments.length) {
+ return null;
+ } else if (resourceAssignments.length === 1) {
+ return manager.getResourceCalendar(key).id;
+ } else if (dynamicCalendars[key]) {
+ return dynamicCalendars[key].id;
+ } else {
+ var tempCalendar = mergeResourceCalendars(resourceAssignments, manager);
+ dynamicCalendars[key] = tempCalendar;
+ return manager.addCalendar(tempCalendar);
+ }
+ }
+
+ return {
+ getCalendarIdFromMultipleResources: getCalendarIdFromMultipleResources
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/core/worktime/legacy_resource_config.js":
+/*!*********************************************************!*\
+ !*** ./sources/core/worktime/legacy_resource_config.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+module.exports = {
+ isLegacyResourceCalendarFormat: function isLegacyResourceCalendarFormat(resourceCalendarsProperty) {
+ // modern format:
+ //gantt.config.resource_calendars = {
+ // resourceId: calendarId,
+ // resourceId: calendarId,
+ // resourceId: calendarId
+ // };
+ // legacy format:
+ // gantt.config.resource_calendars = {
+ // "resourceProperty": {
+ // resourceId: calendarId,
+ // resourceId: calendarId,
+ // resourceId: calendarId
+ // }
+ // };
+ if (!resourceCalendarsProperty) {
+ return false;
+ }
+
+ for (var i in resourceCalendarsProperty) {
+ if (resourceCalendarsProperty[i] && _typeof(resourceCalendarsProperty[i]) === "object") {
+ return true;
+ }
+ }
+
+ return false;
+ },
+ getResourceProperty: function getResourceProperty(config) {
+ var resourceCalendarsConfig = config.resource_calendars;
+ var propertyName = config.resource_property;
+
+ if (this.isLegacyResourceCalendarFormat(resourceCalendarsConfig)) {
+ for (var i in config) {
+ propertyName = i;
+ break;
+ }
+ }
+
+ return propertyName;
+ },
+ getCalendarIdFromLegacyConfig: function getCalendarIdFromLegacyConfig(task, config) {
+ if (config) {
+ for (var field in config) {
+ var resource = config[field];
+
+ if (task[field]) {
+ var calendarId = resource[task[field]];
+
+ if (calendarId) {
+ return calendarId;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+};
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/calendar_strategy.js":
+/*!*************************************************************!*\
+ !*** ./sources/core/worktime/strategy/calendar_strategy.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var createCacheObject = __webpack_require__(/*! ./work_unit_cache */ "./sources/core/worktime/strategy/work_unit_cache/index.ts").createCacheObject;
+
+var LargerUnitsCache = __webpack_require__(/*! ./work_unit_cache */ "./sources/core/worktime/strategy/work_unit_cache/index.ts").LargerUnitsCache;
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js");
+
+var DateDurationCache = __webpack_require__(/*! ./work_unit_cache/date_duration_cache */ "./sources/core/worktime/strategy/work_unit_cache/date_duration_cache.ts").DateDurationCache;
+
+function CalendarWorkTimeStrategy(gantt, argumentsHelper) {
+ this.argumentsHelper = argumentsHelper;
+ this.$gantt = gantt;
+ this._workingUnitsCache = createCacheObject();
+ this._largeUnitsCache = new LargerUnitsCache(this);
+ this._dateDurationCache = new DateDurationCache();
+ this._worktime = null;
+ this._cached_timestamps = {};
+ this._cached_timestamps_count = 0;
+}
+
+CalendarWorkTimeStrategy.prototype = {
+ units: ["year", "month", "week", "day", "hour", "minute"],
+ _clearCaches: function _clearCaches() {
+ this._workingUnitsCache.clear();
+
+ this._largeUnitsCache.clear();
+
+ this._dateDurationCache.clear();
+ },
+ // cache previously calculated worktime
+ _getUnitOrder: function _getUnitOrder(unit) {
+ for (var i = 0, len = this.units.length; i < len; i++) {
+ if (this.units[i] == unit) return i;
+ }
+ },
+ _resetTimestampCache: function _resetTimestampCache() {
+ this._cached_timestamps = {};
+ this._cached_timestamps_count = 0;
+ },
+ _timestamp: function _timestamp(settings) {
+ // minor optimization, store calculated timestamps to reduce computations
+ // reset cache when number of keys exceeds large number where key lookup may became more expensive than the recalculation
+ if (this._cached_timestamps_count > 1000000) {
+ this._resetTimestampCache();
+ }
+
+ var timestamp = null;
+
+ if (settings.day || settings.day === 0) {
+ timestamp = settings.day;
+ } else if (settings.date) {
+ var value = String(settings.date.valueOf());
+
+ if (this._cached_timestamps[value]) {
+ timestamp = this._cached_timestamps[value];
+ } else {
+ // store worktime datestamp in utc so it could be recognized in different timezones (e.g. opened locally and sent to the export service in different timezone)
+ timestamp = Date.UTC(settings.date.getFullYear(), settings.date.getMonth(), settings.date.getDate());
+ this._cached_timestamps[value] = timestamp;
+ this._cached_timestamps_count++;
+ }
+ }
+
+ return timestamp;
+ },
+ _checkIfWorkingUnit: function _checkIfWorkingUnit(date, unit) {
+ // GS-596: If unit is larger than day or has a custom logic
+ if (!this["_is_work_" + unit]) {
+ var from = this.$gantt.date["".concat(unit, "_start")](new Date(date));
+ var to = this.$gantt.date.add(from, 1, unit);
+ return this.hasDuration(from, to);
+ }
+
+ return this["_is_work_" + unit](date);
+ },
+ //checkings for particular time units
+ //methods for month-year-week can be defined, otherwise always return 'true'
+ _is_work_day: function _is_work_day(date) {
+ var val = this._getWorkHours(date);
+
+ if (Array.isArray(val)) {
+ return val.length > 0;
+ }
+
+ return false;
+ },
+ _is_work_hour: function _is_work_hour(date) {
+ var hours = this._getWorkHours(date); // [{start: 8*60*60, end: 12*60*60}, {start: 13*60*60, end: 17*60*60}]
+
+
+ var value = date.getHours();
+
+ for (var i = 0; i < hours.length; i++) {
+ if (value >= hours[i].startHour && value < hours[i].endHour) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+ _getTimeOfDayStamp: function _getTimeOfDayStamp(date, dayEnd) {
+ var hours = date.getHours();
+
+ if (!date.getHours() && !date.getMinutes() && dayEnd) {
+ hours = 24;
+ }
+
+ return hours * 60 * 60 + date.getMinutes() * 60;
+ },
+ _is_work_minute: function _is_work_minute(date) {
+ var hours = this._getWorkHours(date); // [{start: 8*60*60, end: 12*60*60}, {start: 13*60*60, end: 17*60*60}]
+
+
+ var checkTime = this._getTimeOfDayStamp(date);
+
+ for (var i = 0; i < hours.length; i++) {
+ if (checkTime >= hours[i].start && checkTime < hours[i].end) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+ _nextDate: function _nextDate(start, unit, step) {
+ return this.$gantt.date.add(start, step, unit);
+ },
+ _getWorkUnitsBetweenGeneric: function _getWorkUnitsBetweenGeneric(from, to, unit, step) {
+ var dateHelper = this.$gantt.date;
+ var start = new Date(from),
+ end = new Date(to);
+ step = step || 1;
+ var units = 0;
+ var next = null;
+ var stepStart, stepEnd; // calculating decimal durations, i.e. 2016-09-20 00:05:00 - 2016-09-20 01:00:00 ~ 0.95 instead of 1
+ // and also 2016-09-20 00:00:00 - 2016-09-20 00:05:00 ~ 0.05 instead of 1
+ // durations must be rounded later
+
+ var checkFirst = false;
+ stepStart = dateHelper[unit + "_start"](new Date(start));
+
+ if (stepStart.valueOf() != start.valueOf()) {
+ checkFirst = true;
+ }
+
+ var checkLast = false;
+ stepEnd = dateHelper[unit + "_start"](new Date(to));
+
+ if (stepEnd.valueOf() != to.valueOf()) {
+ checkLast = true;
+ }
+
+ var isLastStep = false;
+
+ while (start.valueOf() < end.valueOf()) {
+ next = this._nextDate(start, unit, step);
+ isLastStep = next.valueOf() > end.valueOf();
+
+ if (this._isWorkTime(start, unit)) {
+ if (checkFirst || checkLast && isLastStep) {
+ stepStart = dateHelper[unit + "_start"](new Date(start));
+ stepEnd = dateHelper.add(stepStart, step, unit);
+ }
+
+ if (checkFirst) {
+ checkFirst = false;
+ next = this._nextDate(stepStart, unit, step);
+ units += (stepEnd.valueOf() - start.valueOf()) / (stepEnd.valueOf() - stepStart.valueOf());
+ } else if (checkLast && isLastStep) {
+ checkLast = false;
+ units += (end.valueOf() - start.valueOf()) / (stepEnd.valueOf() - stepStart.valueOf());
+ } else {
+ units++;
+ }
+ } else {
+ var unitOrder = this._getUnitOrder(unit);
+
+ var biggerTimeUnit = this.units[unitOrder - 1];
+
+ if (biggerTimeUnit && !this._isWorkTime(start, biggerTimeUnit)) {
+ next = this._getClosestWorkTimeFuture(start, biggerTimeUnit);
+ }
+ }
+
+ start = next;
+ }
+
+ return units;
+ },
+ _getMinutesPerHour: function _getMinutesPerHour(date) {
+ var hourStart = this._getTimeOfDayStamp(date);
+
+ var hourEnd = this._getTimeOfDayStamp(this._nextDate(date, "hour", 1));
+
+ if (hourEnd === 0) {
+ hourEnd = 24 * 60 * 60;
+ }
+
+ var worktimes = this._getWorkHours(date);
+
+ for (var i = 0; i < worktimes.length; i++) {
+ var interval = worktimes[i];
+
+ if (hourStart >= interval.start && hourEnd <= interval.end) {
+ return 60; // hour inside a working interval, all hour is a work hour
+ } else if (hourStart < interval.end && hourEnd > interval.start) {
+ // hour is partially work time
+ var duration = Math.min(hourEnd, interval.end) - Math.max(hourStart, interval.start);
+ return duration / 60;
+ }
+ }
+
+ return 0;
+ },
+ _getMinutesPerDay: function _getMinutesPerDay(date) {
+ var hours = this._getWorkHours(date);
+
+ var res = 0;
+ hours.forEach(function (interval) {
+ res += interval.durationMinutes;
+ });
+ return res;
+ },
+ getHoursPerDay: function getHoursPerDay(date) {
+ var hours = this._getWorkHours(date);
+
+ var res = 0;
+ hours.forEach(function (interval) {
+ res += interval.durationHours;
+ });
+ return res;
+ },
+ _getWorkUnitsForRange: function _getWorkUnitsForRange(from, to, unit, step) {
+ var total = 0;
+ var start = new Date(from),
+ end = new Date(to);
+ var getUnitsPerDay;
+
+ if (unit == "minute") {
+ getUnitsPerDay = utils.bind(this._getMinutesPerDay, this);
+ } else {
+ getUnitsPerDay = utils.bind(this.getHoursPerDay, this);
+ }
+
+ while (start.valueOf() < end.valueOf()) {
+ if (end - start > 1000 * 60 * 60 * 24 * 32 && start.getDate() === 0) {
+ var units = this._largeUnitsCache.getMinutesPerMonth(start);
+
+ if (unit == "hour") {
+ units = units / 60;
+ }
+
+ total += units;
+ start = this.$gantt.date.add(start, 1, "month");
+ continue;
+ } else if (end - start > 1000 * 60 * 60 * 24 * 16) {
+ var weekStart = this.$gantt.date.week_start(new Date(start));
+
+ if (start.valueOf() === weekStart.valueOf()) {
+ var units = this._largeUnitsCache.getMinutesPerWeek(start);
+
+ if (unit == "hour") {
+ units = units / 60;
+ }
+
+ total += units;
+ start = this.$gantt.date.add(start, 7, "day");
+ continue;
+ }
+ } // if (this._isWorkTime(start, "day")) {
+
+
+ total += getUnitsPerDay(start); // }
+
+ start = this._nextDate(start, "day", 1);
+ }
+
+ return total / step;
+ },
+ _getMinutesBetweenSingleDay: function _getMinutesBetweenSingleDay(from, to) {
+ var range = this._getIntervalTimestamp(from, to);
+
+ var worktimes = this._getWorkHours(from);
+
+ var result = 0;
+
+ for (var i = 0; i < worktimes.length; i++) {
+ var interval = worktimes[i];
+
+ if (range.end >= interval.start && range.start <= interval.end) {
+ var minuteFrom = Math.max(interval.start, range.start);
+ var minuteTo = Math.min(interval.end, range.end);
+ result += (minuteTo - minuteFrom) / 60;
+ range.start = minuteTo;
+ }
+ }
+
+ return Math.floor(result);
+ },
+ _getMinutesBetween: function _getMinutesBetween(from, to, unit, step) {
+ var start = new Date(from),
+ end = new Date(to);
+ step = step || 1;
+ var firstDayStart = new Date(start);
+ var firstDayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(start)), 1, "day");
+
+ if (end.valueOf() <= firstDayEnd.valueOf()) {
+ return this._getMinutesBetweenSingleDay(from, to);
+ } else {
+ var lastDayStart = this.$gantt.date.day_start(new Date(end));
+ var lastDayEnd = end;
+
+ var startPart = this._getMinutesBetweenSingleDay(firstDayStart, firstDayEnd);
+
+ var endPart = this._getMinutesBetweenSingleDay(lastDayStart, lastDayEnd);
+
+ var rangePart = this._getWorkUnitsForRange(firstDayEnd, lastDayStart, unit, step);
+
+ var total = startPart + rangePart + endPart;
+ return total;
+ }
+ },
+ // optimized method for calculating work units duration of large time spans
+ // implemented for hours and minutes units, bigger time units don't benefit from the optimization so much
+ _getHoursBetween: function _getHoursBetween(from, to, unit, step) {
+ var start = new Date(from),
+ end = new Date(to);
+ step = step || 1;
+ var firstDayStart = new Date(start);
+ var firstDayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(start)), 1, "day");
+
+ if (end.valueOf() <= firstDayEnd.valueOf()) {
+ return Math.round(this._getMinutesBetweenSingleDay(from, to) / 60);
+ } else {
+ var lastDayStart = this.$gantt.date.day_start(new Date(end));
+ var lastDayEnd = end;
+ var startPart = this._getMinutesBetweenSingleDay(firstDayStart, firstDayEnd, unit, step) / 60;
+ var endPart = this._getMinutesBetweenSingleDay(lastDayStart, lastDayEnd, unit, step) / 60;
+
+ var rangePart = this._getWorkUnitsForRange(firstDayEnd, lastDayStart, unit, step);
+
+ var total = startPart + rangePart + endPart;
+ return Math.round(total);
+ }
+ },
+ getConfig: function getConfig() {
+ return this._worktime;
+ },
+ _setConfig: function _setConfig(settings) {
+ this._worktime = settings;
+
+ this._parseSettings();
+
+ this._clearCaches();
+ },
+ _parseSettings: function _parseSettings() {
+ var settings = this.getConfig();
+ settings.parsed = {
+ dates: {},
+ hours: null,
+ haveCustomWeeks: false,
+ customWeeks: {},
+ customWeeksRangeStart: null,
+ customWeeksRangeEnd: null,
+ customWeeksBoundaries: []
+ };
+ settings.parsed.hours = this._parseHours(settings.hours);
+
+ for (var i in settings.dates) {
+ settings.parsed.dates[i] = this._parseHours(settings.dates[i]);
+ }
+
+ if (settings.customWeeks) {
+ var minCustomRangeStart = null;
+ var maxCustomRangeEnd = null;
+
+ for (var i in settings.customWeeks) {
+ var customTime = settings.customWeeks[i];
+
+ if (customTime.from && customTime.to) {
+ var rangeStart = customTime.from;
+ var rangeEnd = customTime.to;
+
+ if (!minCustomRangeStart || minCustomRangeStart > rangeStart.valueOf()) {
+ minCustomRangeStart = rangeStart.valueOf();
+ }
+
+ if (!maxCustomRangeEnd || maxCustomRangeEnd < rangeEnd.valueOf()) {
+ maxCustomRangeEnd = rangeEnd.valueOf();
+ }
+
+ settings.parsed.customWeeksBoundaries.push({
+ from: rangeStart.valueOf(),
+ fromReadable: new Date(rangeStart),
+ to: rangeEnd.valueOf(),
+ toReadable: new Date(rangeEnd),
+ name: i
+ });
+ settings.parsed.haveCustomWeeks = true;
+ var currentWeek = settings.parsed.customWeeks[i] = {
+ from: customTime.from,
+ to: customTime.to,
+ hours: this._parseHours(customTime.hours),
+ dates: {}
+ };
+
+ for (var d in customTime.dates) {
+ currentWeek.dates[d] = this._parseHours(customTime.dates[d]);
+ }
+ }
+ }
+
+ settings.parsed.customWeeksRangeStart = minCustomRangeStart;
+ settings.parsed.customWeeksRangeEnd = maxCustomRangeEnd;
+ }
+ },
+ _tryChangeCalendarSettings: function _tryChangeCalendarSettings(payload) {
+ var backup = JSON.stringify(this.getConfig());
+ payload();
+
+ if (!this.hasWorkTime()) {
+ // this.$gantt.assert(false, "Invalid calendar settings, no worktime available");
+ this._setConfig(JSON.parse(backup));
+
+ this._clearCaches();
+
+ return false;
+ }
+
+ return true;
+ },
+ _arraysEqual: function _arraysEqual(a, b) {
+ if (a === b) return true;
+ if (!a || !b) return false;
+ if (a.length != b.length) return false;
+
+ for (var i = 0; i < a.length; ++i) {
+ if (a[i] !== b[i]) return false;
+ }
+
+ return true;
+ },
+ _compareSettings: function _compareSettings(mySettings, thatSettings) {
+ if (!this._arraysEqual(mySettings.hours, thatSettings.hours)) {
+ return false;
+ }
+
+ var myDays = Object.keys(mySettings.dates);
+ var otherDates = Object.keys(thatSettings.dates);
+ myDays.sort();
+ otherDates.sort();
+
+ if (!this._arraysEqual(myDays, otherDates)) {
+ return false;
+ }
+
+ for (var i = 0; i < myDays.length; i++) {
+ var timestamp = myDays[i];
+ var myHours = mySettings.dates[timestamp];
+ var otherHours = mySettings.dates[timestamp]; // day settings not equal
+
+ if (myHours !== otherHours && // but still can be two arrays with the equivalent hour settings
+ !(Array.isArray(myHours) && Array.isArray(otherHours) && this._arraysEqual(myHours, otherHours))) {
+ return false;
+ }
+ }
+
+ return true;
+ },
+ equals: function equals(calendar) {
+ if (!(calendar instanceof CalendarWorkTimeStrategy)) {
+ return false;
+ }
+
+ var mySettings = this.getConfig();
+ var thatSettings = calendar.getConfig();
+
+ if (!this._compareSettings(mySettings, thatSettings)) {
+ return false;
+ }
+
+ if (mySettings.parsed.haveCustomWeeks && thatSettings.parsed.haveCustomWeeks) {
+ if (mySettings.parsed.customWeeksBoundaries.length != thatSettings.parsed.customWeeksBoundaries.length) {
+ return false;
+ }
+
+ for (var i in mySettings.parsed.customWeeks) {
+ var myWeek = mySettings.parsed.customWeeks[i];
+ var thatWeek = thatSettings.parsed.customWeeks[i];
+
+ if (!thatWeek) {
+ return false;
+ }
+
+ if (!this._compareSettings(myWeek, thatWeek)) {
+ return false;
+ }
+ }
+ } else if (mySettings.parse.haveCustomWeeks !== thatSettings.parsed.haveCustomWeeks) {
+ return false;
+ }
+
+ return true;
+ },
+ getWorkHours: function getWorkHours() {
+ var config = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments);
+ return this._getWorkHours(config.date, false);
+ },
+ _getWorkHours: function _getWorkHours(date, parsed) {
+ var calendar = this.getConfig();
+
+ if (parsed !== false) {
+ calendar = calendar.parsed;
+ }
+
+ if (!date) {
+ return calendar.hours;
+ }
+
+ var dateValue = this._timestamp({
+ date: date
+ });
+
+ if (calendar.haveCustomWeeks) {
+ if (calendar.customWeeksRangeStart <= dateValue && calendar.customWeeksRangeEnd > dateValue) {
+ for (var i = 0; i < calendar.customWeeksBoundaries.length; i++) {
+ if (calendar.customWeeksBoundaries[i].from <= dateValue && calendar.customWeeksBoundaries[i].to > dateValue) {
+ calendar = calendar.customWeeks[calendar.customWeeksBoundaries[i].name];
+ break;
+ }
+ }
+ }
+ }
+
+ var hours = true;
+
+ if (calendar.dates[dateValue] !== undefined) {
+ hours = calendar.dates[dateValue]; //custom day
+ } else if (calendar.dates[date.getDay()] !== undefined) {
+ hours = calendar.dates[date.getDay()]; //week day
+ }
+
+ if (hours === true) {
+ return calendar.hours;
+ } else if (hours) {
+ return hours;
+ }
+
+ return [];
+ },
+ _getIntervalTimestamp: function _getIntervalTimestamp(from, to) {
+ var res = {
+ start: 0,
+ end: 0
+ };
+ res.start = from.getHours() * 60 * 60 + from.getMinutes() * 60 + from.getSeconds();
+ var endHours = to.getHours();
+
+ if (!endHours && !to.getMinutes() && !to.getSeconds() && from.valueOf() < to.valueOf()) {
+ endHours = 24;
+ }
+
+ res.end = endHours * 60 * 60 + to.getMinutes() * 60 + to.getSeconds();
+ return res;
+ },
+ _parseHours: function _parseHours(hours) {
+ if (Array.isArray(hours)) {
+ var timestampRanges = []; // worktime as seconds range
+
+ hours.forEach(function (hour) {
+ if (typeof hour === "number") {
+ timestampRanges.push(hour * 60 * 60);
+ } else if (typeof hour === "string") {
+ // "12-13", or "12:00-13:00", or "12:00:00-13:00:00"
+ hour.split("-").map(function (time) {
+ return time.trim();
+ }).forEach(function (part) {
+ var parsed = part.split(":").map(function (time) {
+ return time.trim();
+ });
+ var value = parseInt(parsed[0] * 60 * 60);
+
+ if (parsed[1]) {
+ value += parseInt(parsed[1] * 60);
+ }
+
+ if (parsed[2]) {
+ value += parseInt(parsed[2]);
+ }
+
+ timestampRanges.push(value);
+ });
+ }
+ });
+ var timerangeConfig = [];
+
+ for (var i = 0; i < timestampRanges.length; i += 2) {
+ var start = timestampRanges[i];
+ var end = timestampRanges[i + 1];
+ var duration = end - start;
+ timerangeConfig.push({
+ start: start,
+ end: end,
+ startHour: Math.floor(start / (60 * 60)),
+ startMinute: Math.floor(start / 60),
+ endHour: Math.ceil(end / (60 * 60)),
+ endMinute: Math.ceil(end / 60),
+ durationSeconds: duration,
+ durationMinutes: duration / 60,
+ durationHours: duration / (60 * 60)
+ });
+ }
+
+ return timerangeConfig;
+ } else {
+ return hours;
+ }
+ },
+ setWorkTime: function setWorkTime(settings) {
+ return this._tryChangeCalendarSettings(utils.bind(function () {
+ var hours = settings.hours !== undefined ? settings.hours : true;
+
+ var timestamp = this._timestamp(settings);
+
+ var calendarConfig = this.getConfig();
+
+ if (timestamp !== null) {
+ calendarConfig.dates[timestamp] = hours;
+ } else if (!settings.customWeeks) {
+ calendarConfig.hours = hours;
+ }
+
+ if (settings.customWeeks) {
+ if (!calendarConfig.customWeeks) {
+ calendarConfig.customWeeks = {};
+ } // GS-1867. allow setWorkTime to exclude dates in the customWeeks range
+
+
+ if (typeof settings.customWeeks == "string") {
+ if (timestamp !== null) {
+ calendarConfig.customWeeks[settings.customWeeks].dates[timestamp] = hours;
+ } else if (!settings.customWeeks) {
+ calendarConfig.customWeeks[settings.customWeeks].hours = hours;
+ }
+ } else if (_typeof(settings.customWeeks) === "object" && Function.prototype.toString.call(settings.customWeeks.constructor) === "function Object() { [native code] }") {
+ for (var i in settings.customWeeks) {
+ calendarConfig.customWeeks[i] = settings.customWeeks[i];
+ }
+ }
+ }
+
+ this._parseSettings();
+
+ this._clearCaches();
+ }, this));
+ },
+ unsetWorkTime: function unsetWorkTime(settings) {
+ return this._tryChangeCalendarSettings(utils.bind(function () {
+ if (!settings) {
+ this.reset_calendar();
+ } else {
+ var timestamp = this._timestamp(settings);
+
+ if (timestamp !== null) {
+ delete this.getConfig().dates[timestamp];
+ }
+ } // Load updated settings and clear work units cache
+
+
+ this._parseSettings();
+
+ this._clearCaches();
+ }, this));
+ },
+ _isWorkTime: function _isWorkTime(date, unit) {
+ // Check if this item has in the cache
+ var useCache = true; //unit === "day"; // use cache only for days. In case of hours/minutes cache size grows too large and the overhead exceeds the gains
+
+ var isWorkUnit = -1;
+ var dateKey = null;
+
+ if (useCache) {
+ // use string keys
+ dateKey = String(date.valueOf());
+ isWorkUnit = this._workingUnitsCache.getItem(unit, dateKey, date);
+ }
+
+ if (isWorkUnit == -1) {
+ // calculate if not cached
+ isWorkUnit = this._checkIfWorkingUnit(date, unit);
+
+ if (useCache) {
+ this._workingUnitsCache.setItem(unit, dateKey, isWorkUnit, date);
+ }
+ }
+
+ return isWorkUnit;
+ },
+ isWorkTime: function isWorkTime() {
+ var config = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ return this._isWorkTime(config.date, config.unit);
+ },
+ calculateDuration: function calculateDuration() {
+ var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);
+
+ if (!config.unit) {
+ return false;
+ } //return this._calculateDuration(config.start_date, config.end_date, config.unit, config.step);
+
+
+ var self = this;
+ return this._dateDurationCache.getDuration(config.start_date, config.end_date, config.unit, config.step, function () {
+ return self._calculateDuration(config.start_date, config.end_date, config.unit, config.step);
+ });
+ },
+ _calculateDuration: function _calculateDuration(from, to, unit, step) {
+ var res = 0;
+ var sign = 1;
+
+ if (from.valueOf() > to.valueOf()) {
+ var tmp = to;
+ to = from;
+ from = tmp;
+ sign = -1;
+ }
+
+ if (unit == "hour" && step == 1) {
+ res = this._getHoursBetween(from, to, unit, step);
+ } else if (unit == "minute" && step == 1) {
+ // quick calculation for minutes with 1 minute step
+ res = this._getMinutesBetween(from, to, unit, step);
+ } else {
+ res = this._getWorkUnitsBetweenGeneric(from, to, unit, step);
+ } // getWorkUnits.. returns decimal durations
+
+
+ return sign * Math.round(res);
+ },
+ hasDuration: function hasDuration() {
+ var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);
+ var from = config.start_date,
+ to = config.end_date,
+ unit = config.unit,
+ step = config.step;
+
+ if (!unit) {
+ return false;
+ }
+
+ var start = new Date(from),
+ end = new Date(to);
+ step = step || 1;
+
+ while (start.valueOf() < end.valueOf()) {
+ if (this._isWorkTime(start, unit)) return true;
+ start = this._nextDate(start, unit, step);
+ }
+
+ return false;
+ },
+ calculateEndDate: function calculateEndDate() {
+ var config = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);
+ var from = config.start_date,
+ duration = config.duration,
+ unit = config.unit,
+ step = config.step;
+ if (!unit) return false;
+ var mult = config.duration >= 0 ? 1 : -1;
+ duration = Math.abs(duration * 1); // var endDate = this._calculateEndDate(from, duration, unit, step * mult);
+ // return endDate;
+
+ var self = this;
+ return this._dateDurationCache.getEndDate(from, duration, unit, step * mult, function () {
+ return self._calculateEndDate(from, duration, unit, step * mult);
+ });
+ },
+ _calculateEndDate: function _calculateEndDate(from, duration, unit, step) {
+ if (!unit) return false;
+
+ if (step == 1 && unit == "minute") {
+ return this._calculateMinuteEndDate(from, duration, step);
+ } else if (step == -1 && unit == "minute") {
+ return this._subtractMinuteDate(from, duration, step);
+ } else if (step == 1 && unit == "hour") {
+ return this._calculateHourEndDate(from, duration, step);
+ } else {
+ var interval = this._addInterval(from, duration, unit, step, null);
+
+ return interval.end;
+ }
+ },
+ _addInterval: function _addInterval(start, duration, unit, step, stopAction) {
+ var added = 0;
+ var current = start;
+ var dstShift = false;
+
+ while (added < duration && !(stopAction && stopAction(current))) {
+ var next = this._nextDate(current, unit, step); // GS-1501. Correct hours after DST change
+
+
+ if (unit == "day") {
+ dstShift = dstShift || !current.getHours() && next.getHours();
+
+ if (dstShift) {
+ next.setHours(0);
+
+ if (next.getHours()) {// the day when the timezone is changed, try to correct hours next time
+ } else {
+ dstShift = false;
+ }
+ }
+ }
+
+ var dateValue = new Date(next.valueOf() + 1);
+
+ if (step > 0) {
+ dateValue = new Date(next.valueOf() - 1);
+ }
+
+ var workTimeCheck = this._isWorkTime(dateValue, unit);
+
+ if (workTimeCheck && !dstShift) {
+ added++;
+ }
+
+ current = next;
+ }
+
+ return {
+ end: current,
+ start: start,
+ added: added
+ };
+ },
+ _addHoursUntilDayEnd: function _addHoursUntilDayEnd(from, duration) {
+ var dayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(from)), 1, "day");
+ var added = 0;
+ var left = duration;
+
+ var range = this._getIntervalTimestamp(from, dayEnd);
+
+ var worktimes = this._getWorkHours(from);
+
+ for (var i = 0; i < worktimes.length && added < duration; i++) {
+ var interval = worktimes[i];
+
+ if (range.end >= interval.start && range.start <= interval.end) {
+ var minuteFrom = Math.max(interval.start, range.start);
+ var minuteTo = Math.min(interval.end, range.end);
+ var rangeHours = (minuteTo - minuteFrom) / (60 * 60);
+
+ if (rangeHours > left) {
+ rangeHours = left;
+ minuteTo = minuteFrom + left * 60 * 60;
+ }
+
+ var addHours = Math.round((minuteTo - minuteFrom) / (60 * 60));
+ added += addHours;
+ left -= addHours;
+ range.start = minuteTo;
+ }
+ }
+
+ var intervalEnd = dayEnd;
+
+ if (added === duration) {
+ intervalEnd = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, range.start);
+ }
+
+ return {
+ added: added,
+ end: intervalEnd
+ };
+ },
+ _calculateHourEndDate: function _calculateHourEndDate(from, duration, step) {
+ var start = new Date(from),
+ added = 0;
+ step = step || 1;
+ duration = Math.abs(duration * 1);
+
+ var interval = this._addHoursUntilDayEnd(start, duration);
+
+ added = interval.added;
+ start = interval.end;
+ var durationLeft = duration - added;
+
+ if (durationLeft) {
+ var current = start;
+
+ while (added < duration) {
+ var next = this._nextDate(current, "day", step); // reset to day start in case DST switch happens in the process
+
+
+ next.setHours(0);
+ next.setMinutes(0);
+ next.setSeconds(0);
+ var hoursPerDay = 0;
+
+ if (step > 0) {
+ hoursPerDay = this.getHoursPerDay(new Date(next.valueOf() - 1));
+ } else {
+ hoursPerDay = this.getHoursPerDay(new Date(next.valueOf() + 1));
+ }
+
+ if (added + hoursPerDay >= duration) {
+ break;
+ } else {
+ added += hoursPerDay;
+ }
+
+ current = next;
+ }
+
+ start = current;
+ }
+
+ if (added < duration) {
+ var durationLeft = duration - added;
+ interval = this._addHoursUntilDayEnd(start, durationLeft);
+ start = interval.end;
+ }
+
+ return start;
+ },
+ _addMinutesUntilHourEnd: function _addMinutesUntilHourEnd(from, duration) {
+ if (from.getMinutes() === 0) {
+ // already at hour end
+ return {
+ added: 0,
+ end: new Date(from)
+ };
+ }
+
+ var hourEnd = this.$gantt.date.add(this.$gantt.date.hour_start(new Date(from)), 1, "hour");
+ var added = 0;
+ var left = duration;
+
+ var range = this._getIntervalTimestamp(from, hourEnd);
+
+ var worktimes = this._getWorkHours(from);
+
+ for (var i = 0; i < worktimes.length && added < duration; i++) {
+ var interval = worktimes[i];
+
+ if (range.end >= interval.start && range.start <= interval.end) {
+ var minuteFrom = Math.max(interval.start, range.start);
+ var minuteTo = Math.min(interval.end, range.end);
+ var rangeMinutes = (minuteTo - minuteFrom) / 60;
+
+ if (rangeMinutes > left) {
+ rangeMinutes = left;
+ minuteTo = minuteFrom + left * 60;
+ } // TODO: verify testcase https://dhtmlxsupport.teamwork.com/desk/tickets/9625700/messages
+
+ /*if (rangeMinutes === 0) {
+ rangeMinutes = left;
+ minuteTo = minuteFrom + (left * 60);
+ }*/
+
+
+ var addMinutes = Math.round((minuteTo - minuteFrom) / 60);
+ left -= addMinutes;
+ added += addMinutes;
+ range.start = minuteTo;
+ }
+ }
+
+ var intervalEnd = hourEnd;
+
+ if (added === duration) {
+ intervalEnd = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, range.start);
+ }
+
+ return {
+ added: added,
+ end: intervalEnd
+ };
+ },
+ _subtractMinutesUntilHourStart: function _subtractMinutesUntilHourStart(from, duration) {
+ var hourStart = this.$gantt.date.hour_start(new Date(from));
+ var added = 0;
+ var left = duration;
+ var hourStartTimestamp = hourStart.getHours() * 60 * 60 + hourStart.getMinutes() * 60 + hourStart.getSeconds();
+ var initialDateTimestamp = from.getHours() * 60 * 60 + from.getMinutes() * 60 + from.getSeconds();
+
+ var worktimes = this._getWorkHours(from);
+
+ for (var i = worktimes.length - 1; i >= 0 && added < duration; i--) {
+ var interval = worktimes[i];
+
+ if (initialDateTimestamp > interval.start && hourStartTimestamp <= interval.end) {
+ var minuteFrom = Math.min(initialDateTimestamp, interval.end);
+ var minuteTo = Math.max(hourStartTimestamp, interval.start); // var minuteFrom = Math.max(interval.start, currentHour.start);
+ // var minuteTo = Math.min(interval.end, currentHour.end);
+
+ var rangeMinutes = (minuteFrom - minuteTo) / 60;
+
+ if (rangeMinutes > left) {
+ rangeMinutes = left;
+ minuteTo = minuteFrom - left * 60;
+ } // TODO: verify testcase https://dhtmlxsupport.teamwork.com/desk/tickets/9625700/messages
+
+ /*if (rangeMinutes === 0) {
+ rangeMinutes = left;
+ minuteTo = minuteFrom - (left * 60);
+ }*/
+
+
+ var addMinutes = Math.abs(Math.round((minuteFrom - minuteTo) / 60));
+ left -= addMinutes;
+ added += addMinutes;
+ initialDateTimestamp = minuteTo;
+ }
+ }
+
+ var intervalEnd = hourStart;
+
+ if (added === duration) {
+ intervalEnd = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, initialDateTimestamp);
+ }
+
+ return {
+ added: added,
+ end: intervalEnd
+ };
+ },
+ _subtractMinuteDate: function _subtractMinuteDate(from, duration, step) {
+ var start = new Date(from),
+ added = 0;
+ step = step || -1;
+ duration = Math.abs(duration * 1);
+ duration = Math.round(duration);
+
+ var minutePrecision = this._isMinutePrecision(start);
+
+ var addedInterval = this._subtractMinutesUntilHourStart(start, duration);
+
+ added += addedInterval.added;
+ start = addedInterval.end;
+ var calculatedDay = 0;
+ var daySchedule = [];
+ var minutesInDay = 0;
+
+ while (added < duration) {
+ var dayStart = this.$gantt.date.day_start(new Date(start));
+ var iterateFromDayEnd = false;
+
+ if (start.valueOf() === dayStart.valueOf()) {
+ dayStart = this.$gantt.date.add(dayStart, -1, "day");
+ iterateFromDayEnd = true;
+ } //var dayStartTimestamp = this.$gantt.date.day_start(new Date(start)).valueOf();
+
+
+ var dayEnd = new Date(dayStart.getFullYear(), dayStart.getMonth(), dayStart.getDate(), 23, 59, 59, 999).valueOf();
+
+ if (dayEnd !== calculatedDay) {
+ daySchedule = this._getWorkHours(dayStart);
+ minutesInDay = this._getMinutesPerDay(dayStart);
+ calculatedDay = dayEnd;
+ }
+
+ var left = duration - added;
+
+ var timestamp = this._getTimeOfDayStamp(start, iterateFromDayEnd);
+
+ if (!daySchedule.length || !minutesInDay) {
+ start = this.$gantt.date.add(start, -1, "day");
+ continue;
+ }
+
+ if (daySchedule[daySchedule.length - 1].end <= timestamp) {
+ if (left > minutesInDay) {
+ added += minutesInDay;
+ start = this.$gantt.date.add(start, -1, "day");
+ continue;
+ }
+ }
+
+ var isWorkHour = false;
+ var workInterval = null;
+ var prevInterval = null;
+
+ for (var i = daySchedule.length - 1; i >= 0; i--) {
+ if (daySchedule[i].start < timestamp - 1 && daySchedule[i].end >= timestamp - 1) {
+ isWorkHour = true;
+ workInterval = daySchedule[i];
+ prevInterval = daySchedule[i - 1];
+ break;
+ }
+ }
+
+ if (isWorkHour) {
+ // we're at the end of worktime interval and subtracting more than the duration of the interval
+ // -> subtract the duration of the interval and move to the start of the interval (we're moving from end)
+ if (timestamp === workInterval.end && left >= workInterval.durationMinutes) {
+ added += workInterval.durationMinutes;
+ start = this.$gantt.date.add(start, -workInterval.durationMinutes, "minute");
+ } // worktime is set in whole hours (no intervals like 9:15-10:00)
+ // the amount we need to subtract lies inside the interval
+ else if (!minutePrecision && left <= timestamp / 60 - workInterval.startMinute) {
+ added += left;
+ start = this.$gantt.date.add(start, -left, "minute");
+ } else if (minutePrecision) {
+ // GS-2129. If the working time is set in minutes, we accumulate the working time in minutes from right to left
+ // duration we need to subtract lies completely inside the work interval
+ if (left <= timestamp / 60 - workInterval.startMinute) {
+ added += left;
+ start = this.$gantt.date.add(start, -left, "minute");
+ } else {
+ // we need to go trough multiple work intervals to subtract needed time
+ added += timestamp / 60 - workInterval.startMinute;
+
+ if (prevInterval) {
+ start = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, prevInterval.end);
+ } else {
+ start = this.$gantt.date.day_start(start);
+ }
+ }
+ } else {
+ var minutesInHour = this._getMinutesPerHour(start);
+
+ if (minutesInHour <= left) {
+ added += minutesInHour;
+ start = this._nextDate(start, "hour", step);
+ } else {
+ addedInterval = this._subtractMinutesUntilHourStart(start, left);
+ added += addedInterval.added;
+ start = addedInterval.end;
+ }
+ }
+ } else {
+ if (start.getHours() === 0 && start.getMinutes() === 0 && start.getSeconds() === 0) {
+ var prev = this._getClosestWorkTimePast(start, "hour");
+
+ if (prev.valueOf() === start.valueOf()) {
+ var prev = this.$gantt.date.add(start, -1, "day");
+
+ var times = this._getWorkHours(prev);
+
+ if (times.length) {
+ var lastInterval = times[times.length - 1];
+ prev.setSeconds(lastInterval.durationSeconds);
+ }
+ }
+
+ start = prev;
+ } else {
+ start = this._getClosestWorkTimePast(new Date(start - 1), "hour");
+ }
+ }
+ }
+
+ if (added < duration) {
+ var durationLeft = duration - added;
+ addedInterval = this._subtractMinutesUntilHourStart(start, durationLeft);
+ added += addedInterval.added;
+ start = addedInterval.end;
+ }
+
+ return start;
+ },
+ _calculateMinuteEndDate: function _calculateMinuteEndDate(from, duration, step) {
+ var start = new Date(from),
+ added = 0;
+ step = step || 1;
+ duration = Math.abs(duration * 1);
+ duration = Math.round(duration);
+
+ var addedInterval = this._addMinutesUntilHourEnd(start, duration);
+
+ added += addedInterval.added;
+ start = addedInterval.end;
+ var calculatedDay = 0;
+ var daySchedule = [];
+ var minutesInDay = 0;
+
+ var minutePrecision = this._isMinutePrecision(start);
+
+ while (added < duration) {
+ var dayStart = this.$gantt.date.day_start(new Date(start)).valueOf();
+
+ if (dayStart !== calculatedDay) {
+ daySchedule = this._getWorkHours(start);
+ minutesInDay = this._getMinutesPerDay(start);
+ calculatedDay = dayStart;
+ }
+
+ var left = duration - added;
+
+ var timestamp = this._getTimeOfDayStamp(start);
+
+ if (!daySchedule.length || !minutesInDay) {
+ start = this.$gantt.date.add(this.$gantt.date.day_start(start), 1, "day");
+ continue;
+ }
+
+ if (daySchedule[0].start >= timestamp) {
+ if (left >= minutesInDay) {
+ added += minutesInDay;
+
+ if (left == minutesInDay) {
+ start = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, daySchedule[daySchedule.length - 1].end);
+ break;
+ } else {
+ start = this.$gantt.date.add(start, 1, "day");
+ start = this.$gantt.date.day_start(start);
+ }
+
+ continue;
+ }
+ }
+
+ var isWorkHour = false;
+ var workInterval = null;
+
+ for (var i = 0; i < daySchedule.length; i++) {
+ if (daySchedule[i].start <= timestamp && daySchedule[i].end > timestamp) {
+ isWorkHour = true;
+ workInterval = daySchedule[i];
+ break;
+ }
+ }
+
+ if (isWorkHour) {
+ if (timestamp === workInterval.start && left >= workInterval.durationMinutes) {
+ added += workInterval.durationMinutes;
+ start = this.$gantt.date.add(start, workInterval.durationMinutes, "minute");
+ } else if (left <= workInterval.endMinute - timestamp / 60) {
+ added += left;
+ start = this.$gantt.date.add(start, left, "minute");
+ } else {
+ var minutesInHour = this._getMinutesPerHour(start);
+
+ if (minutesInHour <= left) {
+ added += minutesInHour; // when the working time settings are set in minutes move to the next minutes
+
+ if (minutePrecision) {
+ start = this.$gantt.date.add(start, minutesInHour, "minute");
+ } else {
+ start = this._nextDate(start, "hour", step);
+ }
+ } else {
+ addedInterval = this._addMinutesUntilHourEnd(start, left);
+ added += addedInterval.added;
+ start = addedInterval.end;
+ }
+ }
+ } else {
+ start = this._getClosestWorkTimeFuture(start, "hour");
+ }
+ }
+
+ if (added < duration) {
+ var durationLeft = duration - added;
+ addedInterval = this._addMinutesUntilHourEnd(start, durationLeft);
+ added += addedInterval.added;
+ start = addedInterval.end;
+ }
+
+ return start;
+ },
+ getClosestWorkTime: function getClosestWorkTime() {
+ var settings = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ return this._getClosestWorkTime(settings.date, settings.unit, settings.dir);
+ },
+ _getClosestWorkTime: function _getClosestWorkTime(inputDate, unit, direction) {
+ var result = new Date(inputDate);
+
+ if (this._isWorkTime(result, unit)) {
+ return result;
+ }
+
+ result = this.$gantt.date[unit + '_start'](result);
+
+ if (direction == 'any' || !direction) {
+ var closestFuture = this._getClosestWorkTimeFuture(result, unit);
+
+ var closestPast = this._getClosestWorkTimePast(result, unit);
+
+ if (Math.abs(closestFuture - inputDate) <= Math.abs(inputDate - closestPast)) {
+ result = closestFuture;
+ } else {
+ result = closestPast;
+ }
+ } else if (direction == "past") {
+ result = this._getClosestWorkTimePast(result, unit);
+ } else {
+ result = this._getClosestWorkTimeFuture(result, unit);
+ }
+
+ return result;
+ },
+ _getClosestWorkTimeFuture: function _getClosestWorkTimeFuture(date, unit) {
+ return this._getClosestWorkTimeGeneric(date, unit, 1);
+ },
+ _getClosestWorkTimePast: function _getClosestWorkTimePast(date, unit) {
+ var result = this._getClosestWorkTimeGeneric(date, unit, -1); // should return the end of the closest work interval
+
+
+ return this.$gantt.date.add(result, 1, unit);
+ },
+ _findClosestTimeInDay: function _findClosestTimeInDay(date, direction, worktimes) {
+ var start = new Date(date);
+ var resultDate = null;
+ var fromDayEnd = false;
+
+ if (!this._getWorkHours(start).length) {
+ start = this._getClosestWorkTime(start, "day", direction < 0 ? "past" : "future");
+
+ if (direction < 0) {
+ start = new Date(start.valueOf() - 1);
+ fromDayEnd = true;
+ }
+
+ worktimes = this._getWorkHours(start);
+ }
+
+ var value = this._getTimeOfDayStamp(start);
+
+ if (fromDayEnd) {
+ value = this._getTimeOfDayStamp(new Date(start.valueOf() + 1), fromDayEnd);
+ }
+
+ if (direction > 0) {
+ for (var i = 0; i < worktimes.length; i++) {
+ if (worktimes[i].start >= value) {
+ resultDate = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, worktimes[i].start);
+ break;
+ }
+ }
+ } else {
+ for (var i = worktimes.length - 1; i >= 0; i--) {
+ if (worktimes[i].end <= value) {
+ resultDate = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, worktimes[i].end);
+ break;
+ } else if (worktimes[i].end > value && worktimes[i].start <= value) {
+ resultDate = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, value);
+ break;
+ }
+ }
+ }
+
+ return resultDate;
+ },
+ _getClosestWorkMinute: function _getClosestWorkMinute(date, unit, direction) {
+ var start = new Date(date);
+
+ var worktimes = this._getWorkHours(start);
+
+ var resultDate = this._findClosestTimeInDay(start, direction, worktimes);
+
+ if (!resultDate) {
+ start = this.calculateEndDate(start, direction, "day");
+
+ if (direction > 0) {
+ start = this.$gantt.date.day_start(start);
+ } else {
+ start = this.$gantt.date.day_start(start);
+ start = this.$gantt.date.add(start, 1, "day");
+ start = new Date(start.valueOf() - 1);
+ }
+
+ worktimes = this._getWorkHours(start);
+ resultDate = this._findClosestTimeInDay(start, direction, worktimes);
+ }
+
+ if (direction < 0) {
+ // getClosestWorkTimePast adds one time unit to the result date after this
+ resultDate = this.$gantt.date.add(resultDate, -1, unit);
+ }
+
+ return resultDate;
+ },
+ _getClosestWorkTimeGeneric: function _getClosestWorkTimeGeneric(date, unit, increment) {
+ if (unit === "hour" || unit === "minute") {
+ return this._getClosestWorkMinute(date, unit, increment);
+ }
+
+ var unitOrder = this._getUnitOrder(unit),
+ biggerTimeUnit = this.units[unitOrder - 1];
+
+ var result = date; // be extra sure we won't fall into infinite loop, 3k seems big enough
+
+ var maximumLoop = 3000,
+ count = 0;
+
+ while (!this._isWorkTime(result, unit)) {
+ if (biggerTimeUnit && !this._isWorkTime(result, biggerTimeUnit)) {
+ // if we look for closest work hour and detect a week-end - first find the closest work day,
+ // and continue iterations after that
+ if (increment > 0) {
+ result = this._getClosestWorkTimeFuture(result, biggerTimeUnit);
+ } else {
+ result = this._getClosestWorkTimePast(result, biggerTimeUnit);
+ }
+
+ if (this._isWorkTime(result, unit)) {
+ break;
+ }
+ }
+
+ count++;
+
+ if (count > maximumLoop) {
+ this.$gantt.assert(false, "Invalid working time check");
+ return false;
+ }
+
+ var tzOffset = result.getTimezoneOffset();
+ result = this.$gantt.date.add(result, increment, unit);
+ result = this.$gantt._correct_dst_change(result, tzOffset, increment, unit);
+
+ if (this.$gantt.date[unit + '_start']) {
+ result = this.$gantt.date[unit + '_start'](result);
+ }
+ }
+
+ return result;
+ },
+
+ /**
+ * Check whether this calendar has working time. Calendar has working time only if there are regular working days of week
+ *
+ */
+ hasWorkTime: function hasWorkTime() {
+ var worktime = this.getConfig();
+ var dates = worktime.dates;
+ var daysOfWeek = [0, 1, 2, 3, 4, 5, 6];
+ var exceptions = [];
+
+ for (var i in worktime.dates) {
+ if (Number(i) > 6) {
+ exceptions.push(Number(i));
+ }
+ }
+
+ var hasRegularHours = this._checkWorkHours(worktime.hours);
+
+ var result = false;
+ daysOfWeek.forEach(function (day) {
+ if (result) {
+ return;
+ }
+
+ var dayConfig = dates[day];
+
+ if (dayConfig === true) {
+ // workday uses global hours
+ result = hasRegularHours;
+ } else if (Array.isArray(dayConfig)) {
+ // workday uses custom hours
+ result = this._checkWorkHours(dayConfig);
+ }
+ }.bind(this));
+ return result;
+ },
+ _checkWorkHours: function _checkWorkHours(hoursArray) {
+ if (hoursArray.length === 0) {
+ return false;
+ }
+
+ var result = false;
+
+ for (var i = 0; i < hoursArray.length; i += 2) {
+ if (hoursArray[i] !== hoursArray[i + 1]) {
+ result = true;
+ }
+ }
+
+ return result;
+ },
+ _isMinutePrecision: function _isMinutePrecision(date) {
+ var minutePrecision = false;
+
+ this._getWorkHours(date).forEach(function (interval) {
+ if (interval.startMinute % 60 || interval.endMinute % 60) {
+ minutePrecision = true;
+ }
+ });
+
+ return minutePrecision;
+ }
+};
+module.exports = CalendarWorkTimeStrategy;
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/no_work_time.js":
+/*!********************************************************!*\
+ !*** ./sources/core/worktime/strategy/no_work_time.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function CalendarDisabledTimeStrategy(gantt, argumentsHelper) {
+ this.argumentsHelper = argumentsHelper;
+ this.$gantt = gantt;
+}
+
+CalendarDisabledTimeStrategy.prototype = {
+ getWorkHours: function getWorkHours() {
+ return [0, 24];
+ },
+ setWorkTime: function setWorkTime() {
+ return true;
+ },
+ unsetWorkTime: function unsetWorkTime() {
+ return true;
+ },
+ isWorkTime: function isWorkTime() {
+ return true;
+ },
+ getClosestWorkTime: function getClosestWorkTime(config) {
+ var config = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ return config.date;
+ },
+ calculateDuration: function calculateDuration() {
+ var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);
+ var from = config.start_date,
+ to = config.end_date,
+ unit = config.unit,
+ step = config.step;
+ return this._calculateDuration(from, to, unit, step);
+ },
+ _calculateDuration: function _calculateDuration(start, end, unit, step) {
+ var dateHelper = this.$gantt.date;
+ var fixedUnits = {
+ "week": 1000 * 60 * 60 * 24 * 7,
+ "day": 1000 * 60 * 60 * 24,
+ "hour": 1000 * 60 * 60,
+ "minute": 1000 * 60
+ };
+ var res = 0;
+
+ if (fixedUnits[unit]) {
+ res = Math.round((end - start) / (step * fixedUnits[unit]));
+ } else {
+ var from = new Date(start),
+ to = new Date(end);
+
+ while (from.valueOf() < to.valueOf()) {
+ res += 1;
+ from = dateHelper.add(from, step, unit);
+ }
+
+ if (from.valueOf() != end.valueOf()) {
+ res += (to - from) / (dateHelper.add(from, step, unit) - from);
+ }
+ }
+
+ return Math.round(res);
+ },
+ hasDuration: function hasDuration() {
+ var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);
+ var from = config.start_date,
+ to = config.end_date,
+ unit = config.unit;
+
+ if (!unit) {
+ return false;
+ }
+
+ from = new Date(from);
+ to = new Date(to);
+ return from.valueOf() < to.valueOf();
+ },
+ hasWorkTime: function hasWorkTime() {
+ return true;
+ },
+ equals: function equals(calendar) {
+ if (!(calendar instanceof CalendarDisabledTimeStrategy)) {
+ return false;
+ }
+
+ return true;
+ },
+ calculateEndDate: function calculateEndDate() {
+ var config = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);
+ var start = config.start_date,
+ duration = config.duration,
+ unit = config.unit,
+ step = config.step;
+ return this.$gantt.date.add(start, step * duration, unit);
+ }
+};
+module.exports = CalendarDisabledTimeStrategy;
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/work_calendar_merger.js":
+/*!****************************************************************!*\
+ !*** ./sources/core/worktime/strategy/work_calendar_merger.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ../../../utils/utils */ "./sources/utils/utils.js");
+
+function WorkTimeCalendarMerger() {}
+
+WorkTimeCalendarMerger.prototype = {
+ /**
+ * convert hours array items into objects, e.g. [8, 12, 17, 18] -> [{start: 8, end: 12}, {start:17, end:18}]
+ * @param {Array} hoursArray
+ */
+ _getIntervals: function _getIntervals(hoursArray) {
+ var result = [];
+
+ for (var i = 0; i < hoursArray.length; i += 2) {
+ result.push({
+ start: hoursArray[i],
+ end: hoursArray[i + 1]
+ });
+ }
+
+ return result;
+ },
+
+ /**
+ * Convert ranges config into hours array
+ * [{start: 8, end: 12}, {start:17, end:18}] --> [8, 12, 17, 18]
+ * @param {*} intervalsArray
+ */
+ _toHoursArray: function _toHoursArray(intervalsArray) {
+ var result = [];
+
+ function toFixed(value) {
+ var str = String(value);
+
+ if (str.length < 2) {
+ str = "0" + str;
+ }
+
+ return str;
+ }
+
+ function formatHHMM(secondsValue) {
+ var hours = Math.floor(secondsValue / (60 * 60));
+ var minutePart = secondsValue - hours * 60 * 60;
+ var minutes = Math.floor(minutePart / 60);
+ return hours + ":" + toFixed(minutes);
+ }
+
+ for (var i = 0; i < intervalsArray.length; i++) {
+ result.push(formatHHMM(intervalsArray[i].start) + "-" + formatHHMM(intervalsArray[i].end));
+ }
+
+ return result;
+ },
+
+ /**
+ * Build intersection of hour intervals. e.g.
+ * first: [{start: 8, end: 12}, {start:13, end:18}]
+ * second: [{start: 10, end: 15}]
+ * result: [{start: 10, end: 12}, {start: 13, end: 15}]
+ * @param {Array} first
+ * @param {Array} second
+ */
+ _intersectHourRanges: function _intersectHourRanges(first, second) {
+ var result = [];
+ var baseArray = first.length > second.length ? first : second;
+ var overridesArray = first === baseArray ? second : first;
+ baseArray = baseArray.slice();
+ overridesArray = overridesArray.slice();
+ var result = [];
+
+ for (var i = 0; i < baseArray.length; i++) {
+ var base = baseArray[i];
+
+ for (var j = 0; j < overridesArray.length; j++) {
+ var current = overridesArray[j];
+
+ if (current.start < base.end && current.end > base.start) {
+ result.push({
+ start: Math.max(base.start, current.start),
+ end: Math.min(base.end, current.end)
+ });
+
+ if (base.end > current.end) {
+ overridesArray.splice(j, 1);
+ j--;
+ i--;
+ }
+ }
+ }
+ }
+
+ return result;
+ },
+
+ /**
+ * Reduce the number of ranges in config when possible,
+ * joins ranges that can be merged
+ * parts: [{start: 8, end: 12}, {start:12, end:13}, {start: 15, end: 17}]
+ * result: [{start: 8, end: 13}, {start: 15, end: 17}]
+ * @param {Array} parts
+ */
+ _mergeAdjacentIntervals: function _mergeAdjacentIntervals(parts) {
+ var result = parts.slice();
+ result.sort(function (a, b) {
+ return a.start - b.start;
+ });
+ var base = result[0];
+
+ for (var i = 1; i < result.length; i++) {
+ var current = result[i];
+
+ if (current.start <= base.end) {
+ if (current.end > base.end) {
+ base.end = current.end;
+ }
+
+ result.splice(i, 1);
+ i--;
+ } else {
+ base = current;
+ }
+ }
+
+ return result;
+ },
+ _mergeHoursConfig: function _mergeHoursConfig(firstHours, secondHours) {
+ //var firstIntervals = this._getIntervals(firstHours);
+ //var secondIntervals = this._getIntervals(secondHours);
+ return this._mergeAdjacentIntervals(this._intersectHourRanges(firstHours, secondHours));
+ },
+ merge: function merge(first, second) {
+ var firstConfig = utils.copy(first.getConfig().parsed);
+ var secondConfig = utils.copy(second.getConfig().parsed);
+ var mergedSettings = {
+ hours: this._toHoursArray(this._mergeHoursConfig(firstConfig.hours, secondConfig.hours)),
+ dates: {},
+ customWeeks: {}
+ };
+
+ for (var i in firstConfig.dates) {
+ var firstDate = firstConfig.dates[i];
+ var secondDate = secondConfig.dates[i]; // if this key is a working date in both calendars
+
+ if (firstDate && secondDate) {
+ // if at least one of working date is set by hours config - build intersection
+ if (Array.isArray(firstDate) || Array.isArray(secondDate)) {
+ var firstHours = Array.isArray(firstDate) ? firstDate : firstConfig.hours;
+ var secondHours = Array.isArray(secondDate) ? secondDate : secondConfig.hours;
+ mergedSettings.dates[i] = this._toHoursArray(this._mergeHoursConfig(firstHours, secondHours));
+ } else {
+ // date will use global hours
+ mergedSettings.dates[i] = true;
+ }
+ } else {
+ mergedSettings.dates[i] = false;
+ }
+ } // transfer and overwrite custom week calendars
+
+
+ if (firstConfig.customWeeks) {
+ for (var i in firstConfig.customWeeks) {
+ mergedSettings.customWeeks[i] = firstConfig.customWeeks[i];
+ }
+ }
+
+ if (secondConfig.customWeeks) {
+ for (var i in secondConfig.customWeeks) {
+ mergedSettings.customWeeks[i] = secondConfig.customWeeks[i];
+ }
+ }
+
+ return mergedSettings;
+ }
+};
+module.exports = WorkTimeCalendarMerger;
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/work_unit_cache/date_duration_cache.ts":
+/*!*******************************************************************************!*\
+ !*** ./sources/core/worktime/strategy/work_unit_cache/date_duration_cache.ts ***!
+ \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var DateDurationCache = /** @class */ (function () {
+ function DateDurationCache() {
+ this.clear();
+ }
+ DateDurationCache.prototype._getCacheObject = function (startDate, unit, step) {
+ var cache = this._cache;
+ if (!cache[unit]) {
+ cache[unit] = [];
+ }
+ var unitCache = cache[unit];
+ if (!unitCache) {
+ unitCache = cache[unit] = {};
+ }
+ var stepCache = unitCache[step];
+ if (!stepCache) {
+ stepCache = unitCache[step] = {};
+ }
+ var year = startDate.getFullYear();
+ var yearCache = stepCache[year];
+ if (!yearCache) {
+ yearCache = stepCache[year] = { durations: {}, endDates: {} };
+ }
+ return yearCache;
+ };
+ DateDurationCache.prototype._endDateCacheKey = function (startDate, duration) {
+ return String(startDate) + "-" + String(duration);
+ };
+ DateDurationCache.prototype._durationCacheKey = function (startDate, endDate) {
+ return String(startDate) + "-" + String(endDate);
+ };
+ DateDurationCache.prototype.getEndDate = function (startDate, duration, unit, step, compute) {
+ var cache = this._getCacheObject(startDate, unit, step);
+ var startDateTimestamp = startDate.valueOf();
+ var key = this._endDateCacheKey(startDateTimestamp, duration);
+ var endDate;
+ if (cache.endDates[key] === undefined) {
+ var result = compute();
+ var resultTimestamp = result.valueOf();
+ cache.endDates[key] = resultTimestamp;
+ cache.durations[this._durationCacheKey(startDateTimestamp, resultTimestamp)] = duration;
+ endDate = result;
+ }
+ else {
+ endDate = new Date(cache.endDates[key]);
+ }
+ return endDate;
+ };
+ DateDurationCache.prototype.getDuration = function (startDate, endDate, unit, step, compute) {
+ var cache = this._getCacheObject(startDate, unit, step);
+ var startDateTimestamp = startDate.valueOf();
+ var endDateTimestamp = endDate.valueOf();
+ var key = this._durationCacheKey(startDateTimestamp, endDateTimestamp);
+ var duration;
+ if (cache.durations[key] === undefined) {
+ var result = compute();
+ cache.durations[key] = result.valueOf();
+ // can't populate end date due to logic of end date calculation, current unit tests capture it
+ // cache.endDates[this._endDateCacheKey(startDateTimestamp, result)] = endDateTimestamp;
+ duration = result;
+ }
+ else {
+ duration = cache.durations[key];
+ }
+ return duration;
+ };
+ DateDurationCache.prototype.clear = function () {
+ this._cache = {};
+ };
+ return DateDurationCache;
+}());
+exports.DateDurationCache = DateDurationCache;
+
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/work_unit_cache/index.ts":
+/*!*****************************************************************!*\
+ !*** ./sources/core/worktime/strategy/work_unit_cache/index.ts ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var workunit_map_cache_1 = __webpack_require__(/*! ./workunit_map_cache */ "./sources/core/worktime/strategy/work_unit_cache/workunit_map_cache.ts");
+var workunit_object_cache_1 = __webpack_require__(/*! ./workunit_object_cache */ "./sources/core/worktime/strategy/work_unit_cache/workunit_object_cache.ts");
+var larger_units_helper_1 = __webpack_require__(/*! ./larger_units_helper */ "./sources/core/worktime/strategy/work_unit_cache/larger_units_helper.ts");
+exports.LargerUnitsCache = larger_units_helper_1.LargerUnitsCache;
+function createCacheObject() {
+ // worktime hash is on the hot path,
+ // Map seems to work faster than plain array, use it whenever possible
+ if (typeof Map !== "undefined") {
+ return new workunit_map_cache_1.WorkUnitsMapCache();
+ }
+ else {
+ return new workunit_object_cache_1.WorkUnitsObjectCache();
+ }
+}
+exports.createCacheObject = createCacheObject;
+
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/work_unit_cache/larger_units_helper.ts":
+/*!*******************************************************************************!*\
+ !*** ./sources/core/worktime/strategy/work_unit_cache/larger_units_helper.ts ***!
+ \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var LargerUnitsCache = /** @class */ (function () {
+ function LargerUnitsCache(calendar) {
+ var _this = this;
+ this.getMinutesPerWeek = function (weekStart) {
+ var key = weekStart.valueOf();
+ if (_this._weekCache.has(key)) {
+ return _this._weekCache.get(key);
+ }
+ var calendar = _this._calendar;
+ var gantt = _this._calendar.$gantt;
+ var minutesPerWeek = 0;
+ var start = gantt.date.week_start(new Date(weekStart));
+ for (var i = 0; i < 7; i++) {
+ minutesPerWeek += calendar.getHoursPerDay(start) * 60;
+ start = gantt.date.add(start, 1, "day");
+ }
+ _this._weekCache.set(key, minutesPerWeek);
+ return minutesPerWeek;
+ };
+ this.getMinutesPerMonth = function (monthStart) {
+ var key = monthStart.valueOf();
+ if (_this._monthCache.has(key)) {
+ return _this._monthCache.get(key);
+ }
+ var calendar = _this._calendar;
+ var gantt = _this._calendar.$gantt;
+ var minutesPerMonth = 0;
+ var start = gantt.date.week_start(new Date(monthStart));
+ var nextMonth = gantt.date.add(start, 1, "month").valueOf();
+ while (start.valueOf() < nextMonth) {
+ minutesPerMonth += calendar.getHoursPerDay(start) * 60;
+ start = gantt.date.add(start, 1, "day");
+ }
+ _this._monthCache.set(key, minutesPerMonth);
+ return minutesPerMonth;
+ };
+ this.clear = function () {
+ _this._weekCache = new Map();
+ _this._monthCache = new Map();
+ };
+ this.clear();
+ this._calendar = calendar;
+ }
+ return LargerUnitsCache;
+}());
+exports.LargerUnitsCache = LargerUnitsCache;
+
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/work_unit_cache/workunit_map_cache.ts":
+/*!******************************************************************************!*\
+ !*** ./sources/core/worktime/strategy/work_unit_cache/workunit_map_cache.ts ***!
+ \******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var WorkUnitsMapCache = /** @class */ (function () {
+ function WorkUnitsMapCache() {
+ this.clear();
+ }
+ WorkUnitsMapCache.prototype.getItem = function (unit, timestamp, value) {
+ if (this._cache.has(unit)) {
+ var unitCache = this._cache.get(unit);
+ var subCache = unitCache[value.getFullYear()];
+ if (subCache && subCache.has(timestamp)) {
+ return subCache.get(timestamp);
+ }
+ }
+ return -1;
+ };
+ WorkUnitsMapCache.prototype.setItem = function (unit, timestamp, value, rawValue) {
+ if (!unit || !timestamp) {
+ return;
+ }
+ var cache = this._cache;
+ var year = rawValue.getFullYear();
+ var unitCache;
+ if (!cache.has(unit)) {
+ unitCache = [];
+ cache.set(unit, unitCache);
+ }
+ else {
+ unitCache = cache.get(unit);
+ }
+ var yearCache = unitCache[year];
+ if (!yearCache) {
+ yearCache = unitCache[year] = new Map();
+ }
+ yearCache.set(timestamp, value);
+ };
+ WorkUnitsMapCache.prototype.clear = function () {
+ this._cache = new Map();
+ };
+ return WorkUnitsMapCache;
+}());
+exports.WorkUnitsMapCache = WorkUnitsMapCache;
+
+
+/***/ }),
+
+/***/ "./sources/core/worktime/strategy/work_unit_cache/workunit_object_cache.ts":
+/*!*********************************************************************************!*\
+ !*** ./sources/core/worktime/strategy/work_unit_cache/workunit_object_cache.ts ***!
+ \*********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var WorkUnitsObjectCache = /** @class */ (function () {
+ function WorkUnitsObjectCache() {
+ this.clear();
+ }
+ WorkUnitsObjectCache.prototype.getItem = function (unit, timestamp, value) {
+ var cache = this._cache;
+ if (cache && cache[unit]) {
+ var units = cache[unit];
+ if (units === undefined) {
+ return -1;
+ }
+ var subCache = units[value.getFullYear()];
+ if (subCache && subCache[timestamp] !== undefined) {
+ return subCache[timestamp];
+ }
+ }
+ return -1;
+ };
+ WorkUnitsObjectCache.prototype.setItem = function (unit, timestamp, value, rawValue) {
+ if (!unit || !timestamp) {
+ return;
+ }
+ var cache = this._cache;
+ if (!cache) {
+ return;
+ }
+ if (!cache[unit]) {
+ cache[unit] = [];
+ }
+ var unitCache = cache[unit];
+ var year = rawValue.getFullYear();
+ var yearCache = unitCache[year];
+ if (!yearCache) {
+ yearCache = unitCache[year] = {};
+ }
+ yearCache[timestamp] = value;
+ };
+ WorkUnitsObjectCache.prototype.clear = function () {
+ this._cache = {};
+ };
+ return WorkUnitsObjectCache;
+}());
+exports.WorkUnitsObjectCache = WorkUnitsObjectCache;
+
+
+/***/ }),
+
+/***/ "./sources/core/worktime/time_calculator.js":
+/*!**************************************************!*\
+ !*** ./sources/core/worktime/time_calculator.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createArgumentsHelper = __webpack_require__(/*! ./calendar_arguments_helper */ "./sources/core/worktime/calendar_arguments_helper.js"),
+ NoWorkTimeCalendar = __webpack_require__(/*! ./strategy/no_work_time */ "./sources/core/worktime/strategy/no_work_time.js");
+
+function TimeCalculator(calendarManager) {
+ this.$gantt = calendarManager.$gantt;
+ this.argumentsHelper = createArgumentsHelper(this.$gantt);
+ this.calendarManager = calendarManager;
+ this.$disabledCalendar = new NoWorkTimeCalendar(this.$gantt, this.argumentsHelper);
+}
+
+TimeCalculator.prototype = {
+ _getCalendar: function _getCalendar(config) {
+ var calendar;
+
+ if (!this.$gantt.config.work_time) {
+ calendar = this.$disabledCalendar;
+ } else {
+ var manager = this.calendarManager;
+
+ if (config.task) {
+ calendar = manager.getTaskCalendar(config.task);
+ } else if (config.id) {
+ calendar = manager.getTaskCalendar(config);
+ } else if (config.calendar) {
+ calendar = config.calendar;
+ }
+
+ if (!calendar) {
+ calendar = manager.getTaskCalendar();
+ }
+ }
+
+ return calendar;
+ },
+ getWorkHours: function getWorkHours(config) {
+ config = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments);
+
+ var calendar = this._getCalendar(config);
+
+ return calendar.getWorkHours(config.date);
+ },
+ setWorkTime: function setWorkTime(config, calendar) {
+ config = this.argumentsHelper.setWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ if (!calendar) calendar = this.calendarManager.getCalendar(); // Global
+
+ return calendar.setWorkTime(config);
+ },
+ unsetWorkTime: function unsetWorkTime(config, calendar) {
+ config = this.argumentsHelper.unsetWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ if (!calendar) calendar = this.calendarManager.getCalendar(); // Global
+
+ return calendar.unsetWorkTime(config);
+ },
+ isWorkTime: function isWorkTime(date, unit, task, calendar) {
+ var config = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);
+ calendar = this._getCalendar(config);
+ return calendar.isWorkTime(config);
+ },
+ getClosestWorkTime: function getClosestWorkTime(config) {
+ config = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);
+
+ var calendar = this._getCalendar(config);
+
+ return calendar.getClosestWorkTime(config);
+ },
+ calculateDuration: function calculateDuration() {
+ // start_date_date, end_date, task
+ var config = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);
+
+ var calendar = this._getCalendar(config);
+
+ return calendar.calculateDuration(config);
+ },
+ hasDuration: function hasDuration() {
+ var config = this.argumentsHelper.hasDurationArguments.apply(this.argumentsHelper, arguments);
+
+ var calendar = this._getCalendar(config);
+
+ return calendar.hasDuration(config);
+ },
+ calculateEndDate: function calculateEndDate(config) {
+ // start_date, duration, unit, task
+ var config = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);
+
+ var calendar = this._getCalendar(config);
+
+ return calendar.calculateEndDate(config);
+ }
+};
+module.exports = TimeCalculator;
+
+/***/ }),
+
+/***/ "./sources/core/worktime/work_time.js":
+/*!********************************************!*\
+ !*** ./sources/core/worktime/work_time.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var CalendarManager = __webpack_require__(/*! ./calendar_manager */ "./sources/core/worktime/calendar_manager.js"),
+ TimeCalculator = __webpack_require__(/*! ./time_calculator */ "./sources/core/worktime/time_calculator.js"),
+ worktimeFacadeFactory = __webpack_require__(/*! ../facades/worktime_calendars */ "./sources/core/facades/worktime_calendars.js"),
+ utils = __webpack_require__(/*! ../../utils/utils */ "./sources/utils/utils.js");
+
+module.exports = function (gantt) {
+ var manager = new CalendarManager(gantt),
+ timeCalculator = new TimeCalculator(manager);
+ var facade = worktimeFacadeFactory.create(manager, timeCalculator);
+ utils.mixin(gantt, facade);
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/broadway.js":
+/*!***************************************!*\
+ !*** ./sources/css/skins/broadway.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.skins.broadway = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 1,
+ link_arrow_size: 7,
+ lightbox_additional_height: 86
+ },
+ _second_column_width: 90,
+ _third_column_width: 80,
+ _lightbox_template: "<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span><div class='gantt_cancel_btn'></div></div><div class='gantt_cal_larea'></div>",
+ _config_buttons_left: {},
+ _config_buttons_right: {
+ "gantt_delete_btn": "icon_delete",
+ "gantt_save_btn": "icon_save"
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/contrast_black.js":
+/*!*********************************************!*\
+ !*** ./sources/css/skins/contrast_black.js ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.skins["contrast_black"] = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 100,
+ _third_column_width: 80
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/contrast_white.js":
+/*!*********************************************!*\
+ !*** ./sources/css/skins/contrast_white.js ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.skins["contrast_white"] = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 100,
+ _third_column_width: 80
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/material.js":
+/*!***************************************!*\
+ !*** ./sources/css/skins/material.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.skins.material = {
+ config: {
+ grid_width: 411,
+ row_height: 34,
+ task_height_offset: 6,
+ scale_height: 36,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 80
+ },
+ _second_column_width: 110,
+ _third_column_width: 75,
+ _redefine_lightbox_buttons: {
+ "buttons_left": ["dhx_delete_btn"],
+ "buttons_right": ["dhx_save_btn", "dhx_cancel_btn"]
+ }
+ };
+ gantt.attachEvent("onAfterTaskDrag", function (id) {
+ var t = gantt.getTaskNode(id);
+
+ if (t) {
+ t.className += " gantt_drag_animation";
+ setTimeout(function () {
+ var indx = t.className.indexOf(" gantt_drag_animation");
+
+ if (indx > -1) {
+ t.className = t.className.slice(0, indx);
+ }
+ }, 200);
+ }
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/meadow.js":
+/*!*************************************!*\
+ !*** ./sources/css/skins/meadow.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.skins.meadow = {
+ config: {
+ grid_width: 350,
+ row_height: 27,
+ scale_height: 30,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 72
+ },
+ _second_column_width: 95,
+ _third_column_width: 80
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/skyblue.js":
+/*!**************************************!*\
+ !*** ./sources/css/skins/skyblue.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.skins.skyblue = {
+ config: {
+ grid_width: 350,
+ row_height: 27,
+ scale_height: 27,
+ link_line_width: 1,
+ link_arrow_size: 8,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 95,
+ _third_column_width: 80
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/terrace.js":
+/*!**************************************!*\
+ !*** ./sources/css/skins/terrace.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.skins.terrace = {
+ config: {
+ grid_width: 360,
+ row_height: 35,
+ scale_height: 35,
+ link_line_width: 2,
+ link_arrow_size: 6,
+ lightbox_additional_height: 75
+ },
+ _second_column_width: 90,
+ _third_column_width: 70
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/css/skins/terrace.less":
+/*!****************************************!*\
+ !*** ./sources/css/skins/terrace.less ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+
+/***/ "./sources/dhtmlxgantt.gpl.ts":
+/*!************************************!*\
+ !*** ./sources/dhtmlxgantt.gpl.ts ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var extensions_gpl_1 = __webpack_require__(/*! ./ext/extensions_gpl */ "./sources/ext/extensions_gpl.ts");
+var base = __webpack_require__(/*! ./factory/make_instance_web */ "./sources/factory/make_instance_web.js");
+var scope = __webpack_require__(/*! ./utils/global */ "./sources/utils/global.js");
+var gantt = scope.gantt = base(extensions_gpl_1.default);
+exports.gantt = gantt;
+exports.default = gantt;
+
+
+/***/ }),
+
+/***/ "./sources/ext/click_drag/eventsManager.ts":
+/*!*************************************************!*\
+ !*** ./sources/ext/click_drag/eventsManager.ts ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var domHelpers = __webpack_require__(/*! ../../core/ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+var EventsManager = /** @class */ (function () {
+ function EventsManager(gantt) {
+ this._mouseDown = false;
+ this._gantt = gantt;
+ this._domEvents = gantt._createDomEventScope();
+ }
+ EventsManager.prototype.attach = function (selectedRegion, useKey, ignore) {
+ var _this = this;
+ var gantt = this._gantt;
+ var _target = selectedRegion.getViewPort();
+ this._originPosition = window.getComputedStyle(_target).display;
+ this._restoreOriginPosition = function () {
+ _target.style.position = _this._originPosition;
+ };
+ if (this._originPosition === "static") {
+ _target.style.position = "relative";
+ }
+ var state = gantt.$services.getService("state");
+ state.registerProvider("clickDrag", function () {
+ var result = { autoscroll: false };
+ return result;
+ });
+ var scheduledDndCoordinates = null;
+ var startDragAndDrop = function () {
+ if (!scheduledDndCoordinates) {
+ return;
+ }
+ _this._mouseDown = true;
+ selectedRegion.setStart(gantt.copy(scheduledDndCoordinates));
+ selectedRegion.setPosition(gantt.copy(scheduledDndCoordinates));
+ selectedRegion.setEnd(gantt.copy(scheduledDndCoordinates));
+ scheduledDndCoordinates = null;
+ };
+ this._domEvents.attach(_target, "mousedown", function (event) {
+ scheduledDndCoordinates = null;
+ var filterTargets = ".gantt_task_line, .gantt_task_link";
+ if (ignore !== undefined) {
+ if (ignore instanceof Array) {
+ filterTargets = ignore.join(", ");
+ }
+ else {
+ filterTargets = ignore;
+ }
+ }
+ if (filterTargets) {
+ if (gantt.utils.dom.closest(event.target, filterTargets)) {
+ return;
+ }
+ }
+ state.registerProvider("clickDrag", function () {
+ var result = { autoscroll: _this._mouseDown };
+ return result;
+ });
+ if (useKey && event[useKey] !== true) {
+ return;
+ }
+ scheduledDndCoordinates = _this._getCoordinates(event, selectedRegion);
+ });
+ var eventElement = domHelpers.getRootNode(gantt.$root) || document.body;
+ this._domEvents.attach(eventElement, "mouseup", function (event) {
+ scheduledDndCoordinates = null;
+ if (useKey && event[useKey] !== true) {
+ return;
+ }
+ if (_this._mouseDown === true) {
+ _this._mouseDown = false;
+ var coordinates = _this._getCoordinates(event, selectedRegion);
+ selectedRegion.dragEnd(coordinates);
+ }
+ });
+ this._domEvents.attach(_target, "mousemove", function (event) {
+ if (useKey && event[useKey] !== true) {
+ return;
+ }
+ // GS-854. If we don't have useKey for the click_drag extension,
+ // check the drag_timeline to not simultaneously use both extensions
+ var dragTimeline = _this._gantt.ext.clickDrag;
+ var dragTimelineUseKey = (_this._gantt.config.drag_timeline || {}).useKey;
+ if (dragTimeline && dragTimelineUseKey) {
+ if (!useKey && event[dragTimelineUseKey]) {
+ return;
+ }
+ }
+ var coordinates = null;
+ if (!_this._mouseDown && scheduledDndCoordinates) {
+ coordinates = _this._getCoordinates(event, selectedRegion);
+ if (Math.abs(scheduledDndCoordinates.relative.left - coordinates.relative.left) > 5) {
+ // add small threshold not to start dnd on simple click
+ startDragAndDrop();
+ }
+ return;
+ }
+ if (_this._mouseDown === true) {
+ coordinates = _this._getCoordinates(event, selectedRegion);
+ selectedRegion.setEnd(coordinates);
+ selectedRegion.render();
+ }
+ });
+ };
+ EventsManager.prototype.detach = function () {
+ var gantt = this._gantt;
+ this._domEvents.detachAll();
+ if (this._restoreOriginPosition) {
+ this._restoreOriginPosition();
+ }
+ var state = gantt.$services.getService("state");
+ state.unregisterProvider("clickDrag");
+ };
+ EventsManager.prototype.destructor = function () {
+ this.detach();
+ };
+ EventsManager.prototype._getCoordinates = function (event, selectedRegion) {
+ var viewPort = selectedRegion.getViewPort();
+ var viewPortBounds = viewPort.getBoundingClientRect();
+ var clientX = event.clientX, clientY = event.clientY;
+ var result = {
+ absolute: {
+ left: clientX,
+ top: clientY,
+ },
+ relative: {
+ left: clientX - viewPortBounds.left + viewPort.scrollLeft,
+ top: clientY - viewPortBounds.top + viewPort.scrollTop
+ }
+ };
+ return result;
+ };
+ return EventsManager;
+}());
+exports.EventsManager = EventsManager;
+
+
+/***/ }),
+
+/***/ "./sources/ext/click_drag/index.ts":
+/*!*****************************************!*\
+ !*** ./sources/ext/click_drag/index.ts ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __assign = (this && this.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var eventsManager_1 = __webpack_require__(/*! ./eventsManager */ "./sources/ext/click_drag/eventsManager.ts");
+var selectedRegion_1 = __webpack_require__(/*! ./selectedRegion */ "./sources/ext/click_drag/selectedRegion.ts");
+function default_1(gantt) {
+ if (!gantt.ext) {
+ gantt.ext = {};
+ }
+ var defaultConfig = {
+ className: "gantt_click_drag_rect",
+ useRequestAnimationFrame: true,
+ callback: undefined,
+ singleRow: false
+ };
+ var eventsManager = new eventsManager_1.EventsManager(gantt);
+ gantt.ext.clickDrag = eventsManager;
+ gantt.attachEvent("onGanttReady", function () {
+ var config = __assign({ viewPort: gantt.$task_data }, defaultConfig);
+ if (gantt.config.click_drag) {
+ var clickDrag = gantt.config.click_drag;
+ config.render = clickDrag.render || defaultConfig.render;
+ config.className = clickDrag.className || defaultConfig.className;
+ config.callback = clickDrag.callback || defaultConfig.callback;
+ config.viewPort = clickDrag.viewPort || gantt.$task_data;
+ config.useRequestAnimationFrame = clickDrag.useRequestAnimationFrame === undefined ?
+ defaultConfig.useRequestAnimationFrame : clickDrag.useRequestAnimationFrame;
+ config.singleRow = clickDrag.singleRow === undefined ? defaultConfig.singleRow : clickDrag.singleRow;
+ var timeline = gantt.$ui.getView("timeline");
+ var selectedRegion = new selectedRegion_1.SelectedRegion(config, gantt, timeline);
+ gantt.ext.clickDrag.attach(selectedRegion, clickDrag.useKey, clickDrag.ignore);
+ }
+ });
+ gantt.attachEvent("onDestroy", function () {
+ eventsManager.destructor();
+ });
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/ext/click_drag/selectedRegion.ts":
+/*!**************************************************!*\
+ !*** ./sources/ext/click_drag/selectedRegion.ts ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var eventable = __webpack_require__(/*! ../../utils/eventable */ "./sources/utils/eventable.js");
+var helpers_1 = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js");
+var SelectedRegion = /** @class */ (function () {
+ function SelectedRegion(config, gantt, view) {
+ var _this = this;
+ this._el = document.createElement("div");
+ this.defaultRender = function (start, end) {
+ if (!_this._el) {
+ _this._el = document.createElement("div");
+ }
+ var node = _this._el;
+ // const gantt = this._gantt;
+ var top = Math.min(start.relative.top, end.relative.top);
+ var bottom = Math.max(start.relative.top, end.relative.top);
+ var left = Math.min(start.relative.left, end.relative.left);
+ var right = Math.max(start.relative.left, end.relative.left);
+ if (_this._singleRow) {
+ var pos = _this._getTaskPositionByTop(_this._startPoint.relative.top);
+ node.style.height = pos.height + "px";
+ node.style.top = pos.top + "px";
+ }
+ else {
+ node.style.height = Math.abs(bottom - top) + "px";
+ node.style.top = top + "px";
+ }
+ node.style.width = Math.abs(right - left) + "px";
+ node.style.left = left + "px";
+ return node;
+ };
+ this._gantt = gantt;
+ this._view = view;
+ this._viewPort = config.viewPort;
+ this._el.classList.add(config.className);
+ if (typeof config.callback === "function") {
+ this._callback = config.callback;
+ }
+ this.render = function () {
+ var node;
+ if (config.render) {
+ node = config.render(_this._startPoint, _this._endPoint);
+ }
+ else {
+ node = _this.defaultRender(_this._startPoint, _this._endPoint);
+ }
+ if (node !== _this._el) {
+ if (_this._el && _this._el.parentNode) {
+ _this._el.parentNode.removeChild(_this._el);
+ }
+ _this._el = node;
+ }
+ if (config.className !== "") {
+ _this._el.classList.add(config.className);
+ }
+ _this.draw();
+ };
+ if (!helpers_1.isEventable(this._viewPort)) {
+ eventable(this._viewPort);
+ }
+ this._singleRow = config.singleRow;
+ this._useRequestAnimationFrame = config.useRequestAnimationFrame;
+ }
+ SelectedRegion.prototype.draw = function () {
+ var _this = this;
+ if (this._useRequestAnimationFrame) {
+ return requestAnimationFrame(function () {
+ _this._viewPort.appendChild(_this.getElement());
+ });
+ }
+ else {
+ this._viewPort.appendChild(this.getElement());
+ }
+ };
+ SelectedRegion.prototype.clear = function () {
+ var _this = this;
+ if (this._useRequestAnimationFrame) {
+ return requestAnimationFrame(function () {
+ if (!_this._el.parentNode) {
+ return;
+ }
+ _this._viewPort.removeChild(_this._el);
+ });
+ }
+ else {
+ if (!this._el.parentNode) {
+ return;
+ }
+ this._viewPort.removeChild(this._el);
+ }
+ };
+ SelectedRegion.prototype.getElement = function () {
+ return this._el;
+ };
+ SelectedRegion.prototype.getViewPort = function () {
+ return this._viewPort;
+ };
+ SelectedRegion.prototype.setStart = function (startPoint) {
+ var gantt = this._gantt;
+ this._startPoint = startPoint;
+ this._startDate = gantt.dateFromPos(this._startPoint.relative.left);
+ this._viewPort.callEvent("onBeforeDrag", [this._startPoint]);
+ };
+ SelectedRegion.prototype.setEnd = function (endPoint) {
+ var gantt = this._gantt;
+ this._endPoint = endPoint;
+ if (this._singleRow) {
+ var pos = this._getTaskPositionByTop(this._startPoint.relative.top);
+ this._endPoint.relative.top = pos.top;
+ }
+ this._endDate = gantt.dateFromPos(this._endPoint.relative.left);
+ if (this._startPoint.relative.left > this._endPoint.relative.left) {
+ this._positionPoint = {
+ relative: { left: this._endPoint.relative.left, top: this._positionPoint.relative.top },
+ absolute: { left: this._endPoint.absolute.left, top: this._positionPoint.absolute.top }
+ };
+ }
+ if (this._startPoint.relative.top > this._endPoint.relative.top) {
+ this._positionPoint = {
+ relative: { left: this._positionPoint.relative.left, top: this._endPoint.relative.top },
+ absolute: { left: this._positionPoint.absolute.left, top: this._endPoint.absolute.top }
+ };
+ }
+ this._viewPort.callEvent("onDrag", [this._startPoint, this._endPoint]);
+ };
+ SelectedRegion.prototype.setPosition = function (positionPoint) {
+ this._positionPoint = positionPoint;
+ };
+ SelectedRegion.prototype.dragEnd = function (endPoint) {
+ var _a;
+ var gantt = this._gantt;
+ if (endPoint.relative.left < 0) {
+ endPoint.relative.left = 0;
+ }
+ this._viewPort.callEvent("onBeforeDragEnd", [this._startPoint, endPoint]);
+ this.setEnd(endPoint);
+ // GS-1422. The endDate can be null if we drag the mouse outside the Gantt container
+ this._endDate = this._endDate || gantt.getState().max_date;
+ if (this._startDate.valueOf() > this._endDate.valueOf()) {
+ _a = [this._endDate, this._startDate], this._startDate = _a[0], this._endDate = _a[1];
+ }
+ this.clear();
+ var tasksByTime = gantt.getTaskByTime(this._startDate, this._endDate);
+ var tasksByIndex = this._getTasksByTop(this._startPoint.relative.top, this._endPoint.relative.top);
+ this._viewPort.callEvent("onDragEnd", [this._startPoint, this._endPoint]);
+ if (this._callback) {
+ this._callback(this._startPoint, this._endPoint, this._startDate, this._endDate, tasksByTime, tasksByIndex);
+ }
+ };
+ SelectedRegion.prototype.getInBounds = function () {
+ return this._singleRow;
+ };
+ SelectedRegion.prototype._getTasksByTop = function (start, end) {
+ var gantt = this._gantt;
+ var startValue = start;
+ var endValue = end;
+ if (start > end) {
+ startValue = end;
+ endValue = start;
+ }
+ var startIndex = this._getTaskPositionByTop(startValue).index;
+ var endIndex = this._getTaskPositionByTop(endValue).index;
+ var result = [];
+ for (var i = startIndex; i <= endIndex; i++) {
+ var task = gantt.getTaskByIndex(i);
+ if (task) {
+ result.push(gantt.getTaskByIndex(i));
+ }
+ }
+ return result;
+ };
+ SelectedRegion.prototype._getTaskPositionByTop = function (top) {
+ var gantt = this._gantt;
+ var view = this._view;
+ var index = view.getItemIndexByTopPosition(top);
+ var task = gantt.getTaskByIndex(index);
+ if (task) {
+ var height = view.getItemHeight(task.id);
+ var itemTop = view.getItemTop(task.id);
+ return {
+ top: itemTop || 0,
+ height: height || 0,
+ index: index,
+ };
+ }
+ else {
+ var dataHeight = view.getTotalHeight();
+ return {
+ top: top > dataHeight ? dataHeight : 0,
+ height: gantt.config.row_height,
+ index: top > dataHeight ? gantt.getTaskCount() : 0,
+ };
+ }
+ };
+ return SelectedRegion;
+}());
+exports.SelectedRegion = SelectedRegion;
+
+
+/***/ }),
+
+/***/ "./sources/ext/drag_timeline/eventsManager.ts":
+/*!****************************************************!*\
+ !*** ./sources/ext/drag_timeline/eventsManager.ts ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var EventsManager = /** @class */ (function () {
+ function EventsManager(gantt) {
+ var _this = this;
+ this._mouseDown = false;
+ this._calculateDirectionVector = function () {
+ var traceSteps = 10;
+ if (_this._trace.length >= traceSteps) {
+ var dots = _this._trace.slice(_this._trace.length - traceSteps);
+ var vectors = [];
+ for (var i = 1; i < dots.length; i++) {
+ vectors.push({
+ x: dots[i].x - dots[i - 1].x,
+ y: dots[i].y - dots[i - 1].y
+ });
+ }
+ var resultVector_1 = { x: 0, y: 0 };
+ vectors.forEach(function (vector) {
+ resultVector_1.x += vector.x;
+ resultVector_1.y += vector.y;
+ });
+ var magnitude = Math.sqrt(resultVector_1.x * resultVector_1.x + resultVector_1.y * resultVector_1.y);
+ var angleDegrees = Math.atan2(Math.abs(resultVector_1.y), Math.abs(resultVector_1.x)) * 180 / Math.PI;
+ return {
+ magnitude: magnitude,
+ angleDegrees: angleDegrees
+ };
+ }
+ return null;
+ };
+ this._applyDndReadyStyles = function () {
+ _this._timeline.$task.classList.add("gantt_timeline_move_available");
+ };
+ this._clearDndReadyStyles = function () {
+ _this._timeline.$task.classList.remove("gantt_timeline_move_available");
+ };
+ this._getScrollPosition = function (timeline) {
+ var gantt = _this._gantt;
+ return {
+ x: gantt.$ui.getView(timeline.$config.scrollX).getScrollState().position,
+ y: gantt.$ui.getView(timeline.$config.scrollY).getScrollState().position
+ };
+ };
+ this._countNewScrollPosition = function (coords) {
+ var vector = _this._calculateDirectionVector();
+ var shiftX = _this._startPoint.x - coords.x;
+ var shiftY = _this._startPoint.y - coords.y;
+ if (vector) {
+ if (vector.angleDegrees < 15) {
+ shiftY = 0;
+ }
+ else if (vector.angleDegrees > 75) {
+ shiftX = 0;
+ }
+ }
+ var result = {
+ x: _this._scrollState.x + shiftX,
+ y: _this._scrollState.y + shiftY
+ };
+ return result;
+ };
+ this._setScrollPosition = function (timeline, coords) {
+ var gantt = _this._gantt;
+ requestAnimationFrame(function () {
+ gantt.scrollLayoutCell(timeline.$id, coords.x, coords.y);
+ });
+ };
+ this._stopDrag = function (event) {
+ var gantt = _this._gantt;
+ _this._trace = [];
+ gantt.$root.classList.remove("gantt_noselect");
+ if (_this._originalReadonly !== undefined) {
+ gantt.config.readonly = _this._originalReadonly;
+ }
+ if (_this._originAutoscroll !== undefined) {
+ gantt.config.autoscroll = _this._originAutoscroll;
+ }
+ if (gantt.config.drag_timeline) {
+ var useKey = gantt.config.drag_timeline.useKey;
+ if (useKey && event[useKey] !== true) {
+ return;
+ }
+ }
+ _this._mouseDown = false;
+ };
+ this._startDrag = function (event) {
+ var gantt = _this._gantt;
+ _this._originAutoscroll = gantt.config.autoscroll;
+ gantt.config.autoscroll = false;
+ gantt.$root.classList.add("gantt_noselect");
+ _this._originalReadonly = gantt.config.readonly;
+ gantt.config.readonly = true;
+ _this._trace = [];
+ _this._mouseDown = true;
+ var _a = _this._getScrollPosition(_this._timeline), x = _a.x, y = _a.y;
+ _this._scrollState = { x: x, y: y };
+ _this._startPoint = { x: event.clientX, y: event.clientY };
+ _this._trace.push(_this._startPoint);
+ };
+ this._gantt = gantt;
+ this._domEvents = gantt._createDomEventScope();
+ this._trace = [];
+ }
+ EventsManager.create = function (gantt) {
+ return new EventsManager(gantt);
+ };
+ EventsManager.prototype.destructor = function () {
+ this._domEvents.detachAll();
+ };
+ EventsManager.prototype.attach = function (timeline) {
+ var _this = this;
+ this._timeline = timeline;
+ var gantt = this._gantt;
+ this._domEvents.attach(timeline.$task, "mousedown", function (event) {
+ if (!gantt.config.drag_timeline) {
+ return;
+ }
+ var _a = gantt.config.drag_timeline, useKey = _a.useKey, ignore = _a.ignore, enabled = _a.enabled;
+ if (enabled === false) {
+ return;
+ }
+ var filterTargets = ".gantt_task_line, .gantt_task_link";
+ if (ignore !== undefined) {
+ if (ignore instanceof Array) {
+ filterTargets = ignore.join(", ");
+ }
+ else {
+ filterTargets = ignore;
+ }
+ }
+ if (filterTargets) {
+ if (gantt.utils.dom.closest(event.target, filterTargets)) {
+ return;
+ }
+ }
+ if (useKey && event[useKey] !== true) {
+ return;
+ }
+ _this._startDrag(event);
+ });
+ this._domEvents.attach(document, "keydown", function (event) {
+ if (!gantt.config.drag_timeline) {
+ return;
+ }
+ var useKey = gantt.config.drag_timeline.useKey;
+ if (useKey && event[useKey] === true) {
+ _this._applyDndReadyStyles();
+ }
+ });
+ this._domEvents.attach(document, "keyup", function (event) {
+ if (!gantt.config.drag_timeline) {
+ return;
+ }
+ var useKey = gantt.config.drag_timeline.useKey;
+ if (useKey && event[useKey] === false) {
+ _this._clearDndReadyStyles();
+ _this._stopDrag(event);
+ }
+ });
+ this._domEvents.attach(document, "mouseup", function (event) {
+ _this._stopDrag(event);
+ });
+ this._domEvents.attach(gantt.$root, "mouseup", function (event) {
+ _this._stopDrag(event);
+ });
+ this._domEvents.attach(document, "mouseleave", function (event) {
+ _this._stopDrag(event);
+ });
+ this._domEvents.attach(gantt.$root, "mouseleave", function (event) {
+ _this._stopDrag(event);
+ });
+ this._domEvents.attach(gantt.$root, "mousemove", function (event) {
+ if (!gantt.config.drag_timeline) {
+ return;
+ }
+ var useKey = gantt.config.drag_timeline.useKey;
+ if (useKey && event[useKey] !== true) {
+ return;
+ }
+ // GS-854. If we don't have useKey for the drag_timeline extension,
+ // check the click_drag to not simultaneously use both extensions
+ var clickDrag = _this._gantt.ext.clickDrag;
+ var clickDragUseKey = (_this._gantt.config.click_drag || {}).useKey;
+ if (clickDrag && clickDragUseKey) {
+ if (!useKey && event[clickDragUseKey]) {
+ return;
+ }
+ }
+ if (_this._mouseDown === true) {
+ _this._trace.push({ x: event.clientX, y: event.clientY });
+ var scrollPosition = _this._countNewScrollPosition({ x: event.clientX, y: event.clientY });
+ _this._setScrollPosition(timeline, scrollPosition);
+ _this._scrollState = scrollPosition;
+ _this._startPoint = { x: event.clientX, y: event.clientY };
+ }
+ });
+ };
+ return EventsManager;
+}());
+exports.EventsManager = EventsManager;
+
+
+/***/ }),
+
+/***/ "./sources/ext/drag_timeline/index.ts":
+/*!********************************************!*\
+ !*** ./sources/ext/drag_timeline/index.ts ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var eventsManager_1 = __webpack_require__(/*! ./eventsManager */ "./sources/ext/drag_timeline/eventsManager.ts");
+function default_1(gantt) {
+ if (!gantt.ext) {
+ gantt.ext = {};
+ }
+ gantt.ext.dragTimeline = {
+ create: function () { return eventsManager_1.EventsManager.create(gantt); }
+ };
+ gantt.config.drag_timeline = {
+ enabled: true
+ };
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/ext/export_api/index.ts":
+/*!*****************************************!*\
+ !*** ./sources/ext/export_api/index.ts ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(Buffer) {
+Object.defineProperty(exports, "__esModule", { value: true });
+function default_1(gantt) {
+ gantt.ext = gantt.ext || {};
+ gantt.ext.export_api = gantt.ext.export_api || {
+ _apiUrl: "https://export.dhtmlx.com/gantt",
+ getNodeJSTransport: function (url) {
+ var protocol = url.split("://")[0];
+ var module;
+ var defaultPort;
+ switch (protocol) {
+ case "https":
+ module = __webpack_require__(/*! https */ "./node_modules/https-browserify/index.js");
+ defaultPort = 443;
+ break;
+ case "http":
+ module = __webpack_require__(/*! http */ "./node_modules/stream-http/index.js");
+ defaultPort = 80;
+ break;
+ default:
+ throw new Error("Unsupported protocol: " + protocol + ", url: " + url);
+ }
+ return {
+ module: module,
+ defaultPort: defaultPort
+ };
+ },
+ _prepareConfigPDF: function (config, type) {
+ if (config && config.raw) {
+ var previousDateRage = null;
+ if (config.start && config.end) {
+ previousDateRage = {
+ start_date: gantt.config.start_date,
+ end_date: gantt.config.end_date,
+ };
+ gantt.config.start_date = gantt.date.str_to_date(gantt.config.date_format)(config.start);
+ gantt.config.end_date = gantt.date.str_to_date(gantt.config.date_format)(config.end);
+ }
+ config = gantt.mixin(config, {
+ name: "gantt." + type, data: gantt.ext.export_api._serializeHtml()
+ });
+ if (previousDateRage) {
+ gantt.config.start_date = previousDateRage.start_date;
+ gantt.config.end_date = previousDateRage.end_date;
+ }
+ }
+ else {
+ config = gantt.mixin((config || {}), {
+ name: "gantt." + type,
+ data: gantt.ext.export_api._serializeAll(),
+ config: gantt.config
+ });
+ gantt.ext.export_api._fixColumns(config.config.columns);
+ }
+ config.version = gantt.version;
+ gantt.ext.export_api._sendToExport(config, type);
+ },
+ exportToPDF: function (config) {
+ gantt.ext.export_api._prepareConfigPDF(config, "pdf");
+ },
+ exportToPNG: function (config) {
+ gantt.ext.export_api._prepareConfigPDF(config, "png");
+ },
+ exportToICal: function (config) {
+ config = gantt.mixin((config || {}), {
+ name: "gantt.ical",
+ data: gantt.ext.export_api._serializePlain().data,
+ version: gantt.version
+ });
+ gantt.ext.export_api._sendToExport(config, "ical");
+ },
+ exportToExcel: function (config) {
+ config = config || {};
+ var tasks;
+ var dates;
+ var state;
+ var scroll;
+ // GS-2124, we need to get all task nodes to correctly obtain the colors
+ var smartRendering = gantt.config.smart_rendering;
+ if (config.visual === "base-colors") {
+ gantt.config.smart_rendering = false;
+ }
+ if (config.start || config.end) {
+ state = gantt.getState();
+ dates = [gantt.config.start_date, gantt.config.end_date];
+ scroll = gantt.getScrollState();
+ var convert = gantt.date.str_to_date(gantt.config.date_format);
+ tasks = gantt.eachTask;
+ if (config.start) {
+ gantt.config.start_date = convert(config.start);
+ }
+ if (config.end) {
+ gantt.config.end_date = convert(config.end);
+ }
+ gantt.render();
+ gantt.config.smart_rendering = smartRendering;
+ gantt.eachTask = gantt.ext.export_api._eachTaskTimed(gantt.config.start_date, gantt.config.end_date);
+ }
+ else if (config.visual === "base-colors") {
+ gantt.render();
+ gantt.config.smart_rendering = smartRendering;
+ }
+ gantt._no_progress_colors = config.visual === "base-colors";
+ var data = null;
+ if (!gantt.env.isNode) {
+ data = gantt.ext.export_api._serializeTable(config).data;
+ }
+ config = gantt.mixin(config, {
+ name: "gantt.xlsx",
+ title: "Tasks",
+ data: data,
+ columns: gantt.ext.export_api._serializeColumns({ rawDates: true }),
+ version: gantt.version
+ });
+ if (config.visual) {
+ config.scales = gantt.ext.export_api._serializeScales(config);
+ }
+ gantt.ext.export_api._sendToExport(config, "excel");
+ if (config.start || config.end) {
+ gantt.config.start_date = state.min_date;
+ gantt.config.end_date = state.max_date;
+ gantt.eachTask = tasks;
+ gantt.render();
+ gantt.scrollTo(scroll.x, scroll.y);
+ gantt.config.start_date = dates[0];
+ gantt.config.end_date = dates[1];
+ }
+ },
+ exportToJSON: function (config) {
+ config = gantt.mixin((config || {}), {
+ name: "gantt.json",
+ data: gantt.ext.export_api._serializeAll(),
+ config: gantt.config,
+ columns: gantt.ext.export_api._serializeColumns(),
+ worktime: gantt.ext.export_api._getWorktimeSettings(),
+ version: gantt.version
+ });
+ gantt.ext.export_api._sendToExport(config, "json");
+ },
+ importFromExcel: function (config) {
+ try {
+ var formData = config.data;
+ if (formData instanceof FormData) {
+ }
+ else if (formData instanceof File) {
+ var data = new FormData();
+ data.append("file", formData);
+ config.data = data;
+ }
+ }
+ catch (error) { }
+ if (gantt.env.isNode) {
+ gantt.ext.export_api._nodejsImportExcel(config);
+ }
+ else {
+ gantt.ext.export_api._sendImportAjaxExcel(config);
+ }
+ },
+ importFromMSProject: function (config) {
+ var formData = config.data;
+ try {
+ if (formData instanceof FormData) {
+ }
+ else if (formData instanceof File) {
+ var data = new FormData();
+ data.append("file", formData);
+ config.data = data;
+ }
+ }
+ catch (error) { }
+ if (gantt.env.isNode) {
+ gantt.ext.export_api._nodejsImportMSP(config);
+ }
+ else {
+ gantt.ext.export_api._sendImportAjaxMSP(config);
+ }
+ },
+ importFromPrimaveraP6: function (config) {
+ config.type = "primaveraP6-parse";
+ return gantt.importFromMSProject(config);
+ },
+ exportToMSProject: function (config) {
+ config = config || {};
+ config.skip_circular_links = config.skip_circular_links === undefined ? true : !!config.skip_circular_links;
+ var oldXmlFormat = gantt.templates.xml_format;
+ var oldFormatDate = gantt.templates.format_date;
+ var oldXmlDate = gantt.config.xml_date;
+ var oldDateFormat = gantt.config.date_format;
+ var exportServiceDateFormat = "%d-%m-%Y %H:%i:%s";
+ gantt.config.xml_date = exportServiceDateFormat;
+ gantt.config.date_format = exportServiceDateFormat;
+ gantt.templates.xml_format = gantt.date.date_to_str(exportServiceDateFormat);
+ gantt.templates.format_date = gantt.date.date_to_str(exportServiceDateFormat);
+ var data = gantt.ext.export_api._serializeAll();
+ gantt.ext.export_api._customProjectProperties(data, config);
+ gantt.ext.export_api._customTaskProperties(data, config);
+ if (config.skip_circular_links) {
+ gantt.ext.export_api._clearRecLinks(data);
+ }
+ config = gantt.ext.export_api._exportConfig(data, config);
+ gantt.ext.export_api._sendToExport(config, config.type || "msproject");
+ gantt.config.xml_date = oldXmlDate;
+ gantt.config.date_format = oldDateFormat;
+ gantt.templates.xml_format = oldXmlFormat;
+ gantt.templates.format_date = oldFormatDate;
+ gantt.config.$custom_data = null;
+ gantt.config.custom = null;
+ },
+ exportToPrimaveraP6: function (config) {
+ config = config || {};
+ config.type = "primaveraP6";
+ return gantt.exportToMSProject(config);
+ },
+ _nodejsImportExcel: function (config) {
+ // tslint:disable-next-line no-implicit-dependencies
+ var formDataInstance = __webpack_require__(/*! form-data */ "./node_modules/form-data/lib/browser.js");
+ var url = config.server || gantt.ext.export_api._apiUrl;
+ var network = gantt.ext.export_api.getNodeJSTransport(url);
+ var parts1 = url.split("://")[1];
+ var parts2 = parts1.split("/")[0].split(":");
+ var parts3 = parts1.split("/");
+ var hostname = parts2[0];
+ var port = parts2[1] || network.defaultPort;
+ var path = "/" + parts3.slice(1).join("/");
+ var options = {
+ hostname: hostname,
+ port: port,
+ path: path,
+ method: "POST",
+ headers: {
+ "X-Requested-With": "XMLHttpRequest"
+ }
+ };
+ var formData = new formDataInstance();
+ formData.append("file", config.data);
+ formData.append("type", "excel-parse");
+ formData.append("data", JSON.stringify({
+ sheet: config.sheet || 0
+ }));
+ options.headers["Content-Type"] = formData.getHeaders()["content-type"];
+ var req = network.module.request(options, function (res) {
+ var resData = "";
+ res.on("data", function (d) {
+ resData += d;
+ });
+ res.on("end", function (d) {
+ config.callback(resData.toString());
+ });
+ });
+ req.on("error", function (error) {
+ // tslint:disable-next-line no-console
+ console.error(error);
+ });
+ formData.pipe(req);
+ },
+ _nodejsImportMSP: function (config) {
+ // tslint:disable-next-line no-implicit-dependencies
+ var formDataInstance = __webpack_require__(/*! form-data */ "./node_modules/form-data/lib/browser.js");
+ var url = config.server || gantt.ext.export_api._apiUrl;
+ var network = gantt.ext.export_api.getNodeJSTransport(url);
+ var parts1 = url.split("://")[1];
+ var parts2 = parts1.split("/")[0].split(":");
+ var parts3 = parts1.split("/");
+ var hostname = parts2[0];
+ var port = parts2[1] || network.defaultPort;
+ var path = "/" + parts3.slice(1).join("/");
+ var options = {
+ hostname: hostname,
+ port: port,
+ path: path,
+ method: "POST",
+ headers: {
+ "X-Requested-With": "XMLHttpRequest"
+ }
+ };
+ var settings = {
+ durationUnit: config.durationUnit || undefined,
+ projectProperties: config.projectProperties || undefined,
+ taskProperties: config.taskProperties || undefined,
+ };
+ var formData = new formDataInstance();
+ formData.append("file", config.data);
+ formData.append("type", config.type || "msproject-parse");
+ formData.append("data", JSON.stringify(settings), options);
+ options.headers["Content-Type"] = formData.getHeaders()["content-type"];
+ var req = network.module.request(options, function (res) {
+ var resData = "";
+ res.on("data", function (d) {
+ resData += d;
+ });
+ res.on("end", function (d) {
+ config.callback(resData.toString());
+ });
+ });
+ req.on("error", function (error) {
+ // tslint:disable-next-line no-console
+ console.error(error);
+ });
+ formData.pipe(req);
+ },
+ _fixColumns: function (columns) {
+ for (var i = 0; i < columns.length; i++) {
+ columns[i].label = columns[i].label || gantt.locale.labels["column_" + columns[i].name];
+ if (typeof columns[i].width === "string") {
+ columns[i].width = columns[i].width * 1;
+ }
+ }
+ },
+ _xdr: function (url, pack, cb) {
+ if (gantt.env.isNode) {
+ gantt.ext.export_api._nodejsPostRequest(url, pack, cb);
+ }
+ else {
+ gantt.ajax.post(url, pack, cb);
+ }
+ },
+ _nodejsPostRequest: function (url, pack, cb) {
+ var network = gantt.ext.export_api.getNodeJSTransport(url);
+ var parts1 = url.split("://")[1];
+ var parts2 = parts1.split("/")[0].split(":");
+ var parts3 = parts1.split("/");
+ var hostname = parts2[0];
+ var port = parts2[1] || network.defaultPort;
+ var path = "/" + parts3.slice(1).join("/");
+ var options = {
+ hostname: hostname,
+ port: port,
+ path: path,
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "Content-Length": JSON.stringify(pack).length
+ }
+ };
+ var req = network.module.request(options, function (res) {
+ var resData = [];
+ res.on("data", function (d) {
+ resData.push(d);
+ });
+ res.on("end", function (d) {
+ cb(Buffer.concat(resData));
+ });
+ });
+ req.on("error", function (error) {
+ // tslint:disable-next-line no-console
+ console.error(error);
+ });
+ req.write(JSON.stringify(pack));
+ req.end();
+ },
+ _markColumns: function (base) {
+ var columns = base.config.columns;
+ if (columns) {
+ for (var i = 0; i < columns.length; i++) {
+ if (columns[i].template) {
+ columns[i].$template = true;
+ }
+ }
+ }
+ },
+ _sendImportAjaxExcel: function (config) {
+ var url = config.server || gantt.ext.export_api._apiUrl;
+ var store = config.store || 0;
+ var formData = config.data;
+ var callback = config.callback;
+ formData.append("type", "excel-parse");
+ formData.append("data", JSON.stringify({
+ sheet: config.sheet || 0
+ }));
+ if (store) {
+ formData.append("store", store);
+ }
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function (e) {
+ if (xhr.readyState === 4 && xhr.status === 0) { // network error
+ if (callback) {
+ callback(null);
+ }
+ }
+ };
+ xhr.onload = function () {
+ var fail = xhr.status > 400;
+ var info = null;
+ if (!fail) {
+ try {
+ info = JSON.parse(xhr.responseText);
+ }
+ catch (e) { }
+ }
+ if (callback) {
+ callback(info);
+ }
+ };
+ xhr.open("POST", url, true);
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ xhr.send(formData);
+ },
+ _ajaxToExport: function (data, type, callback) {
+ delete data.callback;
+ var url = data.server || gantt.ext.export_api._apiUrl;
+ var pack = "type=" + type + "&store=1&data=" + encodeURIComponent(JSON.stringify(data));
+ var cb = function (loader) {
+ var xdoc = loader.xmlDoc || loader;
+ var fail = xdoc.status > 400;
+ var info = null;
+ if (!fail) {
+ try {
+ info = JSON.parse(xdoc.responseText);
+ }
+ catch (e) { }
+ }
+ callback(info);
+ };
+ gantt.ext.export_api._xdr(url, pack, cb);
+ },
+ _serializableGanttConfig: function (config) {
+ var result = gantt.mixin({}, config);
+ if (result.columns) {
+ result.columns = result.columns.map(function (col) {
+ var copy = gantt.mixin({}, col);
+ delete copy.editor;
+ return copy;
+ });
+ }
+ delete result.editor_types;
+ return result;
+ },
+ _sendToExport: function (data, type) {
+ var convert = gantt.date.date_to_str(gantt.config.date_format || gantt.config.xml_date);
+ if (data.config) {
+ data.config = gantt.copy(gantt.ext.export_api._serializableGanttConfig(data.config));
+ gantt.ext.export_api._markColumns(data, type);
+ if (data.config.start_date && data.config.end_date) {
+ if (data.config.start_date instanceof Date) {
+ data.config.start_date = convert(data.config.start_date);
+ }
+ if (data.config.end_date instanceof Date) {
+ data.config.end_date = convert(data.config.end_date);
+ }
+ }
+ }
+ if (gantt.env.isNode) {
+ var url = data.server || gantt.ext.export_api._apiUrl;
+ var pack = {
+ type: type,
+ store: 0,
+ data: JSON.stringify(data)
+ };
+ var callbackFunction = data.callback || function (response) {
+ // tslint:disable-next-line no-console
+ console.log(response);
+ };
+ return gantt.ext.export_api._xdr(url, pack, callbackFunction);
+ }
+ if (data.callback) {
+ return gantt.ext.export_api._ajaxToExport(data, type, data.callback);
+ }
+ var form = gantt.ext.export_api._createHiddenForm();
+ form.firstChild.action = data.server || gantt.ext.export_api._apiUrl;
+ form.firstChild.childNodes[0].value = JSON.stringify(data);
+ form.firstChild.childNodes[1].value = type;
+ form.firstChild.submit();
+ },
+ _createHiddenForm: function () {
+ if (!gantt.ext.export_api._hidden_export_form) {
+ var t = gantt.ext.export_api._hidden_export_form = document.createElement("div");
+ t.style.display = "none";
+ t.innerHTML = "<form method='POST' target='_blank'><textarea name='data' style='width:0px; height:0px;' readonly='true'></textarea><input type='hidden' name='type' value=''></form>";
+ document.body.appendChild(t);
+ }
+ return gantt.ext.export_api._hidden_export_form;
+ },
+ _copyObjectBase: function (obj) {
+ var copy = {
+ start_date: undefined,
+ end_date: undefined
+ };
+ for (var key in obj) {
+ if (key.charAt(0) === "$") {
+ continue;
+ }
+ copy[key] = obj[key];
+ }
+ var formatDate = gantt.templates.xml_format || gantt.templates.format_date;
+ copy.start_date = formatDate(copy.start_date);
+ if (copy.end_date) {
+ copy.end_date = formatDate(copy.end_date);
+ }
+ return copy;
+ },
+ _color_box: null,
+ _color_hash: {},
+ _getStyles: function (css) {
+ if (!gantt.ext.export_api._color_box) {
+ gantt.ext.export_api._color_box = document.createElement("DIV");
+ gantt.ext.export_api._color_box.style.cssText = "position:absolute; display:none;";
+ document.body.appendChild(gantt.ext.export_api._color_box);
+ }
+ if (gantt.ext.export_api._color_hash[css]) {
+ return gantt.ext.export_api._color_hash[css];
+ }
+ gantt.ext.export_api._color_box.className = css;
+ var color = gantt.ext.export_api._getColor(gantt.ext.export_api._color_box, "color");
+ var backgroundColor = gantt.ext.export_api._getColor(gantt.ext.export_api._color_box, "backgroundColor");
+ return (gantt.ext.export_api._color_hash[css] = color + ";" + backgroundColor);
+ },
+ _getMinutesWorktimeSettings: function (parsedRanges) {
+ var minutes = [];
+ parsedRanges.forEach(function (range) {
+ minutes.push(range.startMinute);
+ minutes.push(range.endMinute);
+ });
+ return minutes;
+ },
+ _getWorktimeSettings: function () {
+ var defaultWorkTimes = {
+ hours: [0, 24],
+ minutes: null,
+ dates: { 0: true, 1: true, 2: true, 3: true, 4: true, 5: true, 6: true }
+ };
+ var time;
+ if (!gantt.config.work_time) {
+ time = defaultWorkTimes;
+ }
+ else {
+ var wTime = gantt._working_time_helper;
+ if (wTime && wTime.get_calendar) {
+ time = wTime.get_calendar();
+ }
+ else if (wTime) {
+ time = {
+ hours: wTime.hours,
+ minutes: null,
+ dates: wTime.dates
+ };
+ }
+ else if (gantt.config.worktimes && gantt.config.worktimes.global) {
+ var settings = gantt.config.worktimes.global;
+ if (settings.parsed) {
+ var minutes = gantt.ext.export_api._getMinutesWorktimeSettings(settings.parsed.hours);
+ time = {
+ hours: null,
+ minutes: minutes,
+ dates: {}
+ };
+ for (var i in settings.parsed.dates) {
+ if (Array.isArray(settings.parsed.dates[i])) {
+ time.dates[i] = gantt.ext.export_api._getMinutesWorktimeSettings(settings.parsed.dates[i]);
+ }
+ else {
+ time.dates[i] = settings.parsed.dates[i];
+ }
+ }
+ }
+ else {
+ time = {
+ hours: settings.hours,
+ minutes: null,
+ dates: settings.dates
+ };
+ }
+ }
+ else {
+ time = defaultWorkTimes;
+ }
+ }
+ return time;
+ },
+ _eachTaskTimed: function (start, end) {
+ return function (code, parent, master) {
+ parent = parent || gantt.config.root_id;
+ master = master || gantt;
+ var branch = gantt.getChildren(parent);
+ if (branch) {
+ for (var i = 0; i < branch.length; i++) {
+ var item = gantt._pull[branch[i]];
+ if ((!start || item.end_date > start) && (!end || item.start_date < end)) {
+ code.call(master, item);
+ }
+ if (gantt.hasChild(item.id)) {
+ gantt.eachTask(code, item.id, master);
+ }
+ }
+ }
+ };
+ },
+ // patch broken json serialization in gantt 2.1
+ _originalCopyObject: gantt.json._copyObject,
+ _copyObjectPlain: function (obj) {
+ var text = gantt.templates.task_text(obj.start_date, obj.end_date, obj);
+ var copy = gantt.ext.export_api._copyObjectBase(obj);
+ copy.text = text || copy.text;
+ return copy;
+ },
+ _getColor: function (node, style) {
+ var value = node.currentStyle ? node.currentStyle[style] : getComputedStyle(node, null)[style];
+ var rgb = value.replace(/\s/g, "").match(/^rgba?\((\d+),(\d+),(\d+)/i);
+ return ((rgb && rgb.length === 4) ?
+ ("0" + parseInt(rgb[1], 10).toString(16)).slice(-2) +
+ ("0" + parseInt(rgb[2], 10).toString(16)).slice(-2) +
+ ("0" + parseInt(rgb[3], 10).toString(16)).slice(-2) : value).replace("#", "");
+ },
+ // excel serialization
+ _copyObjectTable: function (obj) {
+ // Excel interprets UTC time as local time in every timezone, send local time instead of actual UTC time.
+ // https://github.com/SheetJS/js-xlsx/issues/126#issuecomment-60531614
+ var toISOstring = gantt.date.date_to_str("%Y-%m-%dT%H:%i:%s.000Z");
+ var copy = gantt.ext.export_api._copyObjectColumns(obj, gantt.ext.export_api._copyObjectPlain(obj));
+ if (copy.start_date) {
+ copy.start_date = toISOstring(obj.start_date);
+ }
+ if (copy.end_date) {
+ copy.end_date = toISOstring(obj.end_date);
+ }
+ // private gantt._day_index_by_date was replaced by public gantt.columnIndexByDate in gantt 5.0
+ var getDayIndex = gantt._day_index_by_date ? gantt._day_index_by_date : gantt.columnIndexByDate;
+ copy.$start = getDayIndex.call(gantt, obj.start_date);
+ copy.$end = getDayIndex.call(gantt, obj.end_date);
+ // GS-2100. Correct bar position considering hidden cells
+ var hiddenCells = 0;
+ var scaleCellsWidth = gantt.getScale().width;
+ if (scaleCellsWidth.indexOf(0) > -1) {
+ var i = 0;
+ for (i; i < copy.$start; i++) {
+ if (!scaleCellsWidth[i]) {
+ hiddenCells++;
+ }
+ }
+ copy.$start -= hiddenCells;
+ for (i; i < copy.$end; i++) {
+ if (!scaleCellsWidth[i]) {
+ hiddenCells++;
+ }
+ }
+ copy.$end -= hiddenCells;
+ }
+ copy.$level = obj.$level;
+ copy.$type = obj.$rendered_type;
+ var tmps = gantt.templates;
+ copy.$text = tmps.task_text(obj.start, obj.end_date, obj);
+ copy.$left = tmps.leftside_text ? tmps.leftside_text(obj.start, obj.end_date, obj) : "";
+ copy.$right = tmps.rightside_text ? tmps.rightside_text(obj.start, obj.end_date, obj) : "";
+ return copy;
+ },
+ _copyObjectColors: function (obj) {
+ var copy = gantt.ext.export_api._copyObjectTable(obj);
+ var node = gantt.getTaskNode(obj.id);
+ if (node && node.firstChild) {
+ var color = gantt.ext.export_api._getColor((gantt._no_progress_colors ? node : node.firstChild), "backgroundColor");
+ if (color === "363636") {
+ color = gantt.ext.export_api._getColor(node, "backgroundColor");
+ }
+ copy.$color = color;
+ }
+ else if (obj.color) {
+ copy.$color = obj.color;
+ }
+ return copy;
+ },
+ _copyObjectColumns: function (obj, copy) {
+ for (var i = 0; i < gantt.config.columns.length; i++) {
+ var ct = gantt.config.columns[i].template;
+ if (ct) {
+ var val = ct(obj);
+ if (val instanceof Date) {
+ val = gantt.templates.date_grid(val, obj);
+ }
+ copy["_" + i] = val;
+ }
+ }
+ return copy;
+ },
+ _copyObjectAll: function (obj) {
+ var copy = gantt.ext.export_api._copyObjectBase(obj);
+ var templates = [
+ "leftside_text",
+ "rightside_text",
+ "task_text",
+ "progress_text",
+ "task_class"
+ ];
+ // serialize all text templates
+ for (var i = 0; i < templates.length; i++) {
+ var template = gantt.templates[templates[i]];
+ if (template) {
+ copy["$" + i] = template(obj.start_date, obj.end_date, obj);
+ }
+ }
+ gantt.ext.export_api._copyObjectColumns(obj, copy);
+ copy.open = obj.$open;
+ return copy;
+ },
+ _serializeHtml: function () {
+ var smartScales = gantt.config.smart_scales;
+ var smartRendering = gantt.config.smart_rendering;
+ if (smartScales || smartRendering) {
+ gantt.config.smart_rendering = false;
+ gantt.config.smart_scales = false;
+ gantt.render();
+ }
+ var html = gantt.$container.parentNode.innerHTML;
+ if (smartScales || smartRendering) {
+ gantt.config.smart_scales = smartScales;
+ gantt.config.smart_rendering = smartRendering;
+ gantt.render();
+ }
+ return html;
+ },
+ _serializeAll: function () {
+ gantt.json._copyObject = gantt.ext.export_api._copyObjectAll;
+ var data = gantt.ext.export_api._exportSerialize();
+ gantt.json._copyObject = gantt.ext.export_api._originalCopyObject;
+ return data;
+ },
+ _serializePlain: function () {
+ var oldXmlFormat = gantt.templates.xml_format;
+ var oldFormatDate = gantt.templates.format_date;
+ gantt.templates.xml_format = gantt.date.date_to_str("%Y%m%dT%H%i%s", true);
+ gantt.templates.format_date = gantt.date.date_to_str("%Y%m%dT%H%i%s", true);
+ gantt.json._copyObject = gantt.ext.export_api._copyObjectPlain;
+ var data = gantt.ext.export_api._exportSerialize();
+ gantt.templates.xml_format = oldXmlFormat;
+ gantt.templates.format_date = oldFormatDate;
+ gantt.json._copyObject = gantt.ext.export_api._originalCopyObject;
+ delete data.links;
+ return data;
+ },
+ _getRaw: function () {
+ // support Gantt < 5.0
+ if (gantt._scale_helpers) {
+ var scales = gantt._get_scales();
+ var minWidth = gantt.config.min_column_width;
+ var autosizeMinWidth = gantt._get_resize_options().x ? Math.max(gantt.config.autosize_min_width, 0) : gantt.config.$task.offsetWidth;
+ var height = gantt.config.config.scale_height - 1;
+ return gantt._scale_helpers.prepareConfigs(scales, minWidth, autosizeMinWidth, height);
+ }
+ else { // Gantt >= 5.0
+ var timeline = gantt.$ui.getView("timeline");
+ if (timeline) {
+ var availWidth = timeline.$config.width;
+ if (gantt.config.autosize === "x" || gantt.config.autosize === "xy") {
+ availWidth = Math.max(gantt.config.autosize_min_width, 0);
+ }
+ var state = gantt.getState();
+ var scales = timeline._getScales();
+ var minWidth = gantt.config.min_column_width;
+ var height = gantt.config.scale_height - 1;
+ var rtl = gantt.config.rtl;
+ return timeline.$scaleHelper.prepareConfigs(scales, minWidth, availWidth, height, state.min_date, state.max_date, rtl);
+ }
+ }
+ },
+ _serializeTable: function (config) {
+ gantt.json._copyObject = config.visual ? gantt.ext.export_api._copyObjectColors : gantt.ext.export_api._copyObjectTable;
+ var data = gantt.ext.export_api._exportSerialize();
+ gantt.json._copyObject = gantt.ext.export_api._originalCopyObject;
+ delete data.links;
+ if (config.cellColors) {
+ var css = gantt.templates.timeline_cell_class || gantt.templates.task_cell_class;
+ if (css) {
+ var raw = gantt.ext.export_api._getRaw();
+ var steps = raw[0].trace_x;
+ for (var i = 1; i < raw.length; i++) {
+ if (raw[i].trace_x.length > steps.length) {
+ steps = raw[i].trace_x;
+ }
+ }
+ for (var i = 0; i < data.data.length; i++) {
+ data.data[i].styles = [];
+ var task = gantt.getTask(data.data[i].id);
+ for (var j = 0; j < steps.length; j++) {
+ var date = steps[j];
+ var cellCss = css(task, date);
+ if (cellCss) {
+ data.data[i].styles.push({ index: j, styles: gantt.ext.export_api._getStyles(cellCss) });
+ }
+ }
+ }
+ }
+ }
+ return data;
+ },
+ _serializeScales: function (config) {
+ var scales = [];
+ var raw = gantt.ext.export_api._getRaw();
+ var min = Infinity;
+ var max = 0;
+ for (var i = 0; i < raw.length; i++) {
+ min = Math.min(min, raw[i].col_width);
+ }
+ for (var i = 0; i < raw.length; i++) {
+ var start = 0;
+ var end = 0;
+ var row = [];
+ scales.push(row);
+ var step = raw[i];
+ max = Math.max(max, step.trace_x.length);
+ var template = step.format || step.template || (step.date ? gantt.date.date_to_str(step.date) : gantt.config.date_scale);
+ for (var j = 0; j < step.trace_x.length; j++) {
+ var date = step.trace_x[j];
+ end = start + Math.round(step.width[j] / min);
+ var scaleCell = { text: template(date), start: start, end: end, styles: "" };
+ if (config.cellColors) {
+ var css = step.css || gantt.templates.scaleCell_class;
+ if (css) {
+ var scaleCss = css(date);
+ if (scaleCss) {
+ scaleCell.styles = gantt.ext.export_api._getStyles(scaleCss);
+ }
+ }
+ }
+ row.push(scaleCell);
+ start = end;
+ }
+ }
+ return { width: max, height: scales.length, data: scales };
+ },
+ _serializeColumns: function (config) {
+ gantt.exportMode = true;
+ var columns = [];
+ var cols = gantt.config.columns;
+ var ccount = 0;
+ for (var i = 0; i < cols.length; i++) {
+ if (cols[i].name === "add" || cols[i].name === "buttons") {
+ continue;
+ }
+ columns[ccount] = {
+ id: ((cols[i].template) ? ("_" + i) : cols[i].name),
+ header: cols[i].label || gantt.locale.labels["column_" + cols[i].name],
+ width: (cols[i].width ? Math.floor(cols[i].width / 4) : "")
+ };
+ if (cols[i].name === "duration") {
+ columns[ccount].type = "number";
+ }
+ if (cols[i].name === "start_date" || cols[i].name === "end_date") {
+ columns[ccount].type = "date";
+ if (config && config.rawDates) {
+ columns[ccount].id = cols[i].name;
+ }
+ }
+ ccount++;
+ }
+ gantt.exportMode = false;
+ return columns;
+ },
+ _exportSerialize: function () {
+ gantt.exportMode = true;
+ var xmlFormat = gantt.templates.xml_format;
+ var formatDate = gantt.templates.format_date;
+ // use configuration date format for serialization so date could be parsed on the export
+ // required when custom format date function is defined
+ gantt.templates.xml_format =
+ gantt.templates.format_date =
+ gantt.date.date_to_str(gantt.config.date_format || gantt.config.xml_date);
+ var data = gantt.serialize();
+ gantt.templates.xml_format = xmlFormat;
+ gantt.templates.format_date = formatDate;
+ gantt.exportMode = false;
+ return data;
+ },
+ _setLevel: function (data) {
+ for (var i = 0; i < data.length; i++) {
+ // tslint:disable-next-line triple-equals
+ if (data[i].parent == 0) {
+ data[i]._lvl = 1;
+ }
+ for (var j = i + 1; j < data.length; j++) {
+ // tslint:disable-next-line triple-equals
+ if (data[i].id == data[j].parent) {
+ data[j]._lvl = data[i]._lvl + 1;
+ }
+ }
+ }
+ },
+ _clearLevel: function (data) {
+ for (var i = 0; i < data.length; i++) {
+ delete data[i]._lvl;
+ }
+ },
+ _clearRecLinks: function (data) {
+ gantt.ext.export_api._setLevel(data.data);
+ var tasks = {};
+ for (var i = 0; i < data.data.length; i++) {
+ tasks[data.data[i].id] = data.data[i];
+ }
+ var links = {};
+ for (var i = 0; i < data.links.length; i++) {
+ var link = data.links[i];
+ if (gantt.isTaskExists(link.source) && gantt.isTaskExists(link.target) &&
+ tasks[link.source] && tasks[link.target]) {
+ links[link.id] = link;
+ }
+ }
+ for (var j in links) {
+ gantt.ext.export_api._makeLinksSameLevel(links[j], tasks);
+ }
+ var skippedLinks = {};
+ for (var j in tasks) {
+ gantt.ext.export_api._clearCircDependencies(tasks[j], links, tasks, {}, skippedLinks, null);
+ }
+ if (Object.keys(links)) {
+ gantt.ext.export_api._clearLinksSameLevel(links, tasks);
+ }
+ for (var i = 0; i < data.links.length; i++) {
+ if (!links[data.links[i].id]) {
+ data.links.splice(i, 1);
+ i--;
+ }
+ }
+ gantt.ext.export_api._clearLevel(data.data);
+ },
+ _clearCircDependencies: function (task, links, tasks, usedTasks, skippedLinks, prevLink) {
+ var sources = task.$_source;
+ if (!sources) {
+ return;
+ }
+ if (usedTasks[task.id]) {
+ gantt.ext.export_api._onCircDependencyFind(prevLink, links, usedTasks, skippedLinks);
+ }
+ usedTasks[task.id] = true;
+ var targets = {};
+ for (var i = 0; i < sources.length; i++) {
+ if (skippedLinks[sources[i]]) {
+ continue;
+ }
+ var curLink = links[sources[i]];
+ var targetTask = tasks[curLink._target];
+ if (targets[targetTask.id]) { // two link from one task to another
+ gantt.ext.export_api._onCircDependencyFind(curLink, links, usedTasks, skippedLinks);
+ }
+ targets[targetTask.id] = true;
+ gantt.ext.export_api._clearCircDependencies(targetTask, links, tasks, usedTasks, skippedLinks, curLink);
+ }
+ usedTasks[task.id] = false;
+ },
+ _onCircDependencyFind: function (link, links, usedTasks, skippedLinks) {
+ if (link) {
+ if (gantt.callEvent("onExportCircularDependency", [link.id, link])) {
+ delete links[link.id];
+ }
+ delete usedTasks[link._source];
+ delete usedTasks[link._target];
+ skippedLinks[link.id] = true;
+ }
+ },
+ _makeLinksSameLevel: function (link, tasks) {
+ var task;
+ var targetLvl;
+ var linkT = {
+ target: tasks[link.target],
+ source: tasks[link.source]
+ };
+ // tslint:disable-next-line triple-equals
+ if (linkT.target._lvl != linkT.source._lvl) {
+ if (linkT.target._lvl < linkT.source._lvl) {
+ task = "source";
+ targetLvl = linkT.target._lvl;
+ }
+ else {
+ task = "target";
+ targetLvl = linkT.source._lvl;
+ }
+ do {
+ var parent_1 = tasks[linkT[task].parent];
+ if (!parent_1) {
+ break;
+ }
+ linkT[task] = parent_1;
+ } while (linkT[task]._lvl < targetLvl);
+ var sourceParent = tasks[linkT.source.parent];
+ var targetParent = tasks[linkT.target.parent];
+ // tslint:disable-next-line triple-equals
+ while (sourceParent && targetParent && sourceParent.id != targetParent.id) {
+ linkT.source = sourceParent;
+ linkT.target = targetParent;
+ sourceParent = tasks[linkT.source.parent];
+ targetParent = tasks[linkT.target.parent];
+ }
+ }
+ link._target = linkT.target.id;
+ link._source = linkT.source.id;
+ if (!linkT.target.$_target) {
+ linkT.target.$_target = [];
+ }
+ linkT.target.$_target.push(link.id);
+ if (!linkT.source.$_source) {
+ linkT.source.$_source = [];
+ }
+ linkT.source.$_source.push(link.id);
+ },
+ _clearLinksSameLevel: function (links, tasks) {
+ for (var link in links) {
+ delete links[link]._target;
+ delete links[link]._source;
+ }
+ for (var task in tasks) {
+ delete tasks[task].$_source;
+ delete tasks[task].$_target;
+ }
+ },
+ _customProjectProperties: function (data, config) {
+ if (config && config.project) {
+ for (var i in config.project) {
+ if (!gantt.config.$custom_data) {
+ gantt.config.$custom_data = {};
+ }
+ gantt.config.$custom_data[i] = typeof config.project[i] === "function" ? config.project[i](gantt.config) : config.project[i];
+ }
+ delete config.project;
+ }
+ },
+ _customTaskProperties: function (data, config) {
+ if (config && config.tasks) {
+ data.data.forEach(function (el) {
+ for (var i in config.tasks) {
+ if (!el.$custom_data) {
+ el.$custom_data = {};
+ }
+ el.$custom_data[i] = typeof config.tasks[i] === "function" ? config.tasks[i](el, gantt.config) : config.tasks[i];
+ }
+ });
+ delete config.tasks;
+ }
+ },
+ _exportConfig: function (data, config) {
+ var projectName = config.name || "gantt.xml";
+ delete config.name;
+ gantt.config.custom = config;
+ var time = gantt.ext.export_api._getWorktimeSettings();
+ var projectDates = gantt.getSubtaskDates();
+ if (projectDates.start_date && projectDates.end_date) {
+ var formatDate = gantt.templates.format_date || gantt.templates.xml_format;
+ gantt.config.start_end = {
+ start_date: formatDate(projectDates.start_date),
+ end_date: formatDate(projectDates.end_date)
+ };
+ }
+ var manual = config.auto_scheduling === undefined ? false : !!config.auto_scheduling;
+ var res = {
+ callback: config.callback || null,
+ config: gantt.config,
+ data: data,
+ manual: manual,
+ name: projectName,
+ worktime: time
+ };
+ for (var i in config) {
+ res[i] = config[i];
+ }
+ return res;
+ },
+ _sendImportAjaxMSP: function (config) {
+ var url = config.server || gantt.ext.export_api._apiUrl;
+ var store = config.store || 0;
+ var formData = config.data;
+ var callback = config.callback;
+ var settings = {
+ durationUnit: config.durationUnit || undefined,
+ projectProperties: config.projectProperties || undefined,
+ taskProperties: config.taskProperties || undefined,
+ };
+ formData.append("type", config.type || "msproject-parse");
+ formData.append("data", JSON.stringify(settings));
+ if (store) {
+ formData.append("store", store);
+ }
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function (e) {
+ if (xhr.readyState === 4 && xhr.status === 0) { // network error
+ if (callback) {
+ callback(null);
+ }
+ }
+ };
+ xhr.onload = function () {
+ var fail = xhr.status > 400;
+ var info = null;
+ if (!fail) {
+ try {
+ info = JSON.parse(xhr.responseText);
+ }
+ catch (e) { }
+ }
+ if (callback) {
+ callback(info);
+ }
+ };
+ xhr.open("POST", url, true);
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ xhr.send(formData);
+ }
+ };
+ gantt.exportToPDF = gantt.ext.export_api.exportToPDF;
+ gantt.exportToPNG = gantt.ext.export_api.exportToPNG;
+ gantt.exportToICal = gantt.ext.export_api.exportToICal;
+ gantt.exportToExcel = gantt.ext.export_api.exportToExcel;
+ gantt.exportToJSON = gantt.ext.export_api.exportToJSON;
+ gantt.importFromExcel = gantt.ext.export_api.importFromExcel;
+ gantt.importFromMSProject = gantt.ext.export_api.importFromMSProject;
+ gantt.exportToMSProject = gantt.ext.export_api.exportToMSProject;
+ gantt.importFromPrimaveraP6 = gantt.ext.export_api.importFromPrimaveraP6;
+ gantt.exportToPrimaveraP6 = gantt.ext.export_api.exportToPrimaveraP6;
+}
+exports.default = default_1;
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./sources/ext/extension_manager.ts":
+/*!******************************************!*\
+ !*** ./sources/ext/extension_manager.ts ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var ExtensionsManager = /** @class */ (function () {
+ function ExtensionsManager(config) {
+ var _this = this;
+ this.addExtension = function (name, ext) {
+ _this._extensions[name] = ext;
+ };
+ this.getExtension = function (name) {
+ return _this._extensions[name];
+ };
+ this._extensions = {};
+ for (var i in config) {
+ this._extensions[i] = config[i];
+ }
+ }
+ return ExtensionsManager;
+}());
+exports.default = ExtensionsManager;
+
+
+/***/ }),
+
+/***/ "./sources/ext/extensions_gpl.ts":
+/*!***************************************!*\
+ !*** ./sources/ext/extensions_gpl.ts ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var click_drag_1 = __webpack_require__(/*! ./click_drag */ "./sources/ext/click_drag/index.ts");
+var drag_timeline_1 = __webpack_require__(/*! ./drag_timeline */ "./sources/ext/drag_timeline/index.ts");
+var export_api_1 = __webpack_require__(/*! ./export_api */ "./sources/ext/export_api/index.ts");
+var fullscreen_1 = __webpack_require__(/*! ./fullscreen */ "./sources/ext/fullscreen/index.ts");
+var keyboard_navigation = __webpack_require__(/*! ./keyboard_navigation */ "./sources/ext/keyboard_navigation.js");
+var marker = __webpack_require__(/*! ./marker */ "./sources/ext/marker.js");
+var multiselect = __webpack_require__(/*! ./multiselect */ "./sources/ext/multiselect.js");
+var quick_info_1 = __webpack_require__(/*! ./quick_info */ "./sources/ext/quick_info/index.ts");
+var tooltip_1 = __webpack_require__(/*! ./tooltip */ "./sources/ext/tooltip/index.ts");
+var undo_1 = __webpack_require__(/*! ./undo */ "./sources/ext/undo/index.ts");
+exports.default = {
+ click_drag: click_drag_1.default,
+ drag_timeline: drag_timeline_1.default,
+ fullscreen: fullscreen_1.default,
+ keyboard_navigation: keyboard_navigation,
+ quick_info: quick_info_1.default,
+ tooltip: tooltip_1.default,
+ undo: undo_1.default,
+ marker: marker,
+ multiselect: multiselect,
+ export_api: export_api_1.default,
+};
+
+
+/***/ }),
+
+/***/ "./sources/ext/fullscreen/index.ts":
+/*!*****************************************!*\
+ !*** ./sources/ext/fullscreen/index.ts ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function default_1(gantt) {
+ function isExpanded() {
+ var element = (document.fullscreenElement ||
+ document.mozFullScreenElement ||
+ document.webkitFullscreenElement ||
+ document.msFullscreenElement);
+ return !!(element && element === document.body);
+ }
+ function isFullscreenAvailable() {
+ try {
+ return document.fullscreenEnabled ||
+ document.webkitFullscreenEnabled ||
+ document.mozFullScreenEnabled ||
+ document.msFullscreenEnabled;
+ }
+ catch (e) {
+ console.error("Fullscreen is not available:", e); // tslint:disable-line:no-console
+ }
+ }
+ var state = gantt.$services.getService("state");
+ state.registerProvider("fullscreen", function () {
+ if (isFullscreenAvailable()) {
+ return { fullscreen: isExpanded() };
+ }
+ else {
+ return undefined;
+ }
+ });
+ var backupBodyPadding = {
+ overflow: null,
+ padding: null,
+ paddingTop: null,
+ paddingRight: null,
+ paddingBottom: null,
+ paddingLeft: null
+ };
+ var backupElementSizes = {
+ width: null,
+ height: null,
+ top: null,
+ left: null,
+ position: null,
+ zIndex: null,
+ modified: false
+ };
+ var backupPositioning = null;
+ function resetParentPositioning(root) {
+ var parent = root.parentNode;
+ var positions = [];
+ while (parent && parent.style) {
+ positions.push({
+ element: parent,
+ originalPositioning: parent.style.position
+ });
+ parent.style.position = "static";
+ parent = parent.parentNode;
+ }
+ return positions;
+ }
+ function restoreParentPositioning(positions) {
+ positions.forEach(function (record) {
+ record.element.style.position = record.originalPositioning;
+ });
+ }
+ // expand gantt root element to fullscreen automatically
+ function setFullScreenSizes() {
+ var root = gantt.ext.fullscreen.getFullscreenElement();
+ var body = document.body;
+ updateSizes(root.style, backupElementSizes);
+ backupBodyPadding = {
+ overflow: body.style.overflow,
+ padding: body.style.padding ? body.style.padding : null,
+ paddingTop: body.style.paddingTop ? body.style.paddingTop : null,
+ paddingRight: body.style.paddingRight ? body.style.paddingRight : null,
+ paddingBottom: body.style.paddingBottom ? body.style.paddingBottom : null,
+ paddingLeft: body.style.paddingLeft ? body.style.paddingLeft : null
+ };
+ if (body.style.padding) {
+ body.style.padding = "0";
+ }
+ if (body.style.paddingTop) {
+ body.style.paddingTop = "0";
+ }
+ if (body.style.paddingRight) {
+ body.style.paddingRight = "0";
+ }
+ if (body.style.paddingBottom) {
+ body.style.paddingBottom = "0";
+ }
+ if (body.style.paddingLeft) {
+ body.style.paddingLeft = "0";
+ }
+ body.style.overflow = "hidden";
+ root.style.width = "100vw";
+ root.style.height = "100vh";
+ root.style.top = "0px";
+ root.style.left = "0px";
+ root.style.position = "absolute";
+ root.style.zIndex = 1;
+ backupElementSizes.modified = true;
+ backupPositioning = resetParentPositioning(root);
+ }
+ function restoreSizes() {
+ var root = gantt.ext.fullscreen.getFullscreenElement();
+ var body = document.body;
+ if (backupElementSizes.modified) {
+ if (backupBodyPadding.padding) {
+ body.style.padding = backupBodyPadding.padding;
+ }
+ if (backupBodyPadding.paddingTop) {
+ body.style.paddingTop = backupBodyPadding.paddingTop;
+ }
+ if (backupBodyPadding.paddingRight) {
+ body.style.paddingRight = backupBodyPadding.paddingRight;
+ }
+ if (backupBodyPadding.paddingBottom) {
+ body.style.paddingBottom = backupBodyPadding.paddingBottom;
+ }
+ if (backupBodyPadding.paddingLeft) {
+ body.style.paddingLeft = backupBodyPadding.paddingLeft;
+ }
+ body.style.overflow = backupBodyPadding.overflow;
+ backupBodyPadding = {
+ overflow: null,
+ padding: null,
+ paddingTop: null,
+ paddingRight: null,
+ paddingBottom: null,
+ paddingLeft: null
+ };
+ updateSizes(backupElementSizes, root.style);
+ backupElementSizes.modified = false;
+ }
+ restoreParentPositioning(backupPositioning);
+ backupPositioning = null;
+ }
+ function updateSizes(source, target) {
+ target.width = source.width;
+ target.height = source.height;
+ target.top = source.top;
+ target.left = source.left;
+ target.position = source.position;
+ target.zIndex = source.zIndex;
+ }
+ function addDOMEvents() {
+ gantt.event(document, "webkitfullscreenchange", onFullScreenChange);
+ gantt.event(document, "mozfullscreenchange", onFullScreenChange);
+ gantt.event(document, "MSFullscreenChange", onFullScreenChange);
+ // For IE on Win 10
+ gantt.event(document, "fullscreenChange", onFullScreenChange);
+ gantt.event(document, "fullscreenchange", onFullScreenChange);
+ }
+ var expandGantt = false;
+ function onFullScreenChange() {
+ if (!gantt.$container) {
+ // do nothing if gantt is not yet initialized
+ return;
+ }
+ var event;
+ var isBodyExpanded = isExpanded();
+ if (isBodyExpanded) {
+ if (expandGantt) {
+ event = "onExpand";
+ setFullScreenSizes();
+ }
+ }
+ else if (expandGantt) {
+ expandGantt = false;
+ event = "onCollapse";
+ restoreSizes();
+ }
+ setTimeout(function () {
+ gantt.render();
+ });
+ setTimeout(function () {
+ gantt.callEvent(event, [gantt.ext.fullscreen.getFullscreenElement()]);
+ });
+ }
+ function cantFullscreen() {
+ if (!gantt.$container) { // check is gantt initialized or not
+ return true;
+ }
+ if (!gantt.ext.fullscreen.getFullscreenElement()) {
+ return true;
+ }
+ if (!isFullscreenAvailable()) {
+ // tslint:disable-next-line: no-console
+ var method = console.warning || console.log;
+ method("The `fullscreen` feature not being allowed, or full-screen mode not being supported");
+ return true;
+ }
+ return false;
+ }
+ gantt.ext.fullscreen = {
+ expand: function () {
+ if (cantFullscreen()) {
+ return;
+ }
+ if (isExpanded()) {
+ return;
+ }
+ if (!gantt.callEvent("onBeforeExpand", [this.getFullscreenElement()])) {
+ return;
+ }
+ expandGantt = true;
+ // we switch body to fullscreen and then expand fullscreen element to viewport
+ // we do it to correct display common elements: lightboxes, tooltip etc.
+ var element = document.body;
+ var requestArguments = element.webkitRequestFullscreen ?
+ [Element.ALLOW_KEYBOARD_INPUT] : [];
+ var requestFullscreen = element.msRequestFullscreen ||
+ element.mozRequestFullScreen ||
+ element.webkitRequestFullscreen ||
+ element.requestFullscreen;
+ if (requestFullscreen) {
+ requestFullscreen.apply(element, requestArguments);
+ }
+ },
+ collapse: function () {
+ if (cantFullscreen()) {
+ return;
+ }
+ if (!isExpanded()) {
+ return;
+ }
+ if (!gantt.callEvent("onBeforeCollapse", [this.getFullscreenElement()])) {
+ return;
+ }
+ var requestExitFullscreen = document.msExitFullscreen ||
+ document.mozCancelFullScreen ||
+ document.webkitExitFullscreen ||
+ document.exitFullscreen;
+ if (requestExitFullscreen) {
+ requestExitFullscreen.apply(document);
+ }
+ },
+ toggle: function () {
+ if (cantFullscreen()) {
+ return;
+ }
+ if (!isExpanded()) {
+ this.expand();
+ }
+ else {
+ this.collapse();
+ }
+ },
+ getFullscreenElement: function () {
+ return gantt.$root;
+ },
+ };
+ gantt.expand = function () {
+ gantt.ext.fullscreen.expand();
+ };
+ gantt.collapse = function () {
+ gantt.ext.fullscreen.collapse();
+ };
+ gantt.attachEvent("onGanttReady", addDOMEvents);
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation.js":
+/*!********************************************!*\
+ !*** ./sources/ext/keyboard_navigation.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var eventable = __webpack_require__(/*! ../utils/eventable */ "./sources/utils/eventable.js");
+
+ function setupKeyNav(gantt) {
+ gantt.config.keyboard_navigation = true;
+ gantt.config.keyboard_navigation_cells = false;
+ gantt.$keyboardNavigation = {};
+
+ gantt._compose = function () {
+ var parts = Array.prototype.slice.call(arguments, 0);
+ var res = {};
+
+ for (var i = 0; i < parts.length; i++) {
+ var obj = parts[i];
+
+ if (typeof obj == "function") {
+ obj = new obj();
+ }
+
+ for (var p in obj) {
+ res[p] = obj[p];
+ }
+ }
+
+ return res;
+ };
+
+ __webpack_require__(/*! ./keyboard_navigation/common/keyboard_shortcuts */ "./sources/ext/keyboard_navigation/common/keyboard_shortcuts.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/common/eventhandler */ "./sources/ext/keyboard_navigation/common/eventhandler.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/common/trap_modal_focus */ "./sources/ext/keyboard_navigation/common/trap_modal_focus.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/elements/gantt_node */ "./sources/ext/keyboard_navigation/elements/gantt_node.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/elements/nav_node */ "./sources/ext/keyboard_navigation/elements/nav_node.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/elements/header_cell */ "./sources/ext/keyboard_navigation/elements/header_cell.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/elements/task_row */ "./sources/ext/keyboard_navigation/elements/task_row.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/elements/task_cell */ "./sources/ext/keyboard_navigation/elements/task_cell.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/modals */ "./sources/ext/keyboard_navigation/modals.js")(gantt);
+
+ __webpack_require__(/*! ./keyboard_navigation/core */ "./sources/ext/keyboard_navigation/core.js")(gantt);
+
+ var domHelpers = __webpack_require__(/*! ../core/ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+ (function () {
+ var dispatcher = gantt.$keyboardNavigation.dispatcher;
+
+ dispatcher.isTaskFocused = function (id) {
+ var node = dispatcher.activeNode;
+
+ if (node instanceof gantt.$keyboardNavigation.TaskRow || node instanceof gantt.$keyboardNavigation.TaskCell) {
+ if (node.taskId == id) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ var keyDownHandler = function keyDownHandler(e) {
+ if (!gantt.config.keyboard_navigation) return; // GS-734 & GS-1078: we don't need keyboard navigation inside inline editors
+
+ if (!gantt.config.keyboard_navigation_cells && isInlineEditorCell(e)) return;
+
+ if (isNoKeyboardNavigationElement(e) || isLightboxElement(e)) {
+ return;
+ }
+
+ return dispatcher.keyDownHandler(e);
+ };
+
+ var focusHandler = function focusHandler(e) {
+ if (dispatcher.$preventDefault) {
+ e.preventDefault();
+ gantt.$container.blur();
+ return false; // do nothing if key-nav focus is already planned
+ } else if (!dispatcher.awaitsFocus()) {
+ // otherwise - re-focus key-nav element on gantt focus
+ dispatcher.focusGlobalNode();
+ }
+ };
+
+ var reFocusActiveNode = function reFocusActiveNode() {
+ if (!dispatcher.isEnabled()) return;
+ var outsideGantt = !domHelpers.isChildOf(document.activeElement, gantt.$container) && document.activeElement.localName != "body";
+ var activeNode = dispatcher.getActiveNode();
+ if (!activeNode || outsideGantt) return;
+ var domElement = activeNode.getNode();
+ var top, left;
+
+ if (domElement && domElement.parentNode) {
+ top = domElement.parentNode.scrollTop;
+ left = domElement.parentNode.scrollLeft;
+ }
+
+ activeNode.focus(true);
+
+ if (domElement && domElement.parentNode) {
+ domElement.parentNode.scrollTop = top;
+ domElement.parentNode.scrollLeft = left;
+ }
+ };
+
+ gantt.attachEvent("onDataRender", function () {
+ if (!gantt.config.keyboard_navigation) return;
+ reFocusActiveNode();
+ });
+ gantt.attachEvent("onGanttRender", function () {
+ gantt.eventRemove(gantt.$root, "keydown", keyDownHandler);
+ gantt.eventRemove(gantt.$container, "focus", focusHandler);
+ gantt.eventRemove(gantt.$container, "mousedown", mousedownHandler);
+
+ if (gantt.config.keyboard_navigation) {
+ gantt.event(gantt.$root, "keydown", keyDownHandler);
+ gantt.event(gantt.$container, "focus", focusHandler);
+ gantt.event(gantt.$container, "mousedown", mousedownHandler);
+ gantt.$container.setAttribute("tabindex", "0");
+ } else {
+ gantt.$container.removeAttribute("tabindex");
+ }
+ });
+
+ function getTaskNodeConstructor() {
+ if (gantt.config.keyboard_navigation_cells) {
+ return gantt.$keyboardNavigation.TaskCell;
+ } else {
+ return gantt.$keyboardNavigation.TaskRow;
+ }
+ }
+
+ function isInlineEditorCell(e) {
+ return !!domHelpers.closest(e.target, ".gantt_grid_editor_placeholder");
+ } // GS-1445. Cancel keyboard navigation within custom elements
+
+
+ function isNoKeyboardNavigationElement(e) {
+ return !!domHelpers.closest(e.target, ".no_keyboard_navigation");
+ }
+
+ function isLightboxElement(e) {
+ return !!domHelpers.closest(e.target, ".gantt_cal_light");
+ }
+
+ function mousedownHandler(e) {
+ if (!gantt.config.keyboard_navigation) return true; // GS-734 & GS-1078: we don't need keyboard navigation inside inline editors
+
+ if (!gantt.config.keyboard_navigation_cells && isInlineEditorCell(e)) return true;
+
+ if (isNoKeyboardNavigationElement(e)) {
+ return;
+ }
+
+ var focusNode;
+ var locateTask = dispatcher.fromDomElement(e);
+
+ if (locateTask) {
+ //var node = getTaskNodeConstructor();
+ if (dispatcher.activeNode instanceof gantt.$keyboardNavigation.TaskCell && domHelpers.isChildOf(e.target, gantt.$task)) {
+ locateTask = new gantt.$keyboardNavigation.TaskCell(locateTask.taskId, dispatcher.activeNode.columnIndex);
+ }
+
+ focusNode = locateTask;
+ }
+
+ if (focusNode) {
+ if (!dispatcher.isEnabled()) {
+ dispatcher.activeNode = focusNode;
+ } else {
+ dispatcher.delay(function () {
+ dispatcher.setActiveNode(focusNode);
+ });
+ }
+ } else {
+ // empty click should drop focus from gantt, insert of reselecting default node
+ dispatcher.$preventDefault = true;
+ setTimeout(function () {
+ dispatcher.$preventDefault = false;
+ }, 300);
+ }
+ }
+
+ var onReady = gantt.attachEvent("onGanttReady", function () {
+ // restore focus on repainted tasks
+ gantt.detachEvent(onReady);
+ gantt.$data.tasksStore.attachEvent("onStoreUpdated", function (id) {
+ if (gantt.config.keyboard_navigation && dispatcher.isEnabled()) {
+ var currentNode = dispatcher.getActiveNode();
+
+ if (currentNode && currentNode.taskId == id) {
+ reFocusActiveNode();
+ }
+ }
+ });
+
+ if (gantt._smart_render) {
+ var updateRender = gantt._smart_render._redrawTasks;
+
+ gantt._smart_render._redrawTasks = function (renderers, items) {
+ if (gantt.config.keyboard_navigation && dispatcher.isEnabled()) {
+ var currentNode = dispatcher.getActiveNode();
+
+ if (currentNode && currentNode.taskId !== undefined) {
+ var focusedItemVisible = false;
+
+ for (var i = 0; i < items.length; i++) {
+ if (items[i].id == currentNode.taskId && items[i].start_date) {
+ focusedItemVisible = true;
+ break;
+ }
+ }
+
+ if (!focusedItemVisible) {
+ items.push(gantt.getTask(currentNode.taskId));
+ }
+ }
+ }
+
+ var res = updateRender.apply(this, arguments);
+ return res;
+ };
+ }
+ });
+ var createdTaskId = null;
+ var keepFocusOnNewTask = false;
+ gantt.attachEvent("onTaskCreated", function (task) {
+ createdTaskId = task.id;
+ return true;
+ });
+ gantt.attachEvent("onAfterTaskAdd", function (id, item) {
+ if (!gantt.config.keyboard_navigation) return true;
+
+ if (dispatcher.isEnabled()) {
+ // GS-1394. After adding a new task, the focus shouldn't change to the placeholder task
+ if (id == createdTaskId) {
+ keepFocusOnNewTask = true;
+ setTimeout(function () {
+ keepFocusOnNewTask = false;
+ createdTaskId = null;
+ });
+ }
+
+ if (keepFocusOnNewTask && item.type == gantt.config.types.placeholder) {
+ return;
+ }
+
+ var columnIndex = 0;
+ var node = dispatcher.activeNode;
+
+ if (node instanceof gantt.$keyboardNavigation.TaskCell) {
+ columnIndex = node.columnIndex;
+ }
+
+ var nodeConstructor = getTaskNodeConstructor();
+
+ if (item.type == gantt.config.types.placeholder && gantt.config.placeholder_task.focusOnCreate === false) {// do not focus on the placeholder task
+ } else {
+ dispatcher.setActiveNode(new nodeConstructor(id, columnIndex));
+ }
+ }
+ });
+ gantt.attachEvent("onTaskIdChange", function (oldId, newId) {
+ if (!gantt.config.keyboard_navigation) return true;
+ var node = dispatcher.activeNode;
+
+ if (dispatcher.isTaskFocused(oldId)) {
+ node.taskId = newId;
+ }
+
+ return true;
+ });
+ var interval = setInterval(function () {
+ if (!gantt.config.keyboard_navigation) return;
+
+ if (!dispatcher.isEnabled()) {
+ dispatcher.enable();
+ }
+
+ return;
+ }, 500);
+ gantt.attachEvent("onDestroy", function () {
+ clearInterval(interval);
+ });
+
+ function getScopeName(obj) {
+ if (obj instanceof gantt.$keyboardNavigation.GanttNode) {
+ return "gantt";
+ } else if (obj instanceof gantt.$keyboardNavigation.HeaderCell) {
+ return "headerCell";
+ } else if (obj instanceof gantt.$keyboardNavigation.TaskRow) {
+ return "taskRow";
+ } else if (obj instanceof gantt.$keyboardNavigation.TaskCell) {
+ return "taskCell";
+ }
+
+ return null;
+ }
+
+ function getScope(mode) {
+ var scopes = {
+ "gantt": gantt.$keyboardNavigation.GanttNode,
+ "headerCell": gantt.$keyboardNavigation.HeaderCell,
+ "taskRow": gantt.$keyboardNavigation.TaskRow,
+ "taskCell": gantt.$keyboardNavigation.TaskCell
+ };
+ return scopes[mode] || scopes.gantt;
+ }
+
+ function findVisibleColumnIndex(columnName) {
+ var columns = gantt.getGridColumns();
+
+ for (var i = 0; i < columns.length; i++) {
+ if (columns[i].name == columnName) {
+ return i;
+ }
+ }
+
+ return 0;
+ }
+
+ var keyNavFacade = {};
+ eventable(keyNavFacade);
+ gantt.mixin(keyNavFacade, {
+ addShortcut: function addShortcut(shortcut, handler, scope) {
+ var scopeObject = getScope(scope);
+
+ if (scopeObject) {
+ scopeObject.prototype.bind(shortcut, handler);
+ }
+ },
+ getShortcutHandler: function getShortcutHandler(shortcut, scope) {
+ var commands = gantt.$keyboardNavigation.shortcuts.parse(shortcut);
+
+ if (commands.length) {
+ return keyNavFacade.getCommandHandler(commands[0], scope);
+ }
+ },
+ getCommandHandler: function getCommandHandler(command, scope) {
+ var scopeObject = getScope(scope);
+
+ if (scopeObject) {
+ if (command) {
+ return scopeObject.prototype.findHandler(command);
+ }
+ }
+ },
+ removeShortcut: function removeShortcut(shortcut, scope) {
+ var scopeObject = getScope(scope);
+
+ if (scopeObject) {
+ scopeObject.prototype.unbind(shortcut);
+ }
+ },
+ focus: function focus(config) {
+ var type = config ? config.type : null;
+ var constructor = getScope(type);
+ var node;
+
+ switch (type) {
+ case "taskCell":
+ node = new constructor(config.id, findVisibleColumnIndex(config.column));
+ break;
+
+ case "taskRow":
+ node = new constructor(config.id);
+ break;
+
+ case "headerCell":
+ node = new constructor(findVisibleColumnIndex(config.column));
+ break;
+
+ default:
+ break;
+ }
+
+ dispatcher.delay(function () {
+ if (node) {
+ dispatcher.setActiveNode(node);
+ } else {
+ dispatcher.enable();
+
+ if (!dispatcher.getActiveNode()) {
+ dispatcher.setDefaultNode();
+ } else {
+ if (!dispatcher.awaitsFocus()) {
+ dispatcher.enable();
+ }
+ }
+ }
+ });
+ },
+ getActiveNode: function getActiveNode() {
+ if (dispatcher.isEnabled()) {
+ var node = dispatcher.getActiveNode();
+ var scope = getScopeName(node);
+ var columns = gantt.getGridColumns();
+
+ switch (scope) {
+ case "taskCell":
+ return {
+ type: "taskCell",
+ id: node.taskId,
+ column: columns[node.columnIndex].name
+ };
+
+ case "taskRow":
+ return {
+ type: "taskRow",
+ id: node.taskId
+ };
+
+ case "headerCell":
+ return {
+ type: "headerCell",
+ column: columns[node.index].name
+ };
+ }
+ }
+
+ return null;
+ }
+ });
+ gantt.$keyboardNavigation.facade = keyNavFacade;
+ gantt.ext.keyboardNavigation = keyNavFacade;
+
+ gantt.focus = function () {
+ keyNavFacade.focus();
+ };
+
+ gantt.addShortcut = keyNavFacade.addShortcut;
+ gantt.getShortcutHandler = keyNavFacade.getShortcutHandler;
+ gantt.removeShortcut = keyNavFacade.removeShortcut;
+ })();
+ }
+
+ setupKeyNav(gantt);
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/common/eventhandler.js":
+/*!****************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/common/eventhandler.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.$keyboardNavigation.EventHandler = {
+ _handlers: null,
+ findHandler: function findHandler(command) {
+ if (!this._handlers) this._handlers = {};
+ var shortcuts = gantt.$keyboardNavigation.shortcuts;
+ var hash = shortcuts.getHash(command);
+ return this._handlers[hash];
+ },
+ doAction: function doAction(command, e) {
+ var handler = this.findHandler(command);
+
+ if (handler) {
+ var eventFacade = gantt.$keyboardNavigation.facade;
+
+ if (eventFacade.callEvent("onBeforeAction", [command, e]) === false) {
+ return;
+ }
+
+ handler.call(this, e);
+ if (e.preventDefault) e.preventDefault();else e.returnValue = false;
+ }
+ },
+ bind: function bind(shortcut, handler) {
+ if (!this._handlers) this._handlers = {};
+ var shortcuts = gantt.$keyboardNavigation.shortcuts;
+ var commands = shortcuts.parse(shortcut);
+
+ for (var i = 0; i < commands.length; i++) {
+ this._handlers[shortcuts.getHash(commands[i])] = handler;
+ }
+ },
+ unbind: function unbind(shortcut) {
+ var shortcuts = gantt.$keyboardNavigation.shortcuts;
+ var commands = shortcuts.parse(shortcut);
+
+ for (var i = 0; i < commands.length; i++) {
+ if (this._handlers[shortcuts.getHash(commands[i])]) {
+ delete this._handlers[shortcuts.getHash(commands[i])];
+ }
+ }
+ },
+ bindAll: function bindAll(map) {
+ for (var i in map) {
+ this.bind(i, map[i]);
+ }
+ },
+ initKeys: function initKeys() {
+ if (!this._handlers) this._handlers = {};
+
+ if (this.keys) {
+ this.bindAll(this.keys);
+ }
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/common/keyboard_shortcuts.js":
+/*!**********************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/common/keyboard_shortcuts.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.$keyboardNavigation.shortcuts = {
+ createCommand: function createCommand() {
+ return {
+ modifiers: {
+ "shift": false,
+ "alt": false,
+ "ctrl": false,
+ "meta": false
+ },
+ keyCode: null
+ };
+ },
+ parse: function parse(shortcut) {
+ var commands = [];
+ var expr = this.getExpressions(this.trim(shortcut));
+
+ for (var i = 0; i < expr.length; i++) {
+ var words = this.getWords(expr[i]);
+ var command = this.createCommand();
+
+ for (var j = 0; j < words.length; j++) {
+ if (this.commandKeys[words[j]]) {
+ command.modifiers[words[j]] = true;
+ } else if (this.specialKeys[words[j]]) {
+ command.keyCode = this.specialKeys[words[j]];
+ } else {
+ command.keyCode = words[j].charCodeAt(0);
+ }
+ }
+
+ commands.push(command);
+ }
+
+ return commands;
+ },
+ getCommandFromEvent: function getCommandFromEvent(domEvent) {
+ var command = this.createCommand();
+ command.modifiers.shift = !!domEvent.shiftKey;
+ command.modifiers.alt = !!domEvent.altKey;
+ command.modifiers.ctrl = !!domEvent.ctrlKey;
+ command.modifiers.meta = !!domEvent.metaKey;
+ command.keyCode = domEvent.which || domEvent.keyCode;
+
+ if (command.keyCode >= 96 && command.keyCode <= 105) {
+ // numpad keys 96-105 -> 48-57
+ command.keyCode -= 48; //convert numpad number code to regular number code
+ }
+
+ var printableKey = String.fromCharCode(command.keyCode);
+
+ if (printableKey) {
+ command.keyCode = printableKey.toLowerCase().charCodeAt(0);
+ }
+
+ return command;
+ },
+ getHashFromEvent: function getHashFromEvent(domEvent) {
+ return this.getHash(this.getCommandFromEvent(domEvent));
+ },
+ getHash: function getHash(command) {
+ var parts = [];
+
+ for (var i in command.modifiers) {
+ if (command.modifiers[i]) {
+ parts.push(i);
+ }
+ }
+
+ parts.push(command.keyCode);
+ return parts.join(this.junctionChar);
+ },
+ getExpressions: function getExpressions(shortcut) {
+ return shortcut.split(this.junctionChar);
+ },
+ getWords: function getWords(term) {
+ return term.split(this.combinationChar);
+ },
+ trim: function trim(shortcut) {
+ return shortcut.replace(/\s/g, "");
+ },
+ junctionChar: ",",
+ combinationChar: "+",
+ commandKeys: {
+ "shift": 16,
+ "alt": 18,
+ "ctrl": 17,
+ "meta": true
+ },
+ specialKeys: {
+ "backspace": 8,
+ "tab": 9,
+ "enter": 13,
+ "esc": 27,
+ "space": 32,
+ "up": 38,
+ "down": 40,
+ "left": 37,
+ "right": 39,
+ "home": 36,
+ "end": 35,
+ "pageup": 33,
+ "pagedown": 34,
+ "delete": 46,
+ "insert": 45,
+ "plus": 107,
+ "f1": 112,
+ "f2": 113,
+ "f3": 114,
+ "f4": 115,
+ "f5": 116,
+ "f6": 117,
+ "f7": 118,
+ "f8": 119,
+ "f9": 120,
+ "f10": 121,
+ "f11": 122,
+ "f12": 123
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/common/trap_modal_focus.js":
+/*!********************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/common/trap_modal_focus.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ (function () {
+ var domHelpers = __webpack_require__(/*! ../../../core/ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+ gantt.$keyboardNavigation.getFocusableNodes = domHelpers.getFocusableNodes;
+
+ gantt.$keyboardNavigation.trapFocus = function trapFocus(root, e) {
+ if (e.keyCode != 9) return false;
+ var focusable = gantt.$keyboardNavigation.getFocusableNodes(root);
+ var currentFocus = domHelpers.getActiveElement();
+ var currentIndex = -1;
+
+ for (var i = 0; i < focusable.length; i++) {
+ if (focusable[i] == currentFocus) {
+ currentIndex = i;
+ break;
+ }
+ }
+
+ if (e.shiftKey) {
+ // back tab
+ if (currentIndex <= 0) {
+ // go to the last element if we focused on the first
+ var lastItem = focusable[focusable.length - 1];
+
+ if (lastItem) {
+ lastItem.focus();
+ e.preventDefault();
+ return true;
+ }
+ }
+ } else {
+ // forward tab
+ if (currentIndex >= focusable.length - 1) {
+ // forward tab from last element should go back to the first element
+ var firstItem = focusable[0];
+
+ if (firstItem) {
+ firstItem.focus();
+ e.preventDefault();
+ return true;
+ }
+ }
+ }
+
+ return false;
+ };
+ })();
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/core.js":
+/*!*************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/core.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.$keyboardNavigation.dispatcher = {
+ isActive: false,
+ activeNode: null,
+ globalNode: new gantt.$keyboardNavigation.GanttNode(),
+ enable: function enable() {
+ this.isActive = true;
+ this.setActiveNode(this.getActiveNode());
+ },
+ disable: function disable() {
+ this.isActive = false;
+ },
+ isEnabled: function isEnabled() {
+ return !!this.isActive;
+ },
+ getDefaultNode: function getDefaultNode() {
+ var node;
+
+ if (gantt.config.keyboard_navigation_cells) {
+ node = new gantt.$keyboardNavigation.TaskCell();
+ } else {
+ node = new gantt.$keyboardNavigation.TaskRow();
+ }
+
+ if (!node.isValid()) {
+ node = node.fallback();
+ }
+
+ return node;
+ },
+ setDefaultNode: function setDefaultNode() {
+ this.setActiveNode(this.getDefaultNode());
+ },
+ getActiveNode: function getActiveNode() {
+ var node = this.activeNode;
+
+ if (node && !node.isValid()) {
+ node = node.fallback();
+ }
+
+ return node;
+ },
+ fromDomElement: function fromDomElement(e) {
+ var inputs = [gantt.$keyboardNavigation.TaskRow, gantt.$keyboardNavigation.TaskCell, gantt.$keyboardNavigation.HeaderCell];
+
+ for (var i = 0; i < inputs.length; i++) {
+ if (inputs[i].prototype.fromDomElement) {
+ var node = inputs[i].prototype.fromDomElement(e);
+ if (node) return node;
+ }
+ }
+
+ return null;
+ },
+ focusGlobalNode: function focusGlobalNode() {
+ this.blurNode(this.globalNode);
+ this.focusNode(this.globalNode);
+ },
+ setActiveNode: function setActiveNode(el) {
+ //console.trace()
+ var focusChanged = true;
+
+ if (this.activeNode) {
+ if (this.activeNode.compareTo(el)) {
+ focusChanged = false;
+ }
+ }
+
+ if (this.isEnabled()) {
+ if (focusChanged) this.blurNode(this.activeNode);
+ this.activeNode = el;
+ this.focusNode(this.activeNode, !focusChanged);
+ }
+ },
+ focusNode: function focusNode(el, keptFocus) {
+ if (el && el.focus) {
+ el.focus(keptFocus);
+ }
+ },
+ blurNode: function blurNode(el) {
+ if (el && el.blur) {
+ el.blur();
+ }
+ },
+ keyDownHandler: function keyDownHandler(e) {
+ if (gantt.$keyboardNavigation.isModal()) return;
+ if (!this.isEnabled()) return;
+
+ if (e.defaultPrevented) {
+ return;
+ }
+
+ var ganttNode = this.globalNode;
+ var command = gantt.$keyboardNavigation.shortcuts.getCommandFromEvent(e);
+ var activeElement = this.getActiveNode();
+ var eventFacade = gantt.$keyboardNavigation.facade;
+
+ if (eventFacade.callEvent("onKeyDown", [command, e]) === false) {
+ return;
+ }
+
+ if (!activeElement) {
+ this.setDefaultNode();
+ } else if (activeElement.findHandler(command)) {
+ activeElement.doAction(command, e);
+ } else if (ganttNode.findHandler(command)) {
+ ganttNode.doAction(command, e);
+ }
+ },
+ _timeout: null,
+ awaitsFocus: function awaitsFocus() {
+ return this._timeout !== null;
+ },
+ delay: function delay(callback, _delay) {
+ clearTimeout(this._timeout);
+ this._timeout = setTimeout(gantt.bind(function () {
+ this._timeout = null;
+ callback();
+ }, this), _delay || 1);
+ },
+ clearDelay: function clearDelay() {
+ clearTimeout(this._timeout);
+ }
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/elements/gantt_node.js":
+/*!****************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/elements/gantt_node.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.$keyboardNavigation.GanttNode = function () {};
+
+ gantt.$keyboardNavigation.GanttNode.prototype = gantt._compose(gantt.$keyboardNavigation.EventHandler, {
+ focus: function focus() {
+ gantt.focus();
+ },
+ blur: function blur() {},
+ isEnabled: function isEnabled() {
+ return gantt.$container.hasAttribute("tabindex");
+ },
+ scrollHorizontal: function scrollHorizontal(dir) {
+ var date = gantt.dateFromPos(gantt.getScrollState().x);
+ var scale = gantt.getScale();
+ var step = dir < 0 ? -scale.step : scale.step;
+ date = gantt.date.add(date, step, scale.unit);
+ gantt.scrollTo(gantt.posFromDate(date));
+ },
+ scrollVertical: function scrollVertical(dir) {
+ var top = gantt.getScrollState().y;
+ var step = gantt.config.row_height;
+ gantt.scrollTo(null, top + (dir < 0 ? -1 : 1) * step);
+ },
+ keys: {
+ "alt+left": function altLeft(e) {
+ this.scrollHorizontal(-1);
+ },
+ "alt+right": function altRight(e) {
+ this.scrollHorizontal(1);
+ },
+ "alt+up": function altUp(e) {
+ this.scrollVertical(-1);
+ },
+ "alt+down": function altDown(e) {
+ this.scrollVertical(1);
+ },
+ // undo
+ "ctrl+z": function ctrlZ() {
+ if (gantt.undo) gantt.undo();
+ },
+ // redo
+ "ctrl+r": function ctrlR() {
+ if (gantt.redo) gantt.redo();
+ }
+ }
+ });
+ gantt.$keyboardNavigation.GanttNode.prototype.bindAll(gantt.$keyboardNavigation.GanttNode.prototype.keys);
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/elements/header_cell.js":
+/*!*****************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/elements/header_cell.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var domHelpers = __webpack_require__(/*! ../../../core/ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+ gantt.$keyboardNavigation.HeaderCell = function (index) {
+ this.index = index || 0;
+ };
+
+ gantt.$keyboardNavigation.HeaderCell.prototype = gantt._compose(gantt.$keyboardNavigation.KeyNavNode, {
+ _handlers: null,
+ isValid: function isValid() {
+ if (!gantt.config.show_grid) {
+ if (gantt.getVisibleTaskCount()) return false;
+ }
+
+ return !!gantt.getGridColumns()[this.index] || !gantt.getVisibleTaskCount();
+ },
+ fallback: function fallback() {
+ if (!gantt.config.show_grid) {
+ if (gantt.getVisibleTaskCount()) {
+ return new gantt.$keyboardNavigation.TaskRow();
+ }
+
+ return null;
+ }
+
+ var visibleColumns = gantt.getGridColumns();
+ var index = this.index;
+
+ while (index >= 0) {
+ if (visibleColumns[index]) break;
+ index--;
+ }
+
+ if (visibleColumns[index]) {
+ return new gantt.$keyboardNavigation.HeaderCell(index);
+ } else {
+ return null;
+ }
+ },
+ fromDomElement: function fromDomElement(el) {
+ var cellElement = domHelpers.locateClassName(el, "gantt_grid_head_cell");
+
+ if (cellElement) {
+ var index = 0;
+
+ while (cellElement && cellElement.previousSibling) {
+ cellElement = cellElement.previousSibling;
+ index += 1;
+ }
+
+ return new gantt.$keyboardNavigation.HeaderCell(index);
+ } else {
+ return null;
+ }
+ },
+ getNode: function getNode() {
+ var cells = gantt.$grid_scale.childNodes;
+ return cells[this.index];
+ },
+ keys: {
+ "left": function left() {
+ if (this.index > 0) {
+ this.moveTo(new gantt.$keyboardNavigation.HeaderCell(this.index - 1));
+ }
+ },
+ "right": function right() {
+ var columns = gantt.getGridColumns();
+
+ if (this.index < columns.length - 1) {
+ this.moveTo(new gantt.$keyboardNavigation.HeaderCell(this.index + 1));
+ }
+ },
+ "down": function down() {
+ var taskRow;
+ var rootLevel = gantt.getChildren(gantt.config.root_id);
+
+ if (gantt.isTaskExists(rootLevel[0])) {
+ taskRow = rootLevel[0];
+ }
+
+ if (taskRow) {
+ if (gantt.config.keyboard_navigation_cells) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(taskRow, this.index));
+ } else {
+ this.moveTo(new gantt.$keyboardNavigation.TaskRow(taskRow));
+ }
+ }
+ },
+ "end": function end() {
+ var columns = gantt.getGridColumns();
+ this.moveTo(new gantt.$keyboardNavigation.HeaderCell(columns.length - 1));
+ },
+ "home": function home() {
+ this.moveTo(new gantt.$keyboardNavigation.HeaderCell(0));
+ },
+ // press header button
+ "enter, space": function enterSpace() {
+ var node = domHelpers.getActiveElement();
+ node.click();
+ },
+ // add new task
+ "ctrl+enter": function ctrlEnter() {
+ if (gantt.isReadonly(this)) {
+ return;
+ }
+
+ gantt.createTask({}, this.taskId);
+ }
+ }
+ });
+ gantt.$keyboardNavigation.HeaderCell.prototype.bindAll(gantt.$keyboardNavigation.HeaderCell.prototype.keys);
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/elements/nav_node.js":
+/*!**************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/elements/nav_node.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.$keyboardNavigation.KeyNavNode = function () {};
+
+ gantt.$keyboardNavigation.KeyNavNode.prototype = gantt._compose(gantt.$keyboardNavigation.EventHandler, {
+ isValid: function isValid() {
+ return true;
+ },
+ fallback: function fallback() {
+ return null;
+ },
+ moveTo: function moveTo(element) {
+ gantt.$keyboardNavigation.dispatcher.setActiveNode(element);
+ },
+ compareTo: function compareTo(b) {
+ // good enough comparison of two random objects
+ if (!b) return false;
+
+ for (var i in this) {
+ if (!!this[i] != !!b[i]) return false;
+ var canStringifyThis = !!(this[i] && this[i].toString);
+ var canStringifyThat = !!(b[i] && b[i].toString);
+ if (canStringifyThat != canStringifyThis) return false;
+
+ if (!(canStringifyThat && canStringifyThis)) {
+ if (b[i] != this[i]) return false;
+ } else {
+ if (b[i].toString() != this[i].toString()) return false;
+ }
+ }
+
+ return true;
+ },
+ getNode: function getNode() {},
+ focus: function focus() {
+ var node = this.getNode();
+ if (!node) return;
+ var eventFacade = gantt.$keyboardNavigation.facade;
+
+ if (eventFacade.callEvent("onBeforeFocus", [node]) === false) {
+ return;
+ }
+
+ if (node) {
+ node.setAttribute("tabindex", "-1");
+
+ if (!node.$eventAttached) {
+ node.$eventAttached = true;
+ gantt.event(node, "focus", function (e) {
+ e.preventDefault();
+ return false;
+ }, false);
+ } //node.className += " gantt_focused";
+
+
+ if (gantt.utils.dom.isChildOf(document.activeElement, node)) {
+ node = document.activeElement;
+ }
+
+ if (node.focus) node.focus();
+ eventFacade.callEvent("onFocus", [this.getNode()]);
+ }
+ },
+ blur: function blur() {
+ var node = this.getNode();
+
+ if (node) {
+ var eventFacade = gantt.$keyboardNavigation.facade;
+ eventFacade.callEvent("onBlur", [node]);
+ node.setAttribute("tabindex", "-1"); //node.className = (node.className || "").replace(/ ?gantt_focused/g, "");
+ }
+ }
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/elements/task_cell.js":
+/*!***************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/elements/task_cell.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = function (gantt) {
+ var domHelpers = __webpack_require__(/*! ../../../core/ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+
+ var _require = __webpack_require__(/*! ../../../utils/helpers */ "./sources/utils/helpers.js"),
+ replaceValidZeroId = _require.replaceValidZeroId;
+
+ gantt.$keyboardNavigation.TaskCell = function (taskId, index) {
+ taskId = replaceValidZeroId(taskId, gantt.config.root_id);
+
+ if (!taskId) {
+ var rootLevel = gantt.getChildren(gantt.config.root_id);
+
+ if (rootLevel[0]) {
+ taskId = rootLevel[0];
+ }
+ }
+
+ this.taskId = taskId;
+ this.columnIndex = index || 0; // provided task may not exist, in this case node will be detectes as invalid
+
+ if (gantt.isTaskExists(this.taskId)) {
+ this.index = gantt.getTaskIndex(this.taskId);
+ this.globalIndex = gantt.getGlobalTaskIndex(this.taskId);
+ }
+ };
+
+ gantt.$keyboardNavigation.TaskCell.prototype = gantt._compose(gantt.$keyboardNavigation.TaskRow, {
+ _handlers: null,
+ isValid: function isValid() {
+ return gantt.$keyboardNavigation.TaskRow.prototype.isValid.call(this) && !!gantt.getGridColumns()[this.columnIndex];
+ },
+ fallback: function fallback() {
+ var node = gantt.$keyboardNavigation.TaskRow.prototype.fallback.call(this);
+ var result = node;
+
+ if (node instanceof gantt.$keyboardNavigation.TaskRow) {
+ var visibleColumns = gantt.getGridColumns();
+ var index = this.columnIndex;
+
+ while (index >= 0) {
+ if (visibleColumns[index]) break;
+ index--;
+ }
+
+ if (visibleColumns[index]) {
+ result = new gantt.$keyboardNavigation.TaskCell(node.taskId, index);
+ }
+ }
+
+ return result;
+ },
+ fromDomElement: function fromDomElement(el) {
+ if (!gantt.config.keyboard_navigation_cells) {
+ return null;
+ }
+
+ var taskId = gantt.locate(el);
+
+ if (gantt.isTaskExists(taskId)) {
+ var index = 0;
+ var cellElement = domHelpers.locateAttribute(el, "data-column-index");
+
+ if (cellElement) {
+ index = cellElement.getAttribute("data-column-index") * 1;
+ }
+
+ return new gantt.$keyboardNavigation.TaskCell(taskId, index);
+ } else {
+ return null;
+ }
+ },
+ getNode: function getNode() {
+ if (gantt.isTaskExists(this.taskId) && gantt.isTaskVisible(this.taskId)) {
+ if (gantt.config.show_grid) {
+ var row = gantt.$grid.querySelector(".gantt_row[" + gantt.config.task_attribute + "='" + this.taskId + "']");
+ if (!row) return null;
+ return row.querySelector("[data-column-index='" + this.columnIndex + "']");
+ } else {
+ return gantt.getTaskNode(this.taskId);
+ }
+ }
+ },
+ keys: {
+ "up": function up() {
+ var nextElement = null;
+ var prevTask = gantt.getPrev(this.taskId);
+
+ if (!gantt.isTaskExists(prevTask)) {
+ nextElement = new gantt.$keyboardNavigation.HeaderCell(this.columnIndex);
+ } else {
+ nextElement = new gantt.$keyboardNavigation.TaskCell(prevTask, this.columnIndex);
+ }
+
+ this.moveTo(nextElement);
+ },
+ "down": function down() {
+ var nextTask = gantt.getNext(this.taskId);
+
+ if (gantt.isTaskExists(nextTask)) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(nextTask, this.columnIndex));
+ }
+ },
+ "left": function left() {
+ if (this.columnIndex > 0) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, this.columnIndex - 1));
+ }
+ },
+ "right": function right() {
+ var columns = gantt.getGridColumns();
+
+ if (this.columnIndex < columns.length - 1) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, this.columnIndex + 1));
+ }
+ },
+ "end": function end() {
+ var columns = gantt.getGridColumns();
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, columns.length - 1));
+ },
+ "home": function home() {
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(this.taskId, 0));
+ },
+ "pagedown": function pagedown() {
+ if (gantt.getVisibleTaskCount()) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(gantt.getTaskByIndex(gantt.getVisibleTaskCount() - 1).id, this.columnIndex));
+ }
+ },
+ "pageup": function pageup() {
+ if (gantt.getVisibleTaskCount()) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskCell(gantt.getTaskByIndex(0).id, this.columnIndex));
+ }
+ }
+ }
+ });
+ gantt.$keyboardNavigation.TaskCell.prototype.bindAll(gantt.$keyboardNavigation.TaskRow.prototype.keys);
+ gantt.$keyboardNavigation.TaskCell.prototype.bindAll(gantt.$keyboardNavigation.TaskCell.prototype.keys);
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/elements/task_row.js":
+/*!**************************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/elements/task_row.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ gantt.$keyboardNavigation.TaskRow = function (taskId) {
+ if (!taskId) {
+ var rootLevel = gantt.getChildren(gantt.config.root_id);
+
+ if (rootLevel[0]) {
+ taskId = rootLevel[0];
+ }
+ }
+
+ this.taskId = taskId;
+
+ if (gantt.isTaskExists(this.taskId)) {
+ this.index = gantt.getTaskIndex(this.taskId);
+ this.globalIndex = gantt.getGlobalTaskIndex(this.taskId);
+ }
+ };
+
+ gantt.$keyboardNavigation.TaskRow.prototype = gantt._compose(gantt.$keyboardNavigation.KeyNavNode, {
+ _handlers: null,
+ isValid: function isValid() {
+ return gantt.isTaskExists(this.taskId) && gantt.getTaskIndex(this.taskId) > -1;
+ },
+ fallback: function fallback() {
+ if (!gantt.getVisibleTaskCount()) {
+ var header = new gantt.$keyboardNavigation.HeaderCell();
+ if (!header.isValid()) return null;else return header;
+ } else {
+ var nextIndex = -1; // GS-1393. When Gantt tries to restore the focus, it should rely on the global index
+
+ if (gantt.getTaskByIndex(this.globalIndex - 1)) {
+ nextIndex = this.globalIndex - 1;
+ } else if (gantt.getTaskByIndex(this.globalIndex + 1)) {
+ nextIndex = this.globalIndex + 1;
+ } else {
+ var globalIndex = this.globalIndex;
+
+ while (globalIndex >= 0) {
+ if (gantt.getTaskByIndex(globalIndex)) {
+ nextIndex = globalIndex;
+ break;
+ }
+
+ globalIndex--;
+ }
+ }
+
+ if (nextIndex > -1) {
+ return new gantt.$keyboardNavigation.TaskRow(gantt.getTaskByIndex(nextIndex).id);
+ }
+ }
+ },
+ fromDomElement: function fromDomElement(el) {
+ if (gantt.config.keyboard_navigation_cells) {
+ return null;
+ }
+
+ var taskId = gantt.locate(el);
+
+ if (gantt.isTaskExists(taskId)) {
+ return new gantt.$keyboardNavigation.TaskRow(taskId);
+ } else {
+ return null;
+ }
+ },
+ getNode: function getNode() {
+ if (gantt.isTaskExists(this.taskId) && gantt.isTaskVisible(this.taskId)) {
+ if (gantt.config.show_grid) {
+ return gantt.$grid.querySelector(".gantt_row[" + gantt.config.task_attribute + "='" + this.taskId + "']");
+ } else {
+ return gantt.getTaskNode(this.taskId);
+ }
+ }
+ },
+ focus: function focus(keptFocus) {
+ if (!keptFocus) {
+ var pos = gantt.getTaskPosition(gantt.getTask(this.taskId));
+ var height = gantt.getTaskHeight(this.taskId);
+ var scroll = gantt.getScrollState();
+ var viewWidth;
+
+ if (gantt.$task) {
+ viewWidth = gantt.$task.offsetWidth;
+ } else {
+ viewWidth = scroll.inner_width;
+ }
+
+ var viewHeight;
+
+ if (gantt.$grid_data || gantt.$task_data) {
+ viewHeight = (gantt.$grid_data || gantt.$task_data).offsetHeight;
+ } else {
+ viewHeight = scroll.inner_height;
+ }
+
+ if (pos.top < scroll.y || pos.top + height > scroll.y + viewHeight) {
+ gantt.scrollTo(null, pos.top - height * 5);
+ } else if (gantt.config.scroll_on_click && gantt.config.show_chart) {
+ // horizontal scroll activated
+ if (pos.left > scroll.x + viewWidth) {
+ // scroll forward to the start of the task
+ gantt.scrollTo(pos.left - gantt.config.task_scroll_offset);
+ } else if (pos.left + pos.width < scroll.x) {
+ // scroll back to the end of the task
+ gantt.scrollTo(pos.left + pos.width - gantt.config.task_scroll_offset);
+ }
+ }
+ }
+
+ gantt.$keyboardNavigation.KeyNavNode.prototype.focus.apply(this, [keptFocus]); // GS-152 if there are scrollbars with custom names, change their scroll position
+
+ scrollGrid();
+
+ function scrollGrid() {
+ var grid = gantt.$ui.getView("grid");
+ var scrollPositionX = parseInt(grid.$grid.scrollLeft);
+ var scrollPositionY = parseInt(grid.$grid_data.scrollTop);
+ var attachedScrollbarHorizontal = grid.$config.scrollX;
+
+ if (attachedScrollbarHorizontal && grid.$config.scrollable) {
+ var scrollbarHorizontal = gantt.$ui.getView(attachedScrollbarHorizontal);
+
+ if (scrollbarHorizontal) {
+ scrollbarHorizontal.scrollTo(scrollPositionX, scrollPositionY);
+ }
+ }
+
+ var attachedScrollbarVertical = grid.$config.scrollY;
+
+ if (attachedScrollbarVertical) {
+ var scrollbarVertical = gantt.$ui.getView(attachedScrollbarVertical);
+
+ if (scrollbarVertical) {
+ scrollbarVertical.scrollTo(scrollPositionX, scrollPositionY);
+ }
+ }
+ }
+ },
+ keys: {
+ "pagedown": function pagedown() {
+ if (gantt.getVisibleTaskCount()) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskRow(gantt.getTaskByIndex(gantt.getVisibleTaskCount() - 1).id));
+ }
+ },
+ "pageup": function pageup() {
+ if (gantt.getVisibleTaskCount()) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskRow(gantt.getTaskByIndex(0).id));
+ }
+ },
+ "up": function up() {
+ var nextElement = null;
+ var prevTask = gantt.getPrev(this.taskId);
+
+ if (!gantt.isTaskExists(prevTask)) {
+ nextElement = new gantt.$keyboardNavigation.HeaderCell();
+ } else {
+ nextElement = new gantt.$keyboardNavigation.TaskRow(prevTask);
+ }
+
+ this.moveTo(nextElement);
+ },
+ "down": function down() {
+ var nextTask = gantt.getNext(this.taskId);
+
+ if (gantt.isTaskExists(nextTask)) {
+ this.moveTo(new gantt.$keyboardNavigation.TaskRow(nextTask));
+ }
+ },
+ "shift+down": function shiftDown() {
+ if (gantt.hasChild(this.taskId) && !gantt.getTask(this.taskId).$open) {
+ gantt.open(this.taskId);
+ }
+ },
+ "shift+up": function shiftUp() {
+ if (gantt.hasChild(this.taskId) && gantt.getTask(this.taskId).$open) {
+ gantt.close(this.taskId);
+ }
+ },
+ "shift+right": function shiftRight() {
+ if (gantt.isReadonly(this)) {
+ return;
+ }
+
+ var prevId = gantt.getPrevSibling(this.taskId);
+
+ if (gantt.isTaskExists(prevId) && !gantt.isChildOf(this.taskId, prevId)) {
+ var parent = gantt.getTask(prevId);
+ parent.$open = true;
+ var result = gantt.moveTask(this.taskId, -1, prevId);
+ if (result !== false) gantt.updateTask(this.taskId);
+ }
+ },
+ "shift+left": function shiftLeft() {
+ if (gantt.isReadonly(this)) {
+ return;
+ }
+
+ var parent = gantt.getParent(this.taskId);
+
+ if (gantt.isTaskExists(parent)) {
+ var result = gantt.moveTask(this.taskId, gantt.getTaskIndex(parent) + 1, gantt.getParent(parent));
+ if (result !== false) gantt.updateTask(this.taskId);
+ }
+ },
+ // select
+ "space": function space(e) {
+ if (!gantt.isSelectedTask(this.taskId)) {
+ gantt.selectTask(this.taskId);
+ } else {
+ gantt.unselectTask(this.taskId);
+ }
+ },
+ // collapse
+ "ctrl+left": function ctrlLeft(e) {
+ gantt.close(this.taskId);
+ },
+ // expand
+ "ctrl+right": function ctrlRight(e) {
+ gantt.open(this.taskId);
+ },
+ // delete task
+ "delete": function _delete(e) {
+ if (gantt.isReadonly(this)) {
+ return;
+ }
+
+ gantt.$click.buttons["delete"](this.taskId);
+ },
+ // open lightbox
+ "enter": function enter() {
+ if (gantt.isReadonly(this)) {
+ return;
+ }
+
+ gantt.showLightbox(this.taskId);
+ },
+ // add subtask
+ "ctrl+enter": function ctrlEnter() {
+ if (gantt.isReadonly(this)) {
+ return;
+ }
+
+ gantt.createTask({}, this.taskId);
+ }
+ }
+ });
+ gantt.$keyboardNavigation.TaskRow.prototype.bindAll(gantt.$keyboardNavigation.TaskRow.prototype.keys);
+};
+
+/***/ }),
+
+/***/ "./sources/ext/keyboard_navigation/modals.js":
+/*!***************************************************!*\
+ !*** ./sources/ext/keyboard_navigation/modals.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ (function () {
+ var modalsStack = [];
+
+ function isModal() {
+ return !!modalsStack.length;
+ }
+
+ function afterPopup(box) {
+ setTimeout(function () {
+ if (!isModal()) {
+ if (!gantt.$destroyed) {
+ gantt.focus();
+ }
+ }
+ }, 1);
+ }
+
+ function startModal(box) {
+ gantt.eventRemove(box, "keydown", trapFocus);
+ gantt.event(box, "keydown", trapFocus);
+ modalsStack.push(box); //gantt.$keyboardNavigation.dispatcher.disable();
+ }
+
+ function endModal() {
+ var box = modalsStack.pop();
+
+ if (box) {
+ gantt.eventRemove(box, "keydown", trapFocus);
+ }
+
+ afterPopup(box);
+ }
+
+ function isTopModal(box) {
+ return box == modalsStack[modalsStack.length - 1];
+ }
+
+ function trapFocus(event) {
+ var target = event.currentTarget;
+ if (!isTopModal(target)) return;
+ gantt.$keyboardNavigation.trapFocus(target, event);
+ }
+
+ function traceLightbox() {
+ startModal(gantt.getLightbox());
+ }
+
+ gantt.attachEvent("onLightbox", traceLightbox);
+ gantt.attachEvent("onAfterLightbox", endModal);
+ gantt.attachEvent("onLightboxChange", function () {
+ endModal();
+ traceLightbox();
+ });
+ gantt.attachEvent("onAfterQuickInfo", function () {
+ afterPopup();
+ });
+ gantt.attachEvent("onMessagePopup", function (box) {
+ saveFocus();
+ startModal(box);
+ });
+ gantt.attachEvent("onAfterMessagePopup", function () {
+ endModal();
+ restoreFocus();
+ });
+ var focusElement = null;
+
+ function saveFocus() {
+ focusElement = gantt.utils.dom.getActiveElement();
+ }
+
+ function restoreFocus() {
+ setTimeout(function () {
+ if (focusElement) {
+ focusElement.focus();
+ focusElement = null;
+ }
+ }, 1);
+ }
+
+ gantt.$keyboardNavigation.isModal = isModal;
+ })();
+};
+
+/***/ }),
+
+/***/ "./sources/ext/marker.js":
+/*!*******************************!*\
+ !*** ./sources/ext/marker.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (gantt) {
+ if (!gantt._markers) {
+ gantt._markers = gantt.createDatastore({
+ name: "marker",
+ initItem: function initItem(marker) {
+ marker.id = marker.id || gantt.uid();
+ return marker;
+ }
+ });
+ }
+
+ gantt.config.show_markers = true;
+
+ function render_marker(marker) {
+ if (!gantt.config.show_markers) return false;
+ if (!marker.start_date) return false;
+ var state = gantt.getState();
+ if (+marker.start_date > +state.max_date) return;
+ if ((!marker.end_date || +marker.end_date < +state.min_date) && +marker.start_date < +state.min_date) return;
+ var div = document.createElement("div");
+ div.setAttribute("data-marker-id", marker.id);
+ var css = "gantt_marker";
+ if (gantt.templates.marker_class) css += " " + gantt.templates.marker_class(marker);
+
+ if (marker.css) {
+ css += " " + marker.css;
+ }
+
+ if (marker.title) {
+ div.title = marker.title;
+ }
+
+ div.className = css;
+ var start = gantt.posFromDate(marker.start_date);
+ div.style.left = start + "px";
+ var markerHeight = Math.max(gantt.getRowTop(gantt.getVisibleTaskCount()), 0) + "px";
+
+ if (gantt.config.timeline_placeholder) {
+ markerHeight = gantt.$container.scrollHeight + "px";
+ }
+
+ div.style.height = markerHeight;
+
+ if (marker.end_date) {
+ var end = gantt.posFromDate(marker.end_date);
+ div.style.width = Math.max(end - start, 0) + "px";
+ }
+
+ if (marker.text) {
+ div.innerHTML = "<div class='gantt_marker_content' >" + marker.text + "</div>";
+ }
+
+ return div;
+ }
+
+ function initMarkerArea() {
+ if (!gantt.$task_data) return;
+ var markerArea = document.createElement("div");
+ markerArea.className = "gantt_marker_area";
+ gantt.$task_data.appendChild(markerArea);
+ gantt.$marker_area = markerArea;
+ }
+
+ gantt.attachEvent("onBeforeGanttRender", function () {
+ if (!gantt.$marker_area) initMarkerArea();
+ });
+ gantt.attachEvent("onDataRender", function () {
+ if (!gantt.$marker_area) {
+ initMarkerArea();
+ gantt.renderMarkers();
+ }
+ });
+ gantt.attachEvent("onGanttLayoutReady", function () {
+ // GS-1304 - markers should attach when layout is initialized, both on gantt.init and gantt.resetLayout
+ // wait for "onBeforeGanttRender", so all layout elements will be in DOM
+ gantt.attachEvent("onBeforeGanttRender", function () {
+ initMarkerArea();
+ var layers = gantt.$services.getService("layers");
+ var markerRenderer = layers.createDataRender({
+ name: "marker",
+ defaultContainer: function defaultContainer() {
+ return gantt.$marker_area;
+ }
+ });
+ markerRenderer.addLayer(render_marker);
+ }, {
+ once: true
+ });
+ });
+
+ gantt.getMarker = function (id) {
+ if (!this._markers) return null;
+ return this._markers.getItem(id);
+ };
+
+ gantt.addMarker = function (marker) {
+ return this._markers.addItem(marker);
+ };
+
+ gantt.deleteMarker = function (id) {
+ if (!this._markers.exists(id)) return false;
+
+ this._markers.removeItem(id);
+
+ return true;
+ };
+
+ gantt.updateMarker = function (id) {
+ this._markers.refresh(id);
+ };
+
+ gantt._getMarkers = function () {
+ return this._markers.getItems();
+ };
+
+ gantt.renderMarkers = function () {
+ this._markers.refresh();
+ };
+};
+
+/***/ }),
+
+/***/ "./sources/ext/multiselect.js":
+/*!************************************!*\
+ !*** ./sources/ext/multiselect.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _require = __webpack_require__(/*! ../utils/helpers */ "./sources/utils/helpers.js"),
+ replaceValidZeroId = _require.replaceValidZeroId;
+
+module.exports = function (gantt) {
+ gantt.config.multiselect = true;
+ gantt.config.multiselect_one_level = false;
+ gantt._multiselect = {
+ _selected: {},
+ _one_level: false,
+ _active: true,
+ _first_selected_when_shift: null,
+ getDefaultSelected: function getDefaultSelected() {
+ var selected = this.getSelected();
+ return selected.length ? selected[selected.length - 1] : null;
+ },
+ setFirstSelected: function setFirstSelected(id) {
+ this._first_selected_when_shift = id;
+ },
+ getFirstSelected: function getFirstSelected() {
+ return this._first_selected_when_shift;
+ },
+ isActive: function isActive() {
+ this.updateState();
+ return this._active;
+ },
+ updateState: function updateState() {
+ this._one_level = gantt.config.multiselect_one_level;
+ var active = this._active;
+ this._active = gantt.config.select_task;
+
+ if (this._active != active) {
+ this.reset();
+ }
+ },
+ reset: function reset() {
+ this._selected = {};
+ },
+ setLastSelected: function setLastSelected(id) {
+ gantt.$data.tasksStore.silent(function () {
+ var store = gantt.$data.tasksStore;
+ if (id) store.select(id + "");else store.unselect(null);
+ });
+ },
+ getLastSelected: function getLastSelected() {
+ var last = gantt.$data.tasksStore.getSelectedId();
+ if (last && gantt.isTaskExists(last)) return last;
+ return null;
+ },
+ select: function select(id, e) {
+ if (id && gantt.callEvent("onBeforeTaskMultiSelect", [id, true, e]) && gantt.callEvent("onBeforeTaskSelected", [id])) {
+ this._selected[id] = true;
+ this.setLastSelected(id);
+ this.afterSelect(id);
+ gantt.callEvent("onTaskMultiSelect", [id, true, e]);
+ gantt.callEvent("onTaskSelected", [id]);
+ return true;
+ }
+
+ return false;
+ },
+ toggle: function toggle(id, e) {
+ if (this._selected[id]) {
+ this.unselect(id, e);
+ } else {
+ this.select(id, e);
+ }
+ },
+ unselect: function unselect(id, e) {
+ if (id && gantt.callEvent("onBeforeTaskMultiSelect", [id, false, e])) {
+ this._selected[id] = false;
+ if (this.getLastSelected() == id) this.setLastSelected(this.getDefaultSelected());
+ this.afterSelect(id);
+ gantt.callEvent("onTaskMultiSelect", [id, false, e]);
+ gantt.callEvent("onTaskUnselected", [id]);
+ }
+ },
+ isSelected: function isSelected(id) {
+ return !!(gantt.isTaskExists(id) && this._selected[id]);
+ },
+ getSelected: function getSelected() {
+ var res = [];
+
+ for (var i in this._selected) {
+ if (this._selected[i] && gantt.isTaskExists(i)) {
+ res.push(i);
+ } else {
+ this._selected[i] = false;
+ }
+ }
+
+ res.sort(function (a, b) {
+ return gantt.getGlobalTaskIndex(a) > gantt.getGlobalTaskIndex(b) ? 1 : -1;
+ });
+ return res;
+ },
+ forSelected: function forSelected(callback) {
+ var selected = this.getSelected();
+
+ for (var i = 0; i < selected.length; i++) {
+ callback(selected[i]);
+ }
+ },
+ isSameLevel: function isSameLevel(id) {
+ if (!this._one_level) return true;
+ var last = this.getLastSelected();
+ if (!last) return true;
+ if (!(gantt.isTaskExists(last) && gantt.isTaskExists(id))) return true;
+ return !!(gantt.calculateTaskLevel(gantt.getTask(last)) == gantt.calculateTaskLevel(gantt.getTask(id)));
+ },
+ afterSelect: function afterSelect(id) {
+ if (gantt.isTaskExists(id)) {
+ // FIXME: quick workaround to prevent re-filtering inside refresh on multiselect
+ gantt._quickRefresh(function () {
+ gantt.refreshTask(id);
+ });
+ }
+ },
+ doSelection: function doSelection(e) {
+ if (!this.isActive()) return false; // deny selection when click on 'expand' or 'collapse' icons
+
+ if (gantt._is_icon_open_click(e)) return false;
+ var target_ev = gantt.locate(e);
+ if (!target_ev) return false;
+ if (!gantt.callEvent("onBeforeMultiSelect", [e])) return false;
+ var selected = this.getSelected();
+ var defaultLast = this.getFirstSelected();
+ var isLast = false;
+ var last = this.getLastSelected();
+ var multiSelect = gantt.config.multiselect;
+
+ var singleSelection = function () {
+ // GS-719: If the multiselect extension is added we still need a way
+ // to open the inline editors after clicking on the cells in the grid
+ var controller = gantt.ext.inlineEditors;
+ var state = controller.getState();
+ var cell = controller.locateCell(e.target);
+
+ if (gantt.config.inline_editors_multiselect_open && cell && controller.getEditorConfig(cell.columnName)) {
+ if (controller.isVisible() && state.id == cell.id && state.columnName == cell.columnName) {// do nothing if editor is already active in this cell
+ } else {
+ controller.startEdit(cell.id, cell.columnName);
+ }
+ }
+
+ this.setFirstSelected(target_ev);
+
+ if (!this.isSelected(target_ev)) {
+ this.select(target_ev, e);
+ }
+
+ selected = this.getSelected();
+
+ for (var i = 0; i < selected.length; i++) {
+ if (selected[i] !== target_ev) {
+ this.unselect(selected[i], e);
+ }
+ }
+ }.bind(this);
+
+ var blockSelection = function () {
+ if (!last) last = target_ev;else if (target_ev) {
+ var first_indx = gantt.getGlobalTaskIndex(this.getFirstSelected());
+ var target_indx = gantt.getGlobalTaskIndex(target_ev);
+ var last_indx = gantt.getGlobalTaskIndex(last); // clear prev selection
+
+ var tmp = last;
+
+ while (gantt.getGlobalTaskIndex(tmp) !== first_indx) {
+ this.unselect(tmp, e);
+ tmp = first_indx > last_indx ? gantt.getNext(tmp) : gantt.getPrev(tmp);
+ }
+
+ tmp = target_ev;
+
+ while (gantt.getGlobalTaskIndex(tmp) !== first_indx) {
+ if (this.select(tmp, e) && !isLast) {
+ isLast = true;
+ defaultLast = tmp;
+ }
+
+ tmp = first_indx > target_indx ? gantt.getNext(tmp) : gantt.getPrev(tmp);
+ }
+ }
+ }.bind(this);
+
+ if (multiSelect && (e.ctrlKey || e.metaKey)) {
+ if (!this.isSelected(target_ev)) this.setFirstSelected(target_ev);
+
+ if (target_ev) {
+ this.toggle(target_ev, e);
+ }
+ } else if (multiSelect && e.shiftKey) {
+ if (!gantt.isTaskExists(this.getFirstSelected()) || this.getFirstSelected() === null) {
+ this.setFirstSelected(target_ev);
+ }
+
+ if (selected.length) {
+ // select a group of tasks
+ blockSelection();
+ } else {
+ // select a task when no task is selected and Shift is pressed
+ singleSelection();
+ }
+ } else {
+ // no key press or no multiple selection on the mouse click
+ singleSelection();
+ }
+
+ if (this.isSelected(target_ev)) {
+ this.setLastSelected(target_ev);
+ } else if (defaultLast) {
+ if (target_ev == last) this.setLastSelected(e.shiftKey ? defaultLast : this.getDefaultSelected());
+ } else {
+ this.setLastSelected(null);
+ }
+
+ if (!this.getSelected().length) this.setLastSelected(null);
+ if (!this.getLastSelected() || !this.isSelected(this.getFirstSelected())) this.setFirstSelected(this.getLastSelected());
+ return true;
+ }
+ };
+
+ (function () {
+ var old_selectTask = gantt.selectTask;
+
+ gantt.selectTask = function (id) {
+ id = replaceValidZeroId(id, this.config.root_id);
+ if (!id) return false;
+ var multiselect = gantt._multiselect;
+ var res = id;
+
+ if (multiselect.isActive()) {
+ if (multiselect.select(id, null)) {
+ multiselect.setLastSelected(id);
+ }
+
+ multiselect.setFirstSelected(multiselect.getLastSelected());
+ } else {
+ res = old_selectTask.call(this, id);
+ }
+
+ return res;
+ };
+
+ var old_unselectTask = gantt.unselectTask;
+
+ gantt.unselectTask = function (id) {
+ var multiselect = gantt._multiselect;
+ var isActive = multiselect.isActive();
+ id = id || multiselect.getLastSelected();
+
+ if (id && isActive) {
+ multiselect.unselect(id, null);
+ if (id == multiselect.getLastSelected()) multiselect.setLastSelected(null);
+ gantt.refreshTask(id);
+ multiselect.setFirstSelected(multiselect.getLastSelected());
+ }
+
+ var res = id;
+ if (!isActive) res = old_unselectTask.call(this, id);
+ return res;
+ };
+
+ gantt.toggleTaskSelection = function (id) {
+ var multiselect = gantt._multiselect;
+
+ if (id && multiselect.isActive()) {
+ multiselect.toggle(id);
+ multiselect.setFirstSelected(multiselect.getLastSelected());
+ }
+ };
+
+ gantt.getSelectedTasks = function () {
+ var multiselect = gantt._multiselect;
+ multiselect.isActive();
+ return multiselect.getSelected();
+ };
+
+ gantt.eachSelectedTask = function (callback) {
+ return this._multiselect.forSelected(callback);
+ };
+
+ gantt.isSelectedTask = function (id) {
+ return this._multiselect.isSelected(id);
+ };
+
+ gantt.getLastSelectedTask = function () {
+ return this._multiselect.getLastSelected();
+ };
+
+ gantt.attachEvent("onGanttReady", function () {
+ var old_isSelected = gantt.$data.tasksStore.isSelected;
+
+ gantt.$data.tasksStore.isSelected = function (id) {
+ if (gantt._multiselect.isActive()) {
+ return gantt._multiselect.isSelected(id);
+ }
+
+ return old_isSelected.call(this, id);
+ };
+ });
+ })();
+
+ gantt.attachEvent("onTaskIdChange", function (id, new_id) {
+ var multiselect = gantt._multiselect;
+ if (!multiselect.isActive()) return true;
+
+ if (gantt.isSelectedTask(id)) {
+ multiselect.unselect(id, null);
+ multiselect.select(new_id, null);
+ }
+ });
+ gantt.attachEvent("onAfterTaskDelete", function (id, item) {
+ var multiselect = gantt._multiselect;
+ if (!multiselect.isActive()) return true;
+
+ if (multiselect._selected[id]) {
+ multiselect.unselect(id, null);
+ multiselect._selected[id] = false;
+ multiselect.setLastSelected(multiselect.getDefaultSelected());
+ }
+
+ multiselect.forSelected(function (task_id) {
+ if (!gantt.isTaskExists(task_id)) multiselect.unselect(task_id, null);
+ });
+ });
+ gantt.attachEvent("onBeforeTaskMultiSelect", function (id, state, e) {
+ var multiselect = gantt._multiselect;
+
+ if (state && multiselect.isActive()) {
+ if (multiselect._one_level) {
+ return multiselect.isSameLevel(id);
+ }
+ }
+
+ return true;
+ });
+ gantt.attachEvent("onTaskClick", function (id, e) {
+ if (gantt._multiselect.doSelection(e)) gantt.callEvent("onMultiSelect", [e]);
+ return true;
+ });
+};
+
+/***/ }),
+
+/***/ "./sources/ext/quick_info/index.ts":
+/*!*****************************************!*\
+ !*** ./sources/ext/quick_info/index.ts ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var quickInfo_1 = __webpack_require__(/*! ./quickInfo */ "./sources/ext/quick_info/quickInfo.ts");
+function default_1(gantt) {
+ if (!gantt.ext) {
+ gantt.ext = {};
+ }
+ gantt.ext.quickInfo = new quickInfo_1.QuickInfo(gantt);
+ gantt.config.quickinfo_buttons = ["icon_delete", "icon_edit"];
+ gantt.config.quick_info_detached = true;
+ gantt.config.show_quick_info = true;
+ gantt.templates.quick_info_title = function (start, end, ev) { return ev.text.substr(0, 50); };
+ gantt.templates.quick_info_content = function (start, end, ev) { return ev.details || ev.text; };
+ gantt.templates.quick_info_date = function (start, end, ev) {
+ return gantt.templates.task_time(start, end, ev);
+ };
+ gantt.templates.quick_info_class = function (start, end, task) { return ""; };
+ gantt.attachEvent("onTaskClick", function (id, e) {
+ // GS-1460 Don't show Quick Info when clicking on the "+" button
+ if (!gantt.utils.dom.closest(e.target, ".gantt_add")) {
+ setTimeout(function () {
+ gantt.ext.quickInfo.show(id);
+ }, 0);
+ }
+ return true;
+ });
+ var events = ["onViewChange", "onLightbox", "onBeforeTaskDelete", "onBeforeDrag"];
+ var hidingFunction = function () {
+ gantt.ext.quickInfo.hide();
+ return true;
+ };
+ for (var i = 0; i < events.length; i++) {
+ gantt.attachEvent(events[i], hidingFunction);
+ }
+ // GS-957: We don't want to hide QuickInfo when we click on it.
+ gantt.attachEvent("onEmptyClick", function (e) {
+ var hideQuickInfo = true;
+ var parent = document.querySelector(".gantt_cal_quick_info");
+ if (parent) {
+ var quickInfoClick = gantt.utils.dom.isChildOf(e.target, parent);
+ if (quickInfoClick) {
+ hideQuickInfo = false;
+ }
+ }
+ if (hideQuickInfo) {
+ hidingFunction();
+ }
+ });
+ function clearQuickInfo() {
+ gantt.ext.quickInfo.hide();
+ gantt.ext.quickInfo._quickInfoBox = null;
+ return true;
+ }
+ gantt.attachEvent("onGanttReady", clearQuickInfo);
+ gantt.attachEvent("onDestroy", clearQuickInfo);
+ gantt.event(window, "keydown", function (e) {
+ if (e.keyCode === 27) {
+ gantt.ext.quickInfo.hide();
+ }
+ });
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/ext/quick_info/quickInfo.ts":
+/*!*********************************************!*\
+ !*** ./sources/ext/quick_info/quickInfo.ts ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var QuickInfo = /** @class */ (function () {
+ function QuickInfo(gantt) {
+ var _this = this;
+ // show at coordinates:
+ // show(x: number, y: number)
+ // show for a task:
+ // show(id: TaskID)
+ this.show = function (id, y) {
+ if (y === undefined) {
+ _this._showForTask(id);
+ }
+ else {
+ _this._showAtCoordinates(id, y);
+ }
+ };
+ this.hide = function (forced) {
+ var gantt = _this._gantt;
+ var qi = _this._quickInfoBox;
+ _this._quickInfoBoxId = 0;
+ var taskId = _this._quickInfoTask;
+ _this._quickInfoTask = null;
+ if (qi && qi.parentNode) {
+ if (gantt.config.quick_info_detached) {
+ gantt.callEvent("onAfterQuickInfo", [taskId]);
+ return qi.parentNode.removeChild(qi);
+ }
+ qi.className += " gantt_qi_hidden";
+ if (qi.style.right === "auto") {
+ qi.style.left = "-350px";
+ }
+ else {
+ qi.style.right = "-350px";
+ }
+ if (forced) {
+ qi.style.left = qi.style.right = "";
+ qi.parentNode.removeChild(qi);
+ }
+ gantt.callEvent("onAfterQuickInfo", [taskId]);
+ }
+ };
+ this.getNode = function () {
+ if (_this._quickInfoBox) {
+ return _this._quickInfoBox;
+ }
+ return null;
+ };
+ this.setContainer = function (container) {
+ if (container) {
+ _this._container = typeof container === "string" ? document.getElementById(container) : container;
+ }
+ };
+ this.setContent = function (content) {
+ var gantt = _this._gantt;
+ var defaultContent = {
+ taskId: null,
+ header: {
+ title: "",
+ date: ""
+ },
+ content: "",
+ buttons: gantt.config.quickinfo_buttons
+ };
+ if (!content) {
+ content = defaultContent;
+ }
+ if (!content.taskId) {
+ content.taskId = defaultContent.taskId;
+ }
+ if (!content.header) {
+ content.header = defaultContent.header;
+ }
+ if (!content.header.title) {
+ content.header.title = defaultContent.header.title;
+ }
+ if (!content.header.date) {
+ content.header.date = defaultContent.header.date;
+ }
+ if (!content.content) {
+ content.content = defaultContent.content;
+ }
+ if (!content.buttons) {
+ content.buttons = defaultContent.buttons;
+ }
+ var qi = _this.getNode();
+ if (!qi) {
+ qi = _this._createQuickInfoElement();
+ }
+ if (content.taskId) {
+ _this._quickInfoBoxId = content.taskId;
+ }
+ var titleBox = qi.querySelector(".gantt_cal_qi_title");
+ var titleContent = titleBox.querySelector(".gantt_cal_qi_tcontent");
+ var titleDate = titleBox.querySelector(".gantt_cal_qi_tdate");
+ var main = qi.querySelector(".gantt_cal_qi_content");
+ var controls = qi.querySelector(".gantt_cal_qi_controls");
+ gantt._waiAria.quickInfoHeader(qi, [content.header.title, content.header.date].join(" "));
+ titleContent.innerHTML = content.header.title;
+ titleDate.innerHTML = content.header.date;
+ if (!content.header.title && !content.header.date) {
+ titleBox.style.display = "none";
+ }
+ else {
+ titleBox.style.display = "";
+ }
+ main.innerHTML = content.content;
+ var buttons = content.buttons;
+ if (!buttons.length) {
+ controls.style.display = "none";
+ }
+ else {
+ controls.style.display = "";
+ }
+ var html = "";
+ for (var i = 0; i < buttons.length; i++) {
+ var ariaAttr = gantt._waiAria.quickInfoButtonAttrString(gantt.locale.labels[buttons[i]]);
+ html += "<div class=\"gantt_qi_big_icon " + buttons[i] + "\" title=\""
+ + gantt.locale.labels[buttons[i]] + "\" " + ariaAttr + "><div class='gantt_menu_icon " + buttons[i]
+ + "'></div><div>" + gantt.locale.labels[buttons[i]] + "</div></div>";
+ }
+ controls.innerHTML = html;
+ gantt.eventRemove(qi, "click", _this._qiButtonClickHandler);
+ gantt.eventRemove(qi, "keypress", _this._qiKeyPressHandler);
+ gantt.event(qi, "click", _this._qiButtonClickHandler);
+ gantt.event(qi, "keypress", _this._qiKeyPressHandler);
+ };
+ this._qiButtonClickHandler = function (ev) {
+ ev = ev || event;
+ _this._qi_button_click(ev.target || ev.srcElement);
+ };
+ this._qiKeyPressHandler = function (e) {
+ e = e || event;
+ // @ts-ignore
+ var code = e.which || event.keyCode;
+ if (code === 13 || code === 32) {
+ setTimeout(function () {
+ _this._qi_button_click(e.target || e.srcElement);
+ }, 1);
+ }
+ };
+ this._gantt = gantt;
+ }
+ QuickInfo.prototype._showAtCoordinates = function (x, y) {
+ this.hide(true);
+ this._quickInfoBoxId = 0;
+ this._quickInfoTask = null;
+ if (!this._quickInfoBox) {
+ this._createQuickInfoElement();
+ this.setContent();
+ }
+ this._appendAtCoordinates(x, y);
+ this._gantt.callEvent("onQuickInfo", [null]);
+ };
+ QuickInfo.prototype._showForTask = function (id) {
+ var gantt = this._gantt;
+ if ((id === this._quickInfoBoxId &&
+ gantt.utils.dom.isChildOf(this._quickInfoBox, document.body)) || !gantt.config.show_quick_info) {
+ // not show if the quick info is already displayed for this task, or if it shouldn't be displayed
+ return;
+ }
+ this.hide(true);
+ var offset = 6; // offset TASK <> QI-BOX in 'px'
+ var container = this._getContainer();
+ var pos = this._get_event_counter_part(id, offset, container.xViewport, container.yViewport);
+ if (pos) {
+ this._quickInfoBox = this._init_quick_info(id);
+ this._quickInfoTask = id;
+ this._quickInfoBox.className = this._prepare_quick_info_classname(id);
+ this._fill_quick_data(id);
+ this._show_quick_info(pos, offset);
+ gantt.callEvent("onQuickInfo", [id]);
+ }
+ };
+ QuickInfo.prototype._get_event_counter_part = function (id, offset, xViewport, yViewport) {
+ var gantt = this._gantt;
+ var domEv = gantt.getTaskNode(id);
+ if (!domEv) {
+ domEv = gantt.getTaskRowNode(id);
+ if (!domEv) {
+ return null;
+ }
+ }
+ var left = 0;
+ var top = offset + domEv.offsetTop + domEv.offsetHeight;
+ var node = domEv;
+ if (gantt.utils.dom.isChildOf(node, xViewport)) {
+ while (node && node !== xViewport) {
+ left += node.offsetLeft;
+ node = node.offsetParent;
+ }
+ }
+ var scroll = gantt.getScrollState();
+ if (node) {
+ var dx = (left + domEv.offsetWidth / 2) - scroll.x > (xViewport.offsetWidth / 2) ? 1 : 0;
+ var dy = (top + domEv.offsetHeight / 2) - scroll.y > (yViewport.offsetHeight / 2) ? 1 : 0;
+ return { left: left, top: top, dx: dx, dy: dy, width: domEv.offsetWidth, height: domEv.offsetHeight };
+ }
+ return null;
+ };
+ QuickInfo.prototype._createQuickInfoElement = function () {
+ var _this = this;
+ var gantt = this._gantt;
+ var qi = document.createElement("div");
+ qi.className += "gantt_cal_quick_info";
+ gantt._waiAria.quickInfoAttr(qi);
+ // title
+ var ariaAttr = gantt._waiAria.quickInfoHeaderAttrString();
+ var html = "<div class=\"gantt_cal_qi_title\" " + ariaAttr + ">" +
+ "<div class=\"gantt_cal_qi_tcontent\"></div><div class=\"gantt_cal_qi_tdate\"></div>" +
+ "</div>" +
+ "<div class=\"gantt_cal_qi_content\"></div>";
+ // buttons
+ html += "<div class=\"gantt_cal_qi_controls\">";
+ html += "</div>";
+ qi.innerHTML = html;
+ if (gantt.config.quick_info_detached) {
+ var container = this._getContainer();
+ gantt.event(container.parent, "scroll", function () { _this.hide(); });
+ }
+ this._quickInfoBox = qi;
+ return qi;
+ };
+ QuickInfo.prototype._init_quick_info = function (id) {
+ var gantt = this._gantt;
+ var task = gantt.getTask(id);
+ if (typeof this._quickInfoReadonly === "boolean") {
+ if (gantt.isReadonly(task) !== this._quickInfoReadonly) {
+ this.hide(true);
+ this._quickInfoBox = null;
+ }
+ }
+ this._quickInfoReadonly = gantt.isReadonly(task);
+ if (!this._quickInfoBox) {
+ this._quickInfoBox = this._createQuickInfoElement();
+ }
+ return this._quickInfoBox;
+ };
+ QuickInfo.prototype._prepare_quick_info_classname = function (id) {
+ var gantt = this._gantt;
+ var task = gantt.getTask(id);
+ var css = "gantt_cal_quick_info";
+ var template = gantt.templates.quick_info_class(task.start_date, task.end_date, task);
+ if (template) {
+ css += " " + template;
+ }
+ return css;
+ };
+ QuickInfo.prototype._fill_quick_data = function (id) {
+ var gantt = this._gantt;
+ var ev = gantt.getTask(id);
+ this._quickInfoBoxId = id;
+ var allowedButtons = [];
+ if (this._quickInfoReadonly) {
+ var buttons = gantt.config.quickinfo_buttons;
+ var isEditor = { icon_delete: true, icon_edit: true };
+ for (var i = 0; i < buttons.length; i++) {
+ if (this._quickInfoReadonly && isEditor[buttons[i]]) {
+ continue;
+ }
+ allowedButtons.push(buttons[i]);
+ }
+ }
+ else {
+ allowedButtons = gantt.config.quickinfo_buttons;
+ }
+ this.setContent({
+ header: {
+ title: gantt.templates.quick_info_title(ev.start_date, ev.end_date, ev),
+ date: gantt.templates.quick_info_date(ev.start_date, ev.end_date, ev)
+ },
+ content: gantt.templates.quick_info_content(ev.start_date, ev.end_date, ev),
+ buttons: allowedButtons
+ });
+ };
+ QuickInfo.prototype._appendAtCoordinates = function (x, y) {
+ var qi = this._quickInfoBox;
+ var container = this._getContainer();
+ if (!qi.parentNode ||
+ qi.parentNode.nodeName.toLowerCase() === "#document-fragment") { // IE8
+ container.parent.appendChild(qi);
+ }
+ qi.style.left = x + "px";
+ qi.style.top = y + "px";
+ };
+ QuickInfo.prototype._show_quick_info = function (pos, offset) {
+ var gantt = this._gantt;
+ var qi = this._quickInfoBox;
+ if (gantt.config.quick_info_detached) {
+ var container = this._getContainer();
+ if (!qi.parentNode ||
+ qi.parentNode.nodeName.toLowerCase() === "#document-fragment") { // IE8
+ container.parent.appendChild(qi);
+ }
+ var width = qi.offsetWidth;
+ var popupHeight = qi.offsetHeight;
+ var scrolls = gantt.getScrollState();
+ var xViewport = container.xViewport;
+ var yViewport = container.yViewport;
+ var screenWidth = xViewport.offsetWidth + scrolls.x - width;
+ var relativePopupTop = pos.top - scrolls.y;
+ var relativePopupBottom = relativePopupTop + popupHeight;
+ var top_1 = pos.top;
+ if (relativePopupBottom > yViewport.offsetHeight / 2) {
+ top_1 = pos.top - (popupHeight + pos.height + 2 * offset);
+ if (top_1 < scrolls.y && relativePopupBottom <= yViewport.offsetHeight) {
+ top_1 = pos.top;
+ }
+ }
+ if (top_1 < scrolls.y) {
+ top_1 = scrolls.y;
+ }
+ var x = Math.min(Math.max(scrolls.x, pos.left - pos.dx * (width - pos.width)), screenWidth);
+ var y = top_1;
+ this._appendAtCoordinates(x, y);
+ }
+ else {
+ qi.style.top = 20 + "px";
+ if (pos.dx === 1) {
+ qi.style.right = "auto";
+ qi.style.left = "-300px";
+ setTimeout(function () {
+ qi.style.left = "10px";
+ }, 1);
+ }
+ else {
+ qi.style.left = "auto";
+ qi.style.right = "-300px";
+ setTimeout(function () {
+ qi.style.right = "10px";
+ }, 1);
+ }
+ qi.className += " gantt_qi_" + (pos.dx === 1 ? "left" : "right");
+ gantt.$root.appendChild(qi);
+ }
+ };
+ QuickInfo.prototype._qi_button_click = function (node) {
+ var gantt = this._gantt;
+ var box = this._quickInfoBox;
+ if (!node || node === box) {
+ return;
+ }
+ var mask = node.className;
+ if (mask.indexOf("_icon") !== -1) {
+ var id = this._quickInfoBoxId;
+ gantt.$click.buttons[mask.split(" ")[1].replace("icon_", "")](id);
+ }
+ else {
+ this._qi_button_click(node.parentNode);
+ }
+ };
+ QuickInfo.prototype._getContainer = function () {
+ var gantt = this._gantt;
+ var container = this._container ? this._container : gantt.$task_data;
+ if (container && container.offsetHeight && container.offsetWidth) {
+ return {
+ parent: container,
+ xViewport: gantt.$task,
+ yViewport: gantt.$task_data
+ };
+ }
+ container = this._container ? this._container : gantt.$grid_data;
+ if (container && container.offsetHeight && container.offsetWidth) {
+ return {
+ parent: container,
+ xViewport: gantt.$grid,
+ yViewport: gantt.$grid_data
+ };
+ }
+ return {
+ parent: this._container ? this._container : gantt.$layout,
+ xViewport: gantt.$layout,
+ yViewport: gantt.$layout
+ };
+ };
+ return QuickInfo;
+}());
+exports.QuickInfo = QuickInfo;
+
+
+/***/ }),
+
+/***/ "./sources/ext/tooltip/index.ts":
+/*!**************************************!*\
+ !*** ./sources/ext/tooltip/index.ts ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var tooltipManager_1 = __webpack_require__(/*! ./tooltipManager */ "./sources/ext/tooltip/tooltipManager.ts");
+function default_1(gantt) {
+ gantt.config.tooltip_timeout = 30;
+ gantt.config.tooltip_offset_y = 20;
+ gantt.config.tooltip_offset_x = 10;
+ gantt.config.tooltip_hide_timeout = 30;
+ var tooltipManager = new tooltipManager_1.TooltipManager(gantt);
+ gantt.ext.tooltips = tooltipManager;
+ gantt.attachEvent("onGanttReady", function () {
+ tooltipManager.tooltipFor({
+ selector: "[" + gantt.config.task_attribute + "]:not(.gantt_task_row)",
+ html: function (event) {
+ if (gantt.config.touch && !gantt.config.touch_tooltip) {
+ return;
+ }
+ var targetTaskId = gantt.locate(event);
+ if (gantt.isTaskExists(targetTaskId)) {
+ var task = gantt.getTask(targetTaskId);
+ return gantt.templates.tooltip_text(task.start_date, task.end_date, task);
+ }
+ return null;
+ },
+ global: false
+ });
+ });
+ gantt.attachEvent("onDestroy", function () {
+ tooltipManager.destructor();
+ });
+ gantt.attachEvent("onLightbox", function () {
+ tooltipManager.hideTooltip();
+ });
+ var isLinkCreate = function () {
+ var state = gantt.getState();
+ return !!state.link_source_id;
+ };
+ gantt.attachEvent("onBeforeTooltip", function () {
+ if (isLinkCreate()) {
+ return false;
+ }
+ });
+ gantt.attachEvent("onGanttScroll", function () {
+ tooltipManager.hideTooltip();
+ });
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/ext/tooltip/tooltip.ts":
+/*!****************************************!*\
+ !*** ./sources/ext/tooltip/tooltip.ts ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var domHelpers = __webpack_require__(/*! ../../core/ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+var Tooltip = /** @class */ (function () {
+ function Tooltip(gantt) {
+ this._gantt = gantt;
+ }
+ Tooltip.prototype.getNode = function () {
+ var gantt = this._gantt;
+ if (!this._tooltipNode) {
+ this._tooltipNode = document.createElement("div");
+ this._tooltipNode.className = "gantt_tooltip";
+ gantt._waiAria.tooltipAttr(this._tooltipNode);
+ }
+ return this._tooltipNode;
+ };
+ Tooltip.prototype.setViewport = function (node) {
+ this._root = node;
+ return this;
+ };
+ Tooltip.prototype.show = function (left, top) {
+ var gantt = this._gantt;
+ var container = document.body;
+ var node = this.getNode();
+ if (!domHelpers.isChildOf(node, container)) {
+ this.hide();
+ container.appendChild(node);
+ }
+ if (this._isLikeMouseEvent(left)) {
+ var position = this._calculateTooltipPosition(left);
+ top = position.top;
+ left = position.left;
+ }
+ node.style.top = top + "px";
+ node.style.left = left + "px";
+ gantt._waiAria.tooltipVisibleAttr(node);
+ return this;
+ };
+ Tooltip.prototype.hide = function () {
+ var gantt = this._gantt;
+ var node = this.getNode();
+ if (node && node.parentNode) {
+ node.parentNode.removeChild(node);
+ }
+ gantt._waiAria.tooltipHiddenAttr(node);
+ return this;
+ };
+ Tooltip.prototype.setContent = function (html) {
+ var node = this.getNode();
+ node.innerHTML = html;
+ return this;
+ };
+ // it is for salesforce, because it proxies event to it own events
+ Tooltip.prototype._isLikeMouseEvent = function (event) {
+ if (!event || typeof event !== "object") {
+ return false;
+ }
+ return "clientX" in event && "clientY" in event;
+ };
+ Tooltip.prototype._getViewPort = function () {
+ return this._root || document.body;
+ };
+ Tooltip.prototype._calculateTooltipPosition = function (event) {
+ var gantt = this._gantt;
+ // top/left coordinates inside the viewport by mouse position
+ var viewport = this._getViewPortSize();
+ var tooltipNode = this.getNode();
+ var tooltip = {
+ top: 0,
+ left: 0,
+ width: tooltipNode.offsetWidth,
+ height: tooltipNode.offsetHeight,
+ bottom: 0,
+ right: 0
+ };
+ var offsetX = gantt.config.tooltip_offset_x;
+ var offsetY = gantt.config.tooltip_offset_y;
+ var container = document.body;
+ var mouse = domHelpers.getRelativeEventPosition(event, container);
+ var containerPos = domHelpers.getNodePosition(container);
+ mouse.y += containerPos.y; // to fix margin collapsing
+ tooltip.top = mouse.y;
+ tooltip.left = mouse.x;
+ tooltip.top += offsetY;
+ tooltip.left += offsetX;
+ tooltip.bottom = tooltip.top + tooltip.height;
+ tooltip.right = tooltip.left + tooltip.width;
+ var scrollTop = window.scrollY + container.scrollTop; // to fix margin collapsing
+ // edge cases when the tooltip element can be partially hidden by edges of the viewport
+ if (tooltip.top < viewport.top - scrollTop) {
+ tooltip.top = viewport.top;
+ tooltip.bottom = tooltip.top + tooltip.height;
+ }
+ else if (tooltip.bottom > viewport.bottom) {
+ tooltip.bottom = viewport.bottom;
+ tooltip.top = tooltip.bottom - tooltip.height;
+ }
+ if (tooltip.left < viewport.left) {
+ tooltip.left = viewport.left;
+ tooltip.right = viewport.left + tooltip.width;
+ }
+ else if (tooltip.right > viewport.right) {
+ tooltip.right = viewport.right;
+ tooltip.left = tooltip.right - tooltip.width;
+ }
+ if (mouse.x >= tooltip.left && mouse.x <= tooltip.right) {
+ tooltip.left = mouse.x - tooltip.width - offsetX;
+ tooltip.right = tooltip.left + tooltip.width;
+ }
+ if (mouse.y >= tooltip.top && mouse.y <= tooltip.bottom) {
+ tooltip.top = mouse.y - tooltip.height - offsetY;
+ tooltip.bottom = tooltip.top + tooltip.height;
+ }
+ return tooltip;
+ };
+ Tooltip.prototype._getViewPortSize = function () {
+ var gantt = this._gantt;
+ var container = this._getViewPort();
+ var viewport = container;
+ var scrollTop = window.scrollY + document.body.scrollTop;
+ var scrollLeft = window.scrollX + document.body.scrollLeft;
+ var pos;
+ // support for the initial tooltip mode where the tooltip element was attached to the data area of gantt
+ if (container === gantt.$task_data) {
+ viewport = gantt.$task;
+ scrollTop = 0;
+ scrollLeft = 0;
+ pos = domHelpers.getNodePosition(gantt.$task);
+ }
+ else {
+ pos = domHelpers.getNodePosition(viewport);
+ }
+ return {
+ left: pos.x + scrollLeft,
+ top: pos.y + scrollTop,
+ width: pos.width,
+ height: pos.height,
+ bottom: pos.y + pos.height + scrollTop,
+ right: pos.x + pos.width + scrollLeft
+ };
+ };
+ return Tooltip;
+}());
+exports.Tooltip = Tooltip;
+
+
+/***/ }),
+
+/***/ "./sources/ext/tooltip/tooltipManager.ts":
+/*!***********************************************!*\
+ !*** ./sources/ext/tooltip/tooltipManager.ts ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var domEventsScope = __webpack_require__(/*! ../../core/ui/utils/dom_event_scope */ "./sources/core/ui/utils/dom_event_scope.js");
+var domHelpers = __webpack_require__(/*! ../../core/ui/utils/dom_helpers */ "./sources/core/ui/utils/dom_helpers.js");
+var helpers = __webpack_require__(/*! ../../utils/helpers */ "./sources/utils/helpers.js");
+var tooltip_1 = __webpack_require__(/*! ./tooltip */ "./sources/ext/tooltip/tooltip.ts");
+var TooltipManager = /** @class */ (function () {
+ function TooltipManager(gantt) {
+ this._listeners = {};
+ this.tooltip = new tooltip_1.Tooltip(gantt);
+ this._gantt = gantt;
+ this._domEvents = domEventsScope();
+ this._initDelayedFunctions();
+ }
+ TooltipManager.prototype.destructor = function () {
+ this.tooltip.hide();
+ this._domEvents.detachAll();
+ };
+ TooltipManager.prototype.hideTooltip = function () {
+ this.delayHide();
+ };
+ TooltipManager.prototype.attach = function (config) {
+ var _this = this;
+ var root = document.body;
+ var gantt = this._gantt;
+ if (!config.global) {
+ root = gantt.$root;
+ }
+ var watchableTarget = null;
+ var handler = function (event) {
+ var eventTarget = domHelpers.getTargetNode(event);
+ var targetNode = domHelpers.closest(eventTarget, config.selector);
+ if (domHelpers.isChildOf(eventTarget, _this.tooltip.getNode())) {
+ return;
+ }
+ var doOnMouseEnter = function () {
+ watchableTarget = targetNode;
+ config.onmouseenter(event, targetNode);
+ };
+ if (watchableTarget) {
+ if (targetNode && targetNode === watchableTarget) {
+ config.onmousemove(event, targetNode);
+ }
+ else {
+ config.onmouseleave(event, watchableTarget);
+ watchableTarget = null;
+ if (targetNode && targetNode !== watchableTarget) {
+ doOnMouseEnter();
+ }
+ }
+ }
+ else {
+ if (targetNode) {
+ doOnMouseEnter();
+ }
+ }
+ };
+ this.detach(config.selector);
+ this._domEvents.attach(root, "mousemove", handler);
+ this._listeners[config.selector] = {
+ node: root,
+ handler: handler
+ };
+ };
+ TooltipManager.prototype.detach = function (selector) {
+ var listener = this._listeners[selector];
+ if (listener) {
+ this._domEvents.detach(listener.node, "mousemove", listener.handler);
+ }
+ };
+ TooltipManager.prototype.tooltipFor = function (config) {
+ var _this = this;
+ var cloneDomEvent = function (event) {
+ var clone = event;
+ // making events survive timeout in ie
+ // tslint:disable-next-line no-string-literal
+ if (document["createEventObject"] && !document.createEvent) {
+ // tslint:disable-next-line no-string-literal
+ clone = document["createEventObject"](event);
+ }
+ return clone;
+ };
+ this._initDelayedFunctions();
+ this.attach({
+ selector: config.selector,
+ global: config.global,
+ onmouseenter: function (event, node) {
+ var html = config.html(event, node);
+ if (html) {
+ _this.delayShow(cloneDomEvent(event), html);
+ }
+ },
+ onmousemove: function (event, node) {
+ var html = config.html(event, node);
+ if (html) {
+ _this.delayShow(cloneDomEvent(event), html);
+ }
+ else {
+ _this.delayShow.$cancelTimeout();
+ _this.delayHide();
+ }
+ },
+ onmouseleave: function () {
+ _this.delayShow.$cancelTimeout();
+ _this.delayHide();
+ },
+ });
+ };
+ TooltipManager.prototype._initDelayedFunctions = function () {
+ var _this = this;
+ var gantt = this._gantt;
+ // reset delayed functions in order to apply current values of tooltip_timeout
+ if (this.delayShow) {
+ this.delayShow.$cancelTimeout();
+ }
+ if (this.delayHide) {
+ this.delayHide.$cancelTimeout();
+ }
+ this.tooltip.hide();
+ this.delayShow = helpers.delay(function (event, html) {
+ if (gantt.callEvent("onBeforeTooltip", [event]) === false) {
+ _this.tooltip.hide();
+ }
+ else {
+ _this.tooltip.setContent(html);
+ _this.tooltip.show(event);
+ }
+ }, gantt.config.tooltip_timeout || 1);
+ this.delayHide = helpers.delay(function () {
+ _this.delayShow.$cancelTimeout();
+ _this.tooltip.hide();
+ }, gantt.config.tooltip_hide_timeout || 1);
+ };
+ return TooltipManager;
+}());
+exports.TooltipManager = TooltipManager;
+
+
+/***/ }),
+
+/***/ "./sources/ext/undo/index.ts":
+/*!***********************************!*\
+ !*** ./sources/ext/undo/index.ts ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var monitor_1 = __webpack_require__(/*! ./monitor */ "./sources/ext/undo/monitor.ts");
+var undo_1 = __webpack_require__(/*! ./undo */ "./sources/ext/undo/undo.ts");
+function default_1(gantt) {
+ var _undo = new undo_1.Undo(gantt);
+ var monitor = new monitor_1.Monitor(_undo, gantt);
+ gantt.config.undo = true;
+ gantt.config.redo = true;
+ /**
+ * entities that require different processing for undoing-redoing changes
+ * @type {{link: string, task: string}}
+ */
+ gantt.config.undo_types = {
+ link: "link",
+ task: "task"
+ };
+ /**
+ * types of traced actions
+ * @type {{update: string, remove: string, add: string}}
+ */
+ gantt.config.undo_actions = {
+ update: "update",
+ remove: "remove",
+ add: "add",
+ move: "move" // move task in grid
+ };
+ if (!gantt.ext) {
+ gantt.ext = {};
+ }
+ gantt.ext.undo = {
+ undo: function () { return _undo.undo(); },
+ redo: function () { return _undo.redo(); },
+ getUndoStack: function () { return _undo.getUndoStack(); },
+ setUndoStack: function (stack) { return _undo.setUndoStack(stack); },
+ getRedoStack: function () { return _undo.getRedoStack(); },
+ setRedoStack: function (stack) { return _undo.setRedoStack(stack); },
+ clearUndoStack: function () { return _undo.clearUndoStack(); },
+ clearRedoStack: function () { return _undo.clearRedoStack(); },
+ saveState: function (id, type) { return monitor.store(id, type, true); },
+ getInitialState: function (id, type) {
+ if (type === gantt.config.undo_types.link) {
+ return monitor.getInitialLink(id);
+ }
+ else {
+ return monitor.getInitialTask(id);
+ }
+ }
+ };
+ gantt.undo = gantt.ext.undo.undo;
+ gantt.redo = gantt.ext.undo.redo;
+ gantt.getUndoStack = gantt.ext.undo.getUndoStack;
+ gantt.getRedoStack = gantt.ext.undo.getRedoStack;
+ gantt.clearUndoStack = gantt.ext.undo.clearUndoStack;
+ gantt.clearRedoStack = gantt.ext.undo.clearRedoStack;
+ function updTask(task, oldId, newId) {
+ if (!task) {
+ return;
+ }
+ if (task.id === oldId) {
+ task.id = newId;
+ }
+ if (task.parent === oldId) {
+ task.parent = newId;
+ }
+ }
+ function changeTaskCommandId(command, oldId, newId) {
+ updTask(command.value, oldId, newId);
+ updTask(command.oldValue, oldId, newId);
+ }
+ function updLink(link, oldTaskId, newTaskId) {
+ if (!link) {
+ return;
+ }
+ if (link.source === oldTaskId) {
+ link.source = newTaskId;
+ }
+ if (link.target === oldTaskId) {
+ link.target = newTaskId;
+ }
+ }
+ function changeLinkCommandId(command, oldId, newId) {
+ updLink(command.value, oldId, newId);
+ updLink(command.oldValue, oldId, newId);
+ }
+ function updateTasksIds(log, oldId, newId) {
+ var undo = _undo;
+ for (var i = 0; i < log.length; i++) {
+ var entry = log[i];
+ for (var j = 0; j < entry.commands.length; j++) {
+ if (entry.commands[j].entity === undo.command.entity.task) {
+ changeTaskCommandId(entry.commands[j], oldId, newId);
+ }
+ else if (entry.commands[j].entity === undo.command.entity.link) {
+ changeLinkCommandId(entry.commands[j], oldId, newId);
+ }
+ }
+ }
+ }
+ function updateLinksIds(log, oldId, newId) {
+ var undo = _undo;
+ for (var i = 0; i < log.length; i++) {
+ var entry = log[i];
+ for (var j = 0; j < entry.commands.length; j++) {
+ var command = entry.commands[j];
+ if (command.entity === undo.command.entity.link) {
+ if (command.value && command.value.id === oldId) {
+ command.value.id = newId;
+ }
+ if (command.oldValue && command.oldValue.id === oldId) {
+ command.oldValue.id = newId;
+ }
+ }
+ }
+ }
+ }
+ gantt.attachEvent("onTaskIdChange", function (oldId, newId) {
+ var undo = _undo;
+ updateTasksIds(undo.getUndoStack(), oldId, newId);
+ updateTasksIds(undo.getRedoStack(), oldId, newId);
+ });
+ gantt.attachEvent("onLinkIdChange", function (oldId, newId) {
+ var undo = _undo;
+ updateLinksIds(undo.getUndoStack(), oldId, newId);
+ updateLinksIds(undo.getRedoStack(), oldId, newId);
+ });
+ gantt.attachEvent("onGanttReady", function () {
+ _undo.updateConfigs();
+ });
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/ext/undo/monitor.ts":
+/*!*************************************!*\
+ !*** ./sources/ext/undo/monitor.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var noTrack = {
+ onBeforeUndo: "onAfterUndo",
+ onBeforeRedo: "onAfterRedo"
+};
+var batchActions = [
+ "onTaskDragStart",
+ "onAfterTaskUpdate",
+ "onAfterTaskDelete",
+ "onBeforeBatchUpdate"
+];
+var Monitor = /** @class */ (function () {
+ function Monitor(undo, gantt) {
+ this._batchAction = null;
+ this._batchMode = false;
+ this._ignore = false;
+ this._ignoreMoveEvents = false;
+ this._initialTasks = {};
+ this._initialLinks = {};
+ this._nestedTasks = {};
+ this._nestedLinks = {};
+ this._undo = undo;
+ this._gantt = gantt;
+ this._attachEvents();
+ }
+ Monitor.prototype.store = function (id, type, overwrite) {
+ if (overwrite === void 0) { overwrite = false; }
+ if (type === this._gantt.config.undo_types.task) {
+ return this._storeTask(id, overwrite);
+ }
+ if (type === this._gantt.config.undo_types.link) {
+ return this._storeLink(id, overwrite);
+ }
+ return false;
+ };
+ Monitor.prototype.isMoveEventsIgnored = function () {
+ return this._ignoreMoveEvents;
+ };
+ Monitor.prototype.toggleIgnoreMoveEvents = function (newValue) {
+ this._ignoreMoveEvents = newValue || false;
+ };
+ Monitor.prototype.startIgnore = function () {
+ this._ignore = true;
+ };
+ Monitor.prototype.stopIgnore = function () {
+ this._ignore = false;
+ };
+ Monitor.prototype.startBatchAction = function () {
+ var _this = this;
+ // try catching updates made from event handlers using timeout
+ if (!this._timeout) {
+ this._timeout = setTimeout(function () {
+ _this.stopBatchAction();
+ _this._timeout = null;
+ }, 10);
+ }
+ if (this._ignore || this._batchMode) {
+ return;
+ }
+ this._batchMode = true;
+ this._batchAction = this._undo.action.create();
+ };
+ Monitor.prototype.stopBatchAction = function () {
+ if (this._ignore) {
+ return;
+ }
+ var undo = this._undo;
+ if (this._batchAction) {
+ undo.logAction(this._batchAction);
+ }
+ this._batchMode = false;
+ this._batchAction = null;
+ };
+ Monitor.prototype.onTaskAdded = function (task) {
+ if (!this._ignore) {
+ this._storeTaskCommand(task, this._undo.command.type.add);
+ }
+ };
+ Monitor.prototype.onTaskUpdated = function (task) {
+ if (!this._ignore) {
+ this._storeTaskCommand(task, this._undo.command.type.update);
+ }
+ };
+ Monitor.prototype.onTaskMoved = function (task) {
+ if (!this._ignore) {
+ task.$local_index = this._gantt.getTaskIndex(task.id);
+ var oldValue = this.getInitialTask(task.id);
+ if (task.$local_index === oldValue.$local_index &&
+ this._gantt.getParent(task) === this._gantt.getParent(oldValue)) {
+ return;
+ }
+ this._storeEntityCommand(task, this.getInitialTask(task.id), this._undo.command.type.move, this._undo.command.entity.task);
+ }
+ };
+ Monitor.prototype.onTaskDeleted = function (task) {
+ if (!this._ignore) {
+ this._storeTaskCommand(task, this._undo.command.type.remove);
+ if (this._nestedTasks[task.id]) {
+ var children = this._nestedTasks[task.id];
+ for (var i = 0; i < children.length; i++) {
+ this._storeTaskCommand(children[i], this._undo.command.type.remove);
+ }
+ }
+ if (this._nestedLinks[task.id]) {
+ var childrenLinks = this._nestedLinks[task.id];
+ for (var i = 0; i < childrenLinks.length; i++) {
+ this._storeLinkCommand(childrenLinks[i], this._undo.command.type.remove);
+ }
+ }
+ }
+ };
+ Monitor.prototype.onLinkAdded = function (link) {
+ if (!this._ignore) {
+ this._storeLinkCommand(link, this._undo.command.type.add);
+ }
+ };
+ Monitor.prototype.onLinkUpdated = function (link) {
+ if (!this._ignore) {
+ this._storeLinkCommand(link, this._undo.command.type.update);
+ }
+ };
+ Monitor.prototype.onLinkDeleted = function (link) {
+ if (!this._ignore) {
+ this._storeLinkCommand(link, this._undo.command.type.remove);
+ }
+ };
+ Monitor.prototype.setNestedTasks = function (id, taskIds) {
+ var gantt = this._gantt;
+ var task = null;
+ var tasks = [];
+ var linkIds = this._getLinks(gantt.getTask(id));
+ for (var i = 0; i < taskIds.length; i++) {
+ task = this.setInitialTask(taskIds[i]);
+ linkIds = linkIds.concat(this._getLinks(task));
+ tasks.push(task);
+ }
+ var uniqueLinks = {};
+ for (var i = 0; i < linkIds.length; i++) {
+ uniqueLinks[linkIds[i]] = true;
+ }
+ var links = [];
+ for (var i in uniqueLinks) {
+ links.push(this.setInitialLink(i));
+ }
+ this._nestedTasks[id] = tasks;
+ this._nestedLinks[id] = links;
+ };
+ Monitor.prototype.setInitialTask = function (id, overwrite) {
+ var gantt = this._gantt;
+ if (overwrite || (!this._initialTasks[id] || !this._batchMode)) {
+ var task = gantt.copy(gantt.getTask(id));
+ task.$index = gantt.getGlobalTaskIndex(id);
+ task.$local_index = gantt.getTaskIndex(id);
+ this.setInitialTaskObject(id, task);
+ }
+ return this._initialTasks[id];
+ };
+ Monitor.prototype.getInitialTask = function (id) {
+ return this._initialTasks[id];
+ };
+ Monitor.prototype.clearInitialTasks = function () {
+ this._initialTasks = {};
+ };
+ Monitor.prototype.setInitialTaskObject = function (id, object) {
+ this._initialTasks[id] = object;
+ };
+ Monitor.prototype.setInitialLink = function (id, overwrite) {
+ if (!this._initialLinks[id] || !this._batchMode) {
+ this._initialLinks[id] = this._gantt.copy(this._gantt.getLink(id));
+ }
+ return this._initialLinks[id];
+ };
+ Monitor.prototype.getInitialLink = function (id) {
+ return this._initialLinks[id];
+ };
+ Monitor.prototype.clearInitialLinks = function () {
+ this._initialLinks = {};
+ };
+ Monitor.prototype._attachEvents = function () {
+ var _this = this;
+ var deleteCacheCooldown = null;
+ var gantt = this._gantt;
+ var saveInitialAll = function () {
+ if (!deleteCacheCooldown) {
+ deleteCacheCooldown = setTimeout(function () {
+ deleteCacheCooldown = null;
+ });
+ _this.clearInitialTasks();
+ gantt.eachTask(function (task) {
+ _this.setInitialTask(task.id);
+ });
+ _this.clearInitialLinks();
+ gantt.getLinks().forEach(function (link) {
+ _this.setInitialLink(link.id);
+ });
+ }
+ };
+ var getMoveObjectByTaskId = function (id) {
+ return gantt.copy(gantt.getTask(id));
+ };
+ for (var i in noTrack) {
+ gantt.attachEvent(i, function () {
+ _this.startIgnore();
+ return true;
+ });
+ gantt.attachEvent(noTrack[i], function () {
+ _this.stopIgnore();
+ return true;
+ });
+ }
+ for (var i = 0; i < batchActions.length; i++) {
+ gantt.attachEvent(batchActions[i], function () {
+ _this.startBatchAction();
+ return true;
+ });
+ }
+ gantt.attachEvent("onParse", function () {
+ _this._undo.clearUndoStack();
+ _this._undo.clearRedoStack();
+ saveInitialAll();
+ });
+ gantt.attachEvent("onAfterTaskAdd", function (id, task) {
+ _this.setInitialTask(id, true);
+ _this.onTaskAdded(task);
+ });
+ gantt.attachEvent("onAfterTaskUpdate", function (id, task) {
+ _this.onTaskUpdated(task);
+ });
+ gantt.attachEvent("onAfterTaskDelete", function (id, task) {
+ _this.onTaskDeleted(task);
+ });
+ gantt.attachEvent("onAfterLinkAdd", function (id, link) {
+ _this.setInitialLink(id, true);
+ _this.onLinkAdded(link);
+ });
+ gantt.attachEvent("onAfterLinkUpdate", function (id, link) {
+ _this.onLinkUpdated(link);
+ });
+ gantt.attachEvent("onAfterLinkDelete", function (id, link) {
+ _this.onLinkDeleted(link);
+ });
+ gantt.attachEvent("onRowDragEnd", function (id, target) {
+ _this.onTaskMoved(getMoveObjectByTaskId(id));
+ _this.toggleIgnoreMoveEvents();
+ return true;
+ });
+ gantt.attachEvent("onBeforeTaskDelete", function (id) {
+ _this.store(id, gantt.config.undo_types.task);
+ var nested = [];
+ // remember task indexes in case their being deleted in a loop, so they could be restored in the correct order
+ saveInitialAll();
+ gantt.eachTask(function (task) {
+ nested.push(task.id);
+ }, id);
+ _this.setNestedTasks(id, nested);
+ return true;
+ });
+ var datastore = gantt.getDatastore("task");
+ datastore.attachEvent("onBeforeItemMove", function (id, parent, tindex) {
+ if (!_this.isMoveEventsIgnored()) {
+ saveInitialAll();
+ }
+ return true;
+ });
+ datastore.attachEvent("onAfterItemMove", function (id, parent, tindex) {
+ if (!_this.isMoveEventsIgnored()) {
+ _this.onTaskMoved(getMoveObjectByTaskId(id));
+ }
+ return true;
+ });
+ gantt.attachEvent("onRowDragStart", function (id, target, e) {
+ _this.toggleIgnoreMoveEvents(true);
+ saveInitialAll();
+ return true;
+ });
+ gantt.attachEvent("onBeforeTaskDrag", function (taskId) { return _this.store(taskId, gantt.config.undo_types.task); });
+ gantt.attachEvent("onLightbox", function (taskId) { return _this.store(taskId, gantt.config.undo_types.task); });
+ gantt.attachEvent("onBeforeTaskAutoSchedule", function (task) {
+ _this.store(task.id, gantt.config.undo_types.task);
+ return true;
+ });
+ if (gantt.ext.inlineEditors) {
+ gantt.ext.inlineEditors.attachEvent("onEditStart", function (state) {
+ _this.store(state.id, gantt.config.undo_types.task);
+ });
+ }
+ };
+ Monitor.prototype._storeCommand = function (command) {
+ var undo = this._undo;
+ undo.updateConfigs();
+ if (!undo.undoEnabled) {
+ return;
+ }
+ if (this._batchMode) {
+ this._batchAction.commands.push(command);
+ }
+ else {
+ var action = undo.action.create([command]);
+ undo.logAction(action);
+ }
+ };
+ Monitor.prototype._storeEntityCommand = function (obj, old, actionType, entityType) {
+ var undo = this._undo;
+ var command = undo.command.create(obj, old, actionType, entityType);
+ this._storeCommand(command);
+ };
+ Monitor.prototype._storeTaskCommand = function (obj, type) {
+ if (this._gantt.isTaskExists(obj.id)) {
+ obj.$local_index = this._gantt.getTaskIndex(obj.id);
+ }
+ this._storeEntityCommand(obj, this.getInitialTask(obj.id), type, this._undo.command.entity.task);
+ };
+ Monitor.prototype._storeLinkCommand = function (obj, type) {
+ this._storeEntityCommand(obj, this.getInitialLink(obj.id), type, this._undo.command.entity.link);
+ };
+ Monitor.prototype._getLinks = function (task) {
+ return task.$source.concat(task.$target);
+ };
+ Monitor.prototype._storeTask = function (taskId, overwrite) {
+ var _this = this;
+ if (overwrite === void 0) { overwrite = false; }
+ var gantt = this._gantt;
+ this.setInitialTask(taskId, overwrite);
+ gantt.eachTask(function (child) {
+ _this.setInitialTask(child.id);
+ }, taskId);
+ return true;
+ };
+ Monitor.prototype._storeLink = function (linkId, overwrite) {
+ if (overwrite === void 0) { overwrite = false; }
+ this.setInitialLink(linkId, overwrite);
+ return true;
+ };
+ return Monitor;
+}());
+exports.Monitor = Monitor;
+
+
+/***/ }),
+
+/***/ "./sources/ext/undo/undo.ts":
+/*!**********************************!*\
+ !*** ./sources/ext/undo/undo.ts ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var MAX_UNDO_STEPS = 100;
+var Undo = /** @class */ (function () {
+ function Undo(gantt) {
+ var _this = this;
+ this.maxSteps = MAX_UNDO_STEPS;
+ this.undoEnabled = true;
+ this.redoEnabled = true;
+ this.action = {
+ create: function (commands) {
+ return { commands: (commands ? commands.slice() : []) };
+ },
+ invert: function (action) {
+ var _a;
+ var gantt = _this._gantt;
+ var revert = gantt.copy(action);
+ var commands = _this.command;
+ for (var i = 0; i < action.commands.length; i++) {
+ var command = revert.commands[i] = commands.invert(revert.commands[i]);
+ if (command.type === commands.type.update || command.type === commands.type.move) {
+ _a = [command.oldValue, command.value], command.value = _a[0], command.oldValue = _a[1];
+ }
+ }
+ return revert;
+ }
+ };
+ this.command = {
+ // entities that require different processing for undoing-redoing changes (gantt.config.undo_types)
+ entity: null,
+ // types of traced actions (gantt.config.undo_actions)
+ type: null,
+ create: function (value, oldValue, type, entity) {
+ var gantt = _this._gantt;
+ return {
+ entity: entity,
+ type: type,
+ value: gantt.copy(value),
+ oldValue: gantt.copy(oldValue || value)
+ };
+ },
+ invert: function (command) {
+ var gantt = _this._gantt;
+ var revert = gantt.copy(command);
+ revert.type = _this.command.inverseCommands(command.type);
+ return revert;
+ },
+ inverseCommands: function (command) {
+ var gantt = _this._gantt;
+ var types = _this.command.type;
+ switch (command) {
+ case types.update:
+ return types.update;
+ case types.remove:
+ return types.add;
+ case types.add:
+ return types.remove;
+ case types.move:
+ return types.move;
+ default:
+ gantt.assert(false, "Invalid command " + command);
+ return null;
+ }
+ }
+ };
+ this._undoStack = [];
+ this._redoStack = [];
+ this._gantt = gantt;
+ }
+ Undo.prototype.getUndoStack = function () {
+ return this._undoStack;
+ };
+ Undo.prototype.setUndoStack = function (stack) {
+ this._undoStack = stack;
+ };
+ Undo.prototype.getRedoStack = function () {
+ return this._redoStack;
+ };
+ Undo.prototype.setRedoStack = function (stack) {
+ this._redoStack = stack;
+ };
+ Undo.prototype.clearUndoStack = function () {
+ this._undoStack = [];
+ };
+ Undo.prototype.clearRedoStack = function () {
+ this._redoStack = [];
+ };
+ Undo.prototype.updateConfigs = function () {
+ var gantt = this._gantt;
+ this.maxSteps = gantt.config.undo_steps || MAX_UNDO_STEPS;
+ this.command.entity = gantt.config.undo_types;
+ this.command.type = gantt.config.undo_actions;
+ this.undoEnabled = !!gantt.config.undo;
+ this.redoEnabled = !!gantt.config.redo; // GS-873, Redo should work even when the `gantt.config.undo` is disabled.
+ };
+ Undo.prototype.undo = function () {
+ var gantt = this._gantt;
+ this.updateConfigs();
+ if (!this.undoEnabled) {
+ return;
+ }
+ var action = this._pop(this._undoStack);
+ if (action) {
+ this._reorderCommands(action);
+ }
+ if (gantt.callEvent("onBeforeUndo", [action]) !== false) {
+ if (action) {
+ this._applyAction(this.action.invert(action));
+ this._push(this._redoStack, gantt.copy(action));
+ gantt.callEvent("onAfterUndo", [action]);
+ return;
+ }
+ }
+ gantt.callEvent("onAfterUndo", [null]);
+ };
+ Undo.prototype.redo = function () {
+ var gantt = this._gantt;
+ this.updateConfigs();
+ if (!this.redoEnabled) {
+ return;
+ }
+ var action = this._pop(this._redoStack);
+ if (action) {
+ this._reorderCommands(action);
+ }
+ if (gantt.callEvent("onBeforeRedo", [action]) !== false) {
+ if (action) {
+ this._applyAction(action);
+ this._push(this._undoStack, gantt.copy(action));
+ gantt.callEvent("onAfterRedo", [action]);
+ return;
+ }
+ }
+ gantt.callEvent("onAfterRedo", [null]);
+ };
+ // storeUndo:
+ Undo.prototype.logAction = function (action) {
+ this._push(this._undoStack, action);
+ this._redoStack = [];
+ };
+ Undo.prototype._push = function (stack, action) {
+ var gantt = this._gantt;
+ if (!action.commands.length) {
+ return;
+ }
+ var event = stack === this._undoStack ? "onBeforeUndoStack" : "onBeforeRedoStack";
+ if (gantt.callEvent(event, [action]) === false) {
+ return;
+ }
+ // commands can be removed from event handler
+ if (!action.commands.length) {
+ return;
+ }
+ stack.push(action);
+ while (stack.length > this.maxSteps) {
+ stack.shift();
+ }
+ return action;
+ };
+ Undo.prototype._pop = function (stack) {
+ return stack.pop();
+ };
+ Undo.prototype._reorderCommands = function (action) {
+ // firstly process tasks and only then links
+ // in order to ensure links are added not earlier than their tasks
+ // firstly to 'move' actions and only then updates
+ var weights = { any: 0, link: 1, task: 2 };
+ var actionWeights = { move: 1, any: 0 };
+ action.commands.sort(function (a, b) {
+ if (a.entity === "task" && b.entity === "task") {
+ if (a.type !== b.type) {
+ return (actionWeights[b.type] || 0) - (actionWeights[a.type] || 0);
+ }
+ else if (a.type === "move" && a.oldValue && b.oldValue && b.oldValue.parent === a.oldValue.parent) {
+ return a.oldValue.$index - b.oldValue.$index;
+ }
+ else {
+ return 0;
+ }
+ }
+ else {
+ var weightA = weights[a.entity] || weights.any;
+ var weightB = weights[b.entity] || weights.any;
+ return weightB - weightA;
+ }
+ });
+ };
+ Undo.prototype._applyAction = function (action) {
+ var command = null;
+ var entities = this.command.entity;
+ var actions = this.command.type;
+ var gantt = this._gantt;
+ var methods = {};
+ methods[entities.task] = {
+ add: "addTask",
+ get: "getTask",
+ update: "updateTask",
+ remove: "deleteTask",
+ move: "moveTask",
+ isExists: "isTaskExists"
+ };
+ methods[entities.link] = {
+ add: "addLink",
+ get: "getLink",
+ update: "updateLink",
+ remove: "deleteLink",
+ isExists: "isLinkExists"
+ };
+ gantt.batchUpdate(function () {
+ for (var i = 0; i < action.commands.length; i++) {
+ command = action.commands[i];
+ var method = methods[command.entity][command.type];
+ var getMethod = methods[command.entity].get;
+ var check = methods[command.entity].isExists;
+ if (command.type === actions.add) {
+ gantt[method](command.oldValue, command.oldValue.parent, command.oldValue.$local_index);
+ }
+ else if (command.type === actions.remove) {
+ if (gantt[check](command.value.id)) {
+ gantt[method](command.value.id);
+ }
+ }
+ else if (command.type === actions.update) {
+ var item = gantt[getMethod](command.value.id);
+ for (var prop in command.value) {
+ if (!prop.startsWith("$") && !prop.startsWith("_")) {
+ item[prop] = command.value[prop];
+ }
+ }
+ gantt[method](command.value.id);
+ }
+ else if (command.type === actions.move) {
+ gantt[method](command.value.id, command.value.$local_index, command.value.parent);
+ // GS-680: We should send the changes to the server after we undo vertical reorder
+ gantt.callEvent("onRowDragEnd", [command.value.id]);
+ }
+ }
+ });
+ };
+ return Undo;
+}());
+exports.Undo = Undo;
+
+
+/***/ }),
+
+/***/ "./sources/factory/make_instance_common.js":
+/*!*************************************************!*\
+ !*** ./sources/factory/make_instance_common.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function DHXGantt() {
+ this.constants = __webpack_require__(/*! ../constants */ "./sources/constants/index.js");
+ this.version = "8.0.6";
+ this.license = "gpl";
+ this.templates = {};
+ this.ext = {};
+ this.keys = {
+ edit_save: this.constants.KEY_CODES.ENTER,
+ edit_cancel: this.constants.KEY_CODES.ESC
+ };
+}
+
+module.exports = function (supportedExtensions) {
+ // use a named constructor to make gantt instance discoverable in heap snapshots
+ var gantt = new DHXGantt();
+
+ var ExtensionManager = __webpack_require__(/*! ../ext/extension_manager */ "./sources/ext/extension_manager.ts")["default"];
+
+ var extensionManager = new ExtensionManager(supportedExtensions);
+ var activePlugins = {};
+
+ gantt.plugins = function (config) {
+ for (var i in config) {
+ if (config[i] && !activePlugins[i]) {
+ var plugin = extensionManager.getExtension(i);
+
+ if (plugin) {
+ plugin(gantt);
+ activePlugins[i] = true;
+ }
+ }
+ }
+
+ return activePlugins;
+ };
+
+ gantt.$services = __webpack_require__(/*! ../core/common/services */ "./sources/core/common/services.js")();
+ gantt.config = __webpack_require__(/*! ../core/common/config */ "./sources/core/common/config.ts")();
+ gantt.ajax = __webpack_require__(/*! ../core/common/ajax */ "./sources/core/common/ajax.js")(gantt);
+ gantt.date = __webpack_require__(/*! ../core/common/date */ "./sources/core/common/date.js")(gantt);
+ gantt.RemoteEvents = __webpack_require__(/*! ../core/remote/remote_events */ "./sources/core/remote/remote_events.js").remoteEvents;
+
+ var dnd = __webpack_require__(/*! ../core/common/dnd */ "./sources/core/common/dnd.js")(gantt);
+
+ gantt.$services.setService("dnd", function () {
+ return dnd;
+ });
+
+ var templatesLoader = __webpack_require__(/*! ../core/common/templates */ "./sources/core/common/templates.js")(gantt);
+
+ gantt.$services.setService("templateLoader", function () {
+ return templatesLoader;
+ });
+
+ __webpack_require__(/*! ../utils/eventable */ "./sources/utils/eventable.js")(gantt);
+
+ var StateService = __webpack_require__(/*! ../core/common/state */ "./sources/core/common/state.js");
+
+ var stateService = new StateService();
+ stateService.registerProvider("global", function () {
+ var res = {
+ min_date: gantt._min_date,
+ max_date: gantt._max_date,
+ selected_task: null
+ }; // do not throw error if getState called from non-initialized gantt
+
+ if (gantt.$data && gantt.$data.tasksStore) {
+ res.selected_task = gantt.$data.tasksStore.getSelectedId();
+ }
+
+ return res;
+ });
+ gantt.getState = stateService.getState;
+ gantt.$services.setService("state", function () {
+ return stateService;
+ });
+
+ var utils = __webpack_require__(/*! ../utils/utils */ "./sources/utils/utils.js");
+
+ utils.mixin(gantt, utils);
+ gantt.Promise = __webpack_require__(/*! ../utils/promise */ "./sources/utils/promise.js");
+ gantt.env = __webpack_require__(/*! ../utils/env */ "./sources/utils/env.js");
+
+ __webpack_require__(/*! ../core/datastore/datastore_hooks */ "./sources/core/datastore/datastore_hooks.js")(gantt);
+
+ var DataProcessor = __webpack_require__(/*! ../core/dataprocessor */ "./sources/core/dataprocessor/index.js");
+
+ gantt.dataProcessor = DataProcessor.DEPRECATED_api;
+ gantt.createDataProcessor = DataProcessor.createDataProcessor;
+
+ __webpack_require__(/*! ../core/plugins */ "./sources/core/plugins/index.js")(gantt);
+
+ __webpack_require__(/*! ../core/dynamic_loading */ "./sources/core/dynamic_loading.js")(gantt);
+
+ __webpack_require__(/*! ../core/grid_column_api */ "./sources/core/grid_column_api.js")(gantt);
+
+ __webpack_require__(/*! ../core/tasks */ "./sources/core/tasks.js")(gantt);
+
+ __webpack_require__(/*! ../core/load */ "./sources/core/load.js")(gantt);
+
+ __webpack_require__(/*! ../core/worktime/work_time */ "./sources/core/worktime/work_time.js")(gantt);
+
+ __webpack_require__(/*! ../core/data */ "./sources/core/data.js")(gantt);
+
+ __webpack_require__(/*! ../publish_helpers/void_script_second */ "./sources/publish_helpers/void_script_second.ts")["default"](gantt);
+
+ __webpack_require__(/*! ../core/data_task_types */ "./sources/core/data_task_types.js")(gantt);
+
+ __webpack_require__(/*! ../core/cached_functions */ "./sources/core/cached_functions.js")(gantt);
+
+ __webpack_require__(/*! ../core/gantt_core */ "./sources/core/gantt_core.js")(gantt);
+
+ __webpack_require__(/*! ../core/destructor */ "./sources/core/destructor.js")(gantt);
+
+ __webpack_require__(/*! ../publish_helpers/void_script_third */ "./sources/publish_helpers/void_script_third.ts")["default"](gantt);
+
+ var i18n = __webpack_require__(/*! ../locale */ "./sources/locale/index.ts")["default"]();
+
+ gantt.i18n = {
+ addLocale: i18n.addLocale,
+ setLocale: function setLocale(locale) {
+ if (typeof locale === "string") {
+ var localeObject = i18n.getLocale(locale);
+
+ if (!localeObject) {
+ localeObject = i18n.getLocale("en");
+ }
+
+ gantt.locale = localeObject;
+ } else if (locale) {
+ if (!gantt.locale) {
+ gantt.locale = locale;
+ } else {
+ for (var i in locale) {
+ if (locale[i] && _typeof(locale[i]) === "object") {
+ if (!gantt.locale[i]) {
+ gantt.locale[i] = {};
+ }
+
+ gantt.mixin(gantt.locale[i], locale[i], true);
+ } else {
+ gantt.locale[i] = locale[i];
+ }
+ }
+ }
+ }
+ },
+ getLocale: i18n.getLocale
+ };
+ gantt.i18n.setLocale("en");
+ return gantt;
+};
+
+/***/ }),
+
+/***/ "./sources/factory/make_instance_web.js":
+/*!**********************************************!*\
+ !*** ./sources/factory/make_instance_web.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(/*! css/skins/terrace.less */ "./sources/css/skins/terrace.less");
+
+var factory = __webpack_require__(/*! ./make_instance_common */ "./sources/factory/make_instance_common.js");
+
+module.exports = function (supportedExtensions) {
+ var gantt = factory(supportedExtensions);
+
+ if (!gantt.env.isNode) {
+ __webpack_require__(/*! ../core/ui_core */ "./sources/core/ui_core.js")(gantt);
+ }
+
+ return gantt;
+};
+
+/***/ }),
+
+/***/ "./sources/locale/index.ts":
+/*!*********************************!*\
+ !*** ./sources/locale/index.ts ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale_ar_1 = __webpack_require__(/*! ./locale_ar */ "./sources/locale/locale_ar.ts");
+var locale_be_1 = __webpack_require__(/*! ./locale_be */ "./sources/locale/locale_be.ts");
+var locale_ca_1 = __webpack_require__(/*! ./locale_ca */ "./sources/locale/locale_ca.ts");
+var locale_cn_1 = __webpack_require__(/*! ./locale_cn */ "./sources/locale/locale_cn.ts");
+var locale_cs_1 = __webpack_require__(/*! ./locale_cs */ "./sources/locale/locale_cs.ts");
+var locale_da_1 = __webpack_require__(/*! ./locale_da */ "./sources/locale/locale_da.ts");
+var locale_de_1 = __webpack_require__(/*! ./locale_de */ "./sources/locale/locale_de.ts");
+var locale_el_1 = __webpack_require__(/*! ./locale_el */ "./sources/locale/locale_el.ts");
+var locale_en_1 = __webpack_require__(/*! ./locale_en */ "./sources/locale/locale_en.ts");
+var locale_es_1 = __webpack_require__(/*! ./locale_es */ "./sources/locale/locale_es.ts");
+var locale_fa_1 = __webpack_require__(/*! ./locale_fa */ "./sources/locale/locale_fa.ts");
+var locale_fi_1 = __webpack_require__(/*! ./locale_fi */ "./sources/locale/locale_fi.ts");
+var locale_fr_1 = __webpack_require__(/*! ./locale_fr */ "./sources/locale/locale_fr.ts");
+var locale_he_1 = __webpack_require__(/*! ./locale_he */ "./sources/locale/locale_he.ts");
+var locale_hr_1 = __webpack_require__(/*! ./locale_hr */ "./sources/locale/locale_hr.ts");
+var locale_hu_1 = __webpack_require__(/*! ./locale_hu */ "./sources/locale/locale_hu.ts");
+var locale_id_1 = __webpack_require__(/*! ./locale_id */ "./sources/locale/locale_id.ts");
+var locale_it_1 = __webpack_require__(/*! ./locale_it */ "./sources/locale/locale_it.ts");
+var locale_jp_1 = __webpack_require__(/*! ./locale_jp */ "./sources/locale/locale_jp.ts");
+var locale_kr_1 = __webpack_require__(/*! ./locale_kr */ "./sources/locale/locale_kr.ts");
+var locale_manager_1 = __webpack_require__(/*! ./locale_manager */ "./sources/locale/locale_manager.ts");
+var locale_nb_1 = __webpack_require__(/*! ./locale_nb */ "./sources/locale/locale_nb.ts");
+var locale_nl_1 = __webpack_require__(/*! ./locale_nl */ "./sources/locale/locale_nl.ts");
+var locale_no_1 = __webpack_require__(/*! ./locale_no */ "./sources/locale/locale_no.ts");
+var locale_pl_1 = __webpack_require__(/*! ./locale_pl */ "./sources/locale/locale_pl.ts");
+var locale_pt_1 = __webpack_require__(/*! ./locale_pt */ "./sources/locale/locale_pt.ts");
+var locale_ro_1 = __webpack_require__(/*! ./locale_ro */ "./sources/locale/locale_ro.ts");
+var locale_ru_1 = __webpack_require__(/*! ./locale_ru */ "./sources/locale/locale_ru.ts");
+var locale_si_1 = __webpack_require__(/*! ./locale_si */ "./sources/locale/locale_si.ts");
+var locale_sk_1 = __webpack_require__(/*! ./locale_sk */ "./sources/locale/locale_sk.ts");
+var locale_sv_1 = __webpack_require__(/*! ./locale_sv */ "./sources/locale/locale_sv.ts");
+var locale_tr_1 = __webpack_require__(/*! ./locale_tr */ "./sources/locale/locale_tr.ts");
+var locale_ua_1 = __webpack_require__(/*! ./locale_ua */ "./sources/locale/locale_ua.ts");
+function default_1() {
+ return new locale_manager_1.default({
+ en: locale_en_1.default,
+ ar: locale_ar_1.default,
+ be: locale_be_1.default,
+ ca: locale_ca_1.default,
+ cn: locale_cn_1.default,
+ cs: locale_cs_1.default,
+ da: locale_da_1.default,
+ de: locale_de_1.default,
+ el: locale_el_1.default,
+ es: locale_es_1.default,
+ fa: locale_fa_1.default,
+ fi: locale_fi_1.default,
+ fr: locale_fr_1.default,
+ he: locale_he_1.default,
+ hr: locale_hr_1.default,
+ hu: locale_hu_1.default,
+ id: locale_id_1.default,
+ it: locale_it_1.default,
+ jp: locale_jp_1.default,
+ kr: locale_kr_1.default,
+ nb: locale_nb_1.default,
+ nl: locale_nl_1.default,
+ no: locale_no_1.default,
+ pl: locale_pl_1.default,
+ pt: locale_pt_1.default,
+ ro: locale_ro_1.default,
+ ru: locale_ru_1.default,
+ si: locale_si_1.default,
+ sk: locale_sk_1.default,
+ sv: locale_sv_1.default,
+ tr: locale_tr_1.default,
+ ua: locale_ua_1.default
+ });
+}
+exports.default = default_1;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_ar.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_ar.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["賰丕賳賵賳 丕賱孬丕賳賷", "卮亘丕胤", "丌匕丕乇", "賳賷爻丕賳", "兀賷丕乇", "丨夭賷乇丕賳", "鬲賲賵夭", "丌亘", "兀賷賱賵賱", "鬲卮乇賷賳 丕賱兀賵賱", "鬲卮乇賷賳 丕賱孬丕賳賷", "賰丕賳賵賳 丕賱兀賵賱"],
+ month_short: ["賷賳丕賷乇", "賮亘乇丕賷乇", "賲丕乇爻", "兀亘乇賷賱", "賲丕賷賵", "賷賵賳賷賵", "賷賵賱賷賵", "兀睾爻胤爻", "爻亘鬲賲亘乇", "兀賰鬲賵亘乇", "賳賵賮賲亘乇", "丿賷爻賲亘乇"],
+ day_full: ["丕賱兀丨丿", "丕賱兀孬賳賷賳", "兀賱孬賱丕孬丕亍", "丕賱兀乇亘毓丕亍", "兀賱丨賲賷爻", "兀賱噩賲毓丞", "丕賱爻亘鬲"],
+ day_short: ["丕丨丿", "丕孬賳賷賳", "孬賱丕孬丕亍", "丕乇亘毓丕亍", "禺賲賷爻", "噩賲毓丞", "爻亘鬲"]
+ },
+ labels: {
+ new_task: "賲賴賲丞 噩丿賷丿",
+ icon_save: "丕禺夭賳",
+ icon_cancel: "丕賱睾丕亍",
+ icon_details: "鬲賮丕氐賷賱",
+ icon_edit: "鬲丨乇賷乇",
+ icon_delete: "丨匕賮",
+ confirm_closing: "丕賱鬲睾賷賷乇丕鬲 爻賵賮 鬲囟賷毓, 賴賱 丕賳鬲 賲鬲兀賰丿責",
+ confirm_deleting: "丕賱丨丿孬 爻賷鬲賲 丨匕賮賴丕 賳賴丕卅賷丕 貙 賴賱 兀賳鬲 賲鬲兀賰丿責",
+ section_description: "丕賱賵氐賮",
+ section_time: "丕賱賮鬲乇丞 丕賱夭賲賳賷丞",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "丕賱睾丕亍",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_be.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_be.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["小褌褍写蟹械薪褜", "袥褞褌褘", "小邪泻邪胁褨泻", "袣褉邪褋邪胁褨泻", "Ma泄", "效褝褉胁械薪褜", "袥褨锌械薪褜", "袞薪褨胁械薪褜", "袙械褉邪褋械薪褜", "袣邪褋褌褉褘褔薪褨泻", "袥褨褋褌邪锌邪写", "小薪械卸邪薪褜"],
+ month_short: ["小褌褍写蟹", "袥褞褌", "小邪泻", "袣褉邪褋", "Ma泄", "效褝褉", "袥褨锌", "袞薪褨胁", "袙械褉", "袣邪褋褌", "袥褨褋褌", "小薪械卸"],
+ day_full: ["袧褟写蟹械谢褟", "袩邪薪褟写蟹械谢邪泻", "袗褳褌芯褉邪泻", "小械褉邪写邪", "效邪褑胁械褉", "袩褟褌薪褨褑邪", "小褍斜芯褌邪"],
+ day_short: ["袧写", "袩薪", "袗褳褌", "小褉", "效褑胁", "袩褌", "小斜"]
+ },
+ labels: {
+ new_task: "袧芯胁邪械 蟹邪写邪薪薪械",
+ icon_save: "袟邪褏邪胁邪褑褜",
+ icon_cancel: "袗写屑褟薪褨褑褜",
+ icon_details: "袛褝褌邪谢褨",
+ icon_edit: "袟屑褟薪褨褑褜",
+ icon_delete: "袙褘写邪谢褨褑褜",
+ confirm_closing: "",
+ confirm_deleting: "袩邪写蟹械褟 斜褍写蟹械 胁褘写邪谢械薪邪 薪械蟹胁邪褉芯褌薪邪, 锌褉邪褑褟谐薪褍褑褜?",
+ section_description: "袗锌褨褋邪薪薪械",
+ section_time: "袩械褉褘褟写 褔邪褋褍",
+ section_type: "孝褘锌",
+ /* grid columns */
+ column_wbs: "袉小袪",
+ column_text: "袟邪写邪褔邪",
+ column_start_date: "袩邪褔邪褌邪泻",
+ column_duration: "袩褉邪褑褟谐",
+ column_add: "",
+ /* link confirmation */
+ link: "小褍胁褟蟹褜",
+ confirm_link_deleting: "斜褍写蟹械 胁褘写邪谢械薪邪",
+ link_start: "(锌邪褔邪褌邪泻)",
+ link_end: "(泻邪薪械褑)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "啸胁i谢i薪邪",
+ hours: "袚邪写蟹i薪邪",
+ days: "袛蟹械薪褜",
+ weeks: "孝褘写蟹械薪褜",
+ months: "袦械褋褟褑",
+ years: "袚芯写",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "袗写屑褟薪褨褑褜",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_ca.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_ca.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ @Traducido por Vicente Adria Bohigues - vicenteadria@hotmail.com
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Gener", "Febrer", "Mar莽", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"],
+ month_short: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"],
+ day_full: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"],
+ day_short: ["Dg", "Dl", "Dm", "Dc", "Dj", "Dv", "Ds"]
+ },
+ labels: {
+ new_task: "Nova tasca",
+ icon_save: "Guardar",
+ icon_cancel: "Cancel路lar",
+ icon_details: "Detalls",
+ icon_edit: "Editar",
+ icon_delete: "Esborrar",
+ confirm_closing: "",
+ confirm_deleting: "L'esdeveniment s'esborrar脿 definitivament, continuar ?",
+ section_description: "Descripci贸",
+ section_time: "Periode de temps",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Cancel路lar",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_cn.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_cn.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+Translation by FreezeSoul
+
+Update 26/10/2015:
+Translation of new labels by zwh8800
+ https://github.com/DHTMLX/gantt/pull/7
+
+*/
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀", "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"],
+ month_short: ["1鏈�", "2鏈�", "3鏈�", "4鏈�", "5鏈�", "6鏈�", "7鏈�", "8鏈�", "9鏈�", "10鏈�", "11鏈�", "12鏈�"],
+ day_full: ["鏄熸湡鏃�", "鏄熸湡涓�", "鏄熸湡浜�", "鏄熸湡涓�", "鏄熸湡鍥�", "鏄熸湡浜�", "鏄熸湡鍏�"],
+ day_short: ["鏃�", "涓�", "浜�", "涓�", "鍥�", "浜�", "鍏�"]
+ },
+ labels: {
+ new_task: "鏂颁换鍕�",
+ icon_save: "淇濆瓨",
+ icon_cancel: "鍏抽棴",
+ icon_details: "璇︾粏",
+ icon_edit: "缂栬緫",
+ icon_delete: "鍒犻櫎",
+ confirm_closing: "璇风‘璁ゆ槸鍚︽挙閿�淇敼!",
+ confirm_deleting: "鏄惁鍒犻櫎鏃ョ▼?",
+ section_description: "鎻忚堪",
+ section_time: "鏃堕棿鑼冨洿",
+ section_type: "绫诲瀷",
+ /* grid columns */
+ column_wbs: "宸ヤ綔鍒嗚В缁撴瀯",
+ column_text: "浠诲姟鍚�",
+ column_start_date: "寮�濮嬫椂闂�",
+ column_duration: "鎸佺画鏃堕棿",
+ column_add: "",
+ /* link confirmation */
+ link: "鍏宠仈",
+ confirm_link_deleting: "灏嗚鍒犻櫎",
+ link_start: " (寮�濮�)",
+ link_end: " (缁撴潫)",
+ type_task: "浠诲姟",
+ type_project: "椤圭洰",
+ type_milestone: "閲岀▼纰�",
+ minutes: "鍒嗛挓",
+ hours: "灏忔椂",
+ days: "澶�",
+ weeks: "鍛�",
+ months: "鏈�",
+ years: "骞�",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "鍏抽棴",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_cs.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_cs.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Leden", "脷nor", "B艡ezen", "Duben", "Kv臎ten", "膶erven", "膶ervenec", "Srpen", "Z谩艡铆", "艠铆jen", "Listopad", "Prosinec"],
+ month_short: ["Led", "脷n", "B艡e", "Dub", "Kv臎", "膶er", "膶ec", "Srp", "Z谩艡铆", "艠铆j", "List", "Pro"],
+ day_full: ["Ned臎le", "Pond臎l铆", "脷ter媒", "St艡eda", "膶tvrtek", "P谩tek", "Sobota"],
+ day_short: ["Ne", "Po", "脷t", "St", "膶t", "P谩", "So"]
+ },
+ labels: {
+ new_task: "Nov谩 pr谩ce",
+ icon_save: "Ulo啪it",
+ icon_cancel: "Zp臎t",
+ icon_details: "Detail",
+ icon_edit: "Edituj",
+ icon_delete: "Smazat",
+ confirm_closing: "",
+ confirm_deleting: "Ud谩lost bude trvale smaz谩na, opravdu?",
+ section_description: "Pozn谩mky",
+ section_time: "Doba platnosti",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Zp臎t",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_da.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_da.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["S酶ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L酶rdag"],
+ day_short: ["S酶n", "Man", "Tir", "Ons", "Tor", "Fre", "L酶r"]
+ },
+ labels: {
+ new_task: "Ny opgave",
+ icon_save: "Gem",
+ icon_cancel: "Fortryd",
+ icon_details: "Detaljer",
+ icon_edit: "Tilret",
+ icon_delete: "Slet",
+ confirm_closing: "Dine rettelser vil g氓 tabt.. Er dy sikker?",
+ confirm_deleting: "Bigivenheden vil blive slettet permanent. Er du sikker?",
+ section_description: "Beskrivelse",
+ section_time: "Tidsperiode",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Fortryd",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_de.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_de.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: [" Januar", " Februar", " M盲rz ", " April", " Mai", " Juni", " Juli", " August", " September ", " Oktober", " November ", " Dezember"],
+ month_short: ["Jan", "Feb", "M盲r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
+ day_full: ["Sonntag", "Montag", "Dienstag", " Mittwoch", " Donnerstag", "Freitag", "Samstag"],
+ day_short: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]
+ },
+ labels: {
+ new_task: "Neue Aufgabe",
+ icon_save: "Speichern",
+ icon_cancel: "Abbrechen",
+ icon_details: "Details",
+ icon_edit: "脛ndern",
+ icon_delete: "L枚schen",
+ confirm_closing: "",
+ confirm_deleting: "Der Eintrag wird gel枚scht",
+ section_description: "Beschreibung",
+ section_time: "Zeitspanne",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "PSP",
+ column_text: "Task-Namen",
+ column_start_date: "Startzeit",
+ column_duration: "Dauer",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "werden gel枚scht",
+ link_start: "(starten)",
+ link_end: "(ende)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minuten",
+ hours: "Stunden",
+ days: "Tage",
+ weeks: "Wochen",
+ months: "Monate",
+ years: "Jahre",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Abbrechen",
+ /* constraints */
+ section_constraint: "Regel",
+ constraint_type: "Regel",
+ constraint_date: "Regel - Datum",
+ asap: "So bald wie m枚glich",
+ alap: "So sp盲t wie m枚glich",
+ snet: "Beginn nicht vor",
+ snlt: "Beginn nicht sp盲ter als",
+ fnet: "Fertigstellung nicht vor",
+ fnlt: "Fertigstellung nicht sp盲ter als",
+ mso: "Muss beginnen am",
+ mfo: "Muss fertig sein am",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_el.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_el.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["螜伪谓慰蠀维蟻喂慰蟼", "桅蔚尾蟻慰蠀维蟻喂慰蟼", "螠维蟻蟿喂慰蟼", "螒蟺蟻委位喂慰蟼", "螠维蠆慰蟼", "螜慰蠉谓喂慰蟼", "螜慰蠉位喂慰蟼", "螒蠉纬慰蠀蟽蟿慰蟼", "危蔚蟺蟿苇渭尾蟻喂慰蟼", "螣魏蟿蠋尾蟻喂慰蟼", "螡慰苇渭尾蟻喂慰蟼", "螖蔚魏苇渭尾蟻喂慰蟼"],
+ month_short: ["螜螒螡", "桅螘螔", "螠螒巍", "螒螤巍", "螠螒螜", "螜螣违螡", "螜螣违螞", "螒违螕", "危螘螤", "螣螝韦", "螡螣螘", "螖螘螝"],
+ day_full: ["螝蠀蟻喂伪魏萎", "螖蔚蠀蟿苇蟻伪", "韦蟻委蟿畏", "韦蔚蟿维蟻蟿畏", "螤苇渭蟺蟿畏", "螤伪蟻伪蟽魏蔚蠀萎", "螝蠀蟻喂伪魏萎"],
+ day_short: ["螝违", "螖螘", "韦巍", "韦螘", "螤螘", "螤螒", "危螒"]
+ },
+ labels: {
+ new_task: "螡苇伪 蔚蟻纬伪蟽委伪",
+ icon_save: "螒蟺慰胃萎魏蔚蠀蟽畏",
+ icon_cancel: "螁魏蠀蟻慰",
+ icon_details: "螞蔚蟺蟿慰渭苇蟻蔚喂蔚蟼",
+ icon_edit: "螘蟺蔚尉蔚蟻纬伪蟽委伪",
+ icon_delete: "螖喂伪纬蟻伪蠁萎",
+ confirm_closing: "",
+ confirm_deleting: "韦慰 苇蟻纬慰 胃伪 未喂伪纬蟻伪蠁蔚委 慰蟻喂蟽蟿喂魏维. 螛苇位蔚蟿蔚 谓伪 蟽蠀谓蔚蠂委蟽蔚蟿蔚;",
+ section_description: "螤蔚蟻喂纬蟻伪蠁萎",
+ section_time: "围蟻慰谓喂魏萎 蟺蔚蟻委慰未慰蟼",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "螁魏蠀蟻慰",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_en.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_en.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ day_full: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ day_short: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
+ },
+ labels: {
+ new_task: "New task",
+ icon_save: "Save",
+ icon_cancel: "Cancel",
+ icon_details: "Details",
+ icon_edit: "Edit",
+ icon_delete: "Delete",
+ confirm_closing: "",
+ confirm_deleting: "Task will be deleted permanently, are you sure?",
+ section_description: "Description11",
+ section_time: "Time period",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Cancel",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_es.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_es.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ @Autor Manuel Fernandez Panzuela - www.mfernandez.es
+
+ Update 30/10/2015:
+ Translation of new labels by Jorge Macias
+ https://disqus.com/by/disqus_bTuZk1voC7/
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
+ month_short: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
+ day_full: ["Domingo", "Lunes", "Martes", "Mi茅rcoles", "Jueves", "Viernes", "S谩bado"],
+ day_short: ["Dom", "Lun", "Mar", "Mi茅", "Jue", "Vie", "S谩b"]
+ },
+ labels: {
+ new_task: "Nueva tarea",
+ icon_save: "Guardar",
+ icon_cancel: "Cancelar",
+ icon_details: "Detalles",
+ icon_edit: "Editar",
+ icon_delete: "Eliminar",
+ confirm_closing: "",
+ confirm_deleting: "El evento se borrar谩 definitivamente, 驴continuar?",
+ section_description: "Descripci贸n",
+ section_time: "Per铆odo",
+ section_type: "Tipo",
+ /* grid columns */
+ column_wbs: "EDT",
+ column_text: "Tarea",
+ column_start_date: "Inicio",
+ column_duration: "Duraci贸n",
+ column_add: "",
+ /* link confirmation */
+ link: "Enlace",
+ confirm_link_deleting: "ser谩 borrada",
+ link_start: " (inicio)",
+ link_end: " (fin)",
+ type_task: "Tarea",
+ type_project: "Proyecto",
+ type_milestone: "Hito",
+ minutes: "Minutos",
+ hours: "Horas",
+ days: "D铆as",
+ weeks: "Semanas",
+ months: "Meses",
+ years: "A帽os",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Cancelar",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_fa.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_fa.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ dhtmlxGantt Persian (Farsi, fa_IR) locale by Mohammad Shokri http://slashsbin.com/
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: [
+ "跇丕賳賵蹖賴",
+ "賮賵乇蹖賴",
+ "賲丕乇爻",
+ "丌賵乇蹖賱",
+ "賲賴",
+ "跇賵卅賳",
+ "跇賵卅蹖賴",
+ "丕賵鬲",
+ "爻倬鬲丕賲亘乇",
+ "丕讴鬲亘乇",
+ "賳賵丕賲亘乇",
+ "丿爻丕賲亘乇"
+ ],
+ month_short: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
+ day_full: [
+ "賷讴卮賳亘賴",
+ "丿賵卮賳亘賴",
+ "爻賴鈥屫促嗀ㄙ�",
+ "趩賴丕乇卮賳亘賴",
+ "倬賳噩卮賳亘賴",
+ "噩賲毓賴",
+ "卮賳亘賴"
+ ],
+ day_short: [
+ "蹖",
+ "丿",
+ "爻",
+ "趩",
+ "倬",
+ "噩",
+ "卮"
+ ]
+ },
+ labels: {
+ new_task: "賵馗蹖賮賴 噩丿蹖丿",
+ icon_save: "匕禺蹖乇賴",
+ icon_cancel: "賱睾賵",
+ icon_details: "噩夭蹖蹖丕鬲",
+ icon_edit: "賵蹖乇丕蹖卮",
+ icon_delete: "丨匕賮",
+ confirm_closing: "鬲睾蹖蹖乇丕鬲 卮賲丕 丕夭丿爻鬲 禺賵丕賴丿 乇賮鬲貙 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿責",
+ confirm_deleting: "丕蹖賳 賲賵乇丿 亘乇丕蹖 賴賲蹖卮賴 丨匕賮 禺賵丕賴丿 卮丿貙 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿責",
+ section_description: "鬲賵囟蹖丨丕鬲",
+ section_time: "賲丿鬲 夭賲丕賳",
+ section_type: "賳賵毓",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "毓賳賵丕賳",
+ column_start_date: "夭賲丕賳 卮乇賵毓",
+ column_duration: "賲丿鬲",
+ column_add: "",
+ /* link confirmation */
+ link: "丕乇鬲亘丕胤",
+ confirm_link_deleting: "丨匕賮 禺賵丕賴丿 卮丿",
+ link_start: " (丌睾丕夭)",
+ link_end: " (倬丕蹖丕賳)",
+ type_task: "賵馗蹖賮賴",
+ type_project: "倬乇賵跇賴",
+ type_milestone: "賳诏丕乇卮",
+ minutes: "丿賯丕蹖賯",
+ hours: "爻丕毓丕鬲",
+ days: "乇賵夭賴丕",
+ weeks: "賴賮鬲賴",
+ months: "賲丕賴鈥屬囏�",
+ years: "爻丕賱鈥屬囏�",
+ /* message popup */
+ message_ok: "鬲丕蹖蹖丿",
+ message_cancel: "賱睾賵",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_fi.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_fi.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"],
+ month_short: ["Tam", "Hel", "Maa", "Huh", "Tou", "Kes", "Hei", "Elo", "Syy", "Lok", "Mar", "Jou"],
+ day_full: ["Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai"],
+ day_short: ["Su", "Ma", "Ti", "Ke", "To", "Pe", "La"]
+ },
+ labels: {
+ new_task: "Uusi teht盲v盲",
+ icon_save: "Tallenna",
+ icon_cancel: "Peru",
+ icon_details: "Tiedot",
+ icon_edit: "Muokkaa",
+ icon_delete: "Poista",
+ confirm_closing: "",
+ confirm_deleting: "Haluatko varmasti poistaa tapahtuman?",
+ section_description: "Kuvaus",
+ section_time: "Aikajakso",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Peru",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_fr.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_fr.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Janvier", "F茅vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao没t", "Septembre", "Octobre", "Novembre", "D茅cembre"],
+ month_short: ["Jan", "F茅v", "Mar", "Avr", "Mai", "Juin", "Juil", "Ao没", "Sep", "Oct", "Nov", "D茅c"],
+ day_full: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
+ day_short: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"]
+ },
+ labels: {
+ new_task: "Nouvelle t芒che",
+ icon_save: "Enregistrer",
+ icon_cancel: "Annuler",
+ icon_details: "D茅tails",
+ icon_edit: "Modifier",
+ icon_delete: "Effacer",
+ confirm_closing: "",
+ confirm_deleting: "L'茅v茅nement sera effac茅 sans appel, 锚tes-vous s没r ?",
+ section_description: "Description22",
+ section_time: "P茅riode",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "OTP",
+ column_text: "Nom de la t芒che",
+ column_start_date: "Date initiale",
+ column_duration: "Dur茅e",
+ column_add: "",
+ /* link confirmation */
+ link: "Le lien",
+ confirm_link_deleting: "sera supprim茅",
+ link_start: "(d茅but)",
+ link_end: "(fin)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Heures",
+ days: "Jours",
+ weeks: "Semaines",
+ months: "Mois",
+ years: "Ann茅es",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Annuler",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_he.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_he.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["讬谞讜讗专", "驻讘专讜讗专", "诪专抓", "讗驻专讬诇", "诪讗讬", "讬讜谞讬", "讬讜诇讬", "讗讜讙讜住讟", "住驻讟诪讘专", "讗讜拽讟讜讘专", "谞讜讘诪讘专", "讚爪诪讘专"],
+ month_short: ["讬谞讜", "驻讘专", "诪专抓", "讗驻专", "诪讗讬", "讬讜谞", "讬讜诇", "讗讜讙", "住驻讟", "讗讜拽", "谞讜讘", "讚爪诪"],
+ day_full: ["专讗砖讜谉", "砖谞讬", "砖诇讬砖讬", "专讘讬注讬", "讞诪讬砖讬", "砖讬砖讬", "砖讘转"],
+ day_short: ["讗", "讘", "讙", "讚", "讛", "讜", "砖"]
+ },
+ labels: {
+ new_task: "诪砖讬诪讛 讞讚砖",
+ icon_save: "砖诪讜专",
+ icon_cancel: "讘讟诇",
+ icon_details: "驻专讟讬诐",
+ icon_edit: "注专讜讱",
+ icon_delete: "诪讞拽",
+ confirm_closing: "",
+ confirm_deleting: "讗专讜注 讬诪讞拽 住讜驻讬转.诇讛诪砖讬讱?",
+ section_description: "讛住讘专",
+ section_time: "转拽讜驻讛",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "讘讟诇",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_hr.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_hr.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ Translation by Davor
+ http://docs.dhtmlx.com/gantt/desktop__localization.html#comment-2569116291
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Sije膷anj", "Velja膷a", "O啪ujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"],
+ month_short: ["Sij", "Velj", "O啪u", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"],
+ day_full: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "膶etvrtak", "Petak", "Subota"],
+ day_short: ["Ned", "Pon", "Uto", "Sri", "膶et", "Pet", "Sub"]
+ },
+ labels: {
+ new_task: "Novi Zadatak",
+ icon_save: "Spremi",
+ icon_cancel: "Odustani",
+ icon_details: "Detalji",
+ icon_edit: "Izmjeni",
+ icon_delete: "Obri拧i",
+ confirm_closing: "",
+ confirm_deleting: "Zadatak 膰e biti trajno izbrisan, jeste li sigurni?",
+ section_description: "Opis",
+ section_time: "Vremenski Period",
+ section_type: "Tip",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Naziv Zadatka",
+ column_start_date: "Po膷etno Vrijeme",
+ column_duration: "Trajanje",
+ column_add: "",
+ /* link confirmation */
+ link: "Poveznica",
+ confirm_link_deleting: "膰e biti izbrisan",
+ link_start: " (po膷etak)",
+ link_end: " (kraj)",
+ type_task: "Zadatak",
+ type_project: "Projekt",
+ type_milestone: "Milestone",
+ minutes: "Minute",
+ hours: "Sati",
+ days: "Dani",
+ weeks: "Tjedni",
+ months: "Mjeseci",
+ years: "Godine",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Odustani",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_hu.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_hu.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Janu谩r", "Febru谩r", "M谩rcius", "脕prilis", "M谩jus", "J煤nius", "J煤lius", "Augusztus", "Szeptember", "Okt贸ber", "November", "December"],
+ month_short: ["Jan", "Feb", "M谩r", "脕pr", "M谩j", "J煤n", "J煤l", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["Vas谩rnap", "H茅tf玫", "Kedd", "Szerda", "Cs眉t枚rt枚k", "P茅ntek", "szombat"],
+ day_short: ["Va", "H茅", "Ke", "Sze", "Cs眉", "P茅", "Szo"]
+ },
+ labels: {
+ new_task: "脷j feladat",
+ icon_save: "Ment茅s",
+ icon_cancel: "M茅gse",
+ icon_details: "R茅szletek",
+ icon_edit: "Szerkeszt茅s",
+ icon_delete: "T枚rl茅s",
+ confirm_closing: "",
+ confirm_deleting: "Az esem茅ny t枚r枚lve lesz, biztosan folytatja?",
+ section_description: "Le铆r谩s",
+ section_time: "Id玫szak",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "M茅gse",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_id.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_id.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"],
+ day_full: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"],
+ day_short: ["Ming", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"]
+ },
+ labels: {
+ new_task: "Tugas baru",
+ icon_save: "Simpan",
+ icon_cancel: "Batal",
+ icon_details: "Detail",
+ icon_edit: "Edit",
+ icon_delete: "Hapus",
+ confirm_closing: "",
+ confirm_deleting: "Acara akan dihapus",
+ section_description: "Keterangan",
+ section_time: "Periode",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Batal",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_it.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_it.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ Update 29/12/2015:
+ New labels translation by ARCANGELI CLAUDIO
+
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
+ month_short: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
+ day_full: ["Domenica", "Luned矛", "Marted矛", "Mercoled矛", "Gioved矛", "Venerd矛", "Sabato"],
+ day_short: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"]
+ },
+ labels: {
+ new_task: "Nuovo compito",
+ icon_save: "Salva",
+ icon_cancel: "Chiudi",
+ icon_details: "Dettagli",
+ icon_edit: "Modifica",
+ icon_delete: "Elimina",
+ confirm_closing: "",
+ confirm_deleting: "Sei sicuro di confermare l'eliminazione?",
+ section_description: "Descrizione",
+ section_time: "Periodo di tempo",
+ section_type: "Tipo",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Nome Attivit脿",
+ column_start_date: "Inizio",
+ column_duration: "Durata",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "sar脿 eliminato",
+ link_start: " (inizio)",
+ link_end: " (fine)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minuti",
+ hours: "Ore",
+ days: "Giorni",
+ weeks: "Settimane",
+ months: "Mesi",
+ years: "Anni",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Chiudi",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_jp.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_jp.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ Translation by Genexus Japan Inc.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["1鏈�", "2鏈�", "3鏈�", "4鏈�", "5鏈�", "6鏈�", "7鏈�", "8鏈�", "9鏈�", "10鏈�", "11鏈�", "12鏈�"],
+ month_short: ["1鏈�", "2鏈�", "3鏈�", "4鏈�", "5鏈�", "6鏈�", "7鏈�", "8鏈�", "9鏈�", "10鏈�", "11鏈�", "12鏈�"],
+ day_full: ["鏃ユ洔鏃�", "鏈堟洔鏃�", "鐏洔鏃�", "姘存洔鏃�", "鏈ㄦ洔鏃�", "閲戞洔鏃�", "鍦熸洔鏃�"],
+ day_short: ["鏃�", "鏈�", "鐏�", "姘�", "鏈�", "閲�", "鍦�"]
+ },
+ labels: {
+ new_task: "鏂般仐銇勪粫浜�",
+ icon_save: "淇濆瓨",
+ icon_cancel: "銈儯銉炽偦銉�",
+ icon_details: "瑭崇窗",
+ icon_edit: "绶ㄩ泦",
+ icon_delete: "鍓婇櫎",
+ confirm_closing: "",
+ confirm_deleting: "銈ゃ儥銉炽儓瀹屽叏銇墛闄ゃ仌銈屻伨銇欍�佸疁銇椼亜銇с仚銇嬶紵",
+ section_description: "銉囥偣銈儶銉椼偡銉с兂",
+ section_time: "鏈熼枔",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "銈儯銉炽偦銉�",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_kr.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_kr.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ Translated by cjkim@dbvalley.com
+*/
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["1鞗�", "2鞗�", "3鞗�", "4鞗�", "5鞗�", "6鞗�", "7鞗�", "8鞗�", "9鞗�", "10鞗�", "11鞗�", "12鞗�"],
+ month_short: ["1鞗�", "2鞗�", "3鞗�", "4鞗�", "5鞗�", "6鞗�", "7鞗�", "8鞗�", "9鞗�", "10鞗�", "11鞗�", "12鞗�"],
+ day_full: ["鞚检殧鞚�", "鞗旍殧鞚�", "頇旍殧鞚�", "靾橃殧鞚�", "氇╈殧鞚�", "旮堨殧鞚�", "韱犾殧鞚�"],
+ day_short: ["鞚�", "鞗�", "頇�", "靾�", "氇�", "旮�", "韱�"]
+ },
+ labels: {
+ new_task: "鞚措鞐嗠姅 鞛戩梾",
+ icon_save: "鞝�鞛�",
+ icon_cancel: "旆唽",
+ icon_details: "靹鸽秬 靷暛",
+ icon_edit: "靾橃爼",
+ icon_delete: "靷牅",
+ confirm_closing: "",
+ confirm_deleting: "鞛戩梾鞚� 靷牅頃橃嫓瓴犾姷雼堦箤?",
+ section_description: "靹る獏",
+ section_time: "旮瓣皠",
+ section_type: "Type",
+ column_wbs: "WBS",
+ column_text: "鞛戩梾氇�",
+ column_start_date: "鞁滌瀾鞚�",
+ column_duration: "旮瓣皠",
+ column_add: "",
+ link: "鞝勳牅",
+ confirm_link_deleting: "靷牅 頃橃嫓瓴犾姷雼堦箤?",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "鞛戩梾",
+ type_project: "頂勲鞝濏姼",
+ type_milestone: "毵堨澕鞀ろ啢",
+ minutes: "攵�",
+ hours: "鞁滉皠",
+ days: "鞚�",
+ weeks: "欤�",
+ months: "雼�",
+ years: "雲�",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "旆唽",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_manager.ts":
+/*!******************************************!*\
+ !*** ./sources/locale/locale_manager.ts ***!
+ \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var LocaleManager = /** @class */ (function () {
+ function LocaleManager(config) {
+ var _this = this;
+ this.addLocale = function (name, locale) {
+ _this._locales[name] = locale;
+ };
+ this.getLocale = function (name) {
+ return _this._locales[name];
+ };
+ this._locales = {};
+ for (var i in config) {
+ this._locales[i] = config[i];
+ }
+ }
+ return LocaleManager;
+}());
+exports.default = LocaleManager;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_nb.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_nb.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
+ day_full: ["S酶ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L酶rdag"],
+ day_short: ["S酶n", "Mon", "Tir", "Ons", "Tor", "Fre", "L酶r"]
+ },
+ labels: {
+ new_task: "Ny oppgave",
+ icon_save: "Lagre",
+ icon_cancel: "Avbryt",
+ icon_details: "Detaljer",
+ icon_edit: "Rediger",
+ icon_delete: "Slett",
+ confirm_closing: "",
+ confirm_deleting: "Hendelsen vil bli slettet permanent. Er du sikker?",
+ section_description: "Beskrivelse",
+ section_time: "Tidsperiode",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Avbryt",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_nl.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_nl.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"],
+ day_short: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"]
+ },
+ labels: {
+ new_task: "Nieuwe taak",
+ icon_save: "Opslaan",
+ icon_cancel: "Annuleren",
+ icon_details: "Details",
+ icon_edit: "Bewerken",
+ icon_delete: "Verwijderen",
+ confirm_closing: "",
+ confirm_deleting: "Item zal permanent worden verwijderd, doorgaan?",
+ section_description: "Beschrijving",
+ section_time: "Tijd periode",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Taak omschrijving",
+ column_start_date: "Startdatum",
+ column_duration: "Duur",
+ column_add: "",
+ /* link confirmation */
+ link: "Koppeling",
+ confirm_link_deleting: "zal worden verwijderd",
+ link_start: " (start)",
+ link_end: " (eind)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "minuten",
+ hours: "uren",
+ days: "dagen",
+ weeks: "weken",
+ months: "maanden",
+ years: "jaren",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Annuleren",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_no.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_no.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
+ day_full: ["S酶ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L酶rdag"],
+ day_short: ["S酶n", "Man", "Tir", "Ons", "Tor", "Fre", "L酶r"]
+ },
+ labels: {
+ new_task: "Ny oppgave",
+ icon_save: "Lagre",
+ icon_cancel: "Avbryt",
+ icon_details: "Detaljer",
+ icon_edit: "Endre",
+ icon_delete: "Slett",
+ confirm_closing: "Endringer blir ikke lagret, er du sikker?",
+ confirm_deleting: "Oppf酶ringen vil bli slettet, er du sikker?",
+ section_description: "Beskrivelse",
+ section_time: "Tidsperiode",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Avbryt",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_pl.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_pl.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Stycze艅", "Luty", "Marzec", "Kwiecie艅", "Maj", "Czerwiec", "Lipiec", "Sierpie艅", "Wrzesie艅", "Pa藕dziernik", "Listopad", "Grudzie艅"],
+ month_short: ["Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Pa藕", "Lis", "Gru"],
+ day_full: ["Niedziela", "Poniedzia艂ek", "Wtorek", "艢roda", "Czwartek", "Pi膮tek", "Sobota"],
+ day_short: ["Nie", "Pon", "Wto", "艢ro", "Czw", "Pi膮", "Sob"]
+ },
+ labels: {
+ new_task: "Nowe zadanie",
+ icon_save: "Zapisz",
+ icon_cancel: "Anuluj",
+ icon_details: "Szczeg贸艂y",
+ icon_edit: "Edytuj",
+ icon_delete: "Usu艅",
+ confirm_closing: "",
+ confirm_deleting: "Zdarzenie zostanie usuni臋te na zawsze, kontynuowa膰?",
+ section_description: "Opis",
+ section_time: "Okres czasu",
+ section_type: "Typ",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Nazwa zadania",
+ column_start_date: "Pocz膮tek",
+ column_duration: "Czas trwania",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "zostanie usuni臋ty",
+ link_start: " (pocz膮tek)",
+ link_end: " (koniec)",
+ type_task: "Zadanie",
+ type_project: "Projekt",
+ type_milestone: "Milestone",
+ minutes: "Minuty",
+ hours: "Godziny",
+ days: "Dni",
+ weeks: "Tydzie艅",
+ months: "Miesi膮ce",
+ years: "Lata",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Anuluj",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_pt.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_pt.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+
+ TRANSLATION BY MATTHEUS PIROVANI RORIZ GON袟ALVES
+
+ mattheusroriz@hotmail.com / mattheus.pirovani@gmail.com /
+
+ www.atrixian.com.br
+
+
+ Updated by Jorge Albernaz Martins
+
+ jorgefox@hotmail.com
+
+ www.redfox.inf.br
+
+ JorgeFox
+
+*/
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Janeiro", "Fevereiro", "Mar莽o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
+ month_short: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
+ day_full: ["Domingo", "Segunda", "Ter莽a", "Quarta", "Quinta", "Sexta", "S谩bado"],
+ day_short: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"]
+ },
+ labels: {
+ new_task: "Nova tarefa",
+ icon_save: "Salvar",
+ icon_cancel: "Cancelar",
+ icon_details: "Detalhes",
+ icon_edit: "Editar",
+ icon_delete: "Excluir",
+ confirm_closing: "",
+ confirm_deleting: "As tarefas ser茫o excluidas permanentemente, confirme?",
+ section_description: "Descri莽茫o",
+ section_time: "Per铆odo",
+ section_type: "Tipo",
+ /* grid columns */
+ column_wbs: "EAP",
+ column_text: "Nome tarefa",
+ column_start_date: "Data in铆cio",
+ column_duration: "Dura莽茫o",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "Ser谩 exclu铆do!",
+ link_start: " (in铆cio)",
+ link_end: " (fim)",
+ type_task: "Task",
+ type_project: "Projeto",
+ type_milestone: "Marco",
+ minutes: "Minutos",
+ hours: "Horas",
+ days: "Dias",
+ weeks: "Semanas",
+ months: "Meses",
+ years: "Anos",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Cancelar",
+ /* constraints */
+ section_constraint: "Restri莽茫o",
+ constraint_type: "Tipo Restri莽茫o",
+ constraint_date: "Data restri莽茫o",
+ asap: "Mais breve poss铆vel",
+ alap: "Mais tarde poss铆vel",
+ snet: "N茫o come莽ar antes de",
+ snlt: "N茫o come莽ar depois de",
+ fnet: "N茫o terminar antes de",
+ fnlt: "N茫o terminar depois de",
+ mso: "Precisa come莽ar em",
+ mfo: "Precisa terminar em",
+ /* resource control */
+ resources_filter_placeholder: "Tipo de filtros",
+ resources_filter_label: "Ocultar vazios",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_ro.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_ro.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ Traducere de Ovidiu Lixandru: http://www.madball.ro
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "November", "December"],
+ month_short: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ day_full: ["Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata"],
+ day_short: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sa"]
+ },
+ labels: {
+ new_task: "Sarcina noua",
+ icon_save: "Salveaza",
+ icon_cancel: "Anuleaza",
+ icon_details: "Detalii",
+ icon_edit: "Editeaza",
+ icon_delete: "Sterge",
+ confirm_closing: "Schimbarile nu vor fi salvate, esti sigur?",
+ confirm_deleting: "Evenimentul va fi sters permanent, esti sigur?",
+ section_description: "Descriere",
+ section_time: "Interval",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Anuleaza",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_ru.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_ru.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["携薪胁邪褉褜", "肖械胁褉邪谢褜", "袦邪褉褌", "袗锌褉械谢褜", "Ma泄", "袠褞薪褜", "袠褞谢褜", "袗胁谐褍褋褌", "小械薪褌褟斜褉褜", "O泻褌褟斜褉褜", "袧芯褟斜褉褜", "袛械泻邪斜褉褜"],
+ month_short: ["携薪胁", "肖械胁", "Ma褉", "A锌褉", "Ma泄", "袠褞薪", "袠褞谢", "A胁谐", "小械薪", "袨泻褌", "袧芯褟", "袛械泻"],
+ day_full: ["袙芯褋泻褉械褋械薪褜械", "袩芯薪械写械谢褜薪懈泻", "袙褌芯褉薪懈泻", "小褉械写邪", "效械褌胁械褉谐", "袩褟褌薪懈褑邪", "小褍斜斜芯褌邪"],
+ day_short: ["袙褋", "袩薪", "袙褌", "小褉", "效褌", "袩褌", "小斜"]
+ },
+ labels: {
+ new_task: "袧芯胁芯械 蟹邪写邪薪懈械",
+ icon_save: "小芯褏褉邪薪懈褌褜",
+ icon_cancel: "袨褌屑械薪懈褌褜",
+ icon_details: "袛械褌邪谢懈",
+ icon_edit: "袠蟹屑械薪懈褌褜",
+ icon_delete: "校写邪谢懈褌褜",
+ confirm_closing: "",
+ confirm_deleting: "小芯斜褘褌懈械 斜褍写械褌 褍写邪谢械薪芯 斜械蟹胁芯蟹胁褉邪褌薪芯, 锌褉芯写芯谢卸懈褌褜?",
+ section_description: "袨锌懈褋邪薪懈械",
+ section_time: "袩械褉懈芯写 胁褉械屑械薪懈",
+ section_type: "孝懈锌",
+ /* grid columns */
+ column_wbs: "袠小袪",
+ column_text: "袟邪写邪褔邪",
+ column_start_date: "袧邪褔邪谢芯",
+ column_duration: "袛谢懈褌械谢褜薪芯褋褌褜",
+ column_add: "",
+ /* link confirmation */
+ link: "小胁褟蟹褜",
+ confirm_link_deleting: "斜褍写械褌 褍写邪谢械薪邪",
+ link_start: " (薪邪褔邪谢芯)",
+ link_end: " (泻芯薪械褑)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "袦懈薪褍褌邪",
+ hours: "效邪褋",
+ days: "袛械薪褜",
+ weeks: "袧械写械谢褟",
+ months: "袦械褋褟褑",
+ years: "袚芯写",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "袨褌屑械薪懈褌褜",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "薪邪褔薪懈褌械 胁胁芯写懈褌褜 褋谢芯胁芯 写谢褟 褎懈谢褜褌褉邪褑懈懈",
+ resources_filter_label: "褋锌褉褟褌邪褌褜 薪械 褍褋褌邪薪芯胁谢械薪薪褘械",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_si.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_si.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "膶etrtek", "Petek", "Sobota"],
+ day_short: ["Ned", "Pon", "Tor", "Sre", "膶et", "Pet", "Sob"]
+ },
+ labels: {
+ new_task: "Nova naloga",
+ icon_save: "Shrani",
+ icon_cancel: "Prekli膷i",
+ icon_details: "Podrobnosti",
+ icon_edit: "Uredi",
+ icon_delete: "Izbri拧i",
+ confirm_closing: "",
+ confirm_deleting: "Dogodek bo izbrisan. 沤elite nadaljevati?",
+ section_description: "Opis",
+ section_time: "膶asovni okvir",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Prekli膷i",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_sk.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_sk.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["Janu谩r", "Febru谩r", "Marec", "Apr铆l", "M谩j", "J煤n", "J煤l", "August", "September", "Okt贸ber", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "M谩j", "J煤n", "J煤l", "Aug", "Sept", "Okt", "Nov", "Dec"],
+ day_full: ["Nede木a", "Pondelok", "Utorok", "Streda", "艩tvrtok", "Piatok", "Sobota"],
+ day_short: ["Ne", "Po", "Ut", "St", "艩t", "Pi", "So"]
+ },
+ labels: {
+ new_task: "Nov谩 煤loha",
+ icon_save: "Ulo啪i钮",
+ icon_cancel: "Sp盲钮",
+ icon_details: "Detail",
+ icon_edit: "Edituj",
+ icon_delete: "Zmaza钮",
+ confirm_closing: "Va拧e zmeny nebud煤 ulo啪en茅. Skuto膷ne?",
+ confirm_deleting: "Udalos钮 bude natrvalo vymazan谩. Skuto膷ne?",
+ section_description: "Pozn谩mky",
+ section_time: "Doba platnosti",
+ section_type: "Type",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Sp盲钮",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_sv.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_sv.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+/*
+ Translation by Peter Eriksson
+ */
+var locale = {
+ date: {
+ month_full: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"],
+ month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
+ day_full: ["S枚ndag", "M氓ndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "L枚rdag"],
+ day_short: ["S枚n", "M氓n", "Tis", "Ons", "Tor", "Fre", "L枚r"]
+ },
+ labels: {
+ new_task: "Ny uppgift",
+ icon_save: "Spara",
+ icon_cancel: "Avbryt",
+ icon_details: "Detajer",
+ icon_edit: "脛ndra",
+ icon_delete: "Ta bort",
+ confirm_closing: "",
+ confirm_deleting: "脛r du s盲ker p氓 att du vill ta bort h盲ndelsen permanent?",
+ section_description: "Beskrivning",
+ section_time: "Tid",
+ section_type: "Typ",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Uppgiftsnamn",
+ column_start_date: "Starttid",
+ column_duration: "Varaktighet",
+ column_add: "",
+ /* link confirmation */
+ link: "L盲nk",
+ confirm_link_deleting: "kommer tas bort",
+ link_start: " (start)",
+ link_end: " (slut)",
+ type_task: "Uppgift",
+ type_project: "Projekt",
+ type_milestone: "Milstolpe",
+ minutes: "Minuter",
+ hours: "Timmar",
+ days: "Dagar",
+ weeks: "Veckor",
+ months: "M氓nader",
+ years: "脜r",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "Avbryt",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_tr.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_tr.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+/*
+ * updated by @levkar at https://github.com/DHTMLX/gantt/pull/10
+ */
+var locale = {
+ date: {
+ month_full: ["Ocak", "艦ubat", "Mart", "Nisan", "May谋s", "Haziran", "Temmuz", "A臒ustos", "Eyl眉l", "Ekim", "Kas谋m", "Aral谋k"],
+ month_short: ["Oca", "艦ub", "Mar", "Nis", "May", "Haz", "Tem", "A臒u", "Eyl", "Eki", "Kas", "Ara"],
+ day_full: ["Pazar", "Pazartesi", "Sal谋", "脟ar艧amba", "Per艧embe", "Cuma", "Cumartesi"],
+ day_short: ["Paz", "Pzt", "Sal", "脟ar", "Per", "Cum", "Cmt"]
+ },
+ labels: {
+ new_task: "Yeni g枚rev",
+ icon_save: "Kaydet",
+ icon_cancel: "陌ptal",
+ icon_details: "Detaylar",
+ icon_edit: "D眉zenle",
+ icon_delete: "Sil",
+ confirm_closing: "",
+ confirm_deleting: "G枚rev silinecek, emin misiniz?",
+ section_description: "A莽谋klama",
+ section_time: "Zaman Aral谋臒谋",
+ section_type: "Tip",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "G枚rev Ad谋",
+ column_start_date: "Ba艧lang谋莽",
+ column_duration: "S眉re",
+ column_add: "",
+ /* link confirmation */
+ link: "Ba臒lant谋",
+ confirm_link_deleting: "silinecek",
+ link_start: " (ba艧lang谋莽)",
+ link_end: " (biti艧)",
+ type_task: "G枚rev",
+ type_project: "Proje",
+ type_milestone: "Kilometreta艧谋",
+ minutes: "Dakika",
+ hours: "Saat",
+ days: "G眉n",
+ weeks: "Hafta",
+ months: "Ay",
+ years: "Y谋l",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "脻ptal",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/locale/locale_ua.ts":
+/*!*************************************!*\
+ !*** ./sources/locale/locale_ua.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var locale = {
+ date: {
+ month_full: ["小褨褔械薪褜", "袥褞褌懈泄", "袘械褉械蟹械薪褜", "袣胁褨褌械薪褜", "孝褉邪胁械薪褜", "效械褉胁械薪褜", "袥懈锌械薪褜", "小械褉锌械薪褜", "袙械褉械褋械薪褜", "袞芯胁褌械薪褜", "袥懈褋褌芯锌邪写", "袚褉褍写械薪褜"],
+ month_short: ["小褨褔", "袥褞褌", "袘械褉", "袣胁褨", "孝褉邪", "效械褉", "袥懈锌", "小械褉", "袙械褉", "袞芯胁", "袥懈褋", "袚褉褍"],
+ day_full: ["袧械写褨谢褟", "袩芯薪械写褨谢芯泻", "袙褨胁褌芯褉芯泻", "小械褉械写邪", "效械褌胁械褉", "袩'褟褌薪懈褑褟", "小褍斜芯褌邪"],
+ day_short: ["袧械写", "袩芯薪", "袙褨胁", "小械褉", "效械褌", "袩褌薪", "小褍斜"]
+ },
+ labels: {
+ new_task: "袧芯胁械 蟹邪胁写邪薪薪褟",
+ icon_save: "袟斜械褉械谐褌懈",
+ icon_cancel: "袙褨写屑褨薪邪",
+ icon_details: "袛械褌邪谢褨",
+ icon_edit: "袪械写邪谐褍胁邪褌懈",
+ icon_delete: "袙懈谢褍褔懈褌懈",
+ confirm_closing: "",
+ confirm_deleting: "袩芯写褨褟 胁懈谢褍褔懈褌褜褋褟 薪邪蟹邪胁卸写懈. 袙懈 胁锌械胁薪械薪褨?",
+ section_description: "袨锌懈褋",
+ section_time: "效邪褋芯胁懈泄 锌褉芯屑褨卸芯泻",
+ section_type: "孝懈锌",
+ /* grid columns */
+ column_wbs: "WBS",
+ column_text: "Task name",
+ column_start_date: "Start time",
+ column_duration: "Duration",
+ column_add: "",
+ /* link confirmation */
+ link: "Link",
+ confirm_link_deleting: "will be deleted",
+ link_start: " (start)",
+ link_end: " (end)",
+ type_task: "Task",
+ type_project: "Project",
+ type_milestone: "Milestone",
+ minutes: "Minutes",
+ hours: "Hours",
+ days: "Days",
+ weeks: "Week",
+ months: "Months",
+ years: "Years",
+ /* message popup */
+ message_ok: "OK",
+ message_cancel: "袙褨写屑褨薪邪",
+ /* constraints */
+ section_constraint: "Constraint",
+ constraint_type: "Constraint type",
+ constraint_date: "Constraint date",
+ asap: "As Soon As Possible",
+ alap: "As Late As Possible",
+ snet: "Start No Earlier Than",
+ snlt: "Start No Later Than",
+ fnet: "Finish No Earlier Than",
+ fnlt: "Finish No Later Than",
+ mso: "Must Start On",
+ mfo: "Must Finish On",
+ /* resource control */
+ resources_filter_placeholder: "type to filter",
+ resources_filter_label: "hide empty",
+ /* empty state screen */
+ empty_state_text_link: "Click here",
+ empty_state_text_description: "to create your first task"
+ }
+};
+exports.default = locale;
+
+
+/***/ }),
+
+/***/ "./sources/publish_helpers/void_script_second.ts":
+/*!*******************************************************!*\
+ !*** ./sources/publish_helpers/void_script_second.ts ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+// all builds except for evaluation version get this mockup
+// the evaluation build gets actual codes
+exports.default = (function () { });
+
+
+/***/ }),
+
+/***/ "./sources/publish_helpers/void_script_third.ts":
+/*!******************************************************!*\
+ !*** ./sources/publish_helpers/void_script_third.ts ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+// all builds except for evaluation version get this mockup
+// the evaluation build gets actual codes
+exports.default = (function () { });
+
+
+/***/ }),
+
+/***/ "./sources/utils/env.js":
+/*!******************************!*\
+ !*** ./sources/utils/env.js ***!
+ \******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* eslint-disable no-restricted-globals */
+var isWindowAwailable = typeof window !== "undefined";
+/* eslint-enable no-restricted-globals */
+
+var env = {
+ isIE: isWindowAwailable && (navigator.userAgent.indexOf("MSIE") >= 0 || navigator.userAgent.indexOf("Trident") >= 0),
+ isIE6: isWindowAwailable && !XMLHttpRequest && navigator.userAgent.indexOf("MSIE") >= 0,
+ isIE7: isWindowAwailable && navigator.userAgent.indexOf("MSIE 7.0") >= 0 && navigator.userAgent.indexOf("Trident") < 0,
+ isIE8: isWindowAwailable && navigator.userAgent.indexOf("MSIE 8.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0,
+ isOpera: isWindowAwailable && navigator.userAgent.indexOf("Opera") >= 0,
+ isChrome: isWindowAwailable && navigator.userAgent.indexOf("Chrome") >= 0,
+ isKHTML: isWindowAwailable && (navigator.userAgent.indexOf("Safari") >= 0 || navigator.userAgent.indexOf("Konqueror") >= 0),
+ isFF: isWindowAwailable && navigator.userAgent.indexOf("Firefox") >= 0,
+ isIPad: isWindowAwailable && navigator.userAgent.search(/iPad/gi) >= 0,
+ isEdge: isWindowAwailable && navigator.userAgent.indexOf("Edge") != -1,
+ isNode: !isWindowAwailable || typeof navigator == "undefined"
+};
+module.exports = env;
+
+/***/ }),
+
+/***/ "./sources/utils/eventable.js":
+/*!************************************!*\
+ !*** ./sources/utils/eventable.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var EventHost = function EventHost() {
+ this._silent_mode = false;
+ this.listeners = {};
+};
+
+EventHost.prototype = {
+ _silentStart: function _silentStart() {
+ this._silent_mode = true;
+ },
+ _silentEnd: function _silentEnd() {
+ this._silent_mode = false;
+ }
+};
+
+var createEventStorage = function createEventStorage(obj) {
+ var handlers = {};
+ var index = 0;
+
+ var eventStorage = function eventStorage() {
+ var combinedResult = true;
+
+ for (var i in handlers) {
+ var handlerResult = handlers[i].apply(obj, arguments);
+ combinedResult = combinedResult && handlerResult;
+ }
+
+ return combinedResult;
+ };
+
+ eventStorage.addEvent = function (handler, settings) {
+ if (typeof handler == "function") {
+ var handlerId;
+
+ if (settings && settings.id) {
+ handlerId = settings.id;
+ } else {
+ handlerId = index;
+ index++;
+ }
+
+ if (settings && settings.once) {
+ var originalHandler = handler;
+
+ handler = function handler() {
+ originalHandler();
+ eventStorage.removeEvent(handlerId);
+ };
+ }
+
+ handlers[handlerId] = handler;
+ return handlerId;
+ }
+
+ return false;
+ };
+
+ eventStorage.removeEvent = function (id) {
+ delete handlers[id];
+ };
+
+ eventStorage.clear = function () {
+ handlers = {};
+ };
+
+ return eventStorage;
+};
+
+function makeEventable(obj) {
+ var eventHost = new EventHost();
+
+ obj.attachEvent = function (eventName, handler, settings) {
+ eventName = 'ev_' + eventName.toLowerCase();
+
+ if (!eventHost.listeners[eventName]) {
+ eventHost.listeners[eventName] = createEventStorage(this);
+ }
+
+ if (settings && settings.thisObject) {
+ handler = handler.bind(settings.thisObject);
+ }
+
+ var innerId = eventHost.listeners[eventName].addEvent(handler, settings);
+ var handlerId = eventName + ':' + innerId; //return ID (ev_eventname:1)
+
+ if (settings && settings.id) {
+ handlerId = settings.id;
+ }
+
+ return handlerId;
+ };
+
+ obj.attachAll = function (callback) {
+ this.attachEvent('listen_all', callback);
+ };
+
+ obj.callEvent = function (name, eventArguments) {
+ if (eventHost._silent_mode) return true;
+ var handlerName = 'ev_' + name.toLowerCase();
+ var listeners = eventHost.listeners;
+
+ if (listeners['ev_listen_all']) {
+ listeners['ev_listen_all'].apply(this, [name].concat(eventArguments));
+ }
+
+ if (listeners[handlerName]) return listeners[handlerName].apply(this, eventArguments);
+ return true;
+ };
+
+ obj.checkEvent = function (name) {
+ var listeners = eventHost.listeners;
+ return !!listeners['ev_' + name.toLowerCase()];
+ };
+
+ obj.detachEvent = function (id) {
+ if (id) {
+ var listeners = eventHost.listeners;
+
+ for (var i in listeners) {
+ listeners[i].removeEvent(id); //remove event
+ }
+
+ var list = id.split(':'); //get EventName and ID
+
+ var listeners = eventHost.listeners;
+
+ if (list.length === 2) {
+ var eventName = list[0];
+ var eventId = list[1];
+
+ if (listeners[eventName]) {
+ listeners[eventName].removeEvent(eventId); //remove event
+ }
+ }
+ }
+ };
+
+ obj.detachAllEvents = function () {
+ for (var name in eventHost.listeners) {
+ eventHost.listeners[name].clear();
+ }
+ };
+}
+
+module.exports = makeEventable;
+
+/***/ }),
+
+/***/ "./sources/utils/extends.js":
+/*!**********************************!*\
+ !*** ./sources/utils/extends.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (d, b) {
+ for (var p in b) {
+ if (b.hasOwnProperty(p)) d[p] = b[p];
+ }
+
+ function __() {
+ this.constructor = d;
+ }
+
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+
+/***/ }),
+
+/***/ "./sources/utils/global.js":
+/*!*********************************!*\
+ !*** ./sources/utils/global.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {/* eslint-disable no-restricted-globals */
+var globalScope;
+
+if (typeof window !== "undefined") {
+ globalScope = window;
+} else {
+ globalScope = global;
+}
+/* eslint-enable no-restricted-globals */
+
+
+module.exports = globalScope;
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./sources/utils/helpers.js":
+/*!**********************************!*\
+ !*** ./sources/utils/helpers.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var units = {
+ "second": 1,
+ "minute": 60,
+ "hour": 60 * 60,
+ "day": 60 * 60 * 24,
+ "week": 60 * 60 * 24 * 7,
+ "month": 60 * 60 * 24 * 30,
+ "quarter": 60 * 60 * 24 * 30 * 3,
+ "year": 60 * 60 * 24 * 365
+};
+
+function getSecondsInUnit(unit) {
+ return units[unit] || units.hour;
+}
+
+function forEach(arr, callback) {
+ if (arr.forEach) {
+ arr.forEach(callback);
+ } else {
+ var workArray = arr.slice();
+
+ for (var i = 0; i < workArray.length; i++) {
+ callback(workArray[i], i);
+ }
+ }
+}
+
+function arrayMap(arr, callback) {
+ if (arr.map) {
+ return arr.map(callback);
+ } else {
+ var workArray = arr.slice();
+ var resArray = [];
+
+ for (var i = 0; i < workArray.length; i++) {
+ resArray.push(callback(workArray[i], i));
+ }
+
+ return resArray;
+ }
+}
+
+function arrayFind(arr, callback) {
+ if (arr.find) {
+ return arr.find(callback);
+ } else {
+ for (var i = 0; i < arr.length; i++) {
+ if (callback(arr[i], i)) {
+ return arr[i];
+ }
+ }
+ }
+}
+
+function arrayIncludes(arr, item) {
+ if (arr.includes) {
+ return arr.includes(item);
+ } else {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] === item) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+} // iframe-safe array type check instead of using instanceof
+
+
+function isArray(obj) {
+ if (Array.isArray) {
+ return Array.isArray(obj);
+ } else {
+ // close enough
+ return obj && obj.length !== undefined && obj.pop && obj.push;
+ }
+} // non-primitive string object, e.g. new String("abc")
+
+
+function isStringObject(obj) {
+ return obj && _typeof(obj) === "object" && Function.prototype.toString.call(obj.constructor) === "function String() { [native code] }";
+} // non-primitive number object, e.g. new Number(5)
+
+
+function isNumberObject(obj) {
+ return obj && _typeof(obj) === "object" && Function.prototype.toString.call(obj.constructor) === "function Number() { [native code] }";
+} // non-primitive number object, e.g. new Boolean(true)
+
+
+function isBooleanObject(obj) {
+ return obj && _typeof(obj) === "object" && Function.prototype.toString.call(obj.constructor) === "function Boolean() { [native code] }";
+}
+
+function isDate(obj) {
+ if (obj && _typeof(obj) === "object") {
+ return !!(obj.getFullYear && obj.getMonth && obj.getDate);
+ } else {
+ return false;
+ }
+}
+
+function isValidDate(obj) {
+ return isDate(obj) && !isNaN(obj.getTime());
+}
+
+function arrayFilter(arr, callback) {
+ var result = [];
+
+ if (arr.filter) {
+ return arr.filter(callback);
+ } else {
+ for (var i = 0; i < arr.length; i++) {
+ if (callback(arr[i], i)) {
+ result[result.length] = arr[i];
+ }
+ }
+
+ return result;
+ }
+}
+
+function hashToArray(hash) {
+ var result = [];
+
+ for (var key in hash) {
+ if (hash.hasOwnProperty(key)) {
+ result.push(hash[key]);
+ }
+ }
+
+ return result;
+}
+
+function arraySome(arr, callback) {
+ if (arr.length === 0) return false;
+
+ for (var i = 0; i < arr.length; i++) {
+ if (callback(arr[i], i, arr)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function arrayDifference(arr, callback) {
+ return arrayFilter(arr, function (item, i) {
+ return !callback(item, i);
+ });
+}
+
+function throttle(callback, timeout) {
+ var wait = false;
+ return function () {
+ if (!wait) {
+ callback.apply(null, arguments);
+ wait = true;
+ setTimeout(function () {
+ wait = false;
+ }, timeout);
+ }
+ };
+}
+
+function delay(callback, timeout) {
+ var timer;
+
+ var result = function result() {
+ result.$cancelTimeout();
+ result.$pending = true;
+ var args = Array.prototype.slice.call(arguments);
+ timer = setTimeout(function () {
+ callback.apply(this, args);
+ result.$pending = false;
+ }, timeout);
+ };
+
+ result.$pending = false;
+
+ result.$cancelTimeout = function () {
+ clearTimeout(timer);
+ result.$pending = false;
+ };
+
+ result.$execute = function () {
+ var args = Array.prototype.slice.call(arguments);
+ callback.apply(this, args);
+ result.$cancelTimeout();
+ };
+
+ return result;
+}
+
+function sortArrayOfHash(arr, field, desc) {
+ var compare = function compare(a, b) {
+ return a < b;
+ };
+
+ arr.sort(function (a, b) {
+ if (a[field] === b[field]) return 0;
+ return desc ? compare(a[field], b[field]) : compare(b[field], a[field]);
+ });
+}
+
+function objectKeys(obj) {
+ if (Object.keys) {
+ return Object.keys(obj);
+ }
+
+ var result = [];
+ var key;
+
+ for (key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ result.push(key);
+ }
+ }
+
+ return result;
+}
+
+function isEventable(obj) {
+ return obj.attachEvent && obj.detachEvent;
+} //GS-1090: A task should be able to have the id = 0
+
+
+function replaceValidZeroId(id, rootId) {
+ if (checkZeroId(id) && !checkZeroId(rootId)) {
+ id = "0";
+ }
+
+ return id;
+}
+
+function checkZeroId(id) {
+ if (id === 0) {
+ return true;
+ }
+
+ return false;
+}
+
+function findBinary(array, target) {
+ // modified binary search, target value not exactly match array elements, looking for closest one
+ var low = 0,
+ high = array.length - 1,
+ i,
+ item,
+ prev;
+
+ while (low <= high) {
+ i = Math.floor((low + high) / 2);
+ item = +array[i];
+ prev = +array[i - 1];
+
+ if (item < target) {
+ low = i + 1;
+ continue;
+ }
+
+ if (item > target) {
+ if (!(!isNaN(prev) && prev < target)) {
+ high = i - 1;
+ continue;
+ } else {
+ // if target is between 'i' and 'i-1' return 'i - 1'
+ return i - 1;
+ }
+ }
+
+ while (+array[i] == +array[i + 1]) {
+ i++;
+ }
+
+ return i;
+ }
+
+ return array.length - 1;
+}
+
+module.exports = {
+ getSecondsInUnit: getSecondsInUnit,
+ forEach: forEach,
+ arrayMap: arrayMap,
+ arrayIncludes: arrayIncludes,
+ arrayFind: arrayFind,
+ arrayFilter: arrayFilter,
+ arrayDifference: arrayDifference,
+ arraySome: arraySome,
+ hashToArray: hashToArray,
+ sortArrayOfHash: sortArrayOfHash,
+ throttle: throttle,
+ isArray: isArray,
+ isDate: isDate,
+ isValidDate: isValidDate,
+ isStringObject: isStringObject,
+ isNumberObject: isNumberObject,
+ isBooleanObject: isBooleanObject,
+ delay: delay,
+ objectKeys: objectKeys,
+ isEventable: isEventable,
+ replaceValidZeroId: replaceValidZeroId,
+ checkZeroId: checkZeroId,
+ findBinary: findBinary
+};
+
+/***/ }),
+
+/***/ "./sources/utils/is_headless.js":
+/*!**************************************!*\
+ !*** ./sources/utils/is_headless.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var utils = __webpack_require__(/*! ./env */ "./sources/utils/env.js");
+
+module.exports = function (gantt) {
+ return utils.isNode || !gantt.$root;
+};
+
+/***/ }),
+
+/***/ "./sources/utils/placeholder_task.js":
+/*!*******************************************!*\
+ !*** ./sources/utils/placeholder_task.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Check the over task or draggble task is placeholder task
+ */
+module.exports = function isPlaceholderTask(id, gantt, store, config) {
+ // return false;
+ var config = gantt ? gantt.config : config;
+
+ if (config && config.placeholder_task) {
+ if (store.exists(id)) {
+ var item = store.getItem(id);
+ return item.type === config.types.placeholder;
+ }
+ }
+
+ return false;
+};
+
+/***/ }),
+
+/***/ "./sources/utils/promise.js":
+/*!**********************************!*\
+ !*** ./sources/utils/promise.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! bluebird */ "./node_modules/bluebird/js/browser/bluebird.js");
+
+/***/ }),
+
+/***/ "./sources/utils/task_tree_helpers.js":
+/*!********************************************!*\
+ !*** ./sources/utils/task_tree_helpers.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function copyLinkIdsArray(gantt, linkIds, targetHash) {
+ for (var i = 0; i < linkIds.length; i++) {
+ if (gantt.isLinkExists(linkIds[i])) {
+ targetHash[linkIds[i]] = gantt.getLink(linkIds[i]);
+ }
+ }
+}
+
+function copyLinkIds(gantt, task, targetHash) {
+ copyLinkIdsArray(gantt, task.$source, targetHash);
+ copyLinkIdsArray(gantt, task.$target, targetHash);
+}
+
+function getSubtreeLinks(gantt, rootId) {
+ var res = {};
+
+ if (gantt.isTaskExists(rootId)) {
+ copyLinkIds(gantt, gantt.getTask(rootId), res);
+ }
+
+ gantt.eachTask(function (child) {
+ copyLinkIds(gantt, child, res);
+ }, rootId);
+ return res;
+}
+
+function getSubtreeTasks(gantt, rootId) {
+ var res = {};
+ gantt.eachTask(function (child) {
+ res[child.id] = child;
+ }, rootId);
+ return res;
+}
+
+module.exports = {
+ getSubtreeLinks: getSubtreeLinks,
+ getSubtreeTasks: getSubtreeTasks
+};
+
+/***/ }),
+
+/***/ "./sources/utils/timeout.js":
+/*!**********************************!*\
+ !*** ./sources/utils/timeout.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function checkTimeout(host, updPerSecond) {
+ if (!updPerSecond) return true;
+ if (host._on_timeout) return false;
+ var timeout = Math.ceil(1000 / updPerSecond);
+ if (timeout < 2) return true;
+ setTimeout(function () {
+ delete host._on_timeout;
+ }, timeout);
+ host._on_timeout = true;
+ return true;
+}
+
+module.exports = checkTimeout;
+
+/***/ }),
+
+/***/ "./sources/utils/utils.js":
+/*!********************************!*\
+ !*** ./sources/utils/utils.js ***!
+ \********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var helpers = __webpack_require__(/*! ./helpers */ "./sources/utils/helpers.js");
+
+var plainObjectConstructor = {}.constructor.toString();
+
+function isCustomType(object) {
+ var constructorString = object.constructor.toString();
+ return constructorString !== plainObjectConstructor;
+}
+
+function copy(object) {
+ var i, result; // iterator, types array, result
+
+ if (object && _typeof(object) == "object") {
+ switch (true) {
+ case helpers.isDate(object):
+ result = new Date(object);
+ break;
+
+ case helpers.isArray(object):
+ result = new Array(object.length);
+
+ for (i = 0; i < object.length; i++) {
+ result[i] = copy(object[i]);
+ }
+
+ break;
+
+ /* case (helpers.isStringObject(object)):
+ result = new String(object);
+ break;
+ case (helpers.isNumberObject(object)):
+ result = new Number(object);
+ break;
+ case (helpers.isBooleanObject(object)):
+ result = new Boolean(object);
+ break;*/
+
+ default:
+ if (isCustomType(object)) {
+ result = Object.create(object);
+ } else {
+ result = {};
+ }
+
+ for (i in object) {
+ if (Object.prototype.hasOwnProperty.apply(object, [i])) result[i] = copy(object[i]);
+ }
+
+ break;
+ }
+ }
+
+ return result || object;
+}
+
+function mixin(target, source, force) {
+ for (var f in source) {
+ if (target[f] === undefined || force) target[f] = source[f];
+ }
+
+ return target;
+}
+
+function defined(obj) {
+ return typeof obj != "undefined";
+}
+
+var seed;
+
+function uid() {
+ if (!seed) seed = new Date().valueOf();
+ seed++;
+ return seed;
+} //creates function with specified "this" pointer
+
+
+function bind(functor, object) {
+ if (functor.bind) return functor.bind(object);else return function () {
+ return functor.apply(object, arguments);
+ };
+}
+
+function event(el, event, handler, capture) {
+ if (el.addEventListener) el.addEventListener(event, handler, capture === undefined ? false : capture);else if (el.attachEvent) el.attachEvent("on" + event, handler);
+}
+
+function eventRemove(el, event, handler, capture) {
+ if (el.removeEventListener) el.removeEventListener(event, handler, capture === undefined ? false : capture);else if (el.detachEvent) el.detachEvent("on" + event, handler);
+}
+
+module.exports = {
+ copy: copy,
+ defined: defined,
+ mixin: mixin,
+ uid: uid,
+ bind: bind,
+ event: event,
+ eventRemove: eventRemove
+};
+
+/***/ }),
+
+/***/ 7:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ }),
+
+/***/ 8:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ })
+
+/******/ });
+});
diff --git a/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_broadway.css b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_broadway.css
new file mode 100644
index 0000000..86528be
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_broadway.css
@@ -0,0 +1,2136 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #fff;
+}
+/*lighten(@alterColor,7%)*/
+/* colors for items with inline styles assigned (task.color, link.color)*/
+.gantt_grid {
+ background-color: #d6d6d6;
+}
+.gantt_grid_scale {
+ background-color: #4f4f4f;
+ background-size: 5px 5px;
+ background-size: 4px 4px;
+ background-position: 0px 0px, 2px 2px;
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ color: #e1e1e1;
+ font-size: 14px;
+}
+.gantt_grid_scale .gantt_grid_head_cell {
+ border-top: none !important;
+ border-right: 1px solid #4f4f4f !important;
+ border-left: 1px solid #5b5b5b !important;
+}
+.gantt_popup_title {
+ background-color: #4f4f4f;
+ background-size: 5px 5px;
+ background-size: 4px 4px;
+ background-position: 0px 0px, 2px 2px;
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ color: #e1e1e1;
+ font-size: 14px;
+}
+.gantt_grid_data .gantt_row,
+.gantt_grid_data .gantt_row.odd {
+ background-color: #dbdbdb;
+ border-top: 1px solid #f6f6f6;
+ border-bottom: 1px solid #bababa;
+}
+.gantt_grid_data .gantt_row .gantt_cell,
+.gantt_grid_data .gantt_row.odd .gantt_cell {
+ border-right: none;
+}
+.gridHoverStyle {
+ border-top: 1px solid #ededed;
+ background-color: #ededed;
+}
+.gridSelection {
+ background-color: #FFF3A1;
+ border-top-color: #fff087;
+}
+.timelineSelection {
+ background-color: #FFF3A1;
+}
+/*Tree icons*/
+.gantt_cell .gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODhBMDIwQzhDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODhBMDIwQzlDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEEwMjBDNkNFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEEwMjBDN0NFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PntuzoIAAACySURBVHjaYmTAAjo6Ov4z4AAVFRWM6GJM6ALt7e0OUCYjFowsDwfIEjDbDRgZGSf8//8fUzEj4wGgeAGQeQFJ+CIj0IALQEl9BjIB0NADTJQYAHWdAxMDFQBVDGEB+ukgxYYAcQNSzCCnh4NY0o89VkOAAbMfV5gBNR0AytuDXAs01AEUxbhcwoAj1c4HaUTi9wMNwWnb/0ERO0xA/z6k0IyP4NgBGpRApgEfgHgBQIABAAcyQOF3e6FiAAAAAElFTkSuQmCC);
+}
+.gantt_cell .gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODhBMDIwQzhDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODhBMDIwQzlDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEEwMjBDNkNFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEEwMjBDN0NFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PntuzoIAAACySURBVHjaYmTAAjo6Ov4z4AAVFRWM6GJM6ALt7e0OUCYjFowsDwfIEjDbDRgZGSf8//8fUzEj4wGgeAGQeQFJ+CIj0IALQEl9BjIB0NADTJQYAHWdAxMDFQBVDGEB+ukgxYYAcQNSzCCnh4NY0o89VkOAAbMfV5gBNR0AytuDXAs01AEUxbhcwoAj1c4HaUTi9wMNwWnb/0ERO0xA/z6k0IyP4NgBGpRApgEfgHgBQIABAAcyQOF3e6FiAAAAAElFTkSuQmCC);
+}
+.gantt_cell .gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkQ2NjJFM0ZDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkQ2NjJFNDBDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRDY2MkUzRENFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRDY2MkUzRUNFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhnnqLUAAAExSURBVHjanFPtUcMwDI28AB0BJkg6AWEEJqAbxPxLJkh+phuUDdiAbtAwAYxAJ0jf60k51ecWDt3pZFtPn5akSKjv+3uIBlyLSMW3eZ4niD1423Xdt8dLYjzCqCluEJyNcPJq9+CMJzMGaAtet20rZJ7Bb+eIIhHYw0UGLvIRwBoRplx04CrgWModgwAXhTXj8Usjr73xMAwzJbNInBwU/8ASoqV9LbInYqwc2tJBrZdd8XcaVT4GpFOa52topL1Ks9CGVuGXL/vU40fqZPlGA7E5GX1NvQ7U4sSw1AWdMNIm07CfxIn1K6rcB2sI5yCXhXPyjPO7fuOLNfNikAAi+OnWILEUYFfLICWjXGptO12cyRk20G+sduiq/y7TOXJ2G906R13n0n0nmz2m63wSYAB0aMIyVTQbywAAAABJRU5ErkJggg==);
+}
+/*
+ Gantt part
+*/
+.chartHeaderBg {
+ background-color: #dbdbdb;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ border-left: 1px solid #f6f6f6;
+ border-right: 1px solid #bababa;
+ color: #494949;
+ font-size: 14px;
+}
+/*
+ Tasks
+*/
+.taskProgressStyle {
+ border-right: 1px solid #1cb3fb;
+ box-shadow: -1px 0px 0 1px #04a1eb inset;
+}
+.gantt_task_line {
+ background-size: 4px 4px;
+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent);
+ background-image: -moz-linear-gradient(0deg, transparent, transparent);
+}
+.gantt_task_line .gantt_task_content {
+ text-align: left;
+ font-weight: bold;
+ padding: 0 8px;
+ box-sizing: border-box;
+}
+.gantt_task_link .gantt_link_arrow_right {
+ border-width: 5px 5px 5px 5px;
+ margin-top: -1px;
+}
+.gantt_task_link .gantt_link_arrow_left {
+ border-width: 5px 5px 5px 5px;
+ margin-left: -3px;
+ margin-top: -2px;
+}
+.gantt_task_link .gantt_link_arrow_up {
+ border-width: 5px 5px 5px 5px;
+}
+.gantt_task_link .gantt_link_arrow_down {
+ border-width: 5px 5px 5px 5px;
+}
+.gantt_task_line .gantt_task_progress_drag {
+ bottom: -4px;
+ height: 10px;
+ margin-left: -8px;
+ width: 16px;
+}
+/*
+ project highlight
+*/
+.gantt_row.gantt_project,
+.gantt_row.odd.gantt_project {
+ background-color: #edffef;
+}
+.gantt_task_row.gantt_project,
+.gantt_task_row.odd.gantt_project {
+ background-color: #f5fff6;
+}
+.gantt_task_line.gantt_project {
+ background-color: #65c16f;
+ border: 1px solid #3c9445;
+}
+.gantt_task_line.gantt_project .gantt_task_progress {
+ background-color: #46ad51;
+ border-right: 1px solid #5abc65;
+ box-shadow: -1px 0px 0 1px #45a94f inset;
+}
+/*
+ milestone
+*/
+/*
+ lightbox
+*/
+.gantt_cal_light {
+ background-color: #fff;
+ border: none !important;
+}
+.gantt_cal_light .gantt_cal_lsection {
+ color: #959595;
+}
+.gantt_cal_light .gantt_cal_larea {
+ border-bottom: none;
+}
+.gantt_cal_light .gantt_cal_ltitle {
+ background-color: #4f4f4f;
+ background-size: 5px 5px;
+ background-size: 4px 4px;
+ background-position: 0px 0px, 2px 2px;
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ font-size: 14px;
+ color: #e1e1e1;
+ position: relative;
+ padding-top: 12px;
+ padding-bottom: 12px;
+ font-weight: normal;
+}
+.gantt_cal_light .gantt_cal_ltitle .gantt_title {
+ font-size: 13px;
+}
+.gantt_cal_light .gantt_btn_set {
+ margin: 5px 10px;
+}
+.buttonBg {
+ background: #fff;
+}
+.gantt_btn_set.gantt_save_btn_set {
+ background: #46ad51;
+ text-shadow: 0 -1px 0 #307738;
+ color: #fff;
+}
+.gantt_btn_set.gantt_delete_btn_set {
+ margin-left: 0;
+ text-shadow: 0 -1px 0 #6F6F6F;
+ background: #ec8e00;
+ text-shadow: 0 -1px 0 #aa6600;
+ color: #fff;
+}
+.gantt_delete_btn {
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_light_wide {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ border-left: none !important;
+ border-right: none !important;
+}
+.gantt_cal_ltitle .gantt_cancel_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYLEgAjh/DRnAAAAMdJREFUGNN1kcsNwjAQRF9iCkgJdJCUkBJQpDkDFUALdBAqAM6WQglQAlxzSglQgAUH1tIKgS9ezzztz0Vd18QYW0lXfpzsFeM49sAGOEpaf0FHYAnsS6evYoy9g3qDAB6Flb4BtYk568Huu6RmBhBCaFNKV4MPrso9hNAClABd1z2ABfB00BNYmEf5NeTrT/wBh2GogDNQOa8CzuZ9QOuvccPkgZqU0gXA7xFgL2nr1pP1ne/xlCEAi0/5nfc4lzT9+cK5pOkNX8hRT8hMyVwAAAAASUVORK5CYII=);
+ width: 30px;
+ top: 0px;
+ right: 0;
+ background-position: 6px 12px;
+ background-repeat: no-repeat;
+ position: absolute;
+ height: 100%;
+}
+/*
+ Message
+*/
+.gantt_popup_button.gantt_ok_button {
+ background: #46ad51;
+ text-shadow: 0 -1px 0 #307738;
+ color: #fff;
+ font-weight: bold;
+}
+.gantt_popup_button.gantt_cancel_button {
+ font-weight: bold;
+}
+.gantt_popup_shadow {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+/*
+ Quick info
+*/
+.gantt_qi_big_icon.icon_edit {
+ color: #454544;
+}
+.gantt_qi_big_icon.icon_delete {
+ text-shadow: 0 -1px 0 #6F6F6F;
+ background: #ec8e00;
+ text-shadow: 0 -1px 0 #aa6600;
+ color: #fff;
+ font-weight: bold;
+}
+/*
+ links dnd
+*/
+.gantt_tooltip {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: white;
+ border-left: 1px solid rgba(0, 0, 0, 0.07);
+ border-top: 1px solid rgba(0, 0, 0, 0.07);
+ font-family: "Arial";
+ font-size: 8pt;
+ color: #494949;
+}
+.gantt_container {
+ background-color: #fff;
+ font-family: "Arial";
+ font-size: 13px;
+ border: 1px solid #bababa;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: #494949;
+ font-size: 12px;
+ border-bottom: 1px solid #bababa;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ background-color: #4f4f4f;
+ background-size: 5px 5px;
+ background-size: 4px 4px;
+ background-position: 0px 0px, 2px 2px;
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05));
+ color: #e1e1e1;
+ font-size: 14px;
+}
+.gantt_task_scale {
+ background-color: #dbdbdb;
+}
+.gantt_task_vscroll {
+ background-color: #dbdbdb;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #bababa;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #bababa;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 33px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYHCygkHejN0gAAAD1JREFUOMtjtN15mYESwIJLwvHo6v/I/P3WoYzY1DExUAiGgQGMtjsvYwQYsWC/dSjjcAmD0YREo0AkFgAASgkTQxnJ6ggAAAAASUVORK5CYII=);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.3;
+ opacity: 0.3;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ border-top: 1px solid #ededed;
+ background-color: #ededed;
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #fff;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #fff;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #bababa;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #ebebeb;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #bababa;
+ border-right: 1px solid #bababa;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #bababa;
+ border-bottom: 1px solid #bababa;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #ebebeb;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 13px;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #bababa;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #ebebeb;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAW0lEQVQ4T2NkoBJgpJI5DEPEoGnTpv0n5OWsrCwU32B4DWQIuiJshqKro7tBIK+iWEquiyg2CFugg102YC6CRRjFXsOZnMj1GoaBBA2CBSTFKZuQAbjkB1/uBwBrVFUTxDarVwAAAABJRU5ErkJggg==);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAASElEQVQ4T2NkoBJgpJI5DEPEoGnTpv0n5OWsrCwU32B4DWQIuiJshqKrG8EGYQt0cHCMhhFqYiMrHcECkuKUTcgAXPKDL/cDAMbOURO+6QJ7AAAAAElFTkSuQmCC);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAs0lEQVQ4T62T0Q2EIBBEpQlzuaaMsQoqooqLsSljbMLLmMxmUXBR4U+Qt7Mzi2sqLVeJ00SgEMKWAnvvzYLyAyHfT5sU2fXDJSwCAXK8MI0/UTkva7IIFJsg3NSwnKdFoKtAWOQ1CN7CEqeTotE5L7QyJhmBcklZM4ZgTiAr3iOU3kD93ppO5SkMjB1EeXdBWoSkRql3YeIRe+cGvktS056JR9wsmeBUkujCfNXWCPC8GugPqn5ii/hV+FoAAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAfElEQVQ4T2NkoBJgpJI5DCgGTZ8+/T82gzMzMwlaCFcAM0RKQgyrI/0Dg/EahmIQyBB0DRvXr4W78tmLV1gtAbmYoEEgnciG4QpTogzCFyEwSyg2CBS2oCAZNQh3cA+hMAJ5AlcKxuVBlOgnNgVjMwyUrQjmamKLGaoZBAAOTFyLnFFW4wAAAABJRU5ErkJggg==);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAeElEQVQ4T2NkoBJgRDZn+vTp/wmZm5mZiaIHph7DICkJMUJmMfgHBmMYhtUgbAo3rl+L4lp0NUQbBPI2umuRDaPIIFAYwAyjv0HoMQALM5JdhG4QLMxGDcKdyIdoGIE89OzFK4KZF5Rl8EY/QROQFGA1iBQD0NUCAJVjcxO0naAQAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #FFA011;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #FFA011;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #FFA011;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "Arial";
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 250px;
+ width: 250px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ font-family: "Arial";
+ border-radius: 6px;
+ border: 1px solid #bababa;
+ background: #fff;
+}
+.gantt_popup_title {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 1px solid #bababa;
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 4px;
+ background: #fff;
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 10px;
+}
+.gantt_popup_button {
+ min-width: 100px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 4px;
+ font-size: 14px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 1px solid #bababa;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #bababa;
+}
+.gantt-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+}
+.gantt-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #F57C00;
+ border: 1px solid #ffa242;
+}
+.gantt-warning div {
+ background-color: #F57C00;
+ border: 1px solid #845030;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 13px;
+ color: #fff;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: #04a4f0;
+ border-right: 1px solid #1cb3fb;
+ box-shadow: -1px 0px 0 1px #04a1eb inset;
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #17b2fb;
+ border: 1px solid #049ae1;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #6e6e6e;
+ top: 0;
+ font-size: 11px;
+ font-size: 12px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 8.75px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #FFA011;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #FFA011;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #04a4f0;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #ffbf5e;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #e87e7b;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #ffbf5e;
+ border-color: #ffa011;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #e87e7b;
+ border-color: #dd3e3a;
+}
+.gantt_link_arrow_right {
+ border-width: 2.5px 0 2.5px 5px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #FFA011;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 2.5px 5px 2.5px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #FFA011;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 2.5px 5px 2.5px;
+ border-color: transparent transparent #FFA011 transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #FFA011;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 2.5px 5px 0 2.5px;
+ border-top-color: #FFA011;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 100%;
+ width: 8px;
+ z-index: 1;
+ top: -1px;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 8px;
+ width: 8px;
+ bottom: -4px;
+ margin-left: -4px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAq0lEQVQoz6WMsQnCABBFXyII9rqB7qDNZQdtsoWirmAltpnh0BkUfhOHEqLNiaAJIeZ19+//lxRFQR3ungKnOHd5nld1vbRhPALOkjaSNsAlsnaBu4+Bq6TVO5O0BK7xaxa4+xQoJS2+i5GV0fkVuPs8xjMaiN89uh+Buy+Bm6QJLUgaA7fYkJjZGjhJGtCBLMsqYIuZPf/FzJ4pPektSMzsAOyBYcftAzi+ANj8gShpeTzJAAAAAElFTkSuQmCC);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #fff;
+ border-left: 1px dotted #cecece;
+ border-top: 1px dotted #cecece;
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #444;
+ padding: 6px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #FFA011;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: #FFF3A1;
+ border-top-color: #fff087;
+}
+.gantt_task_row.gantt_selected {
+ background-color: #FFF3A1;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #ffec6e;
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: 0 0 5px #04a4f0;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #46ad51;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #DB7DC5;
+ border: 0px solid #cd49ae;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #e63030;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #e63030;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #e63030;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ border-radius: 6px;
+ font-family: "Arial";
+ font-size: 13px;
+ border: 1px solid #bababa;
+ color: #494949;
+ font-size: 12px;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "Arial";
+ border: 1px solid #bababa;
+ font-size: 13px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "Arial";
+ font-size: 13px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #bababa;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #bababa;
+ border-left: none;
+ border-right: none;
+ background-color: #fff;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 5px 15px 5px 10px;
+ float: left;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border-width: 0;
+ border-color: #bababa;
+ border-style: solid;
+ height: 32px;
+ font-weight: bold;
+ background: #fff;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 13px;
+ height: 22px;
+ line-height: 22px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTBBQUI0RDhDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTBBQUI0RDlDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMEFBQjRENkNFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBMEFBQjREN0NFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdPZV0AAACtSURBVHjanJPbDYUgEESvtwJKoQRLoRNL0RK0ArUCS9AOpAMclDVkw0s2mQ9XcpwJY2OM+VWMgDQ9/CsAEtoh9W6skw+S0Akd5hl1J6kADJBwADs9j9MmIszQ5GJo793qf2nwLUYc0E7xONbaBmloZKAsgCCLW0p2qCsBEEQ6F33gcBbg304I1JYA+BWHQFlAqCcclAXEykaguQSQaiyBVEmbm8RfLFgzo3MJMACZSGxiH8QaMAAAAABJRU5ErkJggg==);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "Arial";
+ font-size: 13px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #bababa;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 13px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #bababa;
+}
+.gantt_duration {
+ width: 100px;
+ height: 23px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 23px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #bababa;
+}
+.gantt_duration .gantt_duration_value {
+ width: 40px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 70px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 20px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #fff;
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 4px;
+ -moz-border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 4px;
+ -moz-border-bottom-right-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #ebebeb;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 1px solid #bababa;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 300;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: #fff;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: #494949;
+ background-color: #dbdbdb;
+ border-bottom: 1px solid #bababa;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 13px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 13px;
+ color: #494949;
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 6px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 6px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 6px;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 6px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==);
+}
+.gantt_qi_big_icon {
+ font-size: 13px;
+ border-radius: 4px;
+ font-weight: bold;
+ background: #fff;
+ margin: 5px 9px 8px 0px;
+ min-width: 60px;
+ line-height: 32px;
+ vertical-align: middle;
+ padding: 0px 10px 0px 5px;
+ cursor: pointer;
+ border: 1px solid #bababa;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 32px;
+ text-align: center;
+ line-height: 32px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 13px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 13px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #bababa;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #bababa;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #bababa;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #bababa;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "Arial";
+ font-size: 13px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #fff;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #d2d2d2;
+ border-top: 1px solid #d2d2d2;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #d2d2d2;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #dbf3fe;
+}
+.gantt_popup_button.gantt_delete_button {
+ background: #46ad51;
+ text-shadow: 0 -1px 0 #307738;
+ color: #fff;
+ font-weight: bold;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_black.css b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_black.css
new file mode 100644
index 0000000..dbff829
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_black.css
@@ -0,0 +1,2094 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #000;
+}
+/* colors for items with inline styles assigned (task.color, link.color)*/
+.gridHoverStyle {
+ background-color: #42425e;
+}
+.gridSelection {
+ background-color: #42425e;
+}
+.timelineSelection {
+ background-color: #42425e;
+}
+.header_text_style {
+ text-transform: uppercase;
+ font-weight: bold;
+}
+.gantt_grid_scale .gantt_grid_head_cell {
+ color: #c1c1c1;
+ text-transform: uppercase;
+ font-weight: bold;
+ border-top: none !important;
+ border-right: none !important;
+}
+.gantt_grid_data .gantt_cell {
+ border-right: none;
+ color: #fff;
+}
+.gantt_grid_placeholder_text_explanation {
+ color: #c1c1c1;
+}
+/*
+ Tasks
+*/
+.gantt_task_link .gantt_link_arrow_right {
+ border-width: 6px 6px 6px 6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_left {
+ border-width: 6px 6px 6px 6px;
+ margin-left: -6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_up {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_link .gantt_link_arrow_down {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_line .gantt_task_progress_drag {
+ bottom: -4px;
+ height: 10px;
+ margin-left: -8px;
+ width: 16px;
+}
+.chartHeaderBg {
+ background-color: #000;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ color: #c1c1c1;
+ text-transform: uppercase;
+ font-weight: bold;
+ border-right: 1px solid #7e7e7e;
+}
+/*
+ project highlight
+*/
+.gantt_row.gantt_project,
+.gantt_row.odd.gantt_project {
+ background-color: #edffee;
+}
+.gantt_task_row.gantt_project,
+.gantt_task_row.odd.gantt_project {
+ background-color: #f5fff5;
+}
+.gantt_task_line.gantt_project {
+ background-color: #006803;
+ border: 1px solid #006803;
+}
+.gantt_task_line.gantt_project .gantt_task_progress {
+ background-color: #003b01;
+}
+/*
+ milestone
+*/
+/*
+ lightbox
+*/
+.modalBorder {
+ border-color: #fff;
+ -webkit-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ -moz-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ box-shadow: inset 0px 0px 0px 4px #0505ff;
+ padding: 4px;
+}
+.gantt_popup_shadow {
+ border-color: #fff;
+ -webkit-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ -moz-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ box-shadow: inset 0px 0px 0px 4px #0505ff;
+ padding: 4px;
+}
+.buttonBg {
+ background: #000;
+}
+.gantt_cal_larea input,
+.gantt_cal_larea select,
+.gantt_cal_larea textarea {
+ background: #000;
+ color: #fff;
+}
+.gantt_cal_larea .gantt_section_time {
+ background: #000;
+}
+.gantt_cal_larea .gantt_cal_lsection {
+ color: #c1c1c1;
+ font-size: 14px;
+}
+.gantt_cal_light .gantt_btn_set {
+ margin: 5px 10px;
+}
+.gantt_btn_set.gantt_cancel_btn_set {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #fff;
+ background: #000;
+ color: #fff;
+}
+.gantt_btn_set.gantt_save_btn_set {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #76ff03;
+ background: #000;
+ color: #76ff03;
+}
+.gantt_btn_set.gantt_delete_btn_set {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #ffc400;
+ background: #000;
+ color: #ffc400;
+}
+.gantt_delete_btn {
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_light_wide {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ border-left: none !important;
+ border-right: none !important;
+}
+/*
+ Message
+*/
+.gantt_popup_button.gantt_ok_button {
+ font-weight: bold;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #76ff03;
+ background: #000;
+ color: #76ff03;
+}
+.gantt_popup_button.gantt_cancel_button {
+ font-weight: bold;
+ color: #454544;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #fff;
+ background: #000;
+ color: #fff;
+}
+.gantt_popup_title {
+ color: #fff;
+}
+/*
+ Quick info
+*/
+.gantt_qi_big_icon {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #fff;
+ background: #000;
+ color: #fff;
+}
+.gantt_qi_big_icon.icon_edit {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #fff;
+ background: #000;
+ color: #fff;
+}
+.gantt_qi_big_icon.icon_delete {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #ffc400;
+ background: #000;
+ color: #ffc400;
+}
+/*links dnd*/
+.gantt_tooltip {
+ font-size: 14px;
+ color: #fff;
+ background: #000;
+ border: 1px solid #FFFF00;
+}
+.gantt_container {
+ background-color: #000;
+ font-family: "arial";
+ font-size: 14px;
+ border: 1px solid #FFFF00;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: #ffffff;
+ font-size: 14px;
+ border-bottom: 1px solid #FFFF00;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ background-color: #000;
+}
+.gantt_task_scale {
+ background-color: #000;
+}
+.gantt_task_vscroll {
+ background-color: #000;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #FFFF00;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #FFFF00;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 33px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTk4MTk1QzM2ODc4MTFFNkFCNkFDOUZDNzZFNjgxRkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTk4MTk1QzQ2ODc4MTFFNkFCNkFDOUZDNzZFNjgxRkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFOTgxOTVDMTY4NzgxMUU2QUI2QUM5RkM3NkU2ODFGQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFOTgxOTVDMjY4NzgxMUU2QUI2QUM5RkM3NkU2ODFGQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Psrbi8sAAABYSURBVHjaYiz7z8xACWDCI/cBiP9D8QdyDODHwSbaAIq9QF8DkAMMhtEBuvwHZAP4ybCcn6pe+EiGXrAeFihHAIefkQHjME8HOAOJUCCz4DFAgBgXAAQYACAZFHJhx3hLAAAAAElFTkSuQmCC);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.3;
+ opacity: 0.3;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ background-color: #42425e;
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 1px solid #7e7e7e;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #000;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #000;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #FFFF00;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #7e7e7e;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #FFFF00;
+ border-right: 1px solid #FFFF00;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #FFFF00;
+ border-bottom: 1px solid #FFFF00;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #7e7e7e;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 14px;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #FFFF00;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #7e7e7e;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjRFQzM4RjY2ODc3MTFFNjlGNUVCQUVCQzgyNkQ5RUUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjRFQzM4Rjc2ODc3MTFFNjlGNUVCQUVCQzgyNkQ5RUUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNEVDMzhGNDY4NzcxMUU2OUY1RUJBRUJDODI2RDlFRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNEVDMzhGNTY4NzcxMUU2OUY1RUJBRUJDODI2RDlFRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpdfxE8AAABySURBVHjaYjx48CADucDOzo6BiYFCwILE/k+iXkZ0A+CCRAC4ZXi9sNXO6T8IE+sFkAZcBqHwvQ/tYyDKBaQGIr7A/I8rnGjiAkYsNjMSZQBy4CAHHro4zb2A7CJGUg34T4kLGMnxAuP///8pCgOAAAMAxcMbX5R+AnUAAAAASUVORK5CYII=);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qjg3ODU2QTg2ODc3MTFFNkE4MDlDMDMyQkRGNDgyQTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qjg3ODU2QTk2ODc3MTFFNkE4MDlDMDMyQkRGNDgyQTAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCODc4NTZBNjY4NzcxMUU2QTgwOUMwMzJCREY0ODJBMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCODc4NTZBNzY4NzcxMUU2QTgwOUMwMzJCREY0ODJBMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqbUJTYAAABdSURBVHjaYjx48CADucDOzo6BiYFCwILE/k+iXkZ0A+CCRAC4ZVT1AsNWOyeiNHkf2sdAGxcQGZgo4UQTFzCSbQBy4BALKPYC1cPgPyUGMJLjAsb///9T5AWAAAMAJ4wO9WM7P60AAAAASUVORK5CYII=);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM2MUMyMzQ2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM2MUMyMzU2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzYxQzIzMjY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzYxQzIzMzY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlC39FYAAADWSURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYVWOtFYi/IIn9JxI7oBtUBMTcZDiiHt2gE1B2C55wQMZiQPwZ6iIHZINgMZIKxFxEuOQ1EE9GdxXIoANQLA7E2UR6qweIP6K7iAHJVaVAzEuEQe+BeBqyAAuUBrloBxB7APEnMgL+BXI6ygfiR2QY8hSIk1mQBG4BsTy5CZLx////VEnZAAEGAO3yNxaCOyWPAAAAAElFTkSuQmCC);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkZDMUZDMkI2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkZDMUZDMkM2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRkMxRkMyOTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRkMxRkMyQTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvnU3ycAAAB9SURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYTWJt1KChaNBzKP2fRAwCL5ANSgEJkOGYp0CczIIksA1PpiUIGP///0+VMAIIMAC11ShRpw6rxAAAAABJRU5ErkJggg==);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDQwMTVBMUU2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDQwMTVBMUY2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowNDAxNUExQzY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowNDAxNUExRDY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsHnBgAAAAB8SURBVHjaYvz//z/Dpg3rGCgBfgFBDExoYp5A/AyI/+PB9dgMQzdoLhBLEnBAAzbDWND4MEMYsRjwH80wEGjE5SJSAIrLmBgoAw3UMghnGOEDjHjCjHouGjVoOBj0HCmNEMIg8AKXQSnIkgTAUyBOxpWytxFRjGAFAAEGAOcUI0XiA1ItAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #18ffff;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #18ffff;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #18ffff;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "arial";
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 250px;
+ width: 250px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ border-color: #fff;
+ -webkit-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ -moz-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ box-shadow: inset 0px 0px 0px 4px #0505ff;
+ padding: 4px;
+ font-family: "arial";
+ border-radius: 6px;
+ border: 1px solid #FFFF00;
+ background: #000;
+}
+.gantt_popup_title {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 1px solid #FFFF00;
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 4px;
+ background: #000;
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 10px;
+}
+.gantt_popup_button {
+ min-width: 100px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 4px;
+ font-size: 16px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 1px solid #c1c1c1;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 16px;
+ color: #fff;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 16px;
+ color: #000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFF00;
+}
+.gantt-error {
+ background-color: #B60000;
+ border: 1px solid #FFFF00;
+}
+.gantt-error div {
+ background-color: #B60000;
+ border: 1px solid transparent;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #EF7F00;
+ border: 1px solid #FFFF00;
+}
+.gantt-warning div {
+ background-color: #EF7F00;
+ border: 1px solid transparent;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 14px;
+ color: #fff;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: #0e2d7d;
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #0042e9;
+ border: 1px solid #0042e9;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #fff;
+ top: 0;
+ font-size: 11px;
+ font-size: 13px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 8.75px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #18ffff;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #18ffff;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #0042e9;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #65ffff;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #e87e7b;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #65ffff;
+ border-color: #18ffff;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #e87e7b;
+ border-color: #dd3e3a;
+}
+.gantt_link_arrow_right {
+ border-width: 4px 0 4px 6px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #18ffff;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 4px 6px 4px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #18ffff;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 4px 6px 4px;
+ border-color: transparent transparent #18ffff transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #18ffff;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 4px 6px 0 4px;
+ border-top-color: #18ffff;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 100%;
+ width: 8px;
+ z-index: 1;
+ top: -1px;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 8px;
+ width: 8px;
+ bottom: -4px;
+ margin-left: -4px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDQ2MjFDRjU2ODc4MTFFNjk2MEVEQjgxRDU3RThDRjQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDQ2MjFDRjY2ODc4MTFFNjk2MEVEQjgxRDU3RThDRjQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENDYyMUNGMzY4NzgxMUU2OTYwRURCODFENTdFOENGNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENDYyMUNGNDY4NzgxMUU2OTYwRURCODFENTdFOENGNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkyX4qoAAADrSURBVHjaYiz7z8yADXQx/mUCUr1QbjFQ3T9s6phwaOYEUqvkHBkLQBjIXg0VI2wAUKEIkNqrFc0YHLqDiQGEtWMYg0BiUDncBgAVqACpY5bVjJY+i5kYmNkYwNh7ERMDSAwkB1WDaQBQwoKJheGY+ywmVdsWoDAjkiogGyTmMZtJFajmOEgtigFAgSA2HoZ9wZuZRPVTGRlwAb0URgagGhGQWpAeqNkM+TySDL3BW5mYxQ1xa0YGL8//Z1jr8+/fl2cMRSAd/zMeMjPwyTGQBD49YmCYIf8X4gVSNSPrYWKgEIC9QIkBAAEGAKWdQQSo7CbHAAAAAElFTkSuQmCC);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA+UlEQVQoz6WPP0tCURiHn9+5d7huEd5VKhIEwaEQlOtQS0HjbXBy6ANUkuEo4njAz9Bee5tu2bfoCwTRVsu5p6E7GHoJ8dneP7+H99XQB6zDyhlgmpeDoQ+ydXumIFwCHuOG+nFDfeAp7/0vsHJlYFY50WVnIjoTUTlVCszyWbHAyh0Ci1pX7ea9MCGYEJoDUeuqDSzynVWBlWspYHF0rWq9p5VT6z1xfKOqAl6tXOuPwMqlYcQ8GSnePxdF7J2JZKRyGDG3cimAgNtol2kyVrBzUBxe5vPN8zL22fcHdwL8xYOhFLMRX+/wfJX9vrBpeDlj2BIBfhvBD+rwPMTN8+ghAAAAAElFTkSuQmCC);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #fff;
+ border-left: 1px dotted #cecece;
+ border-top: 1px dotted #cecece;
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #444;
+ padding: 6px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #18ffff;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: #42425e;
+}
+.gantt_task_row.gantt_selected {
+ background-color: #42425e;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #2d2d40;
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: 0 0 5px #0e2d7d;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #006803;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #c06fce;
+ border: 0px solid #ef8eff;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #e63030;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #e63030;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #e63030;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background: #000;
+ border-radius: 6px;
+ font-family: "arial";
+ border: 1px solid #c1c1c1;
+ color: #ffffff;
+ font-size: 14px;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ border-color: #fff;
+ -webkit-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ -moz-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ box-shadow: inset 0px 0px 0px 4px #0505ff;
+ padding: 4px;
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "arial";
+ border: 1px solid #c1c1c1;
+ font-size: 14px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "arial";
+ font-size: 14px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #c1c1c1;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #c1c1c1;
+ border-left: none;
+ border-right: none;
+ background-color: #000;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 5px 15px 5px 10px;
+ float: left;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border-width: 2px;
+ border-color: #c1c1c1;
+ border-style: solid;
+ height: 32px;
+ font-weight: bold;
+ background: #000;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 13px;
+ height: 18px;
+ line-height: 18px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEEyMTFDOUM2ODc5MTFFNjlDOTRDREYyNUQ4NENENTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEEyMTFDOUQ2ODc5MTFFNjlDOTRDREYyNUQ4NENENTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowQTIxMUM5QTY4NzkxMUU2OUM5NENERjI1RDg0Q0Q1MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowQTIxMUM5QjY4NzkxMUU2OUM5NENERjI1RDg0Q0Q1MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhVZXooAAAD2SURBVHjaxNO/a8JAFMBxUx1KQXAQcWj9sdhBCDg52I6FgjgIIi7duunsIl0dxNmxW3EUHaS0tFj1DxJRKiX1/AZeIYTGNMnQg8927727e++0tgqHgqyTUMDlN8E55tAjPoIzeEcWPa8nyEllM3iJupcEeXzgAm+4xdpMoGOB9JHgAmZIYooKtj+P2MWVHO3yl+Ci3DmOEar4tHahIRtSkqRgCb7GK2IYmnfGl72NG5QxRkKSlXCDZ0TxiDsYTnOwQw1PUu0FE5xhgHt8uw2SIVUGEniKPlpQTq9rHyRzYxMr7PHg1lunSez8dTg0pdT//saDAAMAj/Mt6qJaGUkAAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MERGODM2RkI2ODc5MTFFNkFCOTRCOTNEMkMwODJCQkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MERGODM2RkM2ODc5MTFFNkFCOTRCOTNEMkMwODJCQkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowREY4MzZGOTY4NzkxMUU2QUI5NEI5M0QyQzA4MkJCRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowREY4MzZGQTY4NzkxMUU2QUI5NEI5M0QyQzA4MkJCRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ppyd3J4AAAFPSURBVHjajJO5SkNRFEVfnlEbU9qrjVMwYiMBEbSK4g8IllFQK/EvLCwEEYdS/AOHIiJYWinEqREtbLQKCGpQcW3YgUuI8R1YvOTdvU9uzpCqVCpRXQxAEaag2+8e4AT24CYUp4IEbbAOixBHjePHSVbhLQqEMh/CMnzBBuQhY/J+p7MFOIaO8AabsATPMAOXDX69E86hz9+35FGCQT5cwTeMNjGfgbT30AVpyMUuWAtsJzBfwzjs2FNUgoKFBwnMk/ASaAv6C58uYjtUE5gjaz+kT//RrnrzBLwG561+VmMPiWIkoVmR9fMp9oQpZhOaa1pFSTXIuvoakkfo/cc8BBdu47BuUIZdF0bmuybmHBxZq7aXa5OY8cGYO6Ep24dbG/thznuijp3CtLThMinJmme92TLptivwXr+NtVAB5z1gPb6RalPyJpZD8a8AAwBoDGzHPr0K4wAAAABJRU5ErkJggg==);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTZBMjlFNkU2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTZBMjlFNkY2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxNkEyOUU2QzY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxNkEyOUU2RDY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpeemjIAAABMSURBVHjaYvx/hAEbqAfiBjQxEL8RXSETkZphBtSjCzJCXfCfgTzAyMRAIWCBmUSpATBArFcY8QUiSWDUgFEDsBlwhAg9R5E5AAEGAFNACzFr4MENAAAAAElFTkSuQmCC);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "arial";
+ font-size: 14px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #c1c1c1;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #7e7e7e;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 14px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #c1c1c1;
+}
+.gantt_duration {
+ width: 100px;
+ height: 23px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 23px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #c1c1c1;
+}
+.gantt_duration .gantt_duration_value {
+ width: 40px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 70px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 20px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #000;
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 4px;
+ -moz-border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 4px;
+ -moz-border-bottom-right-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #7e7e7e;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 1px solid #FFFF00;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 300;
+ border-color: #fff;
+ -webkit-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ -moz-box-shadow: inset 0px 0px 0px 4px #0505ff;
+ box-shadow: inset 0px 0px 0px 4px #0505ff;
+ padding: 4px;
+ background-color: #000;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: #fff;
+ background-color: #000;
+ border-bottom: 1px solid #FFFF00;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 14px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 14px;
+ color: #fff;
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 6px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 6px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 6px;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 6px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTZBMjlFNkU2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTZBMjlFNkY2ODc5MTFFNjkxOTRGRTZGMDkwMENCMUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxNkEyOUU2QzY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxNkEyOUU2RDY4NzkxMUU2OTE5NEZFNkYwOTAwQ0IxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpeemjIAAABMSURBVHjaYvx/hAEbqAfiBjQxEL8RXSETkZphBtSjCzJCXfCfgTzAyMRAIWCBmUSpATBArFcY8QUiSWDUgFEDsBlwhAg9R5E5AAEGAFNACzFr4MENAAAAAElFTkSuQmCC);
+}
+.gantt_qi_big_icon {
+ font-size: 13px;
+ border-radius: 4px;
+ font-weight: bold;
+ background: #000;
+ margin: 5px 9px 8px 0px;
+ min-width: 60px;
+ line-height: 32px;
+ vertical-align: middle;
+ padding: 0px 10px 0px 5px;
+ cursor: pointer;
+ border: 1px solid #FFFF00;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 32px;
+ text-align: center;
+ line-height: 32px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 14px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #FFFF00;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #FFFF00;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #FFFF00;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #FFFF00;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "arial";
+ font-size: 14px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #000;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #656565;
+ border-top: 1px solid #656565;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #656565;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #d0ddff;
+}
+.gantt_popup_button.gantt_delete_button {
+ font-weight: bold;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #76ff03;
+ background: #000;
+ color: #76ff03;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_white.css b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_white.css
new file mode 100644
index 0000000..f25cc04
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_contrast_white.css
@@ -0,0 +1,2104 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #fff;
+}
+/* colors for items with inline styles assigned (task.color, link.color)*/
+.gridHoverStyle {
+ background-color: #5868c5;
+}
+.gridSelection {
+ background-color: #5868c5;
+}
+.timelineSelection {
+ background-color: #5868c5;
+}
+.header_text_style {
+ text-transform: uppercase;
+ font-weight: bold;
+}
+.gantt_grid_scale .gantt_grid_head_cell {
+ color: #585858;
+ text-transform: uppercase;
+ font-weight: bold;
+ border-top: none !important;
+ border-right: none !important;
+}
+.gantt_grid_data .gantt_cell {
+ border-right: none;
+ color: #000;
+}
+.gantt_grid_data .gantt_row.gantt_selected .gantt_cell,
+.gantt_grid_data .gantt_row:hover .gantt_cell {
+ color: #fff;
+}
+/*
+ Tasks
+*/
+.gantt_task_link .gantt_link_arrow_right {
+ border-width: 6px 6px 6px 6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_left {
+ border-width: 6px 6px 6px 6px;
+ margin-left: -6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_up {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_link .gantt_link_arrow_down {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_line .gantt_task_progress_drag {
+ bottom: -4px;
+ height: 10px;
+ margin-left: -8px;
+ width: 16px;
+}
+.chartHeaderBg {
+ background-color: #fff;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ color: #585858;
+ text-transform: uppercase;
+ font-weight: bold;
+ border-right: 1px solid #000;
+}
+/*
+ project highlight
+*/
+.gantt_row.gantt_project,
+.gantt_row.odd.gantt_project {
+ background-color: #edfff4;
+}
+.gantt_task_row.gantt_project,
+.gantt_task_row.odd.gantt_project {
+ background-color: #f5fff9;
+}
+.gantt_task_line.gantt_project {
+ background-color: #74FFA9;
+}
+.gantt_task_line.gantt_project .gantt_task_progress {
+ background-color: #47BB55;
+}
+/*
+ milestone
+*/
+/*
+ lightbox
+*/
+.gantt_cal_larea input,
+.gantt_cal_larea select,
+.gantt_cal_larea textarea {
+ color: #000;
+ border: #000;
+}
+.gantt_cal_larea .gantt_cal_lsection {
+ color: #000;
+ font-size: 14px;
+}
+.modalBorder {
+ border-color: #000;
+ -webkit-box-shadow: inset 0px 0px 0px 2px #000;
+ -moz-box-shadow: inset 0px 0px 0px 2px #000;
+ box-shadow: inset 0px 0px 0px 2px #000;
+ padding: 2px;
+}
+.gantt_popup_shadow {
+ border-color: #000;
+ -webkit-box-shadow: inset 0px 0px 0px 2px #000;
+ -moz-box-shadow: inset 0px 0px 0px 2px #000;
+ box-shadow: inset 0px 0px 0px 2px #000;
+ padding: 2px;
+}
+.gantt_cal_larea {
+ background: #fff;
+}
+.lightboxHeaderBackground {
+ background: #fff;
+}
+.gantt_cal_light .gantt_btn_set {
+ margin: 5px 10px;
+}
+.gantt_btn_set.gantt_cancel_btn_set {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #fff;
+ color: #000;
+}
+.gantt_btn_set.gantt_save_btn_set {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #006600;
+ color: #000;
+ border-color: transparent;
+ color: #fff;
+}
+.gantt_btn_set.gantt_delete_btn_set {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #9f3500;
+ color: #000;
+ border-color: transparent;
+ color: #fff;
+}
+.gantt_delete_btn {
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_light_wide {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ border-left: none !important;
+ border-right: none !important;
+}
+/*
+ Message
+*/
+.gantt_popup_button.gantt_ok_button {
+ font-weight: bold;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #006600;
+ color: #000;
+ border-color: transparent;
+ color: #fff;
+}
+.gantt_popup_button.gantt_cancel_button {
+ font-weight: bold;
+ color: #454544;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #fff;
+ color: #000;
+}
+.gantt_popup_title {
+ color: #000;
+}
+/*
+ Quick info
+*/
+.gantt_qi_big_icon {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #fff;
+ color: #000;
+}
+.gantt_qi_big_icon.icon_edit {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #fff;
+ color: #000;
+}
+.gantt_qi_big_icon.icon_delete {
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #9f3500;
+ color: #000;
+ border-color: transparent;
+ color: #fff;
+}
+/*links dnd*/
+.gantt_tooltip {
+ font-size: 14px;
+ color: #000;
+ background: #fff;
+ border: 1px solid #000;
+}
+.gantt_container {
+ background-color: #fff;
+ font-family: "arial";
+ font-size: 14px;
+ border: 1px solid #000;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: #262626;
+ font-size: 14px;
+ border-bottom: 1px solid #000;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ background-color: #fff;
+}
+.gantt_task_scale {
+ background-color: #fff;
+}
+.gantt_task_vscroll {
+ background-color: #fff;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #000;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #000;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 33px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkM1NEUwREQ2ODc4MTFFNkJCN0REMkNCNDBBRDc4Q0UiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkM1NEUwREU2ODc4MTFFNkJCN0REMkNCNDBBRDc4Q0UiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2QzU0RTBEQjY4NzgxMUU2QkI3REQyQ0I0MEFENzhDRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2QzU0RTBEQzY4NzgxMUU2QkI3REQyQ0I0MEFENzhDRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PopaRyYAAABHSURBVHjaYmCgIfgAxP+h+AMuRYx4DPhPjFomSp05eAxADrD/WPzPgEX+A3LA/CfTAYxU88JHMvR+HE0HhA34iINNXQAQYAAFOhSSoOBmvgAAAABJRU5ErkJggg==);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.3;
+ opacity: 0.3;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ background-color: #5868c5;
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 1px solid #000;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #fff;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #fff;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #000;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #000;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #000;
+ border-right: 1px solid #000;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #000;
+ border-bottom: 1px solid #000;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #000;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 15px;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #000;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #000;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzVDNzJCOEM2ODc3MTFFNkFGNTdEMzMyODI3QzgxN0EiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzVDNzJCOEQ2ODc3MTFFNkFGNTdEMzMyODI3QzgxN0EiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNUM3MkI4QTY4NzcxMUU2QUY1N0QzMzI4MjdDODE3QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNUM3MkI4QjY4NzcxMUU2QUY1N0QzMzI4MjdDODE3QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pin6TiQAAABfSURBVHja1JLBDoAwCEOp2Ufyh/CXnSezLDoU9CAnLi3tC1BVyY6ZySbFacPOh1rMBuLuuKPcax/HogqMkpUZvApxBZMzvE8T4OQy/gXxqk5sMH5YJgEyFUCyxKALMAAp9xIuO3IRpAAAAABJRU5ErkJggg==);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzk5M0JBOUI2ODc3MTFFNjg3NkRDN0U4RTlDQjZBRjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzk5M0JBOUM2ODc3MTFFNjg3NkRDN0U4RTlDQjZBRjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDOTkzQkE5OTY4NzcxMUU2ODc2REM3RThFOUNCNkFGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDOTkzQkE5QTY4NzcxMUU2ODc2REM3RThFOUNCNkFGMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkhdOa8AAABXSURBVHjatFJBDsAwCJJmj/SH+kt2M91OVi0nYwICEaoqVZiZLGni2WYecvEXiGUCcWw0grh7irQXP+sgWeanpysOUBaofGU7wngH7Aig4gAkWxFeAQYA3h0OMhsl2ScAAAAASUVORK5CYII=);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM2MUMyMzQ2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM2MUMyMzU2ODc3MTFFNjhFMjE5QzYzREY2ODEzREUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzYxQzIzMjY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzYxQzIzMzY4NzcxMUU2OEUyMTlDNjNERjY4MTNERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlC39FYAAADWSURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYVWOtFYi/IIn9JxI7oBtUBMTcZDiiHt2gE1B2C55wQMZiQPwZ6iIHZINgMZIKxFxEuOQ1EE9GdxXIoANQLA7E2UR6qweIP6K7iAHJVaVAzEuEQe+BeBqyAAuUBrloBxB7APEnMgL+BXI6ygfiR2QY8hSIk1mQBG4BsTy5CZLx////VEnZAAEGAO3yNxaCOyWPAAAAAElFTkSuQmCC);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkZDMUZDMkI2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkZDMUZDMkM2ODc3MTFFNkI5QTdFOTQyM0UxNUEzRjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRkMxRkMyOTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRkMxRkMyQTY4NzcxMUU2QjlBN0U5NDIzRTE1QTNGMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvnU3ycAAAB9SURBVHjaYty4fi0DNQATA5UAskGeQPwMiP9jwfWkGDQXiCVxqGsgZBiyQTBDGNFwI5Jh2FwL8oUnMWHUgGQYNgBywFxiA7sBi0thGGwYTWJt1KChaNBzKP2fRAwCL5ANSgEJkOGYp0CczIIksA1PpiUIGP///0+VMAIIMAC11ShRpw6rxAAAAABJRU5ErkJggg==);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDQwMTVBMUU2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDQwMTVBMUY2ODc4MTFFNkFBNDVCQkYzMzdERTM1MzYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowNDAxNUExQzY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowNDAxNUExRDY4NzgxMUU2QUE0NUJCRjMzN0RFMzUzNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsHnBgAAAAB8SURBVHjaYvz//z/Dpg3rGCgBfgFBDExoYp5A/AyI/+PB9dgMQzdoLhBLEnBAAzbDWND4MEMYsRjwH80wEGjE5SJSAIrLmBgoAw3UMghnGOEDjHjCjHouGjVoOBj0HCmNEMIg8AKXQSnIkgTAUyBOxpWytxFRjGAFAAEGAOcUI0XiA1ItAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #000;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #000;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #000;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "arial";
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 250px;
+ width: 250px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ border-color: #000;
+ -webkit-box-shadow: inset 0px 0px 0px 2px #000;
+ -moz-box-shadow: inset 0px 0px 0px 2px #000;
+ box-shadow: inset 0px 0px 0px 2px #000;
+ padding: 2px;
+ font-family: "arial";
+ border-radius: 6px;
+ border: 1px solid #000;
+ background: #fff;
+}
+.gantt_popup_title {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 1px solid #000;
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 4px;
+ background: #fff;
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 10px;
+}
+.gantt_popup_button {
+ min-width: 100px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 4px;
+ font-size: 16px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 1px solid #000;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 16px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 16px;
+ color: #000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #000;
+}
+.gantt-error {
+ background-color: #b60000;
+ border: 1px solid #000;
+}
+.gantt-error div {
+ background-color: #b60000;
+ border: 1px solid #940000;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #EF7F00;
+ border: 1px solid #000;
+}
+.gantt-warning div {
+ background-color: #EF7F00;
+ border: 1px solid #C97110;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 15px;
+ color: #000;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: #18EEFF;
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 1px;
+ -moz-border-radius: 1px;
+ border-radius: 1px;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #BBF9FF;
+ border: 1px solid #000;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #6e6e6e;
+ top: 0;
+ font-size: 11px;
+ font-size: 14px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 8.75px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #000;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #000;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #BBF9FF;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #262626;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #e87e7b;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #262626;
+ border-color: #000000;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #e87e7b;
+ border-color: #dd3e3a;
+}
+.gantt_link_arrow_right {
+ border-width: 4px 0 4px 6px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #000;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 4px 6px 4px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #000;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 4px 6px 4px;
+ border-color: transparent transparent #000 transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #000;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 4px 6px 0 4px;
+ border-top-color: #000;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 100%;
+ width: 8px;
+ z-index: 1;
+ top: -1px;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 8px;
+ width: 8px;
+ bottom: -4px;
+ margin-left: -4px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzM0N0ZFRkM2ODc4MTFFNjhFNUREOTU2N0ZBMkI4ODUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzM0N0ZFRkQ2ODc4MTFFNjhFNUREOTU2N0ZBMkI4ODUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMzQ3RkVGQTY4NzgxMUU2OEU1REQ5NTY3RkEyQjg4NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMzQ3RkVGQjY4NzgxMUU2OEU1REQ5NTY3RkEyQjg4NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pkl1dsMAAADJSURBVHjapJK9DcIwEIXjKA2SSxqnZghar0Cb7EBBmRlYwF4Bam+QMgPQuYUeKVLwcc+QAmQIKJ/05J9772TpLIgoSyGEyHnZP4879oWkEQ3exSxYB601Qbw/4i7pTYSXrLaqKur7PqquaxRa1L42YFasU9M0FEKgEexxhxo8yQbMuiiKszGGPmGtJfZc4H1pwGyklFfnHE0BD7zIjAPYKqWGruvoV+Aty/KGbByE957+BRlkxWOS6b8wBf+VLM9mEl8wp8FdgAEAX8VEJCVY4FsAAAAASUVORK5CYII=);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJElEQVQoz6WRsWqDUBSG/3uvXFHQoBwcMgtu1U6BQAn4BoUMTi7t5JBH0EHo1pdw6liwa8mQMVM6BzrHJUOgNZJws4XQEkjItx04/wfn/MAZiEhKKVdSyhURSVwDEfU1TfsJw1CFYag0Tfslov5FYdd1B5zzXRzHqq5rVde1iuNYcc53rusO/u6L08FxnHS9Xn8kScKzLIMQAkIIDIdD7Pd7Pp/PnxzH+W7bdvFP0Ov1XjabzetkMmHj8RiMsaOYMYYoikBEbDabPdq2rW+328+jwLKs967rnouiwGg0Onue7/sIggDT6fTBMIz7ruvemGmaC13X78qyhO/7F/1puVwiz3O0bfvFAKiqquB53lVNNU2DNE3BAVwdPs1w3AgDoG4RHADj3FVF5NgPuQAAAABJRU5ErkJggg==);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #fff;
+ border-left: 1px dotted #cecece;
+ border-top: 1px dotted #cecece;
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #444;
+ padding: 6px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #000;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: #5868c5;
+}
+.gantt_task_row.gantt_selected {
+ background-color: #5868c5;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #3d4dad;
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: 0 0 5px #18EEFF;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #74FFA9;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #c06fce;
+ border: 0px solid #6e2a7a;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #e63030;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #e63030;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #e63030;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background: #fff;
+ border-radius: 6px;
+ font-family: "arial";
+ border: 1px solid #c1c1c1;
+ color: #262626;
+ font-size: 14px;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ border-color: #000;
+ -webkit-box-shadow: inset 0px 0px 0px 2px #000;
+ -moz-box-shadow: inset 0px 0px 0px 2px #000;
+ box-shadow: inset 0px 0px 0px 2px #000;
+ padding: 2px;
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "arial";
+ border: 1px solid #c1c1c1;
+ font-size: 14px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "arial";
+ font-size: 14px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #c1c1c1;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #c1c1c1;
+ border-left: none;
+ border-right: none;
+ background-color: #fff;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 5px 15px 5px 10px;
+ float: left;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border-width: 2px;
+ border-color: #c1c1c1;
+ border-style: solid;
+ height: 32px;
+ font-weight: bold;
+ background: #fff;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 13px;
+ height: 18px;
+ line-height: 18px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTM5MTFCMzA2ODc4MTFFNjk0MEE5ODRFRjQ3MEY2MkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTM5MTFCMzE2ODc4MTFFNjk0MEE5ODRFRjQ3MEY2MkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MzkxMUIyRTY4NzgxMUU2OTQwQTk4NEVGNDcwRjYyRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MzkxMUIyRjY4NzgxMUU2OTQwQTk4NEVGNDcwRjYyRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pnl+P+YAAADRSURBVHjaYvz//z8DJYCJgUJArgEyQHwIiPUYQF4gESsA8b3/ELCDVM1qQPwIqvkwEPORolkbiJ9DNe8BYm5wBAAJPahp8ng0GwLxa6jmrUDMCZMDEVugEg+BWB2LZnMgfg9Vsw6I2ZDlQQQPEO+FKngJtQ2mwBaIP0HllgExC7oFMAYHEG+AKgTZZg3ErkD8FSo2F4iZsXkPmQMyfQlUA0jjdyh7KhAz4gofdAFGqAYY6ManGYRZ0FIYKGNkA/EHIP4HxLWEkiTjkM1McAAQYAAwa97nPE+LsgAAAABJRU5ErkJggg==);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTc0QzgxQ0U2ODc4MTFFNkE5NTJDMTkyNTg2QUExRDAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTc0QzgxQ0Y2ODc4MTFFNkE5NTJDMTkyNTg2QUExRDAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NzRDODFDQzY4NzgxMUU2QTk1MkMxOTI1ODZBQTFEMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NzRDODFDRDY4NzgxMUU2QTk1MkMxOTI1ODZBQTFEMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pk+05wsAAAFbSURBVHjajNM7LwRRGMbxNQYFSpXKNqwVEtFsIhIismQ/wOg3roVoNL6BhhWFy2p9A5dCKCjEJktiCQWJQkOJiEXi/ybPyJiwmTf5ZWbPnOedObNnqjzPi4WqHVkMo0Vjd9hDHlfByU7gvBYruMAs2lAnCY3ZtTU0hBtYeBvT+MQyUmiUlMbs2hh2/SauGixiEA/I4Dy0rBPcYkhP1osFTNkTJDGO8j9hqyYcKnyDdz1J0tELq9baKoXtRpfow7oyWWuQ1sStCOEBPAbmpq1BXD+KEcNWZzrG3djfFQ734ylwvUbHsqNNYtUdMWzVoeO9ox1mNRox7M+12rcGm/jSX3kUIdypuZbJW4MSNrRlW3FdIdyFHc21v73kb+U5HPtvFvPoQb3Y+RJO0YwDfRs/38IzRrCq7T2DAl6koDFXd85o5/76Gq3JpNaY05b9wKveSU5LmMCbH/oWYAA8HFpKXgW38QAAAABJRU5ErkJggg==);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NUFDNTg4MDI2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NUFDNTg4MDM2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1QUM1ODgwMDY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1QUM1ODgwMTY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQSVckAAABGSURBVHjaYvj//z8DFlz/HxPUY1NLrGachjCCTQGaw0AeYGRioBCwwEyi1AAYINYrcAsp9sKoAaMGYDPgCBF6jiJzAAIMAPUxcjmgixXRAAAAAElFTkSuQmCC);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "arial";
+ font-size: 14px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #c1c1c1;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #000;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 14px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #c1c1c1;
+}
+.gantt_duration {
+ width: 100px;
+ height: 23px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 23px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #c1c1c1;
+}
+.gantt_duration .gantt_duration_value {
+ width: 40px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 70px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 20px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #fff;
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 4px;
+ -moz-border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 4px;
+ -moz-border-bottom-right-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #000;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 1px solid #000;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 300;
+ border-color: #000;
+ -webkit-box-shadow: inset 0px 0px 0px 2px #000;
+ -moz-box-shadow: inset 0px 0px 0px 2px #000;
+ box-shadow: inset 0px 0px 0px 2px #000;
+ padding: 2px;
+ background-color: #fff;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: #000;
+ background-color: #fff;
+ border-bottom: 1px solid #000;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 14px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 14px;
+ color: #000;
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 6px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 6px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 6px;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 6px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NUFDNTg4MDI2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NUFDNTg4MDM2ODc4MTFFNkI5QkY5OTIyMjkyMTFFNTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1QUM1ODgwMDY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1QUM1ODgwMTY4NzgxMUU2QjlCRjk5MjIyOTIxMUU1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQSVckAAABGSURBVHjaYvj//z8DFlz/HxPUY1NLrGachjCCTQGaw0AeYGRioBCwwEyi1AAYINYrcAsp9sKoAaMGYDPgCBF6jiJzAAIMAPUxcjmgixXRAAAAAElFTkSuQmCC);
+}
+.gantt_qi_big_icon {
+ font-size: 13px;
+ border-radius: 4px;
+ font-weight: bold;
+ background: #fff;
+ margin: 5px 9px 8px 0px;
+ min-width: 60px;
+ line-height: 32px;
+ vertical-align: middle;
+ padding: 0px 10px 0px 5px;
+ cursor: pointer;
+ border: 1px solid #000;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 32px;
+ text-align: center;
+ line-height: 32px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 14px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #000;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #000;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #000;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #000;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "arial";
+ font-size: 14px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #fff;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #000000;
+ border-top: 1px solid #000000;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #000000;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #ffffff;
+}
+.gantt_popup_button.gantt_delete_button {
+ font-weight: bold;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #000;
+ background: #006600;
+ color: #000;
+ border-color: transparent;
+ color: #fff;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_material.css b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_material.css
new file mode 100644
index 0000000..3d9da03
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_material.css
@@ -0,0 +1,2454 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #FFFFFF;
+}
+.gantt_task_line.gantt_critical_task {
+ background-color: #FF5252;
+ border: 1px solid #FF5252;
+}
+.gantt_task_line.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.15);
+}
+.gantt_task_line.gantt_critical_task.gantt_milestone,
+.gantt_task_line.gantt_critical_task.gantt_project {
+ border-color: #FF5252;
+}
+.gantt_links_area .gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2);
+}
+.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_right:before,
+.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_left:before {
+ content: "";
+ position: absolute;
+ width: 0px;
+ height: 0px;
+ border: 3px solid;
+ transform-origin: center;
+ box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.2);
+}
+.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_right:before {
+ border-color: transparent transparent #87A4BC #87A4BC;
+ transform: skewY(-40deg);
+ top: -3px;
+ left: -7px;
+}
+.gantt_links_area .gantt_task_link:hover .gantt_link_arrow_left:before {
+ border-color: transparent #87A4BC #87A4BC transparent;
+ transform: skewY(40deg);
+ top: -3px;
+ left: 1px;
+}
+.gantt_task_link.gantt_critical_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 2px 4px 0px rgba(255, 82, 82, 0.2);
+}
+.gantt_task_link.gantt_critical_link:hover .gantt_link_arrow_left:before,
+.gantt_task_link.gantt_critical_link:hover .gantt_link_arrow_right:before {
+ border-color: transparent;
+ box-shadow: 0px 2px 3px 0px rgba(255, 82, 82, 0.4), 0 1px 1px 0 rgba(255, 82, 82, 0.25);
+}
+.gridHoverStyle {
+ background-color: rgba(0, 199, 181, 0.2);
+}
+.gridSelection {
+ background-color: rgba(0, 199, 181, 0.2);
+}
+.timelineSelection {
+ background-color: rgba(0, 199, 181, 0.2);
+}
+.gantt_layout_cell.grid_cell {
+ border-right: none;
+}
+.gantt_grid .gantt_row {
+ border-right: 1px solid #D7D7D7;
+}
+.gantt_grid .gantt_grid_scale {
+ border-right: 1px solid #D7D7D7;
+}
+.gantt_grid .gantt_grid_scale .gantt_grid_head_cell.gantt_grid_head_text {
+ text-align: left;
+ padding-left: 15px;
+}
+.gantt_grid .gantt_grid_scale .gantt_grid_head_cell {
+ color: rgba(0, 0, 0, 0.54);
+ border: none;
+ text-transform: uppercase;
+ font-weight: 500;
+}
+.gantt_grid .gantt_grid_scale .gantt_grid_column_resize_wrap {
+ opacity: 0;
+}
+.gantt_grid .gantt_grid_scale:hover .gantt_grid_column_resize_wrap {
+ opacity: 1;
+}
+/* Shadow under header */
+div.gantt_grid_scale::after,
+div.gantt_scale_line:last-child::after {
+ content: "";
+ width: 100%;
+ display: block;
+ height: 1px;
+ background-color: transparent;
+ position: absolute;
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 2px 3px 0 rgba(0, 0, 0, 0.1);
+ z-index: 1;
+}
+div.gantt_scale_line:last-child::after {
+ bottom: -1px;
+}
+.gantt_grid_data .gantt_cell {
+ border-right: none;
+ border-left: none;
+ color: rgba(0, 0, 0, 0.8);
+ font-weight: 400;
+}
+.gantt_grid_data .gantt_row:last-child {
+ border-bottom: 1px solid #D7D7D7;
+}
+.gantt_data_area .gantt_task_row:last-child {
+ border-bottom: 1px solid #D7D7D7;
+}
+/*
+ Animation
+*/
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_drag {
+ animation: gantt_fade_in 0.15s;
+}
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_drag_animation .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_animation .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag,
+.gantt_task_line.gantt_drag_animation .gantt_task_drag {
+ animation: gantt_fade_in 0;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line.gantt_selected:hover .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line.gantt_selected:hover .gantt_task_drag {
+ animation: none;
+}
+.gantt_grid_data .gantt_row,
+.gantt_grid_data .gantt_row.odd {
+ transition: background 0.15s;
+}
+.gantt_grid_column_resize_wrap {
+ transition: opacity 0.15s;
+}
+.gantt_link_line_down,
+.gantt_link_line_up,
+.gantt_link_line_right,
+.gantt_link_line_left {
+ transition: box-shadow 0.15s;
+}
+@keyframes gantt_fade_in {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+/*
+ Tasks
+*/
+.gantt_task_link .gantt_link_arrow_right {
+ border-width: 6px 7px 6px 7px;
+ margin-left: -2px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_left {
+ border-width: 6px 7px 6px 7px;
+ margin-left: -6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_up {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_link .gantt_link_arrow_down {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_line.gantt_milestone {
+ margin-top: -1px;
+}
+.gantt_task_line.gantt_milestone .gantt_link_control.task_left {
+ left: -21px;
+}
+.gantt_task_line.gantt_milestone .gantt_link_control.task_right {
+ right: -19px;
+}
+.gantt_task_line.gantt_milestone .gantt_side_content {
+ color: rgba(0, 0, 0, 0.8);
+}
+.gantt_task_line.gantt_milestone .gantt_side_content.gantt_right {
+ margin-left: 3px;
+}
+.gantt_task_line.gantt_milestone .gantt_side_content.gantt_left {
+ margin-right: 3px;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ padding: 0;
+}
+.gantt_task_line {
+ font-weight: 500;
+}
+.gantt_task_line .gantt_task_drag {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAHElEQVQYV2NkQAOMIP6vX7/+g2g2NjZG7ALIugAfzQgFD7inoAAAAABJRU5ErkJggg==);
+ opacity: 0.95;
+}
+.gantt_task_line .gantt_task_drag.task_left {
+ left: 9px;
+}
+.gantt_task_line .gantt_task_drag.task_right {
+ right: 9px;
+}
+.gantt_task_line .gantt_link_point {
+ border: 2px solid;
+ border-color: inherit;
+ height: 15px;
+ background-color: #FAFAFA;
+ width: 15px;
+ border-radius: 100%;
+ box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);
+}
+.gantt_task_line .gantt_link_control {
+ top: -1px;
+ border-color: inherit;
+}
+.gantt_task_line .gantt_link_control.task_left {
+ left: -17px;
+}
+.gantt_task_line .gantt_link_control.task_right {
+ right: -15px;
+}
+.gantt_task_line.gantt_thin_task .gantt_task_drag.task_end_date {
+ left: 3px;
+}
+.gantt_task_line.gantt_thin_task .gantt_task_drag.task_start_date {
+ left: -13px;
+}
+.chartHeaderBg {
+ background-color: #fff;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ color: rgba(0, 0, 0, 0.54);
+ text-transform: uppercase;
+ font-weight: 500;
+}
+/*
+ project highlight
+*/
+.gantt_row.gantt_project {
+ background-color: #edfffb;
+}
+.gantt_task_row.gantt_project {
+ background-color: #f5fffc;
+}
+.gantt_task_line.gantt_project {
+ background-color: #1DE9B6;
+ border-color: #16e1ae;
+}
+.gantt_task_line.gantt_project .gantt_task_content {
+ color: rgba(0, 0, 0, 0.6);
+ font-weight: 500;
+}
+.gantt_task_content {
+ text-overflow: ellipsis;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 0 17px;
+}
+/*
+ lightbox
+*/
+div.gantt_cal_light {
+ border: 0px;
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+ width: 560px;
+ padding: 25px;
+}
+div.gantt_cal_light .gantt_cal_ltitle {
+ text-overflow: ellipsis;
+ font-size: 16px;
+ margin: -15px 0px 0px 0px;
+ padding: 16px 5px 9px 7px;
+ color: rgba(0, 0, 0, 0.8);
+}
+div.gantt_cal_light .gantt_cal_ltitle .gantt_mark {
+ display: none;
+}
+div.gantt_cal_light .gantt_cal_ltitle .gantt_time {
+ font-weight: 500;
+}
+div.gantt_cal_light .gantt_cal_ltitle .gantt_title {
+ font-weight: 400;
+}
+div.gantt_cal_light .gantt_cal_ltext {
+ padding: 7px;
+}
+div.gantt_cal_light .gantt_cal_ltext textarea {
+ padding: 6px 8px;
+}
+div.gantt_cal_light .gantt_cal_ltext textarea:focus {
+ outline-color: rgba(68, 138, 255, 0.9);
+ box-shadow: none;
+}
+div.gantt_cal_light .gantt_cal_ltext:focus {
+ outline-color: rgba(68, 138, 255, 0.9);
+ box-shadow: none;
+}
+div.gantt_cal_light .gantt_cal_lsection {
+ padding: 12px 0 5px 7px;
+ color: rgba(0, 0, 0, 0.8);
+ font-size: 14px;
+ font-weight: 500;
+}
+div.gantt_cal_light .gantt_cal_larea {
+ border: 0px;
+ padding: 2px 0px 0px 0px;
+ color: rgba(0, 0, 0, 0.8);
+}
+div.gantt_cal_light .gantt_section_time {
+ padding: 10px 7px;
+}
+div.gantt_cal_light .gantt_section_time *:focus {
+ outline-color: rgba(68, 138, 255, 0.9);
+ box-shadow: none;
+}
+div.gantt_cal_light .gantt_btn_set {
+ margin: 10px 7px 10px 7px;
+ text-transform: uppercase;
+ height: 32px;
+ padding: 7px 15px;
+}
+div.gantt_cal_light select,
+div.gantt_cal_light .gantt_section_time select {
+ height: 30px;
+}
+div.gantt_cal_light select:focus {
+ outline-color: rgba(68, 138, 255, 0.9);
+ box-shadow: none;
+}
+div.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_popup_button {
+ float: right;
+ text-transform: uppercase;
+ font-weight: 500;
+}
+.gantt_cal_quick_info .gantt_qi_big_icon {
+ font-weight: 500;
+ height: 32px;
+ text-transform: uppercase;
+}
+.gantt_cal_quick_info .gantt_qi_big_icon div {
+ padding-top: 1px;
+}
+.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set {
+ background: #FFFFFF;
+ color: #116aff;
+}
+.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set .gantt_cancel_btn {
+ display: none;
+}
+.gantt_popup_button.gantt_cancel_button {
+ color: #116aff;
+}
+.gantt_popup_button.gantt_cancel_button:hover,
+.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set:hover {
+ background: rgba(17, 106, 255, 0.25);
+ color: #005cf7;
+}
+.gantt_popup_button.gantt_cancel_button:focus,
+.gantt_cal_light .gantt_btn_set.gantt_cancel_btn_set:focus {
+ background: rgba(17, 106, 255, 0.35);
+ color: #0053dd;
+ outline: none;
+ box-shadow: none;
+}
+.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set {
+ background: #FFFFFF;
+ color: #FF584C;
+}
+.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set .gantt_delete_btn {
+ display: none;
+}
+.gantt_qi_big_icon.icon_delete {
+ background: #FFFFFF;
+ color: #FF584C;
+}
+.gantt_qi_big_icon.icon_delete .gantt_menu_icon {
+ display: none;
+}
+.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set:hover,
+.gantt_qi_big_icon.icon_delete:hover {
+ background: rgba(255, 88, 76, 0.25);
+}
+.gantt_cal_light .gantt_btn_set.gantt_delete_btn_set:focus,
+.gantt_qi_big_icon.icon_delete:focus {
+ background: rgba(255, 88, 76, 0.35);
+ color: #ff4032;
+ outline: none;
+ box-shadow: none;
+}
+.gantt_qi_big_icon.icon_edit .gantt_menu_icon {
+ display: none;
+}
+.gantt_cal_light .gantt_btn_set.gantt_save_btn_set .gantt_save_btn {
+ display: none;
+}
+.gantt_cal_light .gantt_btn_set.gantt_save_btn_set,
+.gantt_qi_big_icon.icon_edit,
+.gantt_popup_button.gantt_ok_button {
+ background-color: #448AFF;
+ color: #FFFFFF;
+}
+.gantt_qi_big_icon.icon_edit:hover,
+.gantt_popup_button.gantt_ok_button:hover,
+.gantt_cal_light .gantt_btn_set.gantt_save_btn_set:hover {
+ background-color: #005cf6;
+}
+.gantt_popup_button.gantt_ok_button:focus,
+.gantt_qi_big_icon.icon_edit:focus,
+.gantt_cal_light .gantt_btn_set.gantt_save_btn_set:focus {
+ background-color: #005cf6;
+ outline: none;
+ box-shadow: none;
+}
+.gantt_duration {
+ color: rgba(0, 0, 0, 0.54);
+ font-weight: 500;
+}
+.gantt_duration .gantt_duration_dec {
+ color: transparent;
+}
+.gantt_duration .gantt_duration_inc {
+ color: transparent;
+ margin-right: 2px;
+}
+div.gantt_duration .gantt_duration_dec {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAM0lEQVQ4T2NkoBAwUqifYdQABiqFgcaMDf/JiY0bGQGM4Fig2ABybIfpGU0H1EoHlMQCAIgYCBGYGr9NAAAAAElFTkSuQmCC);
+ background-repeat: no-repeat;
+ background-position: center;
+}
+div.gantt_duration .gantt_duration_inc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAO0lEQVQ4T2NkoBAw4tOvMWPDf5D8jYwAnOpGDWBgoE4YwEKb1BgFxQ7YBRQbgMvm0XSACNyBywvEpAsA12c4ER3FU64AAAAASUVORK5CYII=);
+ background-repeat: no-repeat;
+ background-position: center;
+}
+/*
+ milestone
+*/
+.gantt_task_line.gantt_milestone {
+ border-radius: 2px;
+}
+/*
+ Message
+*/
+.gantt-info,
+.gantt-info {
+ border-radius: 2px;
+ border-width: 0px;
+ width: 237px;
+}
+.gantt-info div,
+.gantt-info div {
+ border: 0px;
+ padding: 11px;
+}
+/*
+ Quick info
+*/
+.gantt_cal_quick_info {
+ padding: 15px 25px;
+ min-width: 210px;
+ max-width: 400px;
+ font-size: 16px;
+}
+.gantt_cal_quick_info .gantt_cal_qi_title {
+ padding: 5px 0px 10px 0px;
+ border-bottom: 0px;
+}
+.gantt_cal_quick_info .gantt_cal_qi_title .gantt_cal_qi_tcontent {
+ display: none;
+}
+.gantt_cal_quick_info .gantt_cal_qi_title .gantt_cal_qi_tdate {
+ font-size: 16px;
+ font-weight: 500;
+}
+.gantt_cal_quick_info .gantt_cal_qi_content {
+ padding: 8px 0px;
+ font-size: 14px;
+ text-overflow: ellipsis;
+}
+.gantt_cal_quick_info .gantt_cal_qi_controls {
+ padding: 5px 0px 0px 0px;
+ float: right;
+}
+/*links dnd*/
+.gantt_tooltip {
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+ background-color: #FFFFFF;
+ border: 0px;
+ font-family: "Roboto", arial, sans-serif;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.8);
+ line-height: 1.5em;
+ max-width: 400px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ max-width: 400px;
+ padding: 15px 25px;
+ text-overflow: ellipsis;
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+ color: rgba(0, 0, 0, 0.8);
+}
+.gantt_modal_box .gantt_popup_text {
+ font-size: 14px;
+ line-height: 1.5;
+ text-align: left;
+ padding: 1px 0px;
+ margin: 0px;
+}
+.gantt_modal_box .gantt_popup_title {
+ background-color: #fff;
+ margin: 0px;
+ padding: 4px 0px 14px 0px;
+ text-align: left;
+ font-weight: 500;
+}
+.gantt_tree_icon.gantt_folder_open {
+ display: none;
+}
+.gantt_tree_icon.gantt_folder_closed {
+ display: none;
+}
+.gantt_tree_icon.gantt_file {
+ display: none;
+}
+.gantt_popup_shadow {
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+}
+.gantt_task_line .gantt_side_content {
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.54);
+}
+div.gantt_drag_marker {
+ z-index: 4;
+}
+div.gantt_drag_marker .gantt_link_tooltip {
+ font-size: 14px;
+ font-family: Roboto;
+ border-width: 0px;
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+}
+.switch_unsetted {
+ display: none;
+}
+.matherial_checkbox_icon {
+ background-size: cover;
+ height: 1.3em;
+ width: 1.3em;
+ display: inline-block;
+ vertical-align: -0.3em;
+}
+.matherial_checkbox_checked,
+.switch_unsetted:checked + .matherial_checkbox_icon,
+label.gantt_resource_row input[type=checkbox]:checked + div.gantt_resource_cell_checkbox .matherial_checkbox_icon {
+ background-image: url(data:image/svg+xml;charset=utf-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2224px%22%20height%3D%2224px%22%20viewBox%3D%220%200%2024%2024%22%20enable-background%3D%22new%200%200%2024%2024%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%20id%3D%22Bounding_Boxes%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%2C0h24v24H0V0z%22%2F%3E%3C%2Fg%3E%3Cg%20id%3D%22Outline_1_%22%3E%3Cg%3E%3Cpath%20d%3D%22M19%2C3H5C3.9%2C3%2C3%2C3.9%2C3%2C5v14c0%2C1.1%2C0.9%2C2%2C2%2C2h14c1.1%2C0%2C2-0.9%2C2-2V5C21%2C3.9%2C20.1%2C3%2C19%2C3z%20M19%2C19H5V5h14V19z%22%20fill-opacity%3D%220.8%22%2F%3E%3Cpolygon%20points%3D%2217.99%2C9%2016.58%2C7.58%209.99%2C14.17%207.41%2C11.6%205.99%2C13.01%209.99%2C17%22%20fill-opacity%3D%220.8%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A);
+}
+.matherial_checkbox_unchecked,
+.switch_unsetted + .matherial_checkbox_icon,
+label.gantt_resource_row input[type=checkbox] + div.gantt_resource_cell_checkbox .matherial_checkbox_icon {
+ background-image: url(data:image/svg+xml;charset=utf-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2224px%22%20height%3D%2224px%22%20viewBox%3D%220%200%2024%2024%22%20enable-background%3D%22new%200%200%2024%2024%22%20xml%3Aspace%3D%22preserve%22%3E%3Cg%20id%3D%22Bounding_Boxes%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%2C0h24v24H0V0z%22%2F%3E%3C%2Fg%3E%3Cg%20id%3D%22Outline_1_%22%3E%3Cpath%20d%3D%22M19%2C5v14H5V5H19%20M19%2C3H5C3.9%2C3%2C3%2C3.9%2C3%2C5v14c0%2C1.1%2C0.9%2C2%2C2%2C2h14c1.1%2C0%2C2-0.9%2C2-2V5C21%2C3.9%2C20.1%2C3%2C19%2C3z%22%20fill-opacity%3D%220.8%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);
+}
+label.gantt_resource_row input[type=checkbox] {
+ display: none;
+}
+label.gantt_resource_row select {
+ height: calc(1.3em + 4px);
+ border-width: 0.5px;
+}
+.gantt_container {
+ background-color: #FFFFFF;
+ font-family: "Roboto", arial, sans-serif;
+ font-size: 14px;
+ border: 1px solid #D7D7D7;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: rgba(31, 31, 31, 0.8);
+ font-size: 14px;
+ border-bottom: 1px solid #D7D7D7;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ background-color: #fff;
+}
+.gantt_task_scale {
+ background-color: #fff;
+}
+.gantt_task_vscroll {
+ background-color: #fff;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #D7D7D7;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #D7D7D7;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 35px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAO0lEQVQ4T2NkoBAw4tMvuGHWf5D8+4A0nOpGDWBgoE4YwEKb1BgFxQ7YBRQbgMvm0XSACNyBywvEpAsAxlc4EbYmh6oAAAAASUVORK5CYII=);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ background-color: rgba(0, 199, 181, 0.2);
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 0px;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #FFFFFF;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #D7D7D7;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #D7D7D7;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #D7D7D7;
+ border-right: 1px solid #D7D7D7;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #D7D7D7;
+ border-bottom: 1px solid #D7D7D7;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #D7D7D7;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 14px;
+ font-weight: 500;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #D7D7D7;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #D7D7D7;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAuUAAALlAF37bb0AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAH/SURBVHgBAO8BEP4B////AAAAAAB1dXWV2NjYa+7u7gAJCQkA////AAAAAAAAAAAAvb29AAAAAAACAAAAAAAAAAAGBgZqKysrvREREQD7+/sACAgIAAgICAAICAgAAAAAAAAAAAACAAAAAAAAAAD6+vr1BAQEQisrK8YQEBAA9vb2AP39/QD9/f0AAAAAAAAAAAACAAAAAAAAAAABAQEA+fn5AAUFBTkqKirWCAgIBPLy8gD5+fkAAAAAAAAAAAACAAAAAAAAAAAAAAAAAQEBAPn5+QADAwMpMjIy3xkZGRsEBAQAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAEBAQD4+PgABQUFHCQkJKoVFRUwAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAP///wAICAgA+/v76N3d3Vvx8fHgAAAAAAAAAAAEAAAAAAAAAAAAAAAA////AAcHBwD9/f3b0dHRLfDw8PkGBgYAAAAAAAAAAAAEAAAAAAAAAAD///8ABwcHAPv7+8vY2Ng29/f3AA4ODgAAAAAAAAAAAAAAAAACAAAAAAAAAAAGBgYL+/v7w9LS0jbu7u4ACAgIAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAD4+Pia2traPvj4+AAMDAwA////AAAAAAAAAAAAAAAAAAAAAAABAAD//z9HdQMRW/QpAAAAAElFTkSuQmCC);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAuUAAALlAF37bb0AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAH/SURBVHgBAO8BEP4B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcnJymQgICGb6+vr1AQEBAAAAAAAAAAAAAAAAAAAAAAD///8ABgYGC/r6+pYDFxcXtBEREUMGBgYk/Pz8BgEBAQYAAAAGAAAABv///wYHBwcG/f39vtfX11cC8PDwANLS0j77+/vLBwcHAP///wAAAAAA////AAcHBwD7+/vH1NTUQ+7u7gACCAgIAPT09ADY2Ng2/f392wcHBwD+/v4ABwcHAP39/dfY2Ng68/PzAAkJCQAC////AAwMDADy8vIA0dHRLf///+gMDAwA////5NDQ0C7y8vIADAwMAP///wACAAAAAP///wAHBwcA8PDw+dnZ2Tn39/fG2NjYOPHx8fwHBwcAAAAAAAAAAAADJCQkAAAAAAAAAAAA////APv7+/D8/PzO7+/v2wICAgAEBAQAAgICAPz8/AAB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//4RfjvnDJoM6AAAAAElFTkSuQmCC);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #87A4BC;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #87A4BC;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #87A4BC;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "Roboto", arial, sans-serif;
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 210px;
+ width: 210px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+ font-family: "Roboto", arial, sans-serif;
+ border-radius: 2px;
+ border: 0px;
+ background: #FFFFFF;
+}
+.gantt_popup_title {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 0px;
+ height: 32px;
+ line-height: 32px;
+ display: inline-block;
+ margin: 4px 0px 4px 14px;
+ border-radius: 2px;
+ background: #FFFFFF;
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 4px 0px 0px 0px;
+}
+.gantt_popup_button {
+ min-width: 80px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 2px;
+ font-size: 14px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 1px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 0px;
+ height: auto;
+ line-height: 16px;
+ font-size: 16px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.8);
+ min-height: 30px;
+ border-radius: 2px;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.2), 0 1px 6px 0 rgba(0, 0, 0, 0.2);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #D7D7D7;
+}
+.gantt-error {
+ background-color: #FF5252;
+ border: 1px solid #FF5252;
+}
+.gantt-error div {
+ background-color: #FF5252;
+ border: 1px solid #FF5252;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #FFAB00;
+ border: 1px solid #FFAB00;
+}
+.gantt-warning div {
+ background-color: #FFAB00;
+ border: 1px solid #FFAB00;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 14px;
+ color: #fff;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: rgba(0, 0, 0, 0.15);
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 50px;
+ -moz-border-radius: 50px;
+ border-radius: 50px;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #448AFF;
+ border: 1px solid #448AFF;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #6e6e6e;
+ top: 0;
+ font-size: 11px;
+ font-size: 13px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 8px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #87A4BC;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #87A4BC;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #448AFF;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #b8c9d7;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #FF5252;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #b8c9d7;
+ border-color: #87a4bc;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #FF5252;
+ border-color: #ff0505;
+}
+.gantt_link_arrow_right {
+ border-width: 6px 0 6px 6px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #87A4BC;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 6px 6px 6px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #87A4BC;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 6px 6px 6px;
+ border-color: transparent transparent #87A4BC transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #87A4BC;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 6px 6px 0 6px;
+ border-top-color: #87A4BC;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 80%;
+ width: 8px;
+ z-index: 1;
+ top: 10%;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 19px;
+ width: 25px;
+ bottom: -10px;
+ margin-left: -14px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAAeNJREFUOBGlU0tOAkEQdQAHiIpDjPGz87fxCu400Wt4C1gRbsAhPARbbsCKxISFsjDqUiMfgRl8r+WRYmCExEoeVV1d9V51N+NtrG/ektLJktxCalmjLVq1b2sTBf8isXuKrY+mCpbcxrMBUrNoPrBkjFmXBjaBfL1evxyPx412u32CtWoRzsVcJxqb4sRZ5LaAvVqtdjUajV4msDAMn1ut1jnyHICDqBdhsqnITp5D+Q5wUK1WrweDwSsFZBRqNpsX2F9LKEmgAIKjcrl82+/330Ru/bpCfwkcl0qlu16v926J4/EqIQnQ63F5RTzBWgISNG+08D4S4UYG8IFt4JBXtOoEEpBPEpKITpGHwH6lUrlJegMRJvkoip46nc4peBy3BOQpxJMUG43Gve/7Z/g3+ZguDUKPwJ4zz/MmQiqVijKZTJjNZodBEHSLxWI3l8s9FgqFBxS7JgnQU4TfRADsArw2ijLP66SxTl82v/rQ4BvxF/ABfAJDYMI3sMZmNnWnng0kp4iGQeiMtURciMSDaR5uvpFkOg1JOYBycQFsOZOQhosLMu+Ifsvnr0ATWnLGcXMkSKre+lmtJWFSaxHG/azRBFaIaa4FV5ZEorwrwk98rTy9RJRbWNtmG6vhv94J/gATDnWOR2FfEQAAAABJRU5ErkJggg==);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAAeNJREFUOBGlU0tOAkEQdQAHiIpDjPGz87fxCu400Wt4C1gRbsAhPARbbsCKxISFsjDqUiMfgRl8r+WRYmCExEoeVV1d9V51N+NtrG/ektLJktxCalmjLVq1b2sTBf8isXuKrY+mCpbcxrMBUrNoPrBkjFmXBjaBfL1evxyPx412u32CtWoRzsVcJxqb4sRZ5LaAvVqtdjUajV4msDAMn1ut1jnyHICDqBdhsqnITp5D+Q5wUK1WrweDwSsFZBRqNpsX2F9LKEmgAIKjcrl82+/330Ru/bpCfwkcl0qlu16v926J4/EqIQnQ63F5RTzBWgISNG+08D4S4UYG8IFt4JBXtOoEEpBPEpKITpGHwH6lUrlJegMRJvkoip46nc4peBy3BOQpxJMUG43Gve/7Z/g3+ZguDUKPwJ4zz/MmQiqVijKZTJjNZodBEHSLxWI3l8s9FgqFBxS7JgnQU4TfRADsArw2ijLP66SxTl82v/rQ4BvxF/ABfAJDYMI3sMZmNnWnng0kp4iGQeiMtURciMSDaR5uvpFkOg1JOYBycQFsOZOQhosLMu+Ifsvnr0ATWnLGcXMkSKre+lmtJWFSaxHG/azRBFaIaa4FV5ZEorwrwk98rTy9RJRbWNtmG6vhv94J/gATDnWOR2FfEQAAAABJRU5ErkJggg==);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #FFFFFF;
+ border-left: 1px solid #cecece;
+ border-top: 1px solid #cecece;
+ font-family: Tahoma;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.8);
+ padding: 11px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #87A4BC;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: rgba(0, 199, 181, 0.2);
+}
+.gantt_task_row.gantt_selected {
+ background-color: rgba(0, 199, 181, 0.2);
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: rgba(145, 210, 210, 0.7);
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: none;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: none;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #FFC107;
+ border: 0px solid #FFC107;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #FF5252;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #FF5252;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #FF5252;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background: #FFFFFF;
+ border-radius: 2px;
+ font-family: "Roboto", arial, sans-serif;
+ border: 1px solid #D7D7D7;
+ color: rgba(31, 31, 31, 0.8);
+ font-size: 14px;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "Roboto", arial, sans-serif;
+ border: 1px solid #D7D7D7;
+ font-size: 14px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 2px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 2px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 2px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 2px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "Roboto", arial, sans-serif;
+ font-size: 14px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #D7D7D7;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #D7D7D7;
+ border-left: none;
+ border-right: none;
+ background-color: #FFFFFF;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 6px 15px 6px 15px;
+ float: left;
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ border-width: 0px;
+ border-color: #D7D7D7;
+ border-style: solid;
+ height: 32px;
+ font-weight: 500;
+ background: #FFFFFF;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 14px;
+ height: 20px;
+ line-height: 20px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "Roboto", arial, sans-serif;
+ font-size: 14px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #D7D7D7;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #D7D7D7;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 14px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #D7D7D7;
+}
+.gantt_duration {
+ width: 100px;
+ height: 30px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 32px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #D7D7D7;
+}
+.gantt_duration .gantt_duration_value {
+ width: 36px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 66px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 30px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #FFFFFF;
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 2px;
+ -moz-border-bottom-left-radius: 2px;
+ -webkit-border-top-left-radius: 2px;
+ -webkit-border-bottom-left-radius: 2px;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 2px;
+ -moz-border-bottom-right-radius: 2px;
+ -webkit-border-top-right-radius: 2px;
+ -webkit-border-bottom-right-radius: 2px;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #D7D7D7;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 0px;
+ border-radius: 2px;
+ position: absolute;
+ z-index: 300;
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2), 0 0 3px 1px rgba(0, 0, 0, 0.1);
+ background-color: #FFFFFF;
+ width: auto;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 2px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 2px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 2px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 2px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: rgba(0, 0, 0, 0.8);
+ background-color: #fff;
+ border-bottom: 1px solid #D7D7D7;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 14px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.8);
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 2px;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 2px;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 2px;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 2px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 2px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 2px;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 6px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=);
+}
+.gantt_qi_big_icon {
+ font-size: 14px;
+ border-radius: 2px;
+ font-weight: 500;
+ background: #FFFFFF;
+ margin: 4px 0px 4px 14px;
+ min-width: auto;
+ line-height: 32px;
+ vertical-align: middle;
+ padding: 0px 16px 0px 16px;
+ cursor: pointer;
+ border: 0px;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 32px;
+ text-align: center;
+ line-height: 32px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 14px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #D7D7D7;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #D7D7D7;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #D7D7D7;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #D7D7D7;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "Roboto", arial, sans-serif;
+ font-size: 14px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #bebebe;
+ border-top: 1px solid #bebebe;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #bebebe;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #ffffff;
+}
+.gantt_popup_button.gantt_delete_button {
+ background-color: #448AFF;
+ color: #FFFFFF;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_meadow.css b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_meadow.css
new file mode 100644
index 0000000..27ee9a2
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_meadow.css
@@ -0,0 +1,2036 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #fff;
+}
+/* colors for items with inline styles assigned (task.color, link.color)*/
+/*
+ Header
+*/
+.chartHeaderBg {
+ background-color: #f4f2ea;
+}
+/*
+ Grid
+*/
+.gridHoverStyle {
+ background-color: #ffebbc !important;
+}
+.gantt_grid_scale .gantt_grid_head_cell {
+ border-top: none !important;
+ border-right: none !important;
+}
+.gantt_grid_data .gantt_cell {
+ border-right: none;
+}
+.gridSelection {
+ background-color: #ffebbc !important;
+}
+.timelineSelection {
+ background-color: #ffebbc !important;
+}
+/*
+ Plot
+*/
+.gantt_task_link .gantt_link_arrow_right {
+ margin-top: -1px;
+}
+.gantt_task_link .gantt_link_arrow_left {
+ margin-top: -1px;
+}
+/*
+ milestone
+*/
+.gantt_task_line .gantt_task_progress_drag {
+ bottom: -4px;
+ height: 10px;
+ margin-left: -8px;
+ width: 16px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ border-right: 1px solid #cac8bd;
+}
+/*
+ project highlight
+*/
+.gantt_row.gantt_project .gantt_cell,
+.gantt_row.odd.gantt_project .gantt_cell {
+ background-color: #edf4ff;
+}
+.gantt_task_row.gantt_project .gantt_task_cell,
+.gantt_task_row.odd.gantt_project .gantt_task_cell {
+ background-color: #f5f8ff;
+}
+.gantt_task_line.gantt_project {
+ background-color: #c7d8f7;
+ border: 1px solid #7ba3ed;
+}
+.gantt_task_line.gantt_project .gantt_task_progress {
+ background-color: #9ab9f1;
+}
+/*
+ lightbox
+*/
+.gantt_cal_light .gantt_cal_ltitle {
+ padding: 7px 10px;
+}
+.gantt_cal_light .gantt_cal_ltext textarea {
+ border: 1px solid #d8d6ce;
+}
+.gantt_cal_light .gantt_cal_larea {
+ border-color: #d8d6ce !important;
+ background-color: #fcfaf3;
+}
+.gantt_cal_light .gantt_cal_larea .gantt_section_time {
+ background-color: #fcfaf3;
+}
+.buttonBg {
+ background: #e0ded7;
+}
+.gantt_cal_light .gantt_btn_set {
+ height: 27px;
+ margin: 5px 10px;
+ padding: 0px 15px 0px 10px;
+}
+.gantt_cal_light .gantt_btn_set div {
+ height: 25px;
+ margin-top: 0;
+ background-position: center center;
+ line-height: 25px;
+}
+.gantt_btn_set.gantt_save_btn_set {
+ border: 1px solid #98d27e;
+ background: #a7d991;
+}
+.gantt_btn_set.gantt_cancel_btn_set {
+ background: #fff;
+ background: #e0ded7;
+ border: 1px solid #cac8bd;
+}
+.gantt_btn_set.gantt_delete_btn_set {
+ border: 1px solid #ffad54;
+ background: #ffb96d;
+}
+.gantt_cal_light_wide {
+ padding: 0 !important;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ border-left: none !important;
+ border-right: none !important;
+}
+.gantt_cal_light_wide .gantt_cal_larea .gantt_cal_lsection {
+ width: 90px;
+}
+.gantt_cal_light_wide .gantt_btn_set {
+ margin: 7px 10px;
+}
+/*
+ Message
+*/
+.gantt_popup_button.gantt_ok_button {
+ border: 1px solid #98d27e;
+ background: #a7d991;
+}
+.gantt_popup_title {
+ background-color: #f4f2ea;
+}
+.gantt_popup_shadow {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+/*
+ QuickInfo
+*/
+.gantt_data_area .gantt_cal_quick_info {
+ background-color: #f4f2ea;
+}
+.gantt_data_area .gantt_cal_qi_content {
+ background: #fcfaf3;
+ border-bottom: 1px solid #cac8bd;
+}
+.gantt_qi_big_icon.icon_delete {
+ border-color: #ffad54;
+ background: #ffb96d;
+}
+/* links dnd */
+.gantt_tooltip {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: white;
+ border-left: 1px solid rgba(0, 0, 0, 0.07);
+ border-top: 1px solid rgba(0, 0, 0, 0.07);
+ font-family: "Verdana";
+ font-size: 8pt;
+ color: #3f3f3f;
+}
+.gantt_container {
+ background-color: #FFFFFF;
+ font-family: "Verdana";
+ font-size: 11px;
+ border: 1px solid #cac8bd;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: #3f3f3f;
+ font-size: 8pt;
+ border-bottom: 1px solid #cac8bd;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ background-color: #f4f2ea;
+}
+.gantt_task_scale {
+ background-color: #f4f2ea;
+}
+.gantt_task_vscroll {
+ background-color: #f4f2ea;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #cac8bd;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #cac8bd;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 28px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDAzOTZDREFDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDAzOTZDREJDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDM5NkNEOEM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDM5NkNEOUM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnzqpNoAAAEFSURBVHjapJPPDsFAEMbHZqXSi1ZC3Dg7O9bbeA7v4czZE4hLSRwkbiI4cCAN4Uyqs/pPs1vbrTDJHL7Mb77sbr8WeuMu/FOEMQaStplYdgYHFBnKjK1atZqI8+ViZZ2AMmS5x1QxFNHLNVAx1EPMNVAxBBFtvxnfuq4LUKDTTLwXXsFqNprKE1RMM2y+9oe9FV3Bw5++/3svfMRWpS0MV7fFx0Ka2e62kQEhBEbzoTA0DAPqtXqinbMD643IFGkR3KcL1Cib0yA4/DBY4A2u15ug45oFHD05x44sO+kc+FwhI0j4RZBQlUT5kH+0JS4VBpKfqaSVYDDpJ1rz9eNxlxq8BBgAcMHBu6BPeX8AAAAASUVORK5CYII=);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.3;
+ opacity: 0.3;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ background-color: #ffebbc !important;
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 1px solid #eae9e5;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #FFFFFF;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #cac8bd;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #eae9e5;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #cac8bd;
+ border-right: 1px solid #cac8bd;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #cac8bd;
+ border-bottom: 1px solid #cac8bd;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #eae9e5;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 8pt;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #cac8bd;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #eae9e5;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAWUlEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZyDKIkZGR4f9/hCMHziCQS9AByGUD5yKYa6gWRujeI8lrVElHhAxBlh/GmRYA5MZIE4VV1O8AAAAASUVORK5CYII=);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAATElEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZhrhBjIyYIfD//3+GYeA1XNFGkteoko4IGYIsP4wzLQBu8jwTv5HhogAAAABJRU5ErkJggg==);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB30lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodz0A0xSbqMas6/nwzf/3AwcLL8YPjxYhvDlR11DMiGoRgkp63OIGY0ieHPt7cMF9ZGwQ0yjj0EZv/4L8TAwfiO4f+3awzn1mbgNsgkdidEM6sU3JA/Hy+jGhq+jOH/n09EGoTsKZihQK+dWWDCYBQ8AyxLnIugBv3/9RbMArmAkUuL4exiOwYD/26w2IWNpbi9Zhy5gYHh3zewxn9/PjMw/3nDwPD7HQODsDdY89nlAQw6Hk1gNt7ABjkb2YD/f78w/P3xloFFLoth8cRsBi2xp8QZZOxdDnYBzACQzb+/f2BgUywAB7iyaRA89DiFDVBchRL9Rs6RYBfADADRf398ZuDUrIUYZB6GiIZ/fxh4pP0YLm5IAIcVikH61m4YhjD++cbArtUI1oDson9/fjDwqqQxXFodgGmQlpEZ2CCQKyAmfgIG/i8GDt1u0gxS19IE6we54v//P2BDQABmkKKhF8JrQBZOF4EMghsC0kKuQZICXxj4xbQhroECRkYWoIvawYEtp20NF2dm42dgk4ljuLk5AjWMQCpgJQDMQJgumEEo/oJyYCUASpkCU4hcpIAMFXfeBHYRehmEbDBWg5AVIBuKzyAAfjsXIj7TBm0AAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB90lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodzQIboWYUwsGnU4tR/Zp4+g6J1NQM/HzvDhe11DMiGoRhkErMHiyHMEDE2IQaQQZwcHAxqXvMZLq6LJMUgiCH//3xlYOSSJccgqAG/3oAN+vv7GwMLtxzDmSWOYBepe85kuLA+npCLmMEuYPj3neHfjxcQF/1+z8AibAU0yAVskIZbN8P5Tbm4DTKO2AI2AOQCxr+fwAb8+/2JgVXEAWzg2RU+EBc5VuEPbIPAhSgGMPwFuuznawZWuQSGxZPSGbTEnoINUrXJYbi0pwe3iww8m8AugBkAcsXv728Y2FXyGC6sDmJgZmZmYGNlZVC1TGRgYOZGMQw1HTlmgl0AM+D/ny9gNrtqMTi6QQaJC3Mw8Mm5gcU5pZzgYYWRIH/9+MzA+P8nMMC/AMPoK8O/P78YuHXrwLHEyMzGICnMCjHo3zcGDuV0sEtBCRPFIE1DB7ABkJiCGPL/3y8GHv0WuEEi/CwMwkru+A3S0DWBGwA2DGgICGAYpGALFsfpInUNTYa//xgYGKEGwAzjNugChxHIayAXicibMfxnZMdtkKTANwYeEV2G/0xsYMNANDjgJRIYHh4qhwQwMPrlVXUYGFl4GL7xeoLFUcIIpIiUYgRsKhDASgCUMgUmSQ5NNYMAK+sKIlqSof0AAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAA/klEQVQ4T63Uyw5FMBAG4CliIcHOE9pIeBrCxou69py/yUgvnLRymogS85lOL4L+1ITu1HUtfdx5no04xFwvgPR9T3EckxDOd8rf913du64jGzOgcRxpWRYDQvB5nrSuK5VleSVsYwY0TRNt20ZRFKlgzuI4DgUVRWGMXMccCEHcgEkp1ZCQaZ7n/hACuUboA8YFDNkCR7+qKmqa5qqVk5E9azrGKDDUKwgCzBgAYHjOsiwcAsb14hqmafoOQhY8k+gnSeIPIYAb9xl7Bekgw1hrQcW+Q9Te+m6jIOjXJn6EhmFQm9anYfbatnUXJIJ9jxH+kX4C3J8XPilZ33wAwx73EyvYLYIAAAAASUVORK5CYII=);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #ffb96d;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #ffb96d;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #ffb96d;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "Verdana";
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 250px;
+ width: 250px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ font-family: "Verdana";
+ border-radius: 6px;
+ border: 1px solid #cac8bd;
+ background: #fcfaf3;
+}
+.gantt_popup_title {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 1px solid #cac8bd;
+ height: 25px;
+ line-height: 25px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 4px;
+ background: #fff;
+ background: #e0ded7;
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 10px;
+}
+.gantt_popup_button {
+ min-width: 100px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 4px;
+ font-size: 14px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 1px solid #cac8bd;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #cac8bd;
+}
+.gantt-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+}
+.gantt-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #FF9000;
+ border: 1px solid #ffa633;
+}
+.gantt-warning div {
+ background-color: #FF9000;
+ border: 1px solid #b36500;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 11px;
+ color: #3f3f3f;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: #a7d991;
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #e1ffd4;
+ border: 1px solid #7fbc64;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #6e6e6e;
+ top: 0;
+ font-size: 11px;
+ font-size: 10px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 6.75px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #ffb96d;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #ffb96d;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #a7d991;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #ffdeba;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #e87e7b;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #ffdeba;
+ border-color: #ffb96d;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #e87e7b;
+ border-color: #dd3e3a;
+}
+.gantt_link_arrow_right {
+ border-width: 4px 0 4px 6px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #ffb96d;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 4px 6px 4px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #ffb96d;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 4px 6px 4px;
+ border-color: transparent transparent #ffb96d transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #ffb96d;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 4px 6px 0 4px;
+ border-top-color: #ffb96d;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 100%;
+ width: 8px;
+ z-index: 1;
+ top: -1px;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 8px;
+ width: 8px;
+ bottom: -4px;
+ margin-left: -4px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0JCMkQyRDhDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0JCMkQyRDlDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQkIyRDJENkM5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQkIyRDJEN0M5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ppy3ICwAAADsSURBVHjafFBbaoNQEB1vghtIPlJX4Z/iX/cSsoZQGl80JZvIAvxVf1yNX6EFH+ADK8Y6nblQaGzagXNnmHPODHMVRIR5+L7/Sqm2bfv0i2TDT3ied4zjGBlU7+f8XPzCwrZtsSzLb9PTXQMRfhRFWFUVdl0nURQFco+45xsDNdwwDOVUNuR5LlHXNWZZhsyR5sDahRDC1XXdsSwLFCHgo+/hc5okhusVVFUFTdNgHMfHIAhQ0N2OaZowkbtpGhiG4Qa0RX6OYRicvCU9b2maPqzWa/grKtpE93D5zoZtkiRnyhv4Py6E3ZcAAwDb89Sl5rtPtAAAAABJRU5ErkJggg==);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAjklEQVQY043LwQ0BURjE8aEKPfy3EoWoQQTZCKKI5yUvX0m7W4Jw1sC4cNjF8kvmNDMT2xqqquoo6d627emttN0LcIgIR4SB5bAfjvcR4ZfnafXxAOxKKR4qpRhY9w5AnXP2NzlnAxvbElCnlPxLSsnAVoD/BXgq6do0jSyNpuk6SbpNgLmks6SZxl0kLR44uvaQZ7V7eAAAAABJRU5ErkJggg==);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #fff;
+ border-left: 1px dotted #cecece;
+ border-top: 1px dotted #cecece;
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #444;
+ padding: 6px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #ffb96d;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: #ffebbc !important;
+}
+.gantt_task_row.gantt_selected {
+ background-color: #ffebbc !important;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #ffdc89;
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: 0 0 5px #a7d991;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #9ab9f1;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #DB7DC5;
+ border: 0px solid #cd49ae;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #e63030;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #e63030;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #e63030;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background: #f4f2ea;
+ border-radius: 6px;
+ font-family: "Verdana";
+ font-size: 11px;
+ border: 1px solid #cac8bd;
+ color: #3f3f3f;
+ font-size: 8pt;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "Verdana";
+ border: 1px solid #cac8bd;
+ font-size: 11px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "Verdana";
+ font-size: 11px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #cac8bd;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #cac8bd;
+ border-left: none;
+ border-right: none;
+ background-color: #fff;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 5px 15px 5px 10px;
+ float: left;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border-width: 0;
+ border-color: #cac8bd;
+ border-style: solid;
+ height: 27px;
+ color: #4f4f4f;
+ background: #fff;
+ background: #e0ded7;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 13px;
+ height: 17px;
+ line-height: 17px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUUzMDA3NzlDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUUzMDA3N0FDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBRTMwMDc3N0M5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBRTMwMDc3OEM5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtHrmoUAAAF4SURBVHjaYvr//z8DNTATA5UA1QxiIUdTQEAAG5CaA8S6QGyyYcOGvyzkGMLIyLgSGC4BHBwcr1RUVBhJdhHQEGagIctAhjAzM/9OSkrqd3Nz+ws3CKjAA0hNA+JcoDO34jIESC0FGhIM4tvb2y8FGjIbyPwPD2wNDQ1RIKUItG09UIM3LkOAOBzEB3rnaF5eXieQ+RYl1jo6Og4oKCicAtrGCjXMA82Q+TBD+Pj4HtfU1NQDmTewRf/jjIyMNmDgfYAatgnJMFDsxIIYrKysX7Ozs9sFBAT240xHQO/t8PT0BGliQHLZdiA3AabGz89vlrm5+RIg8x++BPkzPj5+Msj/UMM4gBTciwYGBttiY2MnAJmfiUnZj4CB2MzFxfUGWVBcXPx6WVlZE0ie6CwiJye3D+il6UCvgZ0PCreCggKQ4adIzWu/w8LCpoO8wsLC8j0yMnKipqbmelh6wQUYQUUADmACxDpADArwl4RSPT6DBqYYAQgwANyusz7jloxAAAAAAElFTkSuQmCC);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjQxN0VEOUZDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjQxN0VEQTBDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNDE3RUQ5REM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNDE3RUQ5RUM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq9E2PUAAAH/SURBVHjaYvz//z8DNQAjTQ0KCAjgAVJFQOwBxGZQ4VNAvAOI+zZs2PCFoEFAQ+wZGRkXAMUVsNrMyPgAKJcANOwgToOAhgQCqXUgtqCg4ANXV9ctzs7Od0D8vXv3quzYsSPw06dP0lDl/kDDNmEYBDRECGjbYyCfS09Pb0dNTc1sNja2M0CpF1C1EjExMfu/fPmiBHXZZ5CrgYa9A/FZYCaysLCU/vnzh0tUVPRGU1NTPVDoNBD/R3ItyKVKAgICj/79+8cIdJksSA9QrBIkz4RkUBCINjU1XQUNWGRDQC4zBhrycMGCBYW2trbLkPWgGPTz50+wk6WlpTegBT6yIaCYXMfJybkRJPf7928ZDIOYmZl/g+jjx4+/xmcISPz27dsfYNowDOLi4gIb8PDhQ1N8hkDVGIBobm7ulxgGAb0EClyGX79+leAzBCjH9vXr13pkPSgGhYeHTwd6DxhUP62ghjzCZggw2icCw0YdGNDfQXrgkQVjGBgYHPHx8Zm9cePGHGhA/gdq/ANkysGUAHELMO3ogji+vr6zQXpwZREFkEErV66M//btmwi2LAIMyzdAlyz09/efDAoufJlW8tWrVx7Tp08PevDggc779+8VYFlGQUHhSmZm5joxMTFQ5n1OTDHCCsT6QAxKJ2JQsVdA/ASIL4J8TrPyCCDAAK8E80CvM3cMAAAAAElFTkSuQmCC);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "Verdana";
+ font-size: 11px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #cac8bd;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #eae9e5;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 11px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #cac8bd;
+}
+.gantt_duration {
+ width: 100px;
+ height: 23px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 23px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #cac8bd;
+}
+.gantt_duration .gantt_duration_value {
+ width: 40px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 70px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 20px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #fff;
+ background: #e0ded7;
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 4px;
+ -moz-border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 4px;
+ -moz-border-bottom-right-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #eae9e5;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 1px solid #cac8bd;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 300;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: #fcfaf3;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: #3f3f3f;
+ background-color: #f4f2ea;
+ border-bottom: 1px solid #cac8bd;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 11px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 13px;
+ color: #3f3f3f;
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 6px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 6px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 6px;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 3.5px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDgcMloNXJQAAAFNJREFUOMvt0zEOACAIA0Dkg30rL8TJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAT/KLVk9yshBAAAAAElFTkSuQmCC);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==);
+}
+.gantt_qi_big_icon {
+ font-size: 13px;
+ border-radius: 4px;
+ color: #4f4f4f;
+ background: #fff;
+ background: #e0ded7;
+ margin: 5px 9px 8px 0px;
+ min-width: 60px;
+ line-height: 27px;
+ vertical-align: middle;
+ padding: 0px 10px 0px 5px;
+ cursor: pointer;
+ border: 1px solid #cac8bd;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 27px;
+ text-align: center;
+ line-height: 27px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 11px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 11px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #cac8bd;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #cac8bd;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #cac8bd;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #cac8bd;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "Verdana";
+ font-size: 11px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #d3d1c8;
+ border-top: 1px solid #d3d1c8;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #d3d1c8;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #ffffff;
+}
+.gantt_popup_button.gantt_delete_button {
+ border: 1px solid #98d27e;
+ background: #a7d991;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_skyblue.css b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_skyblue.css
new file mode 100644
index 0000000..cba807d
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_skyblue.css
@@ -0,0 +1,2016 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #fff;
+}
+/* colors for items with inline styles assigned (task.color, link.color)*/
+.gridHoverStyle {
+ background-color: #ffe6b1 !important;
+ background-color: #ffebc1;
+ background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%);
+ border-top-color: #ffc341;
+ border-bottom-color: #ffc341;
+}
+.gridSelection {
+ background-color: #ffe6b1 !important;
+ border-bottom-color: #ffc341;
+}
+.timelineSelection {
+ background-color: #ffe6b1 !important;
+ background-color: #ffebc1;
+ background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%);
+ border-top-color: #ffc341;
+ border-bottom-color: #ffc341;
+}
+.timelineSelection .gantt_task_cell {
+ border-right-color: #ffce65;
+}
+/*
+ milestone
+*/
+/*
+ links dnd
+*/
+/*
+ task resizers
+*/
+/*lightbox*/
+/*
+ Message
+*/
+.gantt_popup_shadow {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+.gantt_cal_quick_info .gantt_cal_qi_title {
+ background: #FFFFFF;
+}
+.gantt_cal_qi_controls .gantt_qi_big_icon .gantt_menu_icon.icon_delete {
+ margin-top: 5px;
+}
+.gantt_popup_title {
+ box-shadow: 0px 1px 1px #fff inset;
+ background-color: #dfedff;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff));
+ /* old webkit */
+ background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%);
+ background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-position: 0px 1px;
+ background-repeat: repeat-x;
+}
+.gantt_tooltip {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: white;
+ border-left: 1px solid rgba(0, 0, 0, 0.07);
+ border-top: 1px solid rgba(0, 0, 0, 0.07);
+ font-family: "Tahoma";
+ font-size: 8pt;
+ color: #1e2022;
+}
+.gantt_container {
+ background-color: #FFFFFF;
+ font-family: "Tahoma";
+ font-size: 11px;
+ border: 1px solid #a4bed4;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: #42464b;
+ border-bottom: 1px solid #a4bed4;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ box-shadow: 0px 1px 1px #fff inset;
+ background-color: #dfedff;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff));
+ /* old webkit */
+ background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%);
+ background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-position: 0px 1px;
+ background-repeat: repeat-x;
+}
+.gantt_task_scale {
+ box-shadow: 0px 1px 1px #fff inset;
+ background-color: #dfedff;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff));
+ /* old webkit */
+ background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%);
+ background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-position: 0px 1px;
+ background-repeat: repeat-x;
+}
+.gantt_task_vscroll {
+ box-shadow: 0px 1px 1px #fff inset;
+ background-color: #dfedff;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff));
+ /* old webkit */
+ background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%);
+ background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-position: 0px 1px;
+ background-repeat: repeat-x;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #a4bed4;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #a4bed4;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 25px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzZCMThBRUFCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzZCMThBRUJCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NkIxOEFFOEJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NkIxOEFFOUJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVHygEAAAEpSURBVHjaYgzeGcyABfxnwA4Y0QVY/v79i1VlsUMxCr/3QC9WdTgN+P//P8Ohr4fAbDtuOwZc6lj+/PmDVeLfv39wTSA2LnU4DQC5AGYAiI1LHRNQ4j861pfSZ3j36x1YEwiD2CAxbGoZbRbZ/K/3qUcx9cPvDwzXv11n+PL3C5jPw8zDoMmlySDAKoCirnFLI8QLID/ufLOTARf48OcDw/Gfx1HE3EXcwa5j+f37N95AwgVAekB64QaATISB97/fM1z5dIXh85/PYD4vCy+DDp8OgyCrIIYBjFoTtDBSnYWyBYO9rj3DsbfHwHwrYSuGg5cPMpy4ewIzFoCmMKLjwzcOMwiwCMBjAcQGiWFTizchweRompDwuiBANoCgCxjFasQoys4AAQYARt4I/K036xQAAAAASUVORK5CYII=);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.3;
+ opacity: 0.3;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ background-color: #ffe6b1 !important;
+ background-color: #ffebc1;
+ background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%);
+ border-top-color: #ffc341;
+ border-bottom-color: #ffc341;
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #FFFFFF;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #a4bed4;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #ebebeb;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #a4bed4;
+ border-right: 1px solid #a4bed4;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #a4bed4;
+ border-bottom: 1px solid #a4bed4;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #ebebeb;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #a4bed4;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #ebebeb;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAWUlEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZyDKIkZGR4f9/hCMHziCQS9AByGUD5yKYa6gWRujeI8lrVElHhAxBlh/GmRYA5MZIE4VV1O8AAAAASUVORK5CYII=);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAATElEQVQ4T2NkoBJgpJI5DCPVoJaWlv+EwrCmpgYcPHjDCGRQdXU1TrNaW1sZhrhBjIyYIfD//3+GYeA1XNFGkteoko4IGYIsP4wzLQBu8jwTv5HhogAAAABJRU5ErkJggg==);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB30lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodz0A0xSbqMas6/nwzf/3AwcLL8YPjxYhvDlR11DMiGoRgkp63OIGY0ieHPt7cMF9ZGwQ0yjj0EZv/4L8TAwfiO4f+3awzn1mbgNsgkdidEM6sU3JA/Hy+jGhq+jOH/n09EGoTsKZihQK+dWWDCYBQ8AyxLnIugBv3/9RbMArmAkUuL4exiOwYD/26w2IWNpbi9Zhy5gYHh3zewxn9/PjMw/3nDwPD7HQODsDdY89nlAQw6Hk1gNt7ABjkb2YD/f78w/P3xloFFLoth8cRsBi2xp8QZZOxdDnYBzACQzb+/f2BgUywAB7iyaRA89DiFDVBchRL9Rs6RYBfADADRf398ZuDUrIUYZB6GiIZ/fxh4pP0YLm5IAIcVikH61m4YhjD++cbArtUI1oDson9/fjDwqqQxXFodgGmQlpEZ2CCQKyAmfgIG/i8GDt1u0gxS19IE6we54v//P2BDQABmkKKhF8JrQBZOF4EMghsC0kKuQZICXxj4xbQhroECRkYWoIvawYEtp20NF2dm42dgk4ljuLk5AjWMQCpgJQDMQJgumEEo/oJyYCUASpkCU4hcpIAMFXfeBHYRehmEbDBWg5AVIBuKzyAAfjsXIj7TBm0AAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAB90lEQVQ4T2NkQAKnZyn9R+bjY5um3WNElodzQIboWYUwsGnU4tR/Zp4+g6J1NQM/HzvDhe11DMiGoRhkErMHiyHMEDE2IQaQQZwcHAxqXvMZLq6LJMUgiCH//3xlYOSSJccgqAG/3oAN+vv7GwMLtxzDmSWOYBepe85kuLA+npCLmMEuYPj3neHfjxcQF/1+z8AibAU0yAVskIZbN8P5Tbm4DTKO2AI2AOQCxr+fwAb8+/2JgVXEAWzg2RU+EBc5VuEPbIPAhSgGMPwFuuznawZWuQSGxZPSGbTEnoINUrXJYbi0pwe3iww8m8AugBkAcsXv728Y2FXyGC6sDmJgZmZmYGNlZVC1TGRgYOZGMQw1HTlmgl0AM+D/ny9gNrtqMTi6QQaJC3Mw8Mm5gcU5pZzgYYWRIH/9+MzA+P8nMMC/AMPoK8O/P78YuHXrwLHEyMzGICnMCjHo3zcGDuV0sEtBCRPFIE1DB7ABkJiCGPL/3y8GHv0WuEEi/CwMwkru+A3S0DWBGwA2DGgICGAYpGALFsfpInUNTYa//xgYGKEGwAzjNugChxHIayAXicibMfxnZMdtkKTANwYeEV2G/0xsYMNANDjgJRIYHh4qhwQwMPrlVXUYGFl4GL7xeoLFUcIIpIiUYgRsKhDASgCUMgUmSQ5NNYMAK+sKIlqSof0AAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAA/klEQVQ4T63Uyw5FMBAG4CliIcHOE9pIeBrCxou69py/yUgvnLRymogS85lOL4L+1ITu1HUtfdx5no04xFwvgPR9T3EckxDOd8rf913du64jGzOgcRxpWRYDQvB5nrSuK5VleSVsYwY0TRNt20ZRFKlgzuI4DgUVRWGMXMccCEHcgEkp1ZCQaZ7n/hACuUboA8YFDNkCR7+qKmqa5qqVk5E9azrGKDDUKwgCzBgAYHjOsiwcAsb14hqmafoOQhY8k+gnSeIPIYAb9xl7Bekgw1hrQcW+Q9Te+m6jIOjXJn6EhmFQm9anYfbatnUXJIJ9jxH+kX4C3J8XPilZ33wAwx73EyvYLYIAAAAASUVORK5CYII=);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #4a8f43;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #4a8f43;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #4a8f43;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "Tahoma";
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 250px;
+ width: 250px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ font-family: "Tahoma";
+ border-radius: 0;
+ border: 1px solid #a4bed4;
+ background: #fff;
+}
+.gantt_popup_title {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 1px solid #a4bed4;
+ height: 24px;
+ line-height: 24px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 4px;
+ background: #fff;
+ background-color: #f8f8f8;
+ background-image: -webkit-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -moz-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -ms-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: linear-gradient(to top, #E6E6E6 0%, #FFFFFF 100%);
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 10px;
+}
+.gantt_popup_button {
+ min-width: 100px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 4px;
+ font-size: 15px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 1px solid #a4bed4;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 0;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #a4bed4;
+}
+.gantt-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+}
+.gantt-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #FFA000;
+ border: 1px solid #ffb333;
+}
+.gantt-warning div {
+ background-color: #FFA000;
+ border: 1px solid #b37000;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 12px;
+ color: #1e2022;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: #5aa0d3;
+ background-color: #82b7de;
+ background-image: -webkit-linear-gradient(top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%);
+ background-image: -moz-linear-gradient(top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%);
+ background-image: -ms-linear-gradient(top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%);
+ background-image: linear-gradient(to top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%);
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #eff6fb;
+ border: 1px solid #3588c5;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #6e6e6e;
+ top: 0;
+ font-size: 11px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 6.75px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #4a8f43;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #4a8f43;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #0070fe;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #6eb867;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #e87e7b;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #6eb867;
+ border-color: #4a8f43;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #e87e7b;
+ border-color: #dd3e3a;
+}
+.gantt_link_arrow_right {
+ border-width: 4px 0 4px 8px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #4a8f43;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 4px 8px 4px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #4a8f43;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 4px 8px 4px;
+ border-color: transparent transparent #4a8f43 transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #4a8f43;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 4px 8px 0 4px;
+ border-top-color: #4a8f43;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 100%;
+ width: 8px;
+ z-index: 1;
+ top: -1px;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 8px;
+ width: 8px;
+ bottom: -4px;
+ margin-left: -4px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDNGNzQ1MTZCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDNGNzQ1MTdCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0M0Y3NDUxNEJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0M0Y3NDUxNUJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrBLI3EAAACISURBVHjafE07DkMhDAuftQdgYuCWbZ9a0WtwGJC4BgMbYmVGaZLpqWpryZFjOwrACSmlSLzCN1DwrLUik/TtM3yUUnDOiWMMZE3enTNF4gghRO89KKXkABGh9w6ttcPSHp1zsNaCvbcUjDHAHhVemg1rrVxprYWs2ZOMR84ZfoGfXuAP3gIMABorQUvC1invAAAAAElFTkSuQmCC);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAUklEQVQY04XNsQ2AMAxE0W+oGYjZCAIxmuk9gze5VCmIIvLaf9KtfD3ADrwM3JmpzBRw9PGKCDURIaC0eLq7eu4uoBggSaNLzIyFCQM0G2x/gwpRwTYDaW9lwQAAAABJRU5ErkJggg==);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #fff;
+ border-left: 1px dotted #cecece;
+ border-top: 1px dotted #cecece;
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #444;
+ padding: 6px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #4a8f43;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: #ffe6b1 !important;
+ border-bottom-color: #ffc341;
+}
+.gantt_task_row.gantt_selected {
+ background-color: #ffe6b1 !important;
+ background-color: #ffebc1;
+ background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%);
+ background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%);
+ border-top-color: #ffc341;
+ border-bottom-color: #ffc341;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #ffb30e;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #ffce65;
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: 0 0 5px #5aa0d3;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #9ab9f1;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #DB7DC5;
+ border: 0px solid #cd49ae;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #e63030;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #e63030;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #e63030;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #eff6fb;
+ border-radius: 0;
+ font-family: "Tahoma";
+ font-size: 11px;
+ border: 1px solid #a4bed4;
+ color: #42464b;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "Tahoma";
+ border: 1px solid #a4bed4;
+ font-size: 11px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "Tahoma";
+ font-size: 11px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #a4bed4;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #a4bed4;
+ border-left: none;
+ border-right: none;
+ background-color: #fff;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 2px 25px 2px 10px;
+ float: left;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border-width: 1px;
+ border-color: #a4bed4;
+ border-style: solid;
+ height: 26px;
+ color: #42464b;
+ background: #fff;
+ background-color: #f8f8f8;
+ background-image: -webkit-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -moz-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -ms-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: linear-gradient(to top, #E6E6E6 0%, #FFFFFF 100%);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 13px;
+ height: 20px;
+ line-height: 20px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkE5Nzc4RENDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkE5Nzc4RERDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQTk3NzhEQUMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQTk3NzhEQkMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pr5Ot2UAAAFoSURBVHjapFO7SgNRED0rxkjEELbcQksLBUMg4EfkG7YV/AFTpBAUfNQisVDQD7CQlBaWwoZ8gNEiFttmg3GTfbF6JtzFTUJYyIHhDnfOnJm5Dy2OYywDjQJnF5ex/dXDweENNtaAzT/jur46IY1D4McHvv3J+nZ7BGNrG436sSaU3ucHqtUqzP1sVcflMizLEl8EwjBEFEXwomwC5DInEeDGaDSC62cTIJc5iUAQBGJukE1A8YkVNYLv++h232WMRUYOuakRlOLTwzU8z1tYPZ/Po1QqJR0kAgQDWTEjwLaIWq0GwzDmJtm2jVarNSvAeeQQXVe6ME1Tgs1mMyXA2GAwQKFQmH8G/X4fjuOgWCxKkP40yMnlcukO1MNgAivoui5B+tMgh3H1DuQa66fnaLfbGA6HMgY7oNGfNnL+v0RN/cbnl9f46qSBSqUiM9J4ZQSvVgl0Oh1pf2d3D4/3d5q27Hf+FWAAc90EKSR5k78AAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzU4NTQ3NUZDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzU4NTQ3NjBDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNTg1NDc1REMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNTg1NDc1RUMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVB3hoAAAEYSURBVHjapJM9CsJAEIUTFStbQRA8gKCNKSIIeohUVraC9oKiGBRsBDvBylbwEkJQCys9gJUgeIOAxDfwEpYNpsmDL7PZ+cn+TMwgCIw0yhgplZPH3bbVuRqYgiYogxe4ABc8wqD69RpbQR6MwQ04TDZoHc6LP/tvC2uw4Fi+Vgcmrct58W9iW4BaYAB80OGSQ8my7xz7jDsAT11Bn3alJYvUa1pp8VGBNu0uIVm2s9fiowJF8OWJ/0sWPRlX1At8eLqlhGRRhXEfvcCJtpeQLOpq8VGBLe04Ibmh+Ld6AY8HWOBVzUCVvio780z/LrxCtQ9EQ+5tBOZElRzeUmmqWCfKlyfAAkfw5vyb7xb9vlrATPs7/wQYAISgQGDaq6hUAAAAAElFTkSuQmCC);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "Tahoma";
+ font-size: 11px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #a4bed4;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 11px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #a4bed4;
+}
+.gantt_duration {
+ width: 100px;
+ height: 23px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 23px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #a4bed4;
+}
+.gantt_duration .gantt_duration_value {
+ width: 40px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 70px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 20px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #fff;
+ background-color: #f8f8f8;
+ background-image: -webkit-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -moz-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -ms-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: linear-gradient(to top, #E6E6E6 0%, #FFFFFF 100%);
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 4px;
+ -moz-border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 4px;
+ -moz-border-bottom-right-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #ebebeb;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 1px solid #a4bed4;
+ border-radius: 0;
+ position: absolute;
+ z-index: 300;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: #fff;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: #1e2022;
+ box-shadow: 0px 1px 1px #fff inset;
+ background-color: #dfedff;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff));
+ /* old webkit */
+ background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%);
+ background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%);
+ background-position: 0px 1px;
+ background-repeat: repeat-x;
+ border-bottom: 1px solid #a4bed4;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 11px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 13px;
+ color: #1e2022;
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 3px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDhEuX3ujFgAAAFNJREFUOMvt0zEOACAIA0DksTyqn8XJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+sNUIROnQoAAAAAElFTkSuQmCC);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==);
+}
+.gantt_qi_big_icon {
+ font-size: 13px;
+ border-radius: 4px;
+ color: #42464b;
+ background: #fff;
+ background-color: #f8f8f8;
+ background-image: -webkit-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -moz-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: -ms-linear-gradient(top, #E6E6E6 0%, #FFFFFF 100%);
+ background-image: linear-gradient(to top, #E6E6E6 0%, #FFFFFF 100%);
+ margin: 5px 9px 8px 0px;
+ min-width: 60px;
+ line-height: 26px;
+ vertical-align: middle;
+ padding: 0px 10px 0px 5px;
+ cursor: pointer;
+ border: 1px solid #a4bed4;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 26px;
+ text-align: center;
+ line-height: 26px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 11px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 11px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #a4bed4;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #a4bed4;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #a4bed4;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #a4bed4;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "Tahoma";
+ font-size: 11px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #d2d2d2;
+ border-top: 1px solid #d2d2d2;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #d2d2d2;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #e4f0ff;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_terrace.css b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_terrace.css
new file mode 100644
index 0000000..d1d22b3
--- /dev/null
+++ b/src/components/dhtmlxGantt/codebase/sources/skins/dhtmlxgantt_terrace.css
@@ -0,0 +1,2027 @@
+/*
+@license
+
+dhtmlxGantt v.8.0.6 Standard
+
+This version of dhtmlxGantt is distributed under GPL 2.0 license and can be legally used in GPL projects.
+
+To use dhtmlxGantt in non-GPL projects (and get Pro version of the product), please obtain Individual, Commercial, Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxGantt/#licensing or contact us at info@dhtmlx.com
+
+(c) XB Software
+
+*/
+.buttonBg {
+ background: #fff;
+}
+/* colors for items with inline styles assigned (task.color, link.color)*/
+.gridHoverStyle {
+ background-color: #FFF3A1;
+}
+.gridSelection {
+ background-color: #FFF3A1;
+}
+.timelineSelection {
+ background-color: #FFF3A1;
+}
+.gantt_grid_scale .gantt_grid_head_cell {
+ color: #a6a6a6;
+ border-top: none !important;
+ border-right: none !important;
+}
+.gantt_grid_data .gantt_cell {
+ border-right: none;
+ color: #454545;
+}
+/*
+ Tasks
+*/
+.gantt_task_link .gantt_link_arrow_right {
+ border-width: 6px 6px 6px 6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_left {
+ border-width: 6px 6px 6px 6px;
+ margin-left: -6px;
+ margin-top: -3px;
+}
+.gantt_task_link .gantt_link_arrow_up {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_link .gantt_link_arrow_down {
+ border-width: 6px 6px 6px 6px;
+}
+.gantt_task_line .gantt_task_progress_drag {
+ bottom: -4px;
+ height: 10px;
+ margin-left: -8px;
+ width: 16px;
+}
+.chartHeaderBg {
+ background-color: #fff;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ color: #a6a6a6;
+ border-right: 1px solid #ebebeb;
+}
+/*
+ project highlight
+*/
+.gantt_row.gantt_project,
+.gantt_row.odd.gantt_project {
+ background-color: #edffef;
+}
+.gantt_task_row.gantt_project,
+.gantt_task_row.odd.gantt_project {
+ background-color: #f5fff6;
+}
+.gantt_task_line.gantt_project {
+ background-color: #65c16f;
+ border: 1px solid #3c9445;
+}
+.gantt_task_line.gantt_project .gantt_task_progress {
+ background-color: #46ad51;
+}
+/*
+ milestone
+*/
+/*
+ lightbox
+*/
+.buttonBg {
+ background: #fff;
+}
+.gantt_cal_light .gantt_btn_set {
+ margin: 5px 10px;
+}
+.gantt_btn_set.gantt_cancel_btn_set {
+ background: #fff;
+ color: #454545;
+ border: 1px solid #CECECE;
+}
+.gantt_btn_set.gantt_save_btn_set {
+ background: #3db9d3;
+ text-shadow: 0 -1px 0 #248a9f;
+ color: #fff;
+}
+.gantt_btn_set.gantt_delete_btn_set {
+ text-shadow: 0 -1px 0 #6F6F6F;
+ background: #ec8e00;
+ text-shadow: 0 -1px 0 #aa6600;
+ color: #fff;
+}
+.gantt_delete_btn {
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_light_wide {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ border-left: none !important;
+ border-right: none !important;
+}
+/*
+ Message
+*/
+.gantt_popup_button.gantt_ok_button {
+ background: #3db9d3;
+ text-shadow: 0 -1px 0 #248a9f;
+ color: #fff;
+ font-weight: bold;
+ border-width: 0;
+}
+.gantt_popup_button.gantt_cancel_button {
+ font-weight: bold;
+ color: #454544;
+}
+.gantt_popup_title {
+ background-color: #fff;
+}
+.gantt_popup_shadow {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+/*
+ Quick info
+*/
+.gantt_qi_big_icon.icon_edit {
+ color: #454545;
+ background: #fff;
+}
+.gantt_qi_big_icon.icon_delete {
+ text-shadow: 0 -1px 0 #aa6600;
+ background: #ec8e00;
+ color: #fff;
+ border-width: 0;
+}
+/*links dnd*/
+.gantt_tooltip {
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: white;
+ border-left: 1px solid rgba(0, 0, 0, 0.07);
+ border-top: 1px solid rgba(0, 0, 0, 0.07);
+ font-family: "Arial";
+ font-size: 8pt;
+ color: #454545;
+}
+.gantt_container {
+ background-color: #FFFFFF;
+ font-family: "Arial";
+ font-size: 13px;
+ border: 1px solid #CECECE;
+ position: relative;
+ white-space: nowrap;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.gantt_touch_active {
+ overscroll-behavior: none;
+}
+.gantt_task_scroll {
+ overflow-x: scroll;
+}
+.gantt_task,
+.gantt_grid {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_grid_scale,
+.gantt_task_scale {
+ color: #6b6b6b;
+ font-size: 12px;
+ border-bottom: 1px solid #CECECE;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_grid_scale {
+ background-color: #fff;
+}
+.gantt_task_scale {
+ background-color: #fff;
+}
+.gantt_task_vscroll {
+ background-color: #fff;
+}
+.gantt_scale_line {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border-top: 1px solid #CECECE;
+}
+.gantt_scale_line:first-child {
+ border-top: none;
+}
+.gantt_grid_head_cell {
+ display: inline-block;
+ vertical-align: top;
+ border-right: 1px solid #CECECE;
+ text-align: center;
+ position: relative;
+ cursor: default;
+ height: 100%;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ line-height: 33px;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+ overflow: hidden;
+}
+.gantt_scale_line {
+ clear: both;
+}
+.gantt_grid_data {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.gantt_row {
+ position: relative;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_add,
+.gantt_grid_head_add {
+ width: 100%;
+ height: 100%;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);
+ background-position: center center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ position: relative;
+ -moz-opacity: 0.3;
+ opacity: 0.3;
+}
+.gantt_grid_head_cell.gantt_grid_head_add {
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+ top: 0;
+}
+.gantt_grid_head_cell.gantt_grid_head_add:hover {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_grid_data .gantt_row:hover,
+.gantt_grid_data .gantt_row.odd:hover {
+ background-color: #FFF3A1;
+}
+.gantt_grid_data .gantt_row:hover .gantt_add,
+.gantt_grid_data .gantt_row.odd:hover .gantt_add {
+ -moz-opacity: 1;
+ opacity: 1;
+}
+.gantt_task_row,
+.gantt_row {
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_row,
+.gantt_task_row {
+ background-color: #FFFFFF;
+}
+.gantt_row.odd,
+.gantt_task_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_row,
+.gantt_cell,
+.gantt_task_row,
+.gantt_task_cell,
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.gantt_grid_head_cell,
+.gantt_scale_cell {
+ line-height: inherit;
+}
+.gantt_grid_scale .gantt_grid_column_resize_wrap {
+ cursor: col-resize;
+ position: absolute;
+ width: 13px;
+ margin-left: -7px;
+}
+.gantt_grid_column_resize_wrap .gantt_grid_column_resize {
+ background-color: #CECECE;
+ height: 100%;
+ width: 1px;
+ margin: 0 auto;
+}
+.gantt_task_grid_row_resize_wrap {
+ cursor: row-resize;
+ position: absolute;
+ height: 13px;
+ margin-top: -7px;
+ left: 0px;
+ width: 100%;
+}
+.gantt_task_grid_row_resize_wrap .gantt_task_grid_row_resize {
+ background-color: #ebebeb;
+ top: 6px;
+ height: 1px;
+ width: 100%;
+ margin: 0 auto;
+ position: relative;
+}
+.gantt_drag_marker {
+ pointer-events: none;
+}
+.gantt_drag_marker.gantt_grid_resize_area,
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ background-color: rgba(231, 231, 231, 0.5);
+ height: 100%;
+ width: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_drag_marker.gantt_grid_resize_area {
+ border-left: 1px solid #CECECE;
+ border-right: 1px solid #CECECE;
+}
+.gantt_drag_marker.gantt_row_grid_resize_area {
+ border-top: 1px solid #CECECE;
+ border-bottom: 1px solid #CECECE;
+ pointer-events: none;
+}
+.gantt_row {
+ display: flex;
+}
+.gantt_row > div {
+ flex-shrink: 0;
+ flex-grow: 0;
+}
+.gantt_cell {
+ vertical-align: top;
+ border-right: 1px solid #ebebeb;
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 13px;
+}
+.gantt_cell_tree {
+ display: flex;
+ flex-wrap: nowrap;
+}
+.gantt_grid_scale .gantt_last_cell,
+.gantt_grid_data .gantt_last_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell,
+.gantt_task_bg .gantt_last_cell {
+ border-right-width: 0px;
+}
+.gantt_task .gantt_task_scale .gantt_scale_cell.gantt_last_cell {
+ border-right-width: 1px;
+}
+.gantt_task_bg {
+ overflow: hidden;
+}
+.gantt_scale_cell {
+ display: inline-block;
+ white-space: nowrap;
+ overflow: hidden;
+ border-right: 1px solid #CECECE;
+ text-align: center;
+ height: 100%;
+}
+.gantt_task_cell {
+ display: inline-block;
+ height: 100%;
+ border-right: 1px solid #ebebeb;
+}
+.gantt_layout_cell.gantt_ver_scroll {
+ width: 0px;
+ background-color: transparent;
+ height: 1px;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ position: absolute;
+ right: 0px;
+ z-index: 1;
+}
+.gantt_ver_scroll > div {
+ width: 1px;
+ height: 1px;
+}
+.gantt_hor_scroll {
+ height: 0px;
+ background-color: transparent;
+ width: 100%;
+ clear: both;
+ overflow-x: scroll;
+ overflow-y: hidden;
+}
+.gantt_layout_cell .gantt_hor_scroll {
+ position: absolute;
+}
+.gantt_hor_scroll > div {
+ width: 5000px;
+ height: 1px;
+}
+.gantt_tree_indent,
+.gantt_tree_icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+.gantt_tree_indent {
+ width: 15px;
+ height: 100%;
+}
+.gantt_tree_content,
+.gantt_tree_icon {
+ vertical-align: top;
+}
+.gantt_tree_icon {
+ width: 28px;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_tree_content {
+ height: 100%;
+ white-space: nowrap;
+ min-width: 0;
+}
+.gantt_tree_icon.gantt_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAArklEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNUAGcXJyMnz//h3uQrJdRLFBIAPQAchlJLsIFuCMjIwM////B5sJMoRkg2CuIdtrQcHBDOxsbHBfCQgIMHz48AHO//nrF8O6tWsJR7+7uzsDIxMTznT0/98/hp07d+I3iGopm2DewKFg8OV+AJWkfRMrTobLAAAAAElFTkSuQmCC);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_close {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAkUlEQVQ4T2NkoBJgpJI5DEPAoFOnTv0/c+YMQR+bmJgwmJmZwX2E4bVp06b9j4yMZODg4MBp2I8fPxiWL1/OkJWVNeIN4uTkxAin79+/M5AcRtgCHGQIyQbhijaiDQoKDmZgZ2PDGf0/f/1iWLd2LeHod3d3Z2BkYsJp0P9//xh27tyJ3yCqpWyCeQOHgsGX+wEZpW4T5LCxKwAAAABJRU5ErkJggg==);
+ width: 18px;
+ cursor: pointer;
+}
+.gantt_tree_icon.gantt_blank {
+ width: 18px;
+}
+.gantt_tree_icon.gantt_folder_open {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAs0lEQVQ4T62T0Q2EIBBEpQlzuaaMsQoqooqLsSljbMLLmMxmUXBR4U+Qt7Mzi2sqLVeJ00SgEMKWAnvvzYLyAyHfT5sU2fXDJSwCAXK8MI0/UTkva7IIFJsg3NSwnKdFoKtAWOQ1CN7CEqeTotE5L7QyJhmBcklZM4ZgTiAr3iOU3kD93ppO5SkMjB1EeXdBWoSkRql3YeIRe+cGvktS056JR9wsmeBUkujCfNXWCPC8GugPqn5ii/hV+FoAAAAASUVORK5CYII=);
+}
+.gantt_tree_icon.gantt_folder_closed {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAfElEQVQ4T2NkoBJgpJI5DCgGTZ8+/T82gzMzMwlaCFcAM0RKQgyrI/0Dg/EahmIQyBB0DRvXr4W78tmLV1gtAbmYoEEgnciG4QpTogzCFyEwSyg2CBS2oCAZNQh3cA+hMAJ5AlcKxuVBlOgnNgVjMwyUrQjmamKLGaoZBAAOTFyLnFFW4wAAAABJRU5ErkJggg==);
+}
+.gantt_tree_icon.gantt_file {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAeElEQVQ4T2NkoBJgRDZn+vTp/wmZm5mZiaIHph7DICkJMUJmMfgHBmMYhtUgbAo3rl+L4lp0NUQbBPI2umuRDaPIIFAYwAyjv0HoMQALM5JdhG4QLMxGDcKdyIdoGIE89OzFK4KZF5Rl8EY/QROQFGA1iBQD0NUCAJVjcxO0naAQAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort {
+ position: absolute;
+ right: 5px;
+ top: 8px;
+ width: 7px;
+ height: 13px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+.gantt_grid_head_cell .gantt_sort.gantt_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC);
+}
+.gantt_grid_head_cell .gantt_sort.gantt_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC);
+}
+.gantt_inserted,
+.gantt_updated {
+ font-weight: bold;
+}
+.gantt_deleted {
+ text-decoration: line-through;
+}
+.gantt_invalid {
+ background-color: #FFE0E0;
+}
+.gantt_error {
+ color: red;
+}
+.gantt_status {
+ right: 1px;
+ padding: 5px 10px;
+ background: rgba(155, 155, 155, 0.1);
+ position: absolute;
+ top: 1px;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+.gantt_status.gantt_status_visible {
+ opacity: 1;
+}
+#gantt_ajax_dots span {
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ background-repeat: no-repeat;
+ opacity: 0;
+}
+#gantt_ajax_dots span.gantt_dot_visible {
+ opacity: 1;
+}
+.gantt_column_drag_marker {
+ border: 1px solid #CECECE;
+ opacity: 0.8;
+ pointer-events: none;
+}
+.gantt_grid_head_cell_dragged {
+ border: 1px solid #CECECE;
+ opacity: 0.3;
+}
+.gantt_grid_target_marker {
+ position: absolute;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ background-color: #FFA011;
+ transform: translateX(-1px);
+}
+.gantt_grid_target_marker::before,
+.gantt_grid_target_marker::after {
+ display: block;
+ content: "";
+ position: absolute;
+ left: -5px;
+ width: 0px;
+ height: 0px;
+ border: 6px solid rgba(0, 0, 0, 0);
+}
+.gantt_grid_target_marker::before {
+ border-top-color: #FFA011;
+}
+.gantt_grid_target_marker::after {
+ bottom: 0;
+ border-bottom-color: #FFA011;
+}
+.gantt_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.gantt-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: "Arial";
+ z-index: 10000;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.gantt-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.gantt_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 250px;
+ width: 250px;
+ text-align: center;
+ position: fixed;
+ z-index: 20000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ font-family: "Arial";
+ border-radius: 6px;
+ border: 1px solid #CECECE;
+ background: #fff;
+}
+.gantt_popup_title {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ border-width: 0px;
+}
+.gantt_button,
+.gantt_popup_button {
+ border: 1px solid #CECECE;
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 4px;
+ background: #fff;
+}
+.gantt-info,
+.gantt_popup_button,
+.gantt_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.gantt_popup_text {
+ overflow: hidden;
+}
+.gantt_popup_controls {
+ border-radius: 6px;
+ padding: 10px;
+}
+.gantt_popup_button {
+ min-width: 100px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.gantt-info img,
+.gantt_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.gantt-alert-error,
+.gantt-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.gantt_button input,
+.gantt_popup_button div {
+ border-radius: 4px;
+ font-size: 14px;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+}
+.gantt_popup_title {
+ border-bottom: 1px solid #CECECE;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.gantt_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.gantt-info,
+.gantt-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ padding: 0px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #FFFFFF;
+}
+.gantt-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #FFFFFF;
+ border-radius: 3px;
+ border: 1px solid #CECECE;
+}
+.gantt-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+}
+.gantt-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFFFFF;
+}
+.gantt-warning {
+ background-color: #FF9000;
+ border: 1px solid #ffa633;
+}
+.gantt-warning div {
+ background-color: #FF9000;
+ border: 1px solid #b36500;
+ color: #FFFFFF;
+}
+.gantt_grid div,
+.gantt_data_area div {
+ -ms-touch-action: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.gantt_data_area {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_links_area {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+.gantt_task_content,
+.gantt_task_progress,
+.gantt_side_content {
+ line-height: inherit;
+ overflow: hidden;
+ height: 100%;
+}
+.gantt_task_content {
+ font-size: 12px;
+ color: #fff;
+ width: 100%;
+ top: 0;
+ cursor: pointer;
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+}
+.gantt_task_progress {
+ text-align: center;
+ z-index: 0;
+ background: #299cb4;
+}
+.gantt_task_progress_wrapper {
+ border-radius: inherit;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.gantt_task_line {
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ position: absolute;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: #3db9d3;
+ border: 1px solid #2898b0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_task_line.gantt_drag_move div {
+ cursor: move;
+}
+.gantt_touch_move,
+.gantt_touch_progress .gantt_touch_resize {
+ -moz-transform: scale(1.02, 1.1);
+ -o-transform: scale(1.02, 1.1);
+ -webkit-transform: scale(1.02, 1.1);
+ transform: scale(1.02, 1.1);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_touch_progress .gantt_task_progress_drag,
+.gantt_touch_resize .gantt_task_drag {
+ -moz-transform: scaleY(1.3);
+ -o-transform: scaleY(1.3);
+ -webkit-transform: scaleY(1.3);
+ transform: scaleY(1.3);
+ -moz-transform-origin: 50%;
+ -o-transform-origin: 50%;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+}
+.gantt_side_content {
+ position: absolute;
+ white-space: nowrap;
+ color: #6e6e6e;
+ top: 0;
+ font-size: 11px;
+}
+.gantt_side_content.gantt_left {
+ right: 100%;
+ padding-right: 20px;
+}
+.gantt_side_content.gantt_right {
+ left: 100%;
+ padding-left: 20px;
+}
+.gantt_side_content.gantt_link_crossing {
+ bottom: 8.75px;
+ top: auto;
+}
+.gantt_task_link .gantt_line_wrapper,
+.gantt_link_arrow {
+ position: absolute;
+ cursor: pointer;
+}
+.gantt_line_wrapper div {
+ background-color: #FFA011;
+}
+.gantt_task_link:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #FFA011;
+}
+.gantt_task_link div.gantt_link_arrow {
+ background-color: transparent;
+ border-style: solid;
+ width: 0px;
+ height: 0px;
+}
+.gantt_link_control {
+ position: absolute;
+ width: 20px;
+ top: 0px;
+}
+.gantt_link_control div {
+ display: none;
+ cursor: pointer;
+ box-sizing: border-box;
+ position: relative;
+ top: 50%;
+ margin-top: -7.5px;
+ vertical-align: middle;
+ border: 1px solid #929292;
+ -webkit-border-radius: 6.5px;
+ -moz-border-radius: 6.5px;
+ border-radius: 6.5px;
+ height: 13px;
+ width: 13px;
+ background-color: #f0f0f0;
+}
+.gantt_link_control.task_right div.gantt_link_point {
+ margin-left: 7px;
+}
+.gantt_link_control div:hover {
+ background-color: #FFF;
+}
+.gantt_link_control.task_left {
+ left: -20px;
+}
+.gantt_link_control.task_right {
+ right: -20px;
+}
+.gantt_task_line.gantt_selected .gantt_link_control div,
+.gantt_task_line:hover .gantt_link_control div,
+.gantt_task_line.gantt_drag_progress .gantt_link_control div,
+.gantt_task_line.gantt_drag_move .gantt_link_control div,
+.gantt_task_line.gantt_drag_resize .gantt_link_control div,
+.gantt_task_line.gantt_selected .gantt_task_progress_drag,
+.gantt_task_line:hover .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_progress_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_progress_drag,
+.gantt_task_line.gantt_selected .gantt_task_drag,
+.gantt_task_line:hover .gantt_task_drag,
+.gantt_task_line.gantt_drag_progress .gantt_task_drag,
+.gantt_task_line.gantt_drag_move .gantt_task_drag,
+.gantt_task_line.gantt_drag_resize .gantt_task_drag {
+ display: block;
+}
+.gantt_link_target .gantt_link_control div {
+ display: block;
+}
+.gantt_link_source,
+.gantt_link_target {
+ box-shadow: 0px 0px 3px #3db9d3;
+}
+.gantt_link_target.link_start_allow,
+.gantt_link_target.link_finish_allow {
+ box-shadow: 0px 0px 3px #ffbf5e;
+}
+.gantt_link_target.link_start_deny,
+.gantt_link_target.link_finish_deny {
+ box-shadow: 0px 0px 3px #e87e7b;
+}
+.link_start_allow .gantt_link_control.task_start_date div,
+.link_finish_allow .gantt_link_control.task_end_date div {
+ background-color: #ffbf5e;
+ border-color: #ffa011;
+}
+.link_start_deny .gantt_link_control.task_start_date div,
+.link_finish_deny .gantt_link_control.task_end_date div {
+ background-color: #e87e7b;
+ border-color: #dd3e3a;
+}
+.gantt_link_arrow_right {
+ border-width: 4px 0 4px 6px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: #FFA011;
+ /*margin-top: -1px;*/
+}
+.gantt_link_arrow_left {
+ border-width: 4px 6px 4px 0;
+ margin-top: -1px;
+ border-top-color: transparent !important;
+ border-right-color: #FFA011;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_up {
+ border-width: 0 4px 6px 4px;
+ border-color: transparent transparent #FFA011 transparent;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: #FFA011;
+ border-left-color: transparent !important;
+}
+.gantt_link_arrow_down {
+ border-width: 4px 6px 0 4px;
+ border-top-color: #FFA011;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ border-left-color: transparent !important;
+}
+.gantt_task_drag,
+.gantt_task_progress_drag {
+ cursor: ew-resize;
+ display: none;
+ position: absolute;
+}
+.gantt_task_drag.task_right {
+ cursor: e-resize;
+}
+.gantt_task_drag.task_left {
+ cursor: w-resize;
+}
+.gantt_task_drag {
+ height: 100%;
+ width: 8px;
+ z-index: 1;
+ top: -1px;
+}
+.gantt_task_drag.task_left {
+ left: -7px;
+}
+.gantt_task_drag.task_right {
+ right: -7px;
+}
+.gantt_task_progress_drag {
+ height: 8px;
+ width: 8px;
+ bottom: -4px;
+ margin-left: -4px;
+ background-position: bottom;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);
+ background-repeat: no-repeat;
+ z-index: 1;
+}
+.gantt_task_progress_drag:hover {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAs0lEQVQoz6WMPW7CQBgFJxZaiZ60qcgdwjVMmzu8gpwhDULabXyBdHAGuzRHivQiQZovigS2+Jtu95t5T03TMITtCtjEc5VSOgx5k5F4CnxJWgKUUl5sv6eUvk/daiCeAe1fDCCpBtq4jQ/YngO9pMWpGH99OOcDtt8ifmWEuO3D/R+wXQOdpGcuIGkGdNFQ2RawlTTlSsLd2RY55+O95JyPFQ/y8MAE+CylfADpxvYHWP8CXj+JR4wdKHYAAAAASUVORK5CYII=);
+}
+.gantt_link_tooltip {
+ box-shadow: 3px 3px 3px #888888;
+ background-color: #fff;
+ border-left: 1px dotted #cecece;
+ border-top: 1px dotted #cecece;
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #444;
+ padding: 6px;
+ line-height: 20px;
+}
+.gantt_link_direction {
+ height: 0px;
+ border: 0px none #FFA011;
+ border-bottom-style: dashed;
+ border-bottom-width: 2px;
+ transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ -webkit-transform-origin: 0% 0%;
+ z-index: 2;
+ margin-left: 1px;
+ position: absolute;
+}
+.gantt_grid_data .gantt_row.gantt_selected,
+.gantt_grid_data .gantt_row.odd.gantt_selected {
+ background-color: #FFF3A1;
+}
+.gantt_task_row.gantt_selected {
+ background-color: #FFF3A1;
+}
+.gantt_task_row.gantt_selected .gantt_task_cell {
+ border-right-color: #ffec6e;
+}
+.gantt_task_line.gantt_selected {
+ box-shadow: 0 0 5px #299cb4;
+}
+.gantt_task_line.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #46ad51;
+}
+.gantt_task_line.gantt_milestone {
+ visibility: hidden;
+ background-color: #D33DAF;
+ border: 0px solid #61164f;
+ box-sizing: content-box;
+ -moz-box-sizing: content-box;
+}
+.gantt_task_line.gantt_milestone div {
+ visibility: visible;
+}
+.gantt_task_line.gantt_milestone .gantt_task_content {
+ background: inherit;
+ border: inherit;
+ border-width: 1px;
+ border-radius: inherit;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.gantt_task_line.gantt_task_inline_color {
+ border-color: #999999;
+}
+.gantt_task_line.gantt_task_inline_color .gantt_task_progress {
+ background-color: #363636;
+ opacity: 0.2;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected {
+ box-shadow: 0 0 5px #999999;
+}
+.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div {
+ box-shadow: 0 0 5px 0px #999999;
+}
+.gantt_critical_task {
+ background-color: #e63030;
+ border-color: #9d3a3a;
+}
+.gantt_critical_task .gantt_task_progress {
+ background-color: rgba(0, 0, 0, 0.4);
+}
+.gantt_critical_link .gantt_line_wrapper > div {
+ background-color: #e63030;
+}
+.gantt_critical_link .gantt_link_arrow {
+ border-color: #e63030;
+}
+.gantt_row:focus,
+.gantt_cell:focus,
+.gantt_btn_set:focus,
+.gantt_qi_big_icon:focus,
+.gantt_popup_button:focus,
+.gantt_grid_head_cell:focus {
+ -moz-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ -webkit-box-shadow: inset 0px 0px 1px 1px #4d90fe;
+ box-shadow: inset 0px 0px 1px 1px #4d90fe;
+}
+.gantt_split_parent,
+.gantt_split_subproject {
+ opacity: 0.1;
+ pointer-events: none;
+}
+.gantt_rollup_child .gantt_link_control,
+.gantt_rollup_child:hover .gantt_link_control {
+ display: none;
+}
+.gantt_unselectable,
+.gantt_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.gantt_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background: #fff;
+ border-radius: 6px;
+ font-family: "Arial";
+ font-size: 13px;
+ border: 1px solid #CECECE;
+ color: #6b6b6b;
+ font-size: 12px;
+ position: absolute;
+ z-index: 10001;
+ width: 550px;
+ height: 250px;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+}
+.gantt_cal_light_wide {
+ width: 650px;
+}
+.gantt_cal_light select {
+ font-family: "Arial";
+ border: 1px solid #CECECE;
+ font-size: 13px;
+ padding: 2px;
+ margin: 0px;
+}
+.gantt_cal_ltitle {
+ padding: 7px 10px;
+ overflow: hidden;
+ white-space: nowrap;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+}
+.gantt_cal_ltitle span {
+ white-space: nowrap;
+}
+.gantt_cal_lsection {
+ color: #727272;
+ font-weight: bold;
+ padding: 12px 0px 5px 10px;
+}
+.gantt_cal_lsection .gantt_fullday {
+ float: right;
+ margin-right: 5px;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.gantt_cal_lsection {
+ font-size: 13px;
+}
+.gantt_cal_ltext {
+ padding: 2px 10px;
+ overflow: hidden;
+}
+.gantt_cal_ltext textarea {
+ overflow-y: auto;
+ overflow-x: hidden;
+ font-family: "Arial";
+ font-size: 13px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #CECECE;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.gantt_section_constraint [data-constraint-time-select] {
+ margin-left: 20px;
+}
+.gantt_time {
+ font-weight: bold;
+}
+.gantt_cal_light .gantt_title {
+ padding-left: 10px;
+}
+.gantt_cal_larea {
+ border: 1px solid #CECECE;
+ border-left: none;
+ border-right: none;
+ background-color: #fff;
+ overflow: hidden;
+ height: 1px;
+}
+.gantt_btn_set {
+ margin: 10px 7px 5px 10px;
+ padding: 5px 15px 5px 10px;
+ float: left;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border-width: 0;
+ border-color: #CECECE;
+ border-style: solid;
+ height: 32px;
+ font-weight: bold;
+ background: #fff;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+}
+.gantt_hidden {
+ display: none;
+}
+.gantt_btn_set div {
+ float: left;
+ font-size: 13px;
+ height: 22px;
+ line-height: 22px;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+}
+.gantt_save_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 21px;
+}
+.gantt_cancel_btn {
+ margin-top: 2px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);
+ width: 20px;
+}
+.gantt_delete_btn {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);
+ margin-top: 2px;
+ width: 20px;
+}
+.gantt_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10);
+}
+.gantt_custom_button {
+ padding: 0px 3px 0px 3px;
+ font-family: "Arial";
+ font-size: 13px;
+ font-weight: normal;
+ margin-right: 10px;
+ margin-top: -5px;
+ cursor: pointer;
+ float: right;
+ height: 21px;
+ width: 90px;
+ border: 1px solid #CECECE;
+ text-align: center;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.gantt_custom_button div {
+ cursor: pointer;
+ float: none;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.gantt_custom_button div:first-child {
+ display: none;
+}
+.gantt_cal_light_wide {
+ width: 580px;
+ padding: 2px 4px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #CECECE;
+}
+.gantt_cal_light_wide .gantt_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 80px;
+ height: 20px;
+ padding: 5px 10px 0px 0px;
+}
+.gantt_cal_light_wide .gantt_wrap_section {
+ position: relative;
+ padding: 10px 0;
+ overflow: hidden;
+ border-bottom: 1px solid #ebebeb;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ overflow: hidden;
+ padding-top: 2px !important;
+ padding-right: 0px;
+ height: 20px !important;
+}
+.gantt_cal_light_wide .gantt_cal_ltext {
+ padding-right: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_larea {
+ padding: 0 10px;
+ width: 100%;
+}
+.gantt_cal_light_wide .gantt_section_time {
+ background: transparent;
+}
+.gantt_cal_light_wide .gantt_cal_checkbox label {
+ padding-left: 0px;
+}
+.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday {
+ float: none;
+ margin-right: 0px;
+ font-weight: bold;
+ cursor: pointer;
+}
+.gantt_cal_light_wide .gantt_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.gantt_cal_light_wide .gantt_repeat_right {
+ margin-right: 55px;
+}
+.gantt_cal_light_wide.gantt_cal_light_full {
+ width: 738px;
+}
+.gantt_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.gantt_cal_light input {
+ font-size: 13px;
+}
+.gantt_section_time {
+ background-color: white;
+ white-space: nowrap;
+ padding: 2px 10px 5px;
+ padding-top: 2px !important;
+}
+.gantt_section_time .gantt_time_selects {
+ float: left;
+ height: 25px;
+}
+.gantt_section_time .gantt_time_selects select {
+ height: 23px;
+ padding: 2px;
+ border: 1px solid #CECECE;
+}
+.gantt_duration {
+ width: 100px;
+ height: 23px;
+ float: left;
+ white-space: nowrap;
+ margin-left: 20px;
+ line-height: 23px;
+}
+.gantt_duration .gantt_duration_value,
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ vertical-align: top;
+ height: 100%;
+ border: 1px solid #CECECE;
+}
+.gantt_duration .gantt_duration_value {
+ width: 40px;
+ padding: 3px 4px;
+ border-left-width: 0;
+ border-right-width: 0;
+}
+.gantt_duration .gantt_duration_value.gantt_duration_value_formatted {
+ width: 70px;
+}
+.gantt_duration .gantt_duration_dec,
+.gantt_duration .gantt_duration_inc {
+ width: 20px;
+ padding: 1px;
+ padding-bottom: 1px;
+ background: #fff;
+}
+.gantt_duration .gantt_duration_dec {
+ -moz-border-top-left-radius: 4px;
+ -moz-border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.gantt_duration .gantt_duration_inc {
+ margin-right: 4px;
+ -moz-border-top-right-radius: 4px;
+ -moz-border-bottom-right-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.gantt_resources {
+ max-height: 150px;
+ height: auto;
+ overflow-y: auto;
+}
+.gantt_resource_row {
+ display: block;
+ padding: 10px 0;
+ border-bottom: 1px solid #ebebeb;
+ cursor: pointer;
+}
+.gantt_resource_row input[type=checkbox]:not(:checked),
+.gantt_resource_row input[type=checkbox]:not(:checked) ~ div {
+ opacity: 0.5;
+}
+.gantt_resource_toggle {
+ vertical-align: middle;
+}
+.gantt_resources_filter .gantt_resources_filter_input {
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resources_filter .switch_unsetted {
+ vertical-align: middle;
+}
+.gantt_resource_cell {
+ display: inline-block;
+}
+.gantt_resource_cell.gantt_resource_cell_checkbox {
+ width: 24px;
+ max-width: 24px;
+ min-width: 24px;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_label {
+ width: 40%;
+ max-width: 40%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value {
+ width: 30%;
+ max-width: 30%;
+ vertical-align: middle;
+}
+.gantt_resource_cell.gantt_resource_cell_value input,
+.gantt_resource_cell.gantt_resource_cell_value select {
+ width: 80%;
+ vertical-align: middle;
+ padding: 1px 2px 1px 2px;
+ box-sizing: border-box;
+}
+.gantt_resource_cell.gantt_resource_cell_unit {
+ width: 10%;
+ max-width: 10%;
+ vertical-align: middle;
+}
+.gantt_resource_early_value {
+ opacity: 0.8;
+ font-size: 0.9em;
+}
+/* Quick info */
+.gantt_cal_quick_info {
+ border: 1px solid #CECECE;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 300;
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07);
+ background-color: #fff;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.gantt_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon {
+ float: right;
+}
+.gantt_cal_qi_title {
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 0;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 0;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 0;
+ padding: 5px 0px 8px 12px;
+ color: #454545;
+ background-color: #fff;
+ border-bottom: 1px solid #CECECE;
+}
+.gantt_cal_qi_tdate {
+ font-size: 14px;
+ font-weight: bold;
+}
+.gantt_cal_qi_tcontent {
+ font-size: 13px;
+}
+.gantt_cal_qi_content {
+ padding: 16px 8px;
+ font-size: 13px;
+ color: #454545;
+ overflow: hidden;
+}
+.gantt_cal_qi_controls {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 6px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 6px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 6px;
+ padding-left: 7px;
+}
+.gantt_cal_qi_controls .gantt_menu_icon {
+ margin-top: 6px;
+ background-repeat: no-repeat;
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_edit {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC);
+}
+.gantt_cal_qi_controls .gantt_menu_icon.icon_delete {
+ width: 20px;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);
+}
+.gantt_qi_big_icon {
+ font-size: 13px;
+ border-radius: 4px;
+ font-weight: bold;
+ background: #fff;
+ margin: 5px 9px 8px 0px;
+ min-width: 60px;
+ line-height: 32px;
+ vertical-align: middle;
+ padding: 0px 10px 0px 5px;
+ cursor: pointer;
+ border: 1px solid #CECECE;
+}
+.gantt_cal_qi_controls div {
+ float: left;
+ height: 32px;
+ text-align: center;
+ line-height: 32px;
+}
+.gantt_cal_quick_info.gantt_qi_hidden {
+ display: none;
+}
+.gantt_tooltip {
+ padding: 10px;
+ position: absolute;
+ z-index: 50;
+ white-space: nowrap;
+}
+.gantt_resource_marker {
+ position: absolute;
+ text-align: center;
+ font-size: 14px;
+ color: #FFF;
+}
+.gantt_resource_marker_ok {
+ background: rgba(78, 208, 134, 0.75);
+}
+.gantt_resource_marker_overtime {
+ background: rgba(255, 134, 134, 0.69);
+}
+.gantt_histogram_label {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 1;
+ font-weight: bold;
+ font-size: 13px;
+}
+.gantt_histogram_fill {
+ background-color: rgba(41, 157, 180, 0.2);
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+}
+.gantt_histogram_hor_bar {
+ height: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-top: -1px;
+ margin-left: -1px;
+}
+.gantt_histogram_vert_bar {
+ width: 1px;
+ position: absolute;
+ background: #299DB4;
+ margin-left: -1px;
+}
+.gantt_histogram_cell {
+ position: absolute;
+ text-align: center;
+ font-size: 13px;
+ color: #000000;
+}
+.gantt_marker {
+ height: 100%;
+ width: 2px;
+ top: 0;
+ position: absolute;
+ text-align: center;
+ background-color: rgba(255, 0, 0, 0.4);
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gantt_marker .gantt_marker_content {
+ padding: 5px;
+ background: inherit;
+ color: white;
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ opacity: 0.8;
+}
+.gantt_marker_area {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.gantt_grid_editor_placeholder {
+ position: absolute;
+}
+.gantt_grid_editor_placeholder > div,
+.gantt_grid_editor_placeholder input,
+.gantt_grid_editor_placeholder select {
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+.gantt_row_placeholder div {
+ opacity: 0.5;
+}
+.gantt_row_placeholder .gantt_file,
+.gantt_row_placeholder .gantt_add {
+ display: none;
+}
+.gantt_drag_marker.gantt_grid_dnd_marker {
+ background-color: transparent;
+ transition: all 0.1s ease ;
+}
+.gantt_grid_dnd_marker_line {
+ height: 4px;
+ width: 100%;
+ background-color: #3498db;
+}
+.gantt_grid_dnd_marker_line::before {
+ background: #fff;
+ width: 12px;
+ height: 12px;
+ box-sizing: border-box;
+ border: 3px solid #3498db;
+ border-radius: 6px;
+ content: "";
+ line-height: 1px;
+ display: block;
+ position: absolute;
+ margin-left: -11px;
+ margin-top: -4px;
+ pointer-events: none;
+}
+.gantt_grid_dnd_marker_folder {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ pointer-events: none;
+ box-sizing: border-box;
+ box-shadow: 0 0 0px 2px #3f98db inset;
+ background: transparent;
+}
+.gantt_overlay_area {
+ position: absolute;
+ height: inherit;
+ width: inherit;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.gantt_overlay {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: inherit;
+ width: inherit;
+}
+.gantt_click_drag_rect {
+ position: absolute;
+ left: 0;
+ top: 0;
+ outline: 1px solid #3f98db;
+ background-color: rgba(52, 152, 219, 0.3);
+}
+.gantt_timeline_move_available,
+.gantt_timeline_move_available * {
+ cursor: move;
+}
+.gantt_rtl .gantt_grid {
+ text-align: right;
+}
+.gantt_rtl .gantt_row,
+.gantt_rtl .gantt_cell {
+ flex-direction: row-reverse;
+}
+.gantt_layout_content {
+ width: 100%;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.gantt_layout_cell {
+ position: relative;
+ box-sizing: border-box;
+}
+.gantt_layout_cell > .gantt_layout_header {
+ background: #33aae8;
+ color: white;
+ font-size: 17px;
+ padding: 5px 10px;
+ box-sizing: border-box;
+}
+.gantt_layout_header.collapsed_x {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_x .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_header.collapsed_y {
+ background: #a9a9a9;
+}
+.gantt_layout_header.collapsed_y .gantt_header_arrow:before {
+ content: "\21E9";
+}
+.gantt_layout_header {
+ cursor: pointer;
+}
+.gantt_layout_header .gantt_header_arrow {
+ float: right;
+ text-align: right;
+}
+.gantt_layout_header .gantt_header_arrow:before {
+ content: "\21E6";
+}
+.gantt_layout_header.vertical .gantt_header_arrow:before {
+ content: "\21E7";
+}
+.gantt_layout_outer_scroll_vertical .gantt_layout_content {
+ overflow-y: hidden;
+}
+.gantt_layout_outer_scroll_horizontal .gantt_layout_content {
+ overflow-x: hidden;
+}
+.gantt_layout_x > .gantt_layout_cell {
+ display: inline-block;
+ vertical-align: top;
+}
+.gantt_layout_x {
+ white-space: nowrap;
+}
+.gantt_resizing {
+ opacity: 0.7;
+ background: #f2f2f2;
+}
+.gantt_layout_cell_border_right.gantt_resizer {
+ overflow: visible;
+ border-right: 0;
+}
+.gantt_resizer {
+ cursor: e-resize;
+ position: relative;
+}
+.gantt_resizer_y {
+ cursor: n-resize;
+}
+.gantt_resizer_stick {
+ background: #33aae8;
+ z-index: 9999;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.gantt_resizer_x .gantt_resizer_x {
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ margin-left: -10px;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_y .gantt_resizer_y {
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ top: -10px;
+ left: 0;
+ z-index: 1;
+}
+.gantt_resizer_error {
+ background: indianred!important;
+}
+.gantt_noselect {
+ -webkit-user-select: none;
+ user-select: none;
+}
+.gantt_layout_cell_border_left {
+ border-left: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_right {
+ border-right: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_top {
+ border-top: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_bottom {
+ border-bottom: 1px solid #CECECE;
+}
+.gantt_layout_cell_border_transparent {
+ border-color: transparent;
+}
+.gantt_window {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999999999;
+ background: white;
+}
+.gantt_window_content {
+ position: relative;
+}
+.gantt_window_content_header {
+ background: #39c;
+ color: #ffffff;
+ height: 33px;
+ padding: 10px 10px 0 10px;
+ border-bottom: solid 2px #ffffff;
+ position: relative;
+}
+.gantt_window_content_header_text {
+ padding-left: 10%;
+}
+.gantt_window_content_header_buttons {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+.gantt_window_content_header_buttons:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.gantt_window_content_resizer {
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ bottom: 0;
+ line-height: 15px;
+ right: -1px;
+ text-align: center;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);
+ cursor: nw-resize;
+ z-index: 999;
+}
+.gantt_window_content_frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+}
+.gantt_window_drag {
+ cursor: pointer!important;
+}
+.gantt_window_resizing {
+ overflow: visible;
+}
+.gantt_window_resizing_body {
+ overflow: hidden!important;
+}
+.gantt_window_modal {
+ background: rgba(0, 0, 0, 0.1);
+ z-index: 9999;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+}
+.gantt_container,
+.gantt_cal_light,
+.gantt_message_area,
+.gantt_modal_box,
+.gantt_cal_quick_info,
+.gantt_tooltip {
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.gantt_noselect {
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.gantt_noselect .gantt_grid_data .gantt_row:hover,
+.gantt_noselect .gantt_grid_data .gantt_row.odd:hover {
+ background-color: unset;
+}
+.gantt_drag_marker {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ font-family: "Arial";
+ font-size: 13px;
+ z-index: 1;
+ white-space: nowrap;
+}
+.gantt_drag_marker .gantt_tree_indent,
+.gantt_drag_marker .gantt_tree_icon.gantt_blank,
+.gantt_drag_marker .gantt_tree_icon.gantt_open,
+.gantt_drag_marker .gantt_tree_icon.gantt_close {
+ display: none;
+}
+.gantt_empty_state_wrapper {
+ position: relative;
+}
+.gantt_empty_state {
+ height: 100%;
+ max-width: 500px;
+ box-sizing: border-box;
+ white-space: pre-line;
+ overflow-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ margin: 0 auto;
+}
+.gantt_empty_state_image {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ width: 100%;
+ max-width: 500px;
+ max-height: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ min-height: 0;
+ height: 200px;
+ background-size: contain;
+ background-position-x: center;
+ background-position-y: bottom;
+ margin-top: 40px;
+}
+.gantt_empty_state_text {
+ text-align: center;
+}
+.gantt_empty_state_text_link {
+ color: #03A9F4;
+ background-position: top right;
+ background: none;
+ opacity: 1;
+ height: unset;
+ cursor: pointer;
+}
+.gantt_drag_marker,
+.gantt_drag_marker .gantt_row.odd {
+ background-color: #FFFFFF;
+}
+.gantt_drag_marker .gantt_row {
+ border-left: 1px solid #d2d2d2;
+ border-top: 1px solid #d2d2d2;
+}
+.gantt_drag_marker .gantt_cell {
+ border-color: #d2d2d2;
+}
+.gantt_row.gantt_over,
+.gantt_task_row.gantt_over {
+ background-color: #0070fe;
+}
+.gantt_row.gantt_transparent .gantt_cell {
+ opacity: 0.7;
+}
+.gantt_task_row.gantt_transparent {
+ background-color: #f8fdfd;
+}
+.gantt_popup_button.gantt_delete_button {
+ background: #3db9d3;
+ text-shadow: 0 -1px 0 #248a9f;
+ color: #fff;
+ font-weight: bold;
+ border-width: 0;
+}
+.gantt_container_resize_watcher {
+ background: transparent;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ z-index: -1;
+ pointer-events: none;
+ border: 0;
+ box-sizing: border-box;
+ opacity: 0;
+}
+
diff --git a/src/components/dhtmlxGantt/license.txt b/src/components/dhtmlxGantt/license.txt
new file mode 100644
index 0000000..ecbc059
--- /dev/null
+++ b/src/components/dhtmlxGantt/license.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
\ No newline at end of file
diff --git a/src/components/dhtmlxGantt/package.json b/src/components/dhtmlxGantt/package.json
new file mode 100644
index 0000000..243265e
--- /dev/null
+++ b/src/components/dhtmlxGantt/package.json
@@ -0,0 +1,58 @@
+{
+ "_args": [
+ [
+ "dhtmlx-gantt@8.0.6",
+ "E:\\WebstormProjects\\XKD"
+ ]
+ ],
+ "_from": "dhtmlx-gantt@8.0.6",
+ "_id": "dhtmlx-gantt@8.0.6",
+ "_inBundle": false,
+ "_integrity": "sha512-GrEQ40/vgV1wDWkv/IvjJEM27Z4lDv76XvE5nlvMtFQTqUuo5VnL1XNDv/uFSJVMRnaN9StYaPxP1ebGamDLFg==",
+ "_location": "/dhtmlx-gantt",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "dhtmlx-gantt@8.0.6",
+ "name": "dhtmlx-gantt",
+ "escapedName": "dhtmlx-gantt",
+ "rawSpec": "8.0.6",
+ "saveSpec": null,
+ "fetchSpec": "8.0.6"
+ },
+ "_requiredBy": [
+ "/"
+ ],
+ "_resolved": "https://registry.npmmirror.com/dhtmlx-gantt/-/dhtmlx-gantt-8.0.6.tgz",
+ "_spec": "8.0.6",
+ "_where": "E:\\WebstormProjects\\XKD",
+ "author": {
+ "name": "DHTMLX"
+ },
+ "bugs": {
+ "url": "https://github.com/DHTMLX/gantt/issues"
+ },
+ "description": "An open source JavaScript Gantt chart that helps you illustrate a project schedule in a nice-looking chart.",
+ "homepage": "https://github.com/DHTMLX/gantt#readme",
+ "keywords": [
+ "gantt",
+ "chart",
+ "gantt chart",
+ "calendar",
+ "scheduler",
+ "dhtmlx",
+ "dhtmlxgantt",
+ "timeline",
+ "browser"
+ ],
+ "license": "GPL-2.0",
+ "main": "codebase/dhtmlxgantt.js",
+ "name": "dhtmlx-gantt",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/DHTMLX/gantt.git"
+ },
+ "types": "codebase/dhtmlxgantt.d.ts",
+ "version": "8.0.6"
+}
diff --git a/src/components/dhtmlxGantt/whatsnew.md b/src/components/dhtmlxGantt/whatsnew.md
new file mode 100644
index 0000000..798cf74
--- /dev/null
+++ b/src/components/dhtmlxGantt/whatsnew.md
@@ -0,0 +1,843 @@
+### 8.0.6
+
+Enhancements and corrections in the usage of WAI-ARIA attributes for improved accessibility
+Fix the issue of decreasing grid's width after repainting when the grid_elastic_columns config is enabled
+The default number of undo_steps is increased from 10 to 100
+The Export API client is now integrated into the GPL version of Gantt, previously it has been included only in PRO versions
+Add support for the https export server endpoints in the Node.js version of Gantt
+
+### 8.0.5
+
+Fix incorrect warnings triggered by enabling extensions via the Gantt.getGanttInstance configuration.
+Fix the incorrect work of gantt.exportToExcel when the skip_off_time config is enabled
+Improvements for the Sample Explorer
+
+### 8.0.4
+
+Fix issue with DataProcessor not tracking changes of the Resource Datastore
+Resolve an error that occurred after dragging a task when the process_resource_assignments config is disabled
+Fix the incorrect work of gantt.calculateEndDate when subtracting dates in minute units
+Minor performance improvement for layouts with visibility groups
+
+### 8.0.3
+
+Performance improvements for the Resource Panel
+Fix incorrect calculation of Free Slack for tasks with a negative Lag
+Fix incorrect calculation of Critical Path for tasks with 100% progress
+
+### 8.0.2
+
+Fix Export errors that happen when LinkFormatters are used.
+Fix the incorrect work of the Undo extension with Resources and Resource Assignments
+Type definitions are updated
+Performance improvements for Rollup tasks rendering
+Performance improvement for Split Tasks rendering
+Other performance improvements
+
+### 8.0.1
+
+Fix an error thrown from "gantt.showCover()" called when the lightbox is not opened
+Fix regression in split tasks which caused a script error for the split tasks displayed outside of the time scale
+Fix regression in the "gantt.addLinkLayer()" method
+Fix the incorrect work of auto scheduling with MSO, FNET, and FNLT constraints when the settings of work time contain a minute part
+Fix work of the "onBeforeSplitTaskDisplay" event on scroll
+
+### 8.0.0
+
+Updated Resource Management:
+Resources and resource assignments can now be loaded together with the data
+Changes of resources and resource Assignments can be captured using the DataProcessor
+Reduced amount of boilerplate code required to use the Resource panel
+
+Grouping tasks functionality now can preserve the original Gantt tree structure inside groups
+Empty state screen
+The ability to extend the background grid of the timeline to the whole container
+
+Improvements for rollup items and split tasks:
+The ability to style separate rollup items and split tasks
+The ability to hide all rollup items from the project task
+The ability to control where rollup items are displayed
+The ability to filter split tasks
+Performance optimization for display of split tasks
+
+The ability to delete items only after receiving confirmation from the backend
+New deleteAfterConfirmation parameter of the dataProcessor configuration object
+
+Updated Auto Scheduling & Constraint calculation
+Tasks now can inherit the constraint type from parent projects
+
+Improvements for Critical Path, Slack and Auto Scheduling
+Critical path, Slack and Auto scheduling algorithms can now use progress of a task
+Total slack can now be calculated for projects
+Major performance improvement of critical path calculation
+The getTaskBy() method now allows selecting 'project' tasks
+The ability to put any HTML content into the cells of the Timeline
+
+The export API is included into gantt.plugins and no longer requires adding additional JS file. Check the Migration article
+
+Fix the duration calculation issue with minute duration_unit and custom working time settings
+Fix various issues with slack calculation
+Fix the script error on data loading when Slack calculations are enabled
+SetWorkTime method now supports setting rules for dates inside customWeeks
+Fix the issue with smart rendering that causes blank spaces instead of data in the Gantt
+Fix the issue with vertical reordering of rows in the Grid when some rows have custom heights
+Fix the incorrect work of Inline editors when the Multiselect extension is enabled
+Fix the incorrect display of Quick Info popup when gantt.config.quick_info_detached config is set to false
+Correct arguments of is_valid function of Inline Editor interface. The function now receives the column object
+Ensure the parent property of task is saved correctly when the task is created with gantt.groupBy active
+Fix the issue with unexpected vertical scroll when placeholder tasks and Keyboard navigation are enabled
+Fix the issue with DataProcessor causing some changes not to be set to the backend after Auto Scheduling
+Fix the incorrect work of vertical reordering, which allowed task rows to being dragged outside the Gantt
+Fix the incorrect order of odd CSS classes of rows in the Resource panel
+
+
+### 7.1.13
+
+Fix the incorrect work of the "gantt.addLinkLayer()" method with the "smart_rendering" property
+Fix issues with display of S-Curve Overlay together with different time scales
+Fix the issue with resizing of grid columns when the "grid_elastic_columns" property is enabled
+Fix the issue that caused Gantt to reset the position of the vertical scroll after deleting a task using Keyboard Navigation
+Fix the incorrect work of the "treeDatastore.move()" method
+Fix the issue with the "gantt.parse()" method, extra collections from the dataset should be available via the "gantt.serverList()" method
+Fix the issue with the "gantt.groupBy()" method, which caused the selection state to reset after grouping
+Fix compatibility issues with Vue.js v3.x
+Fix the script error thrown from the "gantt.getConstraintLimitations()" method when the specified task didn't have 'constraint_date'
+Fix compatibility issues with SalesForce Web Security
+Fix the issue which caused focus to be returned to the Gantt after clicking outside the Gantt container when Keyboard Navigation was enabled
+German locale is updated
+Now it is possible to open the inline editor after one click on a task in the multi-selection mode (the "inline_editors_multiselect_open" property is added)
+
+### 7.1.12
+
+Fix the incorrect work of the gantt.isWorkTime() method with the "week" time unit
+Fix the issue that prevented tasks and links from being rendered when they were added via the gantt.silent() method
+Fix the issue that caused the "Task not found" error message to be shown after data loading in some cases
+Fix the incorrect work of the gantt.changeLightboxType() method that left old lightbox elements in DOM
+Fix the incorrect calculation of the end dates of tasks when the tasks overlap after the Summer/Winter clock change
+Fix the issue that caused the Resource Grid to disappear when the user edited a resource value using the cell editor
+Fix the script error that happened when the Gantt layout contained the "resourceGrid"/"resourceTimeline" views but not included the "grid"/"timeline" views
+Fix the incorrect work of the autosize config when the Gantt layout contained Resource Panel
+Fix the lightbox for split tasks, the lightbox now should be displayed when you double-click on a split task
+
+### 7.1.11
+
+Fix sourcemaps for compressed Gantt files
+Fix the incorrect position of markers when autosize = 'y' was applied
+Fix the incorrect position of the tooltip and some other elements of Gantt in cases when the Gantt container had extra margin or vertical offsets
+Fix the issue that caused rows of the editable resource diagram to change the order after the first cell of the resource assignment was edited
+Fix the issue that caused the incorrect work of the smart rendering after expanding or collapsing of tasks in some cases
+Fix the issue with the onBeforeDrag event which didn't block the default actions when the click_drag and drag_timeline extensions were activated
+Fix the script error that fired when the changeId() method was called for the resource assignments store
+Scrollbars of the default Gantt layout no longer require fixed scrollVer/scrollHor names to work correctly
+Split tasks now receive the 'gantt_selected' class on selection, in the same way as regular tasks do
+
+### 7.1.10
+
+Fix the issue which caused Gantt not to render a project task if it didn鈥檛 have children and the start_date parameter was specified for the task
+Fix the issue with resizing a task row by drag and drop if the task ID was either a non-number value or a numeric string with more than 16 symbols
+Fix the incorrect work of visibility groups which prevented the sizes of the grid and time scale from being synchronized in the complex layout
+Fix the issues with task dates after dragging several tasks horizontally at once
+Fix the issue which caused dataProcessor not to send all updates from different datastores when the auto-update mode is disabled
+Fix the issue which caused the milestone with the FF link to be moved to the next day
+Fix the incorrect calculation of the end_date of milestones when using backward scheduling and setting project_end to the non-working time
+Fix the incorrect work of task reordering if HTML elements were displayed above the gantt
+Fix the issue with the unsetWorkTime() method when the date/day configuration was removed from the calendar but the changes were not applied immediately
+Fix the issue with the clearAll() method which didn鈥檛 clear selected tasks if the multiselect extension was enabled
+Fix the error appeared when applying the exportToExcel() method with the visual: true parameter and setting the duration_unit config to 鈥榟our鈥�
+
+### 7.1.9
+
+Fix the issue with alignment of subtasks after dragging a project in the "year" scale and switching between scales dynamically
+Fix the issue which caused the duration of the project to change after dragging the project with subtasks in the "month" scale
+Fix the issue with Auto Scheduling that caused the constraint type to be changed from "ASAP" to "SNET" after changing the duration of the task
+Fix the incorrect work of backward scheduling after changing the start and end dates via inline editors when schedule_from_end is enabled
+Now it is possible to open the lightbox for read-only tasks in the read-only mode
+Now it is impossible to edit read-only tasks via the lightbox
+Fix the issue with the lightbox which caused it not to open for editable tasks in the read-only mode (appeared in v6.3.1)
+Fix the issue with resizing columns in grid after hiding the timeline via show_chart
+Fix the issue with Auto Scheduling which couldn't be canceled after changing values of project_start and project_end
+Fix the issue which caused the gantt to assign constraints to the tasks with disabled auto-scheduling
+Fix the issue with defining a year range by the lightbox when the range of dates of tasks is more than 10 years and a range for the year selector isn't specified
+Fix the script error that was thrown after loading Gantt if a horizontal scrollbar was attached to 3 or more vertical views
+Fix the incorrect work of the onBeforeTaskAutoSchedule event after setting the ASAP constraint for the task without links when the strict mode is enabled
+Fix the error occurred when running minified versions of Gantt in Next.js projects
+Fix the issue which caused the width of Gantt to be changed after initializing the gantt instance inside an empty container
+
+### 7.1.8
+
+Fix the script error that was thrown from the gantt.groupBy method when the Resource Histogram and fit_tasks config were enabled
+Fix the incorrect work of the Undo extension that didn't send updates to the server when vertical reordering was reverted
+Fix the issue with the Export to MS Project module which in some cases caused an Unknown error result when custom properties were sent to the export
+Fix the incorrect work of the gantt.silent method, which did not prevent gantt.changeTaskId from triggering API events and repaints
+Fix the incorrect work of the gantt.undo method that did not restore the original vertical position of the reverted item
+Fix the incorrect work of the resource assignment form which caused gantt to replace the user-provided id of the resource assignment with an auto-generated value
+Fix the incorrect work of gantt.changeTaskId in cases when the affected tasks had nested items, which caused the level of nested items to be calculated incorrectly
+
+### 7.1.7
+
+Fix issues with incorrect calculation of the total slack values
+Performance improvement for total slack calculation
+Style fixes for the lightbox in the Material skin
+Fix the issue with the Zoom plugin that prevented the zoom.init method from working when calling the method after gantt.init
+Fix the script error that happened when using the inherit_calendar config together with the gantt.groupBy method
+Fix the script error thrown when adding tasks via gantt.bathUpdate if the placeholder task is active
+Fix the issue that allowed the placeholder task to be sorted, reordered, or accept subtasks
+Fix issues with incorrect size of grid columns
+Fix the incorrect work of the column's resizers which conflicted with reordering of the columns
+
+### 7.1.6
+
+Fix the incorrect work of the auto_scheduling_move_projects config when schedule_from_end is enabled
+Fix the incorrect work of the onrender callback of the column which caused custom elements to disappear when the grid is scrolled quickly
+Fix the regression (appeared in v7.1.5) which caused rows of the grid to disappear after the grid cell is resized in complex layouts
+Fix the incorrect work of the size/visibility groups which prevented the sizes of columns from being synchronized in the complex layout
+Improved the display of the grid when the gantt is rendered in a small container
+
+### 7.1.5
+
+Fix the incorrect work of vertical reordering of tasks in the "marker" mode when gantt rows have different heights
+Fix the issue with the sizes of the timeline and the grid in some layouts when the "show_grid" and "show_chart" configs are disabled
+The "data-column-name" and "data-column-index" attributes are added for cells of the grid header
+Fix the incorrect display of the grid after re-initialization of the gantt after removing all columns from the config
+Fix the issue that caused the resource panel configuration to overwrite the main configuration of the gantt in Vue.js applications
+Added the ability to modify the configuration of the resource panel on the fly by modifying the configuration object provided to the resource layout
+
+### 7.1.4
+
+Fix the incorrect work of unsetWorkTime that caused affected dates to have incorrect work hours
+Fix the script error thrown in the Resource histogram after scrolling the histogram when resource_render_empty_cell is set to false and smart_rendering is enabled
+Fix the incorrect work of the editNextRow and editPrevRow methods of the Inline Editors module
+Fix the incorrect work of the Quick Info popup that caused the popup to be displayed after clicking on the "add" button in the grid
+Fix the incorrect work of the ASAP constraints that caused tasks not to be moved to the earliest date of the project
+Fix the incorrect work of Inline Editors that prevented constraints from being edited via the inline editor
+Fix the incorrect behavior of the "scroll into view" logic of Keyboard Navigation which called an unnecessary scroll when selected task bars are visible
+Fix the script error thrown when the mouse is moved outside the container when the click_drag extension is enabled
+Performance improvements for the auto_types configuration option of Gantt
+
+### 7.1.3
+
+Fix the script error thrown on gantt.moveTask call when some tasks are hidden via the onBeforeTaskDisplay event
+Fix the issue with the speed of the scroll in the latest Firefox browser
+Performance improvement for calculations of working time
+
+### 7.1.2
+
+Major performance improvement of the resource panel
+Fix the script error thrown when gantt.destructor is called while gantt.load is in progress
+Fix the incorrect behavior of split tasks on change of the task id
+Fix the incorrect work of scroll on mouse wheel in Angular
+
+### 7.1.1
+
+Fix the regression in the click_drag plugin
+Fix the Security Violation error thrown from the gantt when setting the gantt.config.csp config to the "auto" mode
+Fix code build settings that caused the package code v7.1.0 to contain ES6 syntax, the library is again ES5 compatible
+Fix the script error fired when trying to resize a grid column when gantt.config.reorder_grid_columns config is enabled
+Update TypeScript type definitions
+Add the onDestroy event to DataStore
+Performance improvement for gantts with a large number of task calendars
+Performance improvement for calculations of resource assignment during batchUpdate and autoScheduling
+
+### 7.1.0
+
+The ability to assign resources to the specific dates of the task
+The new gantt.getTaskAssignments() method
+The ability to manage the resource assignments via the new gantt.config.process_resource_assignments and gantt.updateTaskAssignments() Gantt API
+Rollup tasks and milestones
+The ability to hide task bars and milestones in the timeline area
+The ability to set different working hours for different time spans
+The ability to set the height for a separate row in the grid
+The ability to resize a row in the grid by drag-and-drop
+The ability to get the height of the DOM element of the task via the gantt.getTaskBarHeight() method
+New events: onBeforeRowResize, onRowResize, onBeforeRowResizeEnd, onAfterRowResize
+The onrender callback for rendering a grid cell into DOM is added
+The onrender callback for rendering a custom element of the task layer into DOM is added
+Fix the issue with reordering tasks vertically in the resource view when resources have values assigned
+Fix the issue that caused 鈥渞esource_cell_value鈥� not being called and the resource markers not being rendered if a task doesn鈥檛 start at the beginning of the timeline cell
+Fix the issue that caused Gantt to stop working when deleting the task with the id that already exists in the data store
+Fix the script error thrown when specifying the 0 number value as a task id even if the 鈥渞oot_id鈥� parameter is set
+Fix the issue that caused the resizer listener not to work in Salesforce environment
+Fix the script error appeared when applying Fullscreen Extension several times together with its methods
+Fix the issue with Keyboard Navigation Extension that caused navigation in Grid to stop working when adding the plugin several times
+Fix the issue with Inline Editors when the editor couldn't be opened in a cell that is located after a column that is hidden via hide:true property
+
+### 7.0.13
+
+Fix the script error happened when the layout configuration is changed dynamically and gantt.addTaskLayer is used
+Fix the issue with the initial inner height of the resource histogram when the fetchTasks option is used
+Fix the incorrect work of the predecessor editor which caused it to delete existing links when the value is edited
+Fix the incorrect work of the gantt when a task with a non-unique ID is added to the gantt via the gantt.addTask and gantt.parse methods
+Performance improvement for drag and drop when the auto_types and drag_project configuration options are enabled
+Performance improvement for calculation of working time when duration_unit is set to "day"
+
+### 7.0.12
+
+Fix some minor issues with vertical drag and drop in large projects
+Fix the issue with the incorrect size of the container when the "autosize" config is used
+Keyboard navigation should now work correctly with the horizontal scroll of the grid
+HTML views of Layout now support external scrollbars
+Fix the issue that caused the incorrect state of the grid after reordering tasks, if the additional grid was added to the layout
+Fix the script error that happened after clearing and reloading the resource panel if a resource was selected
+Add the ability to disable automatic correction of the end date in the time section of the lightbox, which was applied when the selected start date was greater than the end date
+Fix a typo in the default config of Duration Formatter
+Fix the script error thrown when the gantt is destroyed while a popup message is shown
+Fix the initial position of the horizontal scroll in Grid and Timeline in the RTL mode
+Fix the incorrect work of the lightbox which caused the selected type of a task not to be saved if the typeselect control was not added to the lightbox configuration
+Fix the issue that caused markers to disappear after calling the "gantt.resetLayout()" method
+Fix the performance issue with the "drag_project" config used in large projects
+Fix the issue that prevented the QuickInfo popup from being displayed in the read-only mode when custom buttons were added to the config
+
+### 7.0.11
+
+Add the container_resize_timeout config for changing the timeout before redrawing Gantt when resizing the container
+Add the wheel_scroll_sensitivity config for changing the speed of scrolling the gantt by the mouse wheel
+Fix the bug with Auto Scheduling when using different working calendars
+Fix the conflict between placeholder tasks and Auto Scheduling
+Fix redundant repaints when api/gantt_sort_config.md is enabled
+Fix the issue with Inline Editors and a scrollable grid, when inline editors lose focus right after click
+Fix the issue that caused Gantt to close the Quick Info popup when the user clicks on it
+
+### 7.0.10
+
+Fix the incorrect work of vertical resizers (the regression appeared in v7.0.9)
+Prevent unexpected page refresh which happened during vertical reordering of tasks on Android Chrome (pull-to-refresh)
+Fix the script error which fired during creating a link on mobile Firefox
+Fix the incorrect work of task selection when the multiselect config is enabled but the multiselect plugin is not activated
+Improve the work of HTML select controls inside Inline Editors
+Fix the incorrect work of Auto Scheduling when linked tasks use different work calendars
+The gantt.plugins method will not activate plugins which are specified with false value
+Fix the conflict between Inline Editors and Keyboard Navigation
+Fix the issue that caused Inline Editors to close on double click
+
+### 7.0.9
+
+Fix the script error on the second initialization of Gantt when custom datastores are added
+Fix the incorrect work of auto-scheduling when using with FF and SS links and when the source and target tasks use different working calendars
+Fix the incorrect calculation of working time when duration_unit is set to "minute" and the start time is set to the middle of a non-working day
+Fix touch support for Safari iPad on iPadOS v13.6
+Fix the sizes of the Lightbox modal overlay on mobile devices
+Fix the incorrect display of lightbox buttons in some browsers
+Fix support of Italian and Portuguese locales in the gantt.i18n module
+Fix the bug in the Parent control of the Lightbox which caused the incorrect work when tasks were assigned to the root level
+Fix the script error which happened when initializing a gantt inside an iframe
+Fix the incorrect work of the redo config when the undo config is disabled
+
+### 7.0.8
+
+- Fix some issues with touch support on Android/iOS devices
+- Fix regression (appeared in v7.0.6) with link creation and gantt.isLinkAllowed method
+- Fix the script error which was thrown when the 'locale' parameter was used in gantt.getGanttInstance
+- Fix the script error that was thrown from gantt.destructor when the Keyboard Navigation and the Quick Info extensions were used
+
+### 7.0.7
+
+- Fix the syntax error in type definition of gantt.Promise
+
+### 7.0.6
+
+- Fix script errors that were fired on touch devices during drag and drop
+- Fix the incorrect work of the Auto Scheduling extension when types of links were defined using numeric values
+- Reduced the number of redundant repaints of the resource histogram
+- Performance improvements for the task grouping extension
+- Fix the ability to scroll a resource timeline on touch devices
+- Fix the incorrect work of the resource control when the 'hide empty' button is used
+- The return type of gantt.Promise in type definitions is fixed
+
+### 7.0.5
+
+- Performance improvements for work time calculation when the duration_unit config is set to "hour"
+- Performance improvements for work time calculation when the duration_unit config is set to "minute"
+- The ability to specify working calendars in the configuration object of Gantt.getGanttInstance is added
+
+### 7.0.4
+
+- Removed the 10000px limit on the gantt size in the autosize mode, which should allow printing larger charts
+- Drag and drop now finishes when the user releases the mouse button over any part of the document body rather than over the gantt container only
+- Portuguese locale was updated
+- The return type of gantt.columnIndexByDate in type definitions is fixed
+- Fix script errors that were fired when the Gantt instance was destroyed during drag and drop
+- Fix the incorrect calculation of end_date/duration when duration_unit is set to "minute" and the last worktime interval finishes after 23:00
+- Fix the issue which caused groups of the grouping extension to expand whenever the user modified any task
+- Fix the issue which caused the second parameter of dataProcessor.setTransactionMode to be ignored if an object was passed into the first parameter
+- Fix the issue which caused the active inline editor to disappear after repaint of Gantt
+- Fix the issue with the static_background extension which caused mouse click on empty cells to be interpreted as a click on task elements
+- Gantt now dynamically repaints links between split tasks during drag and drop
+- Fix the script error which was thrown from gantt.addTask in node.js package
+- Fix the script error which was thrown from gantt.destructor in node.js package
+
+### 7.0.3
+
+- Fix regression in the setWorkTime method which caused a script error when the working time is set for a specific day
+- Fix the incorrect work of the Keyboard Navigation extension when Gantt is used inside a SalesForce Lightning Web Component
+
+### 7.0.2
+
+- Fix the incorrect work of date formatters when gantt.config.csp is set to true.
+- Fix regression in the Click Drag and Drag Timeline extensions which caused the incorrect work when multiple instances of Gantt were created
+- Fix the incorrect css class of a task row element after returning the error status from the dataProcessor router function
+- Fix the incorrect work of inline editors inside Shadow DOM
+
+### 7.0.1
+
+- Major performance improvement for calculation tasks' duration in the working minutes
+- Fix regression in the Tooltip and Undo extensions which caused the incorrect work when multiple instances of Gantt were created
+- Fix the issue with the reordering of grid columns which caused the timeline to scroll when a mouse pointer moved to the edge of the grid during drag and drop
+- Fix the incorrect position of the column after its dragging and dropping to the right side of the grid border
+- dataProcessor custom router should now work correctly with rejected promises
+- Fix the regression in smart rendering which caused some links not to be visible
+- Split tasks now display not only the first level children but also all nested subtasks
+- Fix the issue with split tasks and smart rendering which happened when a split task had the 'task' type
+- Fix the issue with split tasks which caused the gantt not to calculate the duration of the 'project' tasks nested in a split task
+- Fix the incorrect position of a placeholder after opening an inline editor in the RTL mode
+
+### 7.0.0
+
+- Nodejs-compatible build of dhtmlxGantt is now available
+- Update TypeScript type definitions
+- Extensions and Locales are now bundled with dhtmlxgantt.js core file and are enabled from config
+- Ability to specify work time in minutes
+- Ability to merge several work time calendars
+- Changed default work hours from 8:00-17:00 to 8:00-12:00, 13:00-17:00
+- Simpler format for entering work time intervals for Calendars
+- Extend the API of the QuickInfo extension
+- CSP mode is enabled by default
+- All custom HTML attributes were changed to `data-` attributes
+- Add the ability to use `text-overflow:ellipsis` on grid cells
+- Add the ability to reorder grid columns by drag and drop
+- Add support for 'elastic' column width for the scrollable grid
+- gantt.templates.xml_date/gantt.templates.xml_format were replaced with gantt.templates.parse_date/gantt.templates.format_date
+- gantt.config.xml_date was replaced with gantt.config.date_format
+- Fix the bug which caused a column to change width after hiding and showing the column again
+- Fix the bug which disabled the ability to select any task when the multiselect extension was disabled via the `multiselect` config
+- Fix the incorrect work of `gantt.sort` for tasks with equal start dates
+- Fix drag and drop of a link when Gantt is initialized inside a Web Component
+
+### 6.3.7
+
+- Significant performance improvement for smart rendering of chart and resource panel
+
+### 6.3.6
+
+- Fix the regression in gantt.resetLayout which caused the script error
+- Fix the issue with the QuickInfo popup which caused it to be positioned behind the resource panel in some cases
+- Fix the script error thrown from the gantt.getShortcutHandler method
+- Fix the script error thrown from the tooltip.show(x, y) method
+- gantt.getTaskNode now returns the correct HTML element for split tasks
+- Fix the issue with horizontal scrollbars not being displayed when visibility groups are specified in some layout configurations
+
+### 6.3.5
+
+- Fix the issue with task grouping which caused vertical scroll position to reset after moving any task with drag and drop
+- Fix the script error which happened when drag_timeline config was set to null
+- Fix the incorrect position of highlighted cells when static_background and static_background_cells are enabled and smart_rendering is disabled
+- Fix the issue with the onAfterBranchLoading event not being called
+- Fix the incorrect work of smart rendering when the value of task_height is less than the value of row_height
+- A public method for rebuilding gantt layout after changing its config is added
+
+### 6.3.4
+
+- Fix crashes of the resource load diagram when smart rendering is switched off
+- Fix issue with the custom task property named "unit", as gantt considered it as a duration unit value and multiplied the task duration after its dragging
+- Fix the incorrect Tooltip position when the autosize config is enabled
+- Fix the incorrect alignment behavior of grid cells when both the scrollable property and autofit config are set to true
+- Creating a link between a task in the timeline and a placeholder in the grid is now blocked
+- Fix the bug with the auto scheduling extension that caused gantt to freeze when a task has the constraint type (SNET/FNET/SNLT/FNLT) with no date specified, or with an invalid date
+
+### 6.3.3
+
+- Fix the incorrect resizing behavior of grid that disabled the Timeline in some cases
+- gantt.parse should now correctly update the project tree when a parent task is loaded after its children
+- Fix compatibility with SalesForce Lightning Aura components framework (Evaluation build)
+- Fix the incorrect position of the Tooltip in SalesForce environment
+- Fix the incorrect Tooltip position when the gantt container has a vertical margin
+- Add missing WAI-ARIA attributes to elements inside the gantt
+- Fix the incorrect work of the min_duration config
+- Fix the incorrect work of link formatters with custom instances of the gantt
+
+### 6.3.2
+
+- Fix the script error which happened when gantt.destructor was called when the click-drag feature was enabled
+- gantt.parse no longer modifies data objects passed into arguments, deep copies are made instead
+- TypeScript type definitions were updated
+- onBeforeBranchLoading and onAfterBranchLoading public events were added so it would be possible to modify the url or dynamic parameters of dynamic loading requests
+- Added a public method for changing the url of the dataProcessor after its initialization
+
+### 6.3.1
+
+- Fix the regression in the smart rendering which caused links not to be rendered in some cases.
+- Fix the bug that allowed modifying and creating new tasks with keyboard navigation when the read-only mode is activated
+- Fix the display issue with Fullscreen extension which allowed some page elements to be displayed over the gantt in the fullscreen mode
+- Fix the bug that caused the drag-timeline extension to reset the value of the readonly config
+
+### 6.3
+
+- Ability to specify decimal units for the duration of tasks
+- Ability to scroll the timeline via mouse click and drag
+- Ability to drag and drop multiple tasks horizontally
+
+- Ability to display tasks outside the explicit start_date and end_date range of the time scale
+- Add a new task_end_date template for formatting end dates of tasks
+- Ability to add custom actions to the Undo stack
+- Ability to connect custom layers to smart rendering
+- Inline editors for predecessors now support formatted values of links
+- Remove default limits for input values in date inline editors
+- Ability to specify the root node for the Fullscreen extension
+- Ability either to change or disable horizontal scroll by shiftKey+mousewheel
+- Roboto font was removed from Material skin and has to be imported manually
+
+- Fix crashes of the resource histogram when smart rendering is switched off
+- Fix compatibility with r.js compressor
+- Fix various conflicts between keyboard navigation and inline editors
+- Fix the incorrect state of the DataProcessor when tasks and links were modified sequentially from a custom router
+- A correct data object of Task/Link is now also passed into delete call of a custom router
+
+### 6.2.7
+
+- Fix the issue with vertical resizing of grids with horizontal scroll in complex layouts
+- Fix the incorrect work of the resource histogram when the scale step is greater than one
+- Fix the reopened bug with collapsed branches after calling gantt.parse from v6.2.4 bugfix
+
+### 6.2.6
+
+- Fix the regression in v6.2 Smart Rendering which in some cases caused incorrect vertical positions of tasks after re-initialization of the Gantt
+- Fix the issue with QuickInfo popup not being displayed for unscheduled tasks
+- Fix incorrect work of extension files with the Ultimate build of Gantt
+
+### 6.2.5
+
+- Fix incorrect initial values of subtasks in the onBeforeTaskChanged event handler after dragging a project with subtasks
+- Fix incorrect work of the grouping extension when auto task types are enabled
+- Fix the script error after returning the false value from the onTaskLoading event handler
+- Add clearer error messages for the exceptions that can be thrown from gantt.load and gantt.parse
+
+### 6.2.4
+
+- Fix the issue with task branches being collapsed after updating data using gantt.parse
+- Fix the incorrect work of smart rendering in the resource view
+- Fix the issue which caused the Zoom module to attach redundant DOM event handlers on each re-initialization of the Gantt
+
+### 6.2.3
+
+- Fix the incorrect work of the Constraint control in IE11 and MS Edge browsers
+- Fix the size of the Gantt element in Fullscreen mode
+- Fix the issue with onExpand and onCollapse events not being called from Fullscreen mode
+- Correct the Tooltip position when the mouse pointer is near the left/right edge of the screen
+- The Tooltip should now be hidden when the Lightbox is opened
+- The Tooltip should now be hidden when the chart is scrolled
+- Fix the incorrect work of Tooltip which caused the tooltip not to be updated when mouse pointer moved between two elements matching the same selector
+- Fix the incorrect work of getTaskBy when null or 0 is provided as a second argument
+- Fix the issue with WBS column not being updated after sorting the gantt
+- Fix the incorrect display of static_background in Material skin
+
+### 6.2.2
+
+- Add the `gantt.license` property
+- Add the `onLinkCreated` API event for new links, similarly to the `onTaskCreated` functionality for new tasks
+- `gantt.moveTask` returns false when the action is prevented using onBeforeTaskMove
+- Fix the issue which caused a link line to disappear when the render method is called while a user creates a new link
+- Fix the issue when markers were not displayed when their start date was set earlier than the minimal date of the time scale
+- Fix the issue when markers were not displayed when gantt was initialized with the `gantt.config.show_chart = false` config
+- Fix a disappearing modal overlay of the lightbox when a user changed the type of a task
+- Fix the issue in keyboard navigation presets, when onAfterTaskUpdate was fired after Shift+left arrow hotkey even if the action was canceled using onBeforeTaskMove
+
+### 6.2.1
+
+- Fix IE11 compatibility of the click-drag feature
+- Fix the script error which happened when the user tried to add a new task into an empty chart with the resource view
+- Fix the incorrect behavior of the grouping extension which caused assigning an incorrect group value to new tasks
+- Fix a script error in the keyboard navigation extension thrown from the Alt+Arrow key shortcut
+- Filtering in the resource control is changed to ignore text case
+- Task dragging and drag-and-drop may finish on mouseup on any gantt element
+- Fix the script error which happened after saving an unscheduled task
+
+### 6.2.0
+
+- Smart rendering is now embedded into the component
+- Smart rendering works for rows and cells in all timelines
+- static_background allows rendering highlighted cells
+- Ability to expand/collapse split tasks (PRO)
+- Add new Zoom module, add the ability to zoom by mousewheel
+- New options for inline editors
+- Simplified scales API
+- Fix bug that caused multiple selected tasks to lose CSS classes after repaint
+- Fix script error when destroying Gantt from data processor handler
+
+### 6.1.7
+
+- Fix incorrect behavior of getClosestWorkTime
+- Fix issue with the autoscroll which happened after toggling visibility of the timeline
+- Fix bug in the Multiselect extension which caused selected tasks to lose highlight after chart repaint
+- Fix script error which happened after vertical drag-and-drop if smart rendering and keyboard navigation extensions were enabled
+- Fix incorrect behavior which happened when users tried to switch between inline editors using the Tab key if some columns of the grid were hidden
+- Fix unexpected behavior which prevented the lightbox and inline editors from overriding constraint dates
+
+### 6.1.6
+
+- Fix issue with not working click handlers of QuickInfo popup after a second gantt.init call
+- Fix issue with QuickInfo popup not showing up if show_chart config is set to false
+- Fix incorrect `action` argument for dataProcessor router after vertical drag-and-drop
+- Fix issue when gantt.createTask ignores the `index` parameter
+
+### 6.1.5
+
+- Fix script error on a second gantt.init call when show_chart config is disabled
+- Fix incorrect position of order_branch placeholder in the marker mode
+
+### 6.1.4
+
+- Fix script error on reinitialization of gantt in the IE browser
+- Fix incorrect behavior of Tooltip extension when gantt.destructor is called
+- Fix incorrect work of inline editors in keyboard_navigation_cell mode when grid contains hidden columns
+- Fix bug in the Undo extension when Redo action for recreation of new tasks did not restore all properties
+- Fix regression in GPL build which caused a script error on a second gantt.init call
+
+### 6.1.3
+
+- gantt.createTask/gantt.addTask should use root_id config value instead of hardcoded 0 id
+- Performance increase for worktime calculations for minute and hour duration units
+- Minor performance increase for rendering large lists of tasks in the smart rendering mode
+- Ensure vertical drag-and-drop doesn't start when the user selects text inside an inline editor
+- Fix script error from keyboard navigation in the cell mode after deleting last tasks from the chart
+- Ensure Gantt cleans up autogenerated static background style elements after destruction or reinitialization
+- Ensure inline editors are not active when read-only mode is enabled
+- Fix incorrect selection of grid header cells in the cell mode of keyboard navigation when the sort config is enabled
+- Fix regression in the auto_types config which prevented auto type change when new tasks are added
+- Fix bug when returning false from onTaskDblClick blocked onLinkDblClick as well
+- Fix script error when parsing constraint dates from JSON data
+- Fix incorrect position of tasks and markers with the skip_off_time config
+- Fix incorrect height of markers after reordering tasks via drag and drop
+- New tasks receive the initial value of the progress property
+- Fix incorrect task position after vertical drag and drop in the marker mode
+- Fix script error from gantt.destructor when the resource panel is enabled
+- Fix the bug which caused an empty line to be displayed in a typeselect block
+- Fix the bug which caused a task not to be recognized as a part of critical path after id change
+
+### 6.1.2
+
+- Keyboard navigation: add a method for getting the active cell
+- Fix incorrect work of the resource panel after creating a new datastore to overwrite the previous one
+- Fix incorrect values of query parameters in the POST mode of dataProcessor
+- Fix incorrect result of gantt.getClosestWorkTime when called without specifying a direction
+- Fix issue when the English locale couldn't override the previously added locale
+- Fix script error with gantt.undo and indent actions in the grid
+- Fix SalesForce compatibility: new resize listener was broken in SF, fallback is added
+
+### 6.1.1
+
+- Add missing locale options for the resource lightbox control
+- Fix script error when using gantt.destructor together with the dataProcessor
+- Fix script error when using gantt.destructor together with the resource panel
+- Fix the filesize of the tooltip extension
+- Fix unexpected call of the onTaskDblClick event while double clicking on a link element
+- Fix stuck lightbox cover if gantt.init is called while lightbox is opened
+- Fix issues with lightbox and the tooltip extension in the full-screen mode
+
+### 6.1.0
+
+- Ability to add an overlay for the Gantt Chart (PRO)
+- Time constraints for tasks (PRO)
+- Routing options for dataProcessor
+- Project-level working calendars (PRO)
+- Ability to create tooltips for all the elements of dhtmlxGantt
+- Ability to import dhtmlxGantt as an ES6 module
+
+### 6.0.7
+
+- reduce the number of redundant repaints of the resource diagram
+- fix script error from the resource diagram after deleting a task
+- fix script error from the fullscreen extension after exiting fullscreen mode on the `Esc` key
+- fix incorrect state of links drag and drop when dragging a link between multiple charts on the page. Creating links between gantts is not supported
+- fix script error after deleting multiple selected tasks using keyboard navigation extension
+- fix default mapping of inline editors. Inline editors shouldn't block keyboard shortcuts on task cells
+
+### 6.0.4
+
+- fix incorrect task position after task vertical dnd in order_branch='marker' mode
+- fix script error after deleting a sub-tree which contains selected task
+- fix script error on Save/Cancel lightbox containing resource filters
+
+### 6.0.2
+
+- Fix referenceError: getResourceAssignments is not defined when importing Gantt into Vue.js project
+- Fix script error on deleting task after assigning resource to it via resource form
+- Fix JS error in resource diagram after second initialization of Gantt
+- Fix script error on toggle timeline visibility when marker extension is used
+- Fix page freeze on gantt.parse if tasks tree contains cyclic references, script error is thrown instead
+
+### 6.0
+
+- Advanced resource management
+- New lightbox control for resource management
+- Resource histogram
+- Add ability to group by multiple resources
+- Updated branch ordering
+- Public methods for total slack and free slack
+- Add JSON-REST dataprocessor mode
+- Import from Excel added to online service
+- Auto resize when container size changes
+- Performance update for auto_types
+- Performance update for auto scheduling
+
+### 5.2
+
+- Inline editing in grid
+- Split task support
+- Updated keyboard navigation
+- Add checkbox and radio controls to the lightbox
+- Add ability to set task types automatically
+- Add ability to use a placeholder row for creating new tasks
+- Auto Scheduling performance improvements
+- New methods and events for Auto scheduling and Undo extension
+- Updated Content Security Policy extension
+- Various bugfixes
+
+### 5.1
+
+- Resource load diagram
+- RTL mode
+- Horizontal scroll for grid and other layout improvements
+- Destructors for gantt and data processor instances
+- Ability to set min/max widths of grid columns
+- Updated API events for a multiselect extension
+- Ability to drag and drop projects
+- Fixed issues with keyboard navigation in smart rendering mode
+- Many bugfixes
+
+### 5.0
+
+- Major architecture overhaul
+- Added global layout config
+- Added material skin
+- Various bugfixes
+
+### 4.2
+
+- Work Time calendars at the task and resource levels
+- WBS code (outline numbers) calculation
+- Autoscroll for drag and drop operations
+- Persian (Farsi) locale
+- The getter function for key navigation shortcuts
+- The config for cascade deleting of nested tasks and links
+- The ability to scroll timeline horizontally on Shift+a mouse wheel movement
+- German and Italian locales are updated
+- GIF images in the Gantt skins are replaced with PNG
+- various fixes
+
+### 4.1
+
+- Added keyboard navigation
+- Added WAI-ARIA support
+- Added High-contrast themes
+- Updated Auto Scheduling and Critical Path calculations (PRO version)
+- Performance improvements for worktime calculation and timescale rendering
+- Croatian locale added
+- Turkish locale updated
+- Fixed bug redrawing vertical markers using gantt.updateMarker
+- Fixed bug with gantt.showTask error in smart rendering mode
+- Bugfixes for skip_off_time config and multi-tier scales configurations
+- Bugfixes with dataProcessor and REST mode support
+
+### 4.0
+
+- Added Smart rendering of big data sets feature
+- Added Undo/Redo feature
+- Public API improvements - public helpers for popups, ajax, environment variables
+- Public API cleanup - remove redundant global objects, resolve conflicts with dhtmlxSuite
+- Updated critical path calculation - add support for lag/lead of links
+- Updated Spanish and Chinese locales
+- Minor bugfixes
+
+### 3.3
+
+- Added dependency Auto Scheduling feature *
+- Added support for Fullscreen mode
+- Added support of unscheduled tasks
+- Added initial support of Content Security Policy
+- Allow specifying per column grid sorting settings
+- Improved branch ordering feature - allow D'n'D between levels
+- Support of REST mode for ajax loading/saving
+- Support of backward planning
+
+* The marked functionality requires Commercial or Enterprise license, and not provided under GPL
+
+### 3.2
+
+- Added ability to group tasks by custom properties
+- Added multiple selection
+- Added export to iCal and to Excel
+- Added public events for managing tasks reordering in a grid
+- Added ability to specify time range in year selector
+- Major performance improvement of worktime and critical path calculations
+- New samples and API events
+
+### 3.1
+
+- Added ability to drag tasks on touch devices
+- Incorrect tooltip behavior on expand/collapse task tree fixed
+- Order of API events during gantt initialization fixed
+- Issues with markers and multiple initialization of the gantt fixed
+- Issues with markers and gantt.clearAll fixed
+- Issues with gantt.serialize method and nested projects of gantt tree fixed
+- Fixes in French locale
+- Improvements in time range calculation
+
+### 3.0
+
+- Support of Baselines, Deadlines and other custom elements of the timeline *
+- Critical path support *
+
+- Ability to display vertical lines in a timeline area (Today line, Status line, etc.)
+
+- Ability to resize Grid by D'n'D, ability to hide/show columns dynamically *
+- Simplified API for coloring tasks and links *
+- New performance-related options - dynamic loading and simple background rendering *
+
+- Extended configuration for managing 'readonly' state of the tasks
+- Extended set of methods for managing task tree hierarchy
+
+- Support of task types and ability to skip time from the scale was removed from a Free version of the component
+
+* The marked functionality requires Commercial or Enterprise license, and not provided under GPL
+
+
+### 2.1
+
+- Milestone and Projects support
+- Custom configuration of the lightbox for different task types
+- Non-linear scales, ability to skip time from the scale
+
+- Ability to calculate duration in work days/hours instead of calendar time
+
+- Support of multiple gantts on the page (requires PRO version)
+
+- Updated some localisations
+- Added more configurations and API methods events
+- Various bugfixes
+
+### 2.0
+
+- jQuery integration
+- Major performance improvements
+- Ready-to-use PHP integration
+
+- Configurable multi-line scales
+- Configurable multi-column grid with optional sorting and Drag-n-Drop
+- Configurable popup form for editing tasks
+- All text elements can be defined through templates
+- All date strings can be configured
+- All text labels can be localized
+
+- Default skin changed to "terrace"
+- 3 new skins
+- Bars can have an optional inner resizer
+- Optional UI for task creation
+- Vertical and horizontal lines can be colored based on custom rules
+
+- Loading and serialization from JSON
+- Loading and serialization with the simplified XML format
+- 3 types of task linking
+- Gantt charts work on touch devices
+
+- A LOT of events added
+- Templates and configuration options added
+- API simplified, it uses a single gantt object instead of a bunch of different objects
\ No newline at end of file
diff --git a/src/permission.js b/src/permission.js
index e092db5..7fa5299 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -9,7 +9,7 @@
NProgress.configure({ showSpinner: false }) // NProgress Configuration
-const whiteList = ['/login', '/zhkb', '/cj', '/ckgl', '/sop'] // no redirect whitelist
+const whiteList = ['/login', '/zhkb', '/cj', '/ckgl', '/sop', '/gantt'] // no redirect whitelist
router.beforeEach(async(to, from, next) => {
// start progress bar
diff --git a/src/router/index.js b/src/router/index.js
index 9b82fe3..04e38c6 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -36,6 +36,10 @@
* 鐪嬫澘閮ㄥ垎璺敱
* */
{
+ path: '/gantt',
+ component: () => import('@/views/gantt/index'),
+ hidden: true
+ }, {
path: '/zhkb',
component: () => import('@/views/kanbanManager/zhkb'),
hidden: true
diff --git a/src/views/gantt/index.vue b/src/views/gantt/index.vue
new file mode 100644
index 0000000..702da5f
--- /dev/null
+++ b/src/views/gantt/index.vue
@@ -0,0 +1,1624 @@
+<template>
+ <div style="padding: 0 10px">
+ <!-- <input value="淇濆瓨鍒版湰鍦板瓨鍌�" class="local_storage" type="button" @click="saveToLocalStorage()">-->
+ <!-- <input value="浠庢湰鍦板瓨鍌ㄥ姞杞�" class="local_storage" type="button" @click="loadFromLocalStorage()">-->
+
+ <!-- <input value="鎿嶄綔鍥為��" type="button" onclick="gantt.undo()">-->
+ <!-- <input value="鎿嶄綔鍓嶈繘" type="button" onclick="gantt.redo()">-->
+
+ <!-- <input type="button" value="鏀惧ぇ" onclick="gantt.ext.zoom.zoomIn();">-->
+ <!-- <input type="button" value="缂╁皬" onclick="gantt.ext.zoom.zoomOut();">-->
+
+ <!-- <input class="start_date" type="date" value="2025-04-01" @change="changeDates()">-->
+ <!-- <input class="end_date" type="date" value="2025-05-10" @change="changeDates()">-->
+
+ <!-- <input type="button" value="Group by priority" @click="group('priority')">-->
+ <!-- <input type="button" value="Group by resources" @click="group('owner')">-->
+ <!-- <input type="button" value="Reset grouping" @click="group()">-->
+
+ <!-- <label>褰撳墠甯冨眬:-->
+ <!-- <select class="layout_config" name="layout" @input="changeLayout(this.value)">-->
+ <!-- <option value="default">Default</option>-->
+ <!-- <option value="horizontalScrollbars">Horinzontal Scrollbars</option>-->
+ <!-- <option value="resource">With Resource Panel</option>-->
+ <!-- <option value="universal">Universal</option>-->
+ <!-- <option value="complexScrollbars">Complex with scrollbars</option>-->
+ <!-- </select>-->
+ <!-- </label>-->
+
+ <div style="padding: 10px 0;display: flex;">
+ <el-button type="primary" size="mini" @click="ganttUndo">鍥為��鎷栧姩鎿嶄綔</el-button>
+ <el-button type="primary" size="mini" @click="ganttRedo">鍓嶈繘鎷栧姩鎿嶄綔</el-button>
+ <el-button type="primary" size="mini" @click="ganttZoomIn">鏀惧ぇ</el-button>
+ <el-button type="primary" size="mini" @click="ganttZoomOut">缂╁皬</el-button>
+ <el-date-picker
+ v-model="ganttDateRange"
+ style="margin-left: 10px;"
+ size="mini"
+ type="daterange"
+ :clearable="false"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ @change="ganttDateRangeChange"
+ />
+ <el-button type="primary" style="margin-left: 10px;" size="mini" @click="handleGetSelected">
+ 鑾峰彇澶嶉�夋閫変腑浠诲姟
+ </el-button>
+ <!-- <el-button size="mini" @click="handleClearSelection">-->
+ <!-- 娓呯┖澶嶉�夋閫夋嫨-->
+ <!-- </el-button>-->
+ </div>
+
+ <div id="gantt_here" style="width:100%; height:90vh;" />
+ </div>
+</template>
+
+<script>
+// import { gantt } from 'dhtmlx-gantt'
+// import 'dhtmlx-gantt/codebase/dhtmlxgantt.css'
+
+import { gantt } from '@/components/dhtmlxGantt'
+import '@/components/dhtmlxGantt/codebase/dhtmlxgantt.css'
+
+export default {
+ data() {
+ return {
+ value: 'default',
+ ganttDateRange: ['2025-04-01', '2025-05-10'],
+ selectedIds: []
+ }
+ },
+ mounted() {
+ this.init()
+ },
+ methods: {
+
+ init() {
+ // gantt.clearAll()
+
+ gantt.plugins({
+ auto_scheduling: true,
+ critical_path: true,
+ drag_timeline: true,
+ grouping: true,
+ keyboard_navigation: true,
+ marker: true,
+ multiselect: true,
+ tooltip: true,
+ undo: true
+ })
+ gantt.config.multiselect = true // 寮�鍚浠诲姟閫夋嫨
+ /* 鈫撯啌鈫� Auto-scheduling configuration 鈫撯啌鈫� */
+ gantt.config.auto_scheduling = true
+
+ // gantt.config.project_start = new Date(2025, 03, 05);
+ gantt.config.project_start = '2025/03/05'
+
+ gantt.addMarker({
+ text: '椤圭洰寮�濮�',
+ start_date: gantt.config.project_start
+ })
+
+ function renderDiv(task, date, className) {
+ const el = document.createElement('div')
+ el.className = className
+ const sizes = gantt.getTaskPosition(task, date)
+ el.style.left = sizes.left + 'px'
+ el.style.top = sizes.top + 'px'
+ return el
+ }
+
+ gantt.attachEvent('onGanttReady', function() {
+ // gantt.addTaskLayer(function draw_deadline(task) {
+ // const constraintType = gantt.getConstraintType(task);
+ // const types = gantt.config.constraint_types;
+ // if (constraintType != types.ASAP && constraintType != types.ALAP && task.constraint_date) {
+ // const dates = gantt.getConstraintLimitations(task);
+ //
+ // const els = document.createElement("div");
+ //
+ // if (dates.earliestStart) {
+ // els.appendChild(renderDiv(task, dates.earliestStart, 'constraint-marker earliest-start'));
+ // }
+ //
+ // if (dates.latestEnd) {
+ // els.appendChild(renderDiv(task, dates.latestEnd, 'constraint-marker latest-end'));
+ // }
+ //
+ // els.title = gantt.locale.labels[constraintType] + " " + gantt.templates.task_date(task.constraint_date);
+ //
+ // if (els.children.length)
+ // return els;
+ // }
+ // return false;
+ // });
+ })
+ /* 鈫戔啈鈫� Auto-scheduling configuration 鈫戔啈鈫� */
+
+ /* 鈫撯啌鈫� Group configuration 鈫撯啌鈫� */
+ gantt.serverList('task_priority', [
+ { key: 1, label: '楂�' },
+ { key: 2, label: '涓瓑' },
+ { key: 3, label: '浣�' }
+ ])
+
+ gantt.serverList('task_status', [
+ { key: 1, label: 'Planning' },
+ { key: 2, label: 'Not started' },
+ { key: 3, label: 'In Progress' },
+ { key: 4, label: 'Complete' }
+ ])
+
+ gantt.i18n.setLocale('cn')
+
+ function byId(list, id) {
+ for (let i = 0; i < list.length; i++) {
+ if (list[i].key == id) {
+ return list[i].label || ''
+ }
+ }
+ return ''
+ }
+
+ /* 鈫戔啈鈫� Group configuration 鈫戔啈鈫� */
+
+ /* 鈫撯啌鈫� Zoom configuration 鈫撯啌鈫� */
+ const zoomConfig = {
+ levels: [
+ {
+ name: 'hour',
+ scale_height: 27,
+ min_column_width: 50,
+ scales: [
+ { unit: 'day', format: '%Y骞�%M%d鍙�' },
+ { unit: 'hour', format: '%H鏃�' }
+ ]
+ },
+ {
+ name: 'day',
+ scale_height: 27,
+ min_column_width: 80,
+ scales: [
+ // { unit: 'day', step: 1, format: '%d %M' }
+ { unit: 'day', step: 1, format: '%M鏈�%d鍙�' }
+ ]
+ },
+ {
+ name: 'week',
+ scale_height: 50,
+ min_column_width: 50,
+ scales: [
+ // {
+ // unit: 'week', step: 1, format: function(date) {
+ // const dateToStr = gantt.date.date_to_str('%d %M')
+ // const endDate = gantt.date.add(date, -6, 'day')
+ // const weekNum = gantt.date.date_to_str('%W')(date)
+ // return '绗�' + weekNum + '鍛�, ' + dateToStr(date) + ' - ' + dateToStr(endDate)
+ // }
+ // },
+ { unit: 'week', format: '%Y骞�%M绗�%W鍛�' },
+ // { unit: 'day', step: 1, format: '%j %D' }
+ { unit: 'day', step: 1, format: '鏄熸湡%D' }
+ ]
+ },
+ {
+ name: 'month',
+ scale_height: 50,
+ min_column_width: 120,
+ scales: [
+ // { unit: 'month', format: '%Y骞�%F' },
+ { unit: 'month', format: '%Y骞�%M' },
+ { unit: 'week', format: '绗�%W鍛�' }
+ ]
+ },
+ {
+ name: 'quarter',
+ height: 50,
+ min_column_width: 90,
+ scales: [
+ // {
+ // unit: 'quarter', step: 1, format: function(date) {
+ // const dateToStr = gantt.date.date_to_str('%M')
+ // const endDate = gantt.date.add(gantt.date.add(date, 3, 'month'), -1, 'day')
+ // return dateToStr(date) + ' - ' + dateToStr(endDate)
+ // }
+ // },
+ { unit: 'month', step: 1, format: '%Y骞�%M' }
+ ]
+ },
+ {
+ name: 'year',
+ scale_height: 50,
+ min_column_width: 30,
+ scales: [
+ { unit: 'year', step: 1, format: '%Y骞�' }
+
+ ]
+ }
+ ],
+ useKey: 'ctrlKey',
+ trigger: 'wheel',
+ element: function() {
+ return gantt.$root.querySelector('.gantt_task')
+ }
+ }
+
+ gantt.ext.zoom.init(zoomConfig)
+ gantt.ext.zoom.setLevel('week')
+ /* 鈫戔啈鈫� Zoom configuration 鈫戔啈鈫� */
+
+ // 鏄惁鏄伐浣滄椂闂�
+ /* 鈫撯啌鈫� Working Time configuration 鈫撯啌鈫� */
+ gantt.templates.scale_cell_class = function(date) {
+ if (!gantt.isWorkTime(date)) {
+ return 'weekend'
+ }
+ }
+
+ gantt.templates.timeline_cell_class = function(item, date) {
+ if (!gantt.isWorkTime({ date: date, task: item })) {
+ return 'weekend'
+ }
+ }
+
+ gantt.config.work_time = true
+
+ gantt.addCalendar({
+ id: 'custom1',
+ worktime: {
+ hours: ['8:00-12:30', '13:00-17:30'], // global work hours for weekdays
+ days: [0, 1, 1, 1, 1, 1, 1]
+ }
+ })
+
+ // gantt.addCalendar({
+ // id: 'custom2',
+ // hours: ['12:00-21:00'],
+ // days: [1, 0, 1, 0, 1, 0, 1]
+ // })
+ /* 鈫戔啈鈫� Working Time configuration 鈫戔啈鈫� */
+
+ /* 鈫撯啌鈫� Grid Columns configuration 鈫撯啌鈫� */
+
+ gantt.config.reorder_grid_columns = true
+
+ const textEditor = { type: 'text', map_to: 'text' }
+ const startDateEditor = { type: 'date', map_to: 'start_date' }
+ const durationEditor = { type: 'number', map_to: 'duration', min: 0, max: 100 }
+
+ // 鐢樼壒鍥惧垪鍚嶇О
+ gantt.config.columns = [
+ {
+ name: 'checked',
+ label: '閫夋嫨',
+ align: 'center',
+ width: 35,
+ resize: false,
+ // 鍏抽敭锛氱敤 template 杩斿洖涓�涓閫夋
+ template: (task) => {
+ const checked = task.checked ? 'checked' : ''
+ // data-action 鐢ㄤ簬鍦ㄤ簨浠跺鎵樻椂璇嗗埆鏄閫夋
+ return `<input type="checkbox" class="taskCheckBox" data-action="check-row" ${checked} />`
+ }
+ },
+ { name: 'wbs', label: '鑺傜偣', width: 80, template: gantt.getWBSCode },
+ { name: 'text', tree: true, label: '浠诲姟鍚嶇О', width: 200, resize: true, editor: textEditor },
+ { name: 'start_date', align: 'center', label: '寮�濮嬫棩鏈�', width: 80, resize: true, editor: startDateEditor },
+ { name: 'duration', width: 60, align: 'center', label: '鏃堕暱', resize: true, editor: durationEditor },
+ {
+ name: 'owner', align: 'center', width: 75, label: '浣滆��', template: function(task) {
+ if (task.type == gantt.config.types.project) {
+ return ''
+ }
+
+ const store = gantt.getDatastore('resource')
+ const assignments = task[gantt.config.resource_property]
+
+ if (!assignments || !assignments.length) {
+ return 'Unassigned'
+ }
+
+ if (assignments.length == 1) {
+ return store.getItem(assignments[0].resource_id).text
+ }
+
+ let result = ''
+ assignments.forEach(function(assignment) {
+ const owner = store.getItem(assignment.resource_id)
+ if (!owner) {
+ return
+ }
+ result += '<div class=\'owner-label\' title=\'' + owner.text + '\'>' + owner.text.substr(0, 1) + '</div>'
+ })
+
+ return result
+ },
+ resize: true
+ },
+ {
+ name: 'priority', width: 60, label: '浼樺厛绾�', align: 'center', resize: true, template: function(task) {
+ return byId(gantt.serverList('task_priority'), task.priority)
+ }
+ },
+ { name: 'add', width: 44 }
+ ]
+
+ /* 鈫戔啈鈫� Grid Columns configuration 鈫戔啈鈫� */
+
+ /* 鈫撯啌鈫� Resource configuration 鈫撯啌鈫� */
+ function getResourceAssignments(resourceId) {
+ let assignments
+ const store = gantt.getDatastore(gantt.config.resource_store)
+ const resource = store.getItem(resourceId)
+
+ if (resource.$level === 0) {
+ assignments = []
+ store.getChildren(resourceId).forEach(function(childId) {
+ assignments = assignments.concat(gantt.getResourceAssignments(childId))
+ })
+ } else if (resource.$level === 1) {
+ assignments = gantt.getResourceAssignments(resourceId)
+ } else {
+ assignments = gantt.getResourceAssignments(resource.$resource_id, resource.$task_id)
+ }
+ return assignments
+ }
+
+ gantt.templates.resource_cell_class = function(start_date, end_date, resource, tasks) {
+ const css = []
+ css.push('resource_marker')
+ if (tasks.length <= 1) {
+ css.push('workday_ok')
+ } else {
+ css.push('workday_over')
+ }
+ return css.join(' ')
+ }
+
+ gantt.templates.resource_cell_value = function(start_date, end_date, resource, tasks) {
+ let result = 0
+ tasks.forEach(function(item) {
+ const assignments = gantt.getResourceAssignments(resource.id, item.id)
+ assignments.forEach(function(assignment) {
+ const task = gantt.getTask(assignment.task_id)
+ result += assignment.value * 1
+ })
+ })
+
+ if (result % 1) {
+ result = Math.round(result * 10) / 10
+ }
+ return '<div>' + result + '</div>'
+ }
+
+ gantt.locale.labels.section_resources = 'Owners'
+ gantt.locale.labels.section_calendar = 'Calendar'
+
+ // 姹夊寲绐楀彛
+ gantt.locale.labels = {
+ dhx_cal_today_button: '浠婂ぉ',
+ day_tab: '鏃�',
+ week_tab: '鍛�',
+ month_tab: '鏈�',
+ new_event: '鏂板缓鏃ョ▼',
+ icon_save: '淇濆瓨',
+ icon_cancel: '鍏抽棴',
+ icon_details: '璇︾粏',
+ icon_edit: '缂栬緫',
+ icon_delete: '鍒犻櫎',
+ confirm_closing: '璇风‘璁ゆ槸鍚︽挙閿�淇敼!', // Your changes will be lost, are your sure?
+ confirm_deleting: '鏄惁鍒犻櫎璁″垝?',
+ section_description: '鎻忚堪:',
+ section_resources: '鑷畾涔夐�夋嫨:',
+ section_calendar: '鑷畾涔夐�夋嫨2:',
+ section_time: '鏃堕棿鑼冨洿:',
+ section_type: '绫诲瀷:',
+ section_text: '璁″垝鍚嶇О:',
+ section_test: '娴嬭瘯:',
+ section_projectClass: '椤圭洰绫诲瀷:',
+ taskProjectType_0: '椤圭洰浠诲姟',
+ taskProjectType_1: '鏅�氫换鍔�',
+ section_head: '璐熻矗浜�:',
+ section_priority: '浼樺厛绾�:',
+ taskProgress: '浠诲姟鐘舵��',
+ taskProgress_0: '鏈紑濮�',
+ taskProgress_1: '杩涜涓�',
+ taskProgress_2: '宸插畬鎴�',
+ taskProgress_3: '宸插欢鏈�',
+ taskProgress_4: '鎼佺疆涓�',
+ section_template: 'Details',
+ /* grid columns */
+ column_text: '璁″垝鍚嶇О',
+ column_start_date: '寮�濮嬫椂闂�',
+ column_duration: '鎸佺画鏃堕棿',
+ column_add: '',
+ column_priority: '闅惧害',
+ /* link confirmation */
+ link: '鍏宠仈',
+ confirm_link_deleting: '灏嗚鍒犻櫎',
+ message_ok: '纭畾',
+ message_cancel: '鍙栨秷',
+ link_start: ' (寮�濮�)',
+ link_end: ' (缁撴潫)',
+
+ type_task: '浠诲姟',
+ type_project: '椤圭洰',
+ type_milestone: '閲岀▼纰�',
+ minutes: '鍒嗛挓',
+ hours: '灏忔椂',
+ days: '澶�',
+ weeks: '鍛�',
+ months: '鏈�',
+ years: '骞�'
+ }
+
+ gantt.config.lightbox.sections = [
+ { name: 'description', height: 38, map_to: 'text', type: 'textarea', focus: true },
+ {
+ name: 'resources', type: 'resources', map_to: 'owner', options: gantt.serverList('people'), default_value: 8
+ },
+ {
+ name: 'calendar', height: 25, map_to: 'calendar_id', type: 'select', options: [
+ { key: '', label: '榛樿' },
+ { key: 'custom1', label: '閫夐」涓�' },
+ { key: 'custom2', label: '閫夐」浜�' }
+ ]
+ },
+
+ { name: 'time', type: 'duration', map_to: 'auto' }
+ ]
+
+ gantt.config.resource_store = 'resource'
+ gantt.config.resource_property = 'owner'
+ gantt.config.order_branch = true
+ gantt.config.open_tree_initially = true
+
+ gantt.config.show_errors = false // 鍙戠敓寮傚父鏃讹紝涓嶅厑璁稿脊鍑鸿鍛婂埌 UI 鐣岄潰
+
+ const resourcesStore = gantt.createDatastore({
+ name: gantt.config.resource_store,
+ type: 'treeDatastore',
+ initItem: function(item) {
+ item.parent = item.parent || gantt.config.root_id
+ item[gantt.config.resource_property] = item.parent
+ item.open = true
+ return item
+ }
+ })
+
+ resourcesStore.attachEvent('onParse', function() {
+ const people = []
+ resourcesStore.eachItem(function(res) {
+ if (!resourcesStore.hasChild(res.id)) {
+ const copy = gantt.copy(res)
+ copy.key = res.id
+ copy.label = res.text
+ people.push(copy)
+ }
+ })
+ gantt.updateCollection('people', people)
+ })
+
+ resourcesStore.parse([
+ { id: 1, text: 'QA', parent: null },
+ { id: 2, text: 'Development', parent: null },
+ { id: 3, text: 'Sales', parent: null },
+ { id: 4, text: 'Other', parent: null },
+ { id: 5, text: 'Unassigned', parent: 4 },
+ { id: 6, text: 'John', parent: 1, unit: 'hours/day' },
+ { id: 7, text: 'Mike', parent: 2, unit: 'hours/day' },
+ { id: 8, text: 'Anna', parent: 2, unit: 'hours/day' },
+ { id: 9, text: 'Bill', parent: 3, unit: 'hours/day' },
+ { id: 10, text: 'Floe', parent: 3, unit: 'hours/day' }
+ ])
+ /* 鈫戔啈鈫� Resource configuration 鈫戔啈鈫� */
+
+ /* 鈫撯啌鈫� Layout configuration 鈫撯啌鈫� */
+ gantt.config.grid_elastic_columns = true
+
+ // let currentLayout = 'default'
+
+ /* 鈫戔啈鈫� Layout configuration 鈫戔啈鈫� */
+
+ gantt.init('gantt_here')
+ gantt.parse({
+ 'data': [
+ {
+
+ 'id': 1,
+ 'text': '浠诲姟1',
+ 'type': 'project',
+ 'start_date': '02-04-2025 00:00',
+ 'duration': 17,
+ 'progress': 0.4,
+ 'owner': [{ 'resource_id': '5', 'value': 3 }],
+ 'parent': 0,
+ 'checked': false
+ },
+ {
+ 'id': 2,
+ 'text': '浠诲姟2',
+ 'type': 'project',
+ 'start_date': '02-04-2025 00:00',
+ 'duration': 8,
+ 'progress': 0.6,
+ 'owner': [{ 'resource_id': '5', 'value': 4 }],
+ 'parent': '1',
+ checked: false
+ },
+ {
+ 'id': 3,
+ 'text': '浠诲姟3',
+ 'type': 'project',
+ 'start_date': '11-04-2025 00:00',
+ 'duration': 8,
+ 'parent': '1',
+ 'progress': 0.6,
+ 'owner': [{ 'resource_id': '5', 'value': 2 }],
+ checked: false
+ },
+ {
+ 'id': 4,
+ 'text': '浠诲姟4',
+ 'type': 'project',
+ 'start_date': '13-04-2025 00:00',
+ 'duration': 5,
+ 'parent': '1',
+ 'progress': 0.5,
+ 'owner': [{ 'resource_id': '5', 'value': 4 }],
+ 'priority': 3,
+ checked: true
+ },
+ {
+ 'id': 5,
+ 'text': '浠诲姟5',
+ 'calendar_id': 'custom1',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 7,
+ 'parent': '2',
+ 'progress': 0.6,
+ 'owner': [{ 'resource_id': '6', 'value': 5 }],
+ 'priority': 1,
+ checked: true
+ },
+ {
+ 'id': 6,
+ 'text': '浠诲姟6',
+ 'type': 'task',
+ 'calendar_id': 'custom1',
+ 'start_date': '03-04-2025 12:00',
+ 'duration': 7,
+ 'parent': '2',
+ 'progress': 0.6,
+ 'owner': [{ 'resource_id': '7', 'value': 1 }],
+ 'priority': 2,
+ checked: false
+ },
+ {
+ 'id': 7,
+ 'text': '浠诲姟7',
+ 'calendar_id': 'custom1',
+ 'type': 'task',
+ 'start_date': '12-04-2025 00:00',
+ 'duration': 8,
+ 'parent': '3',
+ 'progress': 0.6,
+ 'owner': [{ 'resource_id': '10', 'value': 2 }],
+ checked: false
+ },
+ {
+ 'id': 8,
+ 'text': '浠诲姟8',
+ 'calendar_id': 'custom1',
+ 'type': 'task',
+ 'start_date': '14-04-2025 00:00',
+ 'duration': 5,
+ 'parent': '4',
+ 'progress': 0.5,
+ 'owner': [{ 'resource_id': '10', 'value': 4 }, { 'resource_id': '9', 'value': 5 }],
+ 'priority': 1,
+ checked: false
+ },
+ {
+ 'id': 9,
+ 'text': '浠诲姟9',
+ 'type': 'task',
+ 'start_date': '21-04-2025 00:00',
+ 'duration': 4,
+ 'parent': '4',
+ 'progress': 0.5,
+ 'owner': [{ 'resource_id': '7', 'value': 3 }],
+ checked: false
+ },
+ {
+ 'id': 10,
+ 'text': '浠诲姟10',
+ 'type': 'task',
+ 'start_date': '27-04-2025 00:00',
+ 'duration': 3,
+ 'parent': '4',
+ 'progress': 0.5,
+ 'owner': [{ 'resource_id': '8', 'value': 5 }],
+ 'priority': 2,
+ checked: false
+ },
+ {
+ 'id': 11,
+ 'text': '浠诲姟11',
+ 'type': 'project',
+ 'progress': 0.6,
+ 'start_date': '02-04-2025 00:00',
+ 'duration': 13,
+ 'owner': [{ 'resource_id': '5', 'value': 4 }],
+ 'parent': 0,
+ checked: false
+ },
+ {
+ 'id': 12,
+ 'text': '浠诲姟12',
+ 'calendar_id': 'custom2',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 5,
+ 'parent': '11',
+ 'progress': 1,
+ 'owner': [{ 'resource_id': '7', 'value': 6 }],
+ checked: false
+ },
+ {
+ 'id': 13,
+ 'text': '浠诲姟13',
+ 'type': 'project',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 11,
+ 'parent': '11',
+ 'progress': 0.5,
+ 'owner': [{ 'resource_id': '5', 'value': 2 }],
+ checked: false
+ },
+ {
+ 'id': 14,
+ 'text': '浠诲姟14',
+ 'calendar_id': 'custom2',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 6,
+ 'parent': '11',
+ 'owner': [],
+ 'progress': 0.8,
+ checked: false
+ },
+ {
+ 'id': 15,
+ 'text': '浠诲姟15',
+ 'type': 'project',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 5,
+ 'parent': '11',
+ 'progress': 0.2,
+ 'owner': [{ 'resource_id': '5', 'value': 5 }],
+ checked: false
+ },
+ {
+ 'id': 16,
+ 'text': '浠诲姟16',
+ 'calendar_id': 'custom2',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 7,
+ 'parent': '11',
+ 'progress': 0,
+ 'owner': [{ 'resource_id': '7', 'value': 2 }],
+ 'priority': 1,
+ checked: false
+ },
+ {
+ 'id': 17,
+ 'text': '浠诲姟17',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 2,
+ 'parent': '13',
+ 'progress': 1,
+ 'owner': [{ 'resource_id': '8', 'value': 1 }],
+ 'priority': 2,
+ checked: false
+ },
+ {
+ 'id': 25,
+ 'text': '浠诲姟18',
+ // 'type': 'milestone',
+ 'type': 'task',
+ 'start_date': '06-04-2025 00:00',
+ 'parent': '13',
+ 'progress': 0,
+ 'owner': [{ 'resource_id': '5', 'value': 1 }],
+ 'duration': 0,
+ checked: false
+ },
+ {
+ 'id': 18,
+ 'text': '浠诲姟19',
+ 'type': 'task',
+ 'start_date': '10-04-2025 00:00',
+ 'duration': 2,
+ 'parent': '13',
+ 'progress': 0.8,
+ 'owner': [{ 'resource_id': '6', 'value': 2 }],
+ 'priority': 3,
+ checked: false
+ },
+ {
+ 'id': 19,
+ 'text': '浠诲姟20',
+ 'calendar_id': 'custom1',
+ 'type': 'task',
+ 'start_date': '13-04-2025 00:00',
+ 'duration': 4,
+ 'parent': '13',
+ 'progress': 0.2,
+ 'owner': [{ 'resource_id': '6', 'value': 3 }],
+ checked: false
+ },
+ {
+ 'id': 20,
+ 'text': '浠诲姟21',
+ 'type': 'task',
+ 'start_date': '13-04-2025 00:00',
+ 'duration': 4,
+ 'parent': '13',
+ 'progress': 0,
+ 'owner': [{ 'resource_id': '8', 'value': 4 }],
+ 'priority': 1,
+ checked: false
+ },
+ {
+ 'id': 21,
+ 'text': '浠诲姟22',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 4,
+ 'parent': '15',
+ 'progress': 0.5,
+ 'owner': [{ 'resource_id': '6', 'value': 5 }],
+ checked: false
+ },
+ {
+ 'id': 22,
+ 'text': '浠诲姟23',
+ 'calendar_id': 'custom1',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 4,
+ 'parent': '15',
+ 'progress': 0.1,
+ 'owner': [{ 'resource_id': '8', 'value': 3 }],
+ 'priority': 1,
+ checked: false
+ },
+ {
+ 'id': 23,
+ 'text': '浠诲姟24',
+ 'type': 'task',
+ 'start_date': '03-04-2025 00:00',
+ 'duration': 5,
+ 'parent': '15',
+ 'progress': 0,
+ 'owner': [{ 'resource_id': '8', 'value': 5 }],
+ 'priority': 1,
+ checked: false
+ },
+ {
+ 'id': 24,
+ 'text': '浠诲姟25',
+ // 'type': 'milestone',
+ 'type': 'task',
+ 'start_date': '20-04-2025 00:00',
+ 'parent': '11',
+ 'progress': 0,
+ 'owner': [{ 'resource_id': '5', 'value': 3 }],
+ 'duration': 0,
+ checked: false
+ }
+ ]
+ // "links": [
+ // { "id": "2", "source": "2", "target": "3", "type": "0" },
+ // { "id": "3", "source": "3", "target": "4", "type": "0" },
+ // { "id": "7", "source": "8", "target": "9", "type": "0" },
+ // { "id": "8", "source": "9", "target": "10", "type": "0" },
+ // { "id": "16", "source": "17", "target": "25", "type": "0" },
+ // { "id": "17", "source": "18", "target": "19", "type": "0" },
+ // { "id": "18", "source": "19", "target": "20", "type": "0" },
+ // { "id": "22", "source": "13", "target": "24", "type": "0" },
+ // { "id": "23", "source": "25", "target": "18", "type": "0" }
+ // ]
+ })
+
+ // 缁戝畾鐢樼壒鍥剧偣鍑讳簨浠讹紙瀹樻柟鎺ㄨ崘鐨勪簨浠跺鎵樼敤娉曪級<span data-allow-html class='source-item source-aggregated' data-group-key='source-group-2' data-url='https://juejin.cn/post/7352376280387764278' data-id='turn0fetch0'><span data-allow-html class='source-item-num' data-group-key='source-group-2' data-id='turn0fetch0' data-url='https://juejin.cn/post/7352376280387764278'><span class='source-item-num-name' data-allow-html>https://juejin.cn/post/7352376280387764278</span></span></span>
+ gantt.attachEvent('onTaskClick', (id, e) => {
+ // 鎵惧埌鐐瑰嚮鐨勬槸鍚︽槸澶嶉�夋
+ const checkbox = e.target.closest('[data-action="check-row"]')
+ if (!checkbox) {
+ // 涓嶆槸鐐瑰閫夋锛屽氨淇濇寔榛樿琛屼负
+ return true
+ }
+
+ // 鏄閫夋锛氬垏鎹㈤�変腑鐘舵��
+ const task = gantt.getTask(id)
+ if (task) {
+ task.checked = !task.checked
+ gantt.updateTask(id) // 鍙埛鏂拌繖涓�琛岋紝鎬ц兘鏇村ソ
+ this.syncSelected() // 鍚屾鍒� Vue 鐨� selectedIds
+ }
+
+ // 闃绘榛樿鐐瑰嚮琛岃涓猴紙閬垮厤璇Е鍙戝叾浠栭�昏緫锛�
+ return false
+ })
+
+ // 鍒濆鍖栧畬鎴愬悗鍚屾涓�娆¢�変腑鐘舵��
+ this.syncSelected()
+ },
+
+ // 淇濆瓨鍒版湰鍦板瓨鍌�
+ loadFromLocalStorage() {
+ this.loadGeneralConfig()
+ this.loadStacks()
+ this.loadGridColumnsConfig()
+ this.loadLayoutConfig()
+ this.loadVariousConfig()
+ },
+ // 浠庢湰鍦板瓨鍌ㄥ姞杞�
+ saveToLocalStorage() {
+ this.saveGeneralConfig()
+ this.saveVariousConfig()
+ this.saveGridColumnsConfig()
+ this.saveLayoutConfig()
+ this.saveStacks()
+ },
+
+ saveGeneralConfig() {
+ const generalConfig = {}
+ // add properties that you want to save in the local storage
+ const properties = [
+ 'grid_width',
+ 'start_date',
+ 'end_date'
+
+ // examples of the properties you may want to add
+ // "skip_off_time",
+ // "show_tasks_outside_timescale",
+ // "rtl",
+ // "resize_rows",
+ // "keyboard_navigation",
+ // "keyboard_navigation_cells",
+ ]
+ properties.forEach(function(prop) {
+ switch (typeof gantt.config[prop]) {
+ case 'number':
+ case 'string':
+ case 'boolean':
+ generalConfig[prop] = gantt.config[prop]
+ break
+ case 'object':
+ if (gantt.config[prop] && typeof gantt.config[prop].getMonth === 'function') {
+ generalConfig[prop] = gantt.date.date_to_str(gantt.config.date_format)(gantt.config[prop])
+ }
+ break
+ // objects and methods should be set from the application
+ }
+ })
+
+ const storageName = `DHTMLX Gantt: General Configuration`
+ const serializedConfig = JSON.stringify(generalConfig) + ''
+ localStorage.setItem(storageName, serializedConfig)
+ },
+
+ loadGeneralConfig() {
+ const storageName = `DHTMLX Gantt: General Configuration`
+ const loadedConfig = localStorage.getItem(storageName)
+ const generalConfig = JSON.parse(loadedConfig)
+
+ const dateProperties = [
+ 'start_date',
+ 'end_date',
+ 'project_start',
+ 'project_end'
+ ]
+ dateProperties.forEach(function(prop) {
+ if (generalConfig[prop]) {
+ generalConfig[prop] = gantt.date.str_to_date(gantt.config.date_format)(generalConfig[prop])
+ }
+ })
+ gantt.mixin(gantt.config, generalConfig, true)
+ },
+
+ saveVariousConfig() {
+ const variousConfig = {
+ scrollState: gantt.getScrollState(),
+ groupMode: gantt.getState().group_mode,
+ zoomLevel: gantt.ext.zoom.getCurrentLevel()
+ }
+
+ const storageName = `DHTMLX Gantt: Various Configuration`
+ const serializedConfig = JSON.stringify(variousConfig) + ''
+ localStorage.setItem(storageName, serializedConfig)
+ },
+
+ loadVariousConfig() {
+ const storageName = `DHTMLX Gantt: Various Configuration`
+ const loadedConfig = localStorage.getItem(storageName)
+ const variousConfig = JSON.parse(loadedConfig)
+
+ gantt.scrollTo(variousConfig.scrollState.x, variousConfig.scrollState.y)
+
+ if (variousConfig.groupMode) {
+ // this is a custom function. in your case, it may be a different name
+ this.group(variousConfig.groupMode)
+ }
+
+ gantt.ext.zoom.setLevel(variousConfig.zoomLevel)
+ },
+
+ saveGridColumnsConfig() {
+ const storageName = `DHTMLX Gantt: Grid Columns Configuration`
+ const serializedConfig = JSON.stringify(gantt.config.columns) + ''
+ // objects and functions cannot be saved
+ localStorage.setItem(storageName, serializedConfig)
+ },
+
+ loadGridColumnsConfig() {
+ const storageName = `DHTMLX Gantt: Grid Columns Configuration`
+ const loadedConfig = localStorage.getItem(storageName)
+ const gridColumnsConfig = JSON.parse(loadedConfig)
+
+ // as objects and functions cannot be saved, we add them from the existing columns
+ // also, this approach helps saving the column order
+ gridColumnsConfig.forEach(function(column) {
+ const existingColumn = gantt.getGridColumn(column.name)
+ gantt.mixin(column, existingColumn, false)
+ })
+
+ gantt.config.columns = gridColumnsConfig
+ },
+
+ saveLayoutConfig() {
+ const layoutConfig = {
+ currentLayout,
+ gridWidth: gantt.getLayoutView('grid').$state.width
+ }
+
+ switch (layoutConfig.currentLayout) {
+ case 'resource':
+ layoutConfig.ganttPanelHeight = gantt.getLayoutView('ganttPanelCell').$lastSize.y
+ case 'default':
+ layoutConfig.gridWidth = gantt.config.grid_width
+ break
+
+ case 'universal':
+ case 'complexScrollbars':
+ layoutConfig.ganttPanelHeight = gantt.getLayoutView('mainGrid').$lastSize.y
+ break
+ }
+
+ const storageName = `DHTMLX Gantt: Layout Configuration`
+ const serializedConfig = JSON.stringify(layoutConfig) + ''
+ localStorage.setItem(storageName, serializedConfig)
+ },
+
+ loadLayoutConfig() {
+ const storageName = `DHTMLX Gantt: Layout Configuration`
+ const loadedConfig = localStorage.getItem(storageName)
+ const layoutConfig = JSON.parse(loadedConfig)
+
+ this.changeLayout(layoutConfig.currentLayout)
+ document.querySelector('.layout_config').value = layoutConfig.currentLayout
+
+ switch (layoutConfig.currentLayout) {
+ case 'horizontalScrollbars':
+ gantt.config.layout.cols[0].width = layoutConfig.gridWidth
+
+ break
+ case 'resource':
+ gantt.config.layout.rows[0].height = layoutConfig.ganttPanelHeight
+
+ break
+ case 'universal':
+ case 'complexScrollbars':
+ gantt.config.layout.cols[0].width = layoutConfig.gridWidth
+ gantt.config.layout.cols[0].rows[0].height = layoutConfig.ganttPanelHeight
+ gantt.config.layout.cols[2].rows[0].height = layoutConfig.ganttPanelHeight
+ break
+ }
+
+ gantt.init('gantt_here')
+
+ // with the rows[cols[]] layout configuration, we need to rely
+ // on the grid_width config, and it is correctly applied only
+ // after we use the `render` method
+ if (layoutConfig.currentLayout == 'default' || layoutConfig.currentLayout == 'resource') {
+ gantt.config.grid_width = layoutConfig.gridWidth
+ gantt.render()
+ }
+ },
+
+ saveStacks() {
+ this.saveStack('Undo')
+ this.saveStack('Redo')
+ },
+
+ loadStacks() {
+ this.loadStack('Undo')
+ this.loadStack('Redo')
+ },
+
+ saveStack(stackType) {
+ const stack = gantt.copy(gantt[`get${stackType}Stack`]())
+ stack.forEach(function(action) {
+ action.commands.forEach(function(command) {
+ command.oldValue = gantt.json.serializeTask(command.oldValue)
+ command.value = gantt.json.serializeTask(command.value)
+ const assignments = gantt.config.resource_property
+ // if (command.oldValue[assignments]) {
+ // for (assignment in command.oldValue[assignments]) {
+ // command.oldValue[assignments][assignment] = gantt.json.serializeTask(command.oldValue[assignments][assignment])
+ // }
+ // }
+ // if (command.value[assignments]) {
+ // for (assignment in command.value[assignments]) {
+ // command.value[assignments][assignment] = gantt.json.serializeTask(command.value[assignments][assignment])
+ // }
+ // }
+ })
+ })
+
+ const serializedStack = JSON.stringify(stack) + ''
+ const storageName = `DHTMLX Gantt: ${stackType} Stack`
+ localStorage.setItem(storageName, serializedStack)
+ },
+
+ loadStack(stackType) {
+ const storageName = `DHTMLX Gantt: ${stackType} Stack`
+ const serializedStack = localStorage.getItem(storageName)
+ const loadedStack = JSON.parse(serializedStack)
+
+ loadedStack.forEach(function(action) {
+ action.commands.forEach(function(command) {
+ convertDateProperties(command.oldValue)
+ convertDateProperties(command.value)
+
+ const assignments = gantt.config.resource_property
+ // if (command.oldValue[assignments]) {
+ // for (assignment in command.oldValue[assignments]) {
+ // convertDateProperties(command.oldValue[assignments][assignment])
+ // }
+ // }
+ // if (command.value[assignments]) {
+ // for (assignment in command.value[assignments]) {
+ // convertDateProperties(command.value[assignments][assignment])
+ // }
+ // }
+ })
+ })
+
+ gantt[`clear${stackType}Stack`]()
+
+ const stack = gantt[`get${stackType}Stack`]()
+ loadedStack.forEach(function(action) {
+ stack.push(action)
+ })
+
+ function convertDateProperties(obj) {
+ const dateProperties = [
+ 'start_date',
+ 'end_date',
+ 'constraint_date'
+ ]
+
+ dateProperties.forEach(function(prop) {
+ if (obj[prop]) {
+ obj[prop] = gantt.date.parseDate(obj[prop], gantt.config.date_format)
+ }
+ })
+ }
+ },
+
+ // changeDates() {
+ // const startDateEl = document.querySelector('.start_date')
+ // const endDateEl = document.querySelector('.end_date')
+ // const startDate = new Date(startDateEl.value)
+ // const endDate = new Date(endDateEl.value)
+ // console.log(startDate)
+ // console.log(endDate)
+ // if (!+startDate || !+endDate) {
+ // return
+ // }
+ //
+ // gantt.config.start_date = startDate
+ // gantt.config.end_date = endDate
+ // gantt.render()
+ // },
+
+ ganttDateRangeChange(val) {
+ gantt.config.start_date = val[0]
+ gantt.config.end_date = val[1]
+ gantt.render()
+ },
+
+ ganttUndo() {
+ gantt.undo()
+ },
+ ganttRedo() {
+ gantt.redo()
+ },
+ ganttZoomIn() {
+ gantt.ext.zoom.zoomIn()
+ },
+ ganttZoomOut() {
+ gantt.ext.zoom.zoomOut()
+ },
+
+ // 鍒嗙粍
+ group(type) {
+ switch (type) {
+ case 'priority':
+ gantt.groupBy({
+ groups: gantt.serverList('task_priority'),
+ relation_property: type,
+ group_id: 'key',
+ group_text: 'label'
+ })
+
+ break
+ case 'owner':
+ const groups = gantt.getDatastore('resource').getItems().map(function(item) {
+ const group = gantt.copy(item)
+ group.group_id = group.id
+ group.id = gantt.uid()
+ return group
+ })
+
+ gantt.groupBy({
+ groups: groups,
+ relation_property: gantt.config.resource_property,
+ group_id: 'group_id',
+ group_text: 'text',
+ delimiter: ', ',
+ default_group_label: 'Not Assigned'
+ })
+
+ break
+
+ default:
+ gantt.groupBy(false)
+ break
+ }
+ },
+ changeLayout(value) {
+ console.log(value)
+ // currentLayout = value
+
+ const resourceConfig = {
+ columns: [
+ {
+ name: 'name', label: 'Name', tree: true, template: function(resource) {
+ return resource.text
+ }
+ },
+ {
+ name: 'workload', label: 'Workload', template: function(resource) {
+ let totalDuration = 0
+ if (resource.$level == 2) {
+ const assignment = gantt.getResourceAssignments(resource.$resource_id, resource.$task_id)[0]
+ totalDuration = resource.duration * assignment.value
+ } else {
+ const assignments = getResourceAssignments(resource.id)
+ assignments.forEach(function(assignment) {
+ const task = gantt.getTask(assignment.task_id)
+ totalDuration += Number(assignment.value) * task.duration
+ })
+ }
+
+ return (totalDuration || 0) + 'h'
+ }
+ }
+ ]
+ }
+
+ const defaultLayout = {
+ css: 'gantt_container',
+ rows: [
+ {
+ cols: [
+ {
+ // the default grid view
+ view: 'grid',
+ scrollX: 'scrollHor',
+ scrollY: 'scrollVer'
+ },
+ { resizer: true, width: 1 },
+ {
+ // the default timeline view
+ view: 'timeline',
+ scrollX: 'scrollHor',
+ scrollY: 'scrollVer'
+ },
+ {
+ view: 'scrollbar',
+ id: 'scrollVer'
+ }
+ ]
+ },
+ {
+ view: 'scrollbar',
+ id: 'scrollHor'
+ }
+ ]
+ }
+
+ const gridWidthScrollbarLayout = {
+ css: 'gantt_container',
+ cols: [
+ {
+ rows: [
+ {
+ view: 'grid',
+ scrollable: true,
+ scrollX: 'scrollHor1',
+ scrollY: 'scrollVer'
+ },
+ {
+ view: 'scrollbar',
+ id: 'scrollHor1',
+ scroll: 'x',
+ group: 'hor'
+ }
+ ]
+ },
+ { resizer: true, width: 1 },
+ {
+ rows: [
+ {
+ view: 'timeline',
+ scrollX: 'scrollHor',
+ scrollY: 'scrollVer'
+ },
+ {
+ view: 'scrollbar',
+ id: 'scrollHor',
+ scroll: 'x',
+ group: 'hor'
+ }
+ ]
+ },
+ {
+ view: 'scrollbar',
+ id: 'scrollVer'
+ }
+ ]
+ }
+
+ const resourceLayoutGeneral = {
+ css: 'gantt_container',
+ rows: [
+ {
+ id: 'ganttPanelCell',
+ cols: [
+ { view: 'grid', group: 'grids', scrollY: 'scrollVer' },
+ { resizer: true, width: 1 },
+ { view: 'timeline', scrollX: 'scrollHor', scrollY: 'scrollVer' },
+ { view: 'scrollbar', id: 'scrollVer', group: 'vertical' }
+ ],
+ gravity: 2
+ },
+ { resizer: true, width: 1 },
+ {
+ config: resourceConfig,
+ cols: [
+ { view: 'resourceGrid', group: 'grids', width: 435, scrollY: 'resourceVScroll' },
+ { resizer: true, width: 1 },
+ { view: 'resourceTimeline', scrollX: 'scrollHor', scrollY: 'resourceVScroll' },
+ { view: 'scrollbar', id: 'resourceVScroll', group: 'vertical' }
+ ],
+ gravity: 1
+ },
+ { view: 'scrollbar', id: 'scrollHor' }
+ ]
+ }
+
+ const universalLayout = {
+ css: 'gantt_container',
+ cols: [
+ {
+ width: 400,
+ rows: [
+ {
+ id: 'mainGrid',
+ linkedView: 'mainTimeline',
+ group: 'gantt',
+ cols: [
+ {
+ rows: [
+ { view: 'grid', scrollX: 'gridScrollX', scrollable: true, scrollY: 'scrollVer' }
+ ]
+ }
+ ]
+ },
+ { resizer: true, width: 1 },
+ {
+ id: 'resourceGrid',
+ linkedView: 'resourceTimeline',
+ group: 'resourceLoad',
+ config: resourceConfig,
+ cols: [
+ {
+ rows: [
+ { view: 'resourceGrid', scrollY: 'scrollVer2', scrollX: 'gridScrollX', scrollable: true },
+ { view: 'scrollbar', id: 'gridScrollX' }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ { resizer: true, width: 1 },
+ {
+ rows: [
+ {
+ id: 'mainTimeline',
+ linkedView: 'mainGrid',
+ group: 'gantt',
+ cols: [
+ {
+ rows: [
+ { view: 'timeline', scrollX: 'scrollHor', scrollY: 'scrollVer' }
+ ]
+ },
+ { view: 'scrollbar', id: 'scrollVer' }
+ ]
+ },
+ { resizer: true, width: 1 },
+ {
+ id: 'resourceTimeline',
+ linkedView: 'resourceGrid',
+ group: 'resourceLoad',
+ cols: [
+ {
+ rows: [
+ { view: 'resourceTimeline', scrollX: 'scrollHor', scrollY: 'scrollVer2' },
+ { view: 'scrollbar', id: 'scrollHor' }
+ ]
+ },
+ { view: 'scrollbar', id: 'scrollVer2' }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+
+ const complexLayoutWithScrollbars = {
+ css: 'gantt_container',
+ cols: [
+ {
+ width: 400,
+ // min_width: 100,
+ rows: [
+ {
+ id: 'mainGrid',
+ group: 'gantt',
+ cols: [
+ {
+ rows: [
+ { view: 'grid', scrollX: 'gridScrollX', scrollable: true, scrollY: 'gridScrollY' },
+ { view: 'scrollbar', id: 'gridScrollX', group: 'mainGantt' }
+ ]
+ },
+ { view: 'scrollbar', id: 'gridScrollY' }
+ ]
+ },
+ { resizer: true, width: 1 },
+ {
+ group: 'resources',
+ config: resourceConfig,
+ cols: [
+ {
+ rows: [
+ { view: 'resourceGrid', scrollY: 'gridScrollY2', scrollX: 'gridScrollX2', scrollable: true },
+ { view: 'scrollbar', id: 'gridScrollX2', group: 'resourcePanel' }
+ ]
+ },
+ { view: 'scrollbar', id: 'gridScrollY2' }
+ ]
+ }
+
+ ]
+ },
+ // {view: "scrollbar", id: "grid",scrollX: "grid"},
+ { resizer: true, width: 1 },
+ {
+ rows: [
+ {
+ group: 'gantt',
+ cols: [
+ {
+ rows: [
+ { view: 'timeline', scrollX: 'scrollHor', scrollY: 'scrollVer' },
+ { view: 'scrollbar', id: 'scrollHor', group: 'mainGantt' }
+ ]
+ },
+ { view: 'scrollbar', id: 'scrollVer' }
+ ]
+ },
+ { resizer: true, width: 1 },
+ {
+ group: 'resources',
+ cols: [
+ {
+ rows: [
+ { view: 'resourceTimeline', scrollX: 'scrollHor2', scrollY: 'scrollVer2' },
+ { view: 'scrollbar', id: 'scrollHor2', group: 'resourcePanel' }
+ ]
+ },
+ { view: 'scrollbar', id: 'scrollVer2' }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+
+ switch (value) {
+ case 'default':
+ gantt.config.layout = defaultLayout
+ break
+ case 'horizontalScrollbars':
+ gantt.config.layout = gridWidthScrollbarLayout
+ break
+ case 'resource':
+ gantt.config.layout = resourceLayoutGeneral
+ break
+ case 'universal':
+ gantt.config.layout = universalLayout
+ break
+ case 'complexScrollbars':
+ gantt.config.layout = complexLayoutWithScrollbars
+ break
+ }
+ gantt.init('gantt_here')
+ },
+ // 浠庣敇鐗瑰浘涓悓姝ラ�変腑鐨� id 鍒� Vue data
+ syncSelected() {
+ const tasks = gantt.serialize().data || []
+ console.log(tasks)
+ this.selectedIds = tasks.filter(t => t.checked).map(t => t.id)
+ console.log(this.selectedIds)
+ },
+
+ // 鑾峰彇閫変腑浠诲姟锛堢ず渚嬶級
+ handleGetSelected() {
+ const tasks = gantt.serialize().data || []
+ const selected = tasks.filter(t => t.checked)
+ this.$message.info(`褰撳墠宸查�変腑${selected.length} 鏉′换鍔)
+ },
+
+ // 娓呯┖鎵�鏈夐�夋嫨
+ handleClearSelection() {
+ // gantt.unselectAll();
+ // this.selectedIds = [];
+ // 鏇存柊鎵�鏈夊閫夋鐘舵�佷负鏈�変腑
+
+ const tasks = gantt.serialize().data || []
+ tasks.forEach(t => {
+ if (t.checked) {
+ console.log(t, '鎵ц')
+ t.checked = false
+ gantt.updateTask(t.id)
+ }
+ })
+ const checkboxes = gantt.$container.querySelectorAll('.taskCheckBox')
+ checkboxes.forEach(checkbox => {
+ checkbox.checked = false
+ })
+
+ this.syncSelected()
+ // gantt.render()
+ }
+
+ }
+}
+
+</script>
+
+<style>
+body,
+html {
+ width: 100%;
+ height: 100%;
+ margin: unset;
+}
+
+.local_storage {
+ background: lavender;
+ border: 2px dotted orange;
+ font-weight: bold;
+}
+
+.gantt_grid_scale .gantt_grid_head_cell,
+.gantt_task .gantt_task_scale .gantt_scale_cell {
+ font-weight: bold;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.7);
+}
+
+.resource_marker {
+ text-align: center;
+}
+
+.resource_marker div {
+ width: 28px;
+ height: 28px;
+ line-height: 29px;
+ display: inline-block;
+ border-radius: 15px;
+ color: #FFF;
+ margin: 3px;
+}
+
+.resource_marker.workday_ok div {
+ background: #51c185;
+}
+
+.resource_marker.workday_over div {
+ background: #ff8686;
+}
+
+.owner-label {
+ width: 20px;
+ height: 20px;
+ line-height: 20px;
+ font-size: 12px;
+ display: inline-block;
+ border: 1px solid #cccccc;
+ border-radius: 25px;
+ background: #e6e6e6;
+ color: #6f6f6f;
+ margin: 0 3px;
+ font-weight: bold;
+}
+
+.weekend {
+ background: LightGoldenrodYellow;
+}
+
+.constraint-marker {
+ position: absolute;
+
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+
+ width: 56px;
+ height: 56px;
+ margin-top: -11px;
+
+ opacity: 0.4;
+ z-index: 1;
+ background: url("https://docs.dhtmlx.com/gantt/samples/common/constraint-arrow.svg") center no-repeat;
+ background-size: cover;
+}
+
+.constraint-marker.earliest-start {
+ margin-left: -53px;
+}
+
+.constraint-marker.latest-end {
+ margin-left: -3px;
+ transform: rotate(180deg);
+}
+
+.taskCheckBox {
+ cursor: pointer;
+ z-index: 99999 !important;
+}
+</style>
--
Gitblit v1.9.3