/*! * LiteRyzJS/Project v0.2.0.508 * Copyright 2023-2024 Ray Lam (https://www.hiimray.co.uk) * */ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.LiteRyzJS=e():t.LiteRyzJS=e()}(this,(()=>(()=>{var t={25:(t,e,n)=>{"use strict";n.d(e,{A:()=>i});var a=n(601),o=n.n(a),r=n(314),s=n.n(r)()(o());s.push([t.id,".literyzjs-project .project-planner{border-spacing:0px;border-collapse:separate;cursor:default;padding:0px 0px 30px 0px;width:100%}.literyzjs-project .project-planner .b{font-weight:bold}.literyzjs-project .project-planner .b input[type=text]{font-weight:bold}.literyzjs-project .project-planner .c{text-align:center}.literyzjs-project .project-planner .i{display:inline-block;width:20px}.literyzjs-project .project-planner thead tr{font-weight:bold;font-size:.8em;user-select:none;height:40px;text-align:center;vertical-align:bottom}.literyzjs-project .project-planner thead tr th{background-color:#e1e1e1;border-color:#b8b8b8;border-style:solid;border-width:0px 0px 1px 1px;color:#3e7138;margin:0px;padding:6px 10px 5px 10px;min-width:20px}.literyzjs-project .project-planner thead tr th:first-child{background-color:inherit;border-left-width:0px}.literyzjs-project .project-planner thead tr th:last-child{border-right-width:1px}.literyzjs-project .project-planner tbody tr input[type=text]{background:none;border:none;cursor:default;font-family:inherit;font-size:inherit;margin:0px;padding:0px;width:auto}.literyzjs-project .project-planner tbody tr td{border-color:#b8b8b8;border-style:solid;border-width:0px 0px 1px 0px;margin:0px;overflow:hidden;padding:5px 5px 5px 5px;text-overflow:ellipsis;white-space:nowrap}.literyzjs-project .project-planner tbody tr td:first-child{border-right-width:1px;color:#7e7e7e;font-size:.8em;text-align:center;user-select:none}.literyzjs-project .project-planner tbody tr td:last-child{border-right-width:1px}.literyzjs-project .project-planner tbody tr:hover td:first-child{background-color:#d1f2c7;color:#3e7138;font-weight:bold}.literyzjs-project .project-planner tbody tr:hover td:not(:first-child){background-color:rgba(233,237,239,.8)}.literyzjs-project .project-planner tbody tr:nth-child(odd){background-color:rgba(233,237,239,.3)}.literyzjs-project .gantt-chart{border-color:#b8b8b8;border-style:solid;border-width:1px;overflow:hidden;scrollbar-width:thin;scrollbar-color:#cdcdcd #f0f0f0}.literyzjs-project .gantt-chart.scroll-x{overflow-x:scroll !important}",""]);const i=s},314:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n="",a=void 0!==e[5];return e[4]&&(n+="@supports (".concat(e[4],") {")),e[2]&&(n+="@media ".concat(e[2]," {")),a&&(n+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),n+=t(e),a&&(n+="}"),e[2]&&(n+="}"),e[4]&&(n+="}"),n})).join("")},e.i=function(t,n,a,o,r){"string"==typeof t&&(t=[[null,t,void 0]]);var s={};if(a)for(var i=0;i0?" ".concat(h[5]):""," {").concat(h[1],"}")),h[5]=r),n&&(h[2]?(h[1]="@media ".concat(h[2]," {").concat(h[1],"}"),h[2]=n):h[2]=n),o&&(h[4]?(h[1]="@supports (".concat(h[4],") {").concat(h[1],"}"),h[4]=o):h[4]="".concat(o)),e.push(h))}},e}},601:t=>{"use strict";t.exports=function(t){return t[1]}},72:t=>{"use strict";var e=[];function n(t){for(var n=-1,a=0;a{"use strict";var e={};t.exports=function(t,n){var a=function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(t){n=null}e[t]=n}return e[t]}(t);if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(n)}},540:t=>{"use strict";t.exports=function(t){var e=document.createElement("style");return t.setAttributes(e,t.attributes),t.insert(e,t.options),e}},56:(t,e,n)=>{"use strict";t.exports=function(t){var e=n.nc;e&&t.setAttribute("nonce",e)}},825:t=>{"use strict";t.exports=function(t){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var e=t.insertStyleElement(t);return{update:function(n){!function(t,e,n){var a="";n.supports&&(a+="@supports (".concat(n.supports,") {")),n.media&&(a+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(a+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),a+=n.css,o&&(a+="}"),n.media&&(a+="}"),n.supports&&(a+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(a+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleTagTransform(a,t,e.options)}(e,t,n)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},113:t=>{"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},707:function(t){var e;e=()=>(()=>{var t={814:()=>{Array.isEmpty=function(t){return"array"!=Object.getDataType(t)||t.length<=0},Array.toFlatten=function(t,e,n){for(let a=0;a0&&Array.toFlatten(t[a][e],e,n)},Array.prototype.addRange=function(t){return null==t||t.forEach((t=>{this.push(t)})),this},Array.prototype.any=function(t,e){return this.count(t,e)>0},Array.prototype.copy=function(){return JSON.parse(JSON.stringify(this))},Array.prototype.count=function(t,e){let n=0;for(let a=0;a{e+=this.count(t.propName,t.value)})),e},Array.prototype.create=function(t,e){let n=[];for(let a=0;a=this.length?this.push(e):this.splice(t,0,e),this},Array.prototype.joinIfNotNullOrWhitespace=function(t){let e="";for(let n=0;nn[t]?1:0})),this},Array.prototype.orderByDesc=function(t){return this.sort((function(e,n){return e[t]n[t]?-1:0})),this},Array.prototype.remove=function(t){let e=[];for(let n=0;n=0;t--)this.removeAt(e[t]);return this},Array.prototype.removeAt=function(t){return t<0||t>=this.length||this.splice(t,1),this},Array.prototype.removeRange=function(t){for(let e=0;e{e=e.select(t.propName,t.value)})),e},Array.prototype.toList=function(t){let e=[];return this.forEach((n=>{null!=typeof n[t]&&e.push(n[t])})),e},Array.prototype.sortTree=function(t,e){this.orderBy(e);for(let n=0;n{Boolean.isFalse=function(t){return!!String.isNullOrUndefined(t)||t.toString().containsCI("false","f","y","0","x")},Boolean.isTrue=function(t){return!String.isNullOrUndefined(t)&&t.toString().containsCI("true","t","n","1","o")},Boolean.ifTrue=function(t,e,n){return Boolean.isTrue(t)?e:n}},579:()=>{Date.addDays=function(t,e){let n=new Date(t);return n.addDays(e),n},Date.addMonths=function(t,e){let n=new Date(t);return n.addMonths(e),n},Date.addYears=function(t,e){let n=new Date(t);return n.addYears(e),n},Date.max=function(t,e){return null==t?e:null==e?t:new Date(t)<=new Date(e)?new Date(e):new Date(t)},Date.min=function(t,e){return null==t?e:null==e?t:new Date(t)<=new Date(e)?new Date(t):new Date(e)},Date.diffDays=function(t,e){return Math.ceil((new Date(e).getTime()-new Date(t).getTime())/864e5)},Date.today=function(){let t=new Date;return t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0),t},Date.prototype.addDays=function(t){this.setDate(this.getDate()+parseInt(t))},Date.prototype.addMonths=function(t){this.setMonth(this.getMonth()+parseInt(t))},Date.prototype.addYears=function(t){this.setFullYear(this.getFullYear()+parseInt(t))},Date.prototype.toCString=function(t){let e=t;return e=e.replace("fffffff",this.getMilliseconds().toString().padStart(7,"0")),e=e.replace("ffffff",this.getMilliseconds().toString().padStart(6,"0")),e=e.replace("fffff",this.getMilliseconds().toString().padStart(5,"0")),e=e.replace("yyyy",this.getFullYear().toString().padStart(4,"0")),e=e.replace("MMMM","{1}"),e=e.replace("dddd","{2}"),e=e.replace("ffff",this.getMilliseconds().toString().padStart(4,"0")),e=e.replace("yyy",this.getFullYear().toString().padStart(3,"0")),e=e.replace("MMM","{3}"),e=e.replace("ddd","{4}"),e=e.replace("fff",this.getMilliseconds().toString().padStart(3,"0")),e=e.replace("zzz",""),e=e.replace("yy",this.getFullYear().toString().slice(-2)),e=e.replace("MM",(this.getMonth()+1).toString().padStart(2,"0")),e=e.replace("dd",this.getDate().toString().padStart(2,"0")),e=e.replace("HH",this.getHours().toString().padStart(2,"0")),e=e.replace("hh",(this.getHours()>12?this.getHours()-12:this.getHours()).toString().padStart(2,"0")),e=e.replace("mm",this.getMinutes().toString().padStart(2,"0")),e=e.replace("ss",this.getSeconds().toString().padStart(2,"0")),e=e.replace("ff",this.getMilliseconds().toString().padStart(2,"0")),e=e.replace("tt","{5}"),e=e.replace("zz",""),e=e.replace("y",this.getFullYear().toString()),e=e.replace("M",(this.getMonth()+1).toString()),e=e.replace("d",this.getDate().toString()),e=e.replace("H",this.getHours().toString()),e=e.replace("h",(this.getHours()>12?this.getHours()-12:this.getHours()).toString()),e=e.replace("m",this.getMinutes().toString()),e=e.replace("s",this.getSeconds().toString()),e=e.replace("z",""),e=e.replace("t","{6}"),e=e.replace("Z",""),e=e.replace("{1}",this.toLocaleString("default",{month:"long"})),e=e.replace("{2}",this.toLocaleString("default",{weekday:"long"})),e=e.replace("{3}",this.toLocaleString("default",{month:"short"})),e=e.replace("{4}",this.toLocaleString("default",{weekday:"short"})),e=e.replace("{5}",this.getHours()>=12?"PM":"AM"),e=e.replace("{6}",this.getHours()>=12?"P":"A"),e}},874:()=>{Document.ready=async function(t){!async function(){"loading"!==document.readyState?t():document.addEventListener("DOMContentLoaded",(function(){t()}))}()}},705:()=>{Math.randomN=function(t,e){return t=Math.ceil(t),e=Math.floor(e),Math.floor(Math.random()*(e-t)+t)},Math.average=function(t){let e=0;return t.forEach((t=>{e+=parseFloat(t)})),e/t.length},Math.avg=function(...t){let e=0;return t.forEach((t=>{e+=parseFloat(t)})),e/t.length},Math.half=function(t){return t/2}},428:()=>{Object.isNullOrUndefined=function(t){return void 0===t||null==t},Object.getDataType=function(t){return String.isNullOrUndefined(t)?"null":"object"==typeof t?Array.isArray(t)?"array":"object":typeof t}},930:()=>{String.isNullOrUndefined=function(t){return void 0===t||null==t},String.isNullOrWhitespace=function(t){return!!String.isNullOrUndefined(t)||("string"==typeof t?t.trim().length<=0:t.toString().trim().length<=0)},String.joinIfNotNullOrWhitespace=function(t,...e){let n="";for(let a=0;a$1")},String.prototype.toTitleCase=function(){let t=this;return t=t.replace(/([A-Z]{1})/g," $1"),t=t.trim(),t=t.charAt(0).toUpperCase()+t.substr(1),t},String.prototype.getFilename=function(){return this.substring(this.lastIndexOf("/")+1)}},323:()=>{Window.goToTop=function(){Window.scrollTo(0,0)},Window.fragment={get:function(){if(!window.location.hash)return null;const t=window.location.hash.indexOf("?");return t<0?window.location.hash.substring(1):window.location.hash.substring(1,t)},getQuery:function(){if(!window.location.hash)return null;let t=window.location.hash;const e=t.indexOf("?");if(e<0)return null;t=hasQueryString.substring(e+1);const n=new URLSearchParams(t),a={};for(const[t,e]of n.entries())a[t]=e;return a},clear:function(){location.hash="",history.replaceState("","",location.pathname)}}}},e={};function n(a){var o=e[a];if(void 0!==o)return o.exports;var r=e[a]={exports:{}};return t[a](r,r.exports,n),r.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var a in e)n.o(e,a)&&!n.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var a={};return(()=>{"use strict";n.r(a),n(814),n(523),n(579),n(874),n(705),n(428),n(930),n(323)})(),a})(),t.exports=e()}},e={};function n(a){var o=e[a];if(void 0!==o)return o.exports;var r=e[a]={id:a,exports:{}};return t[a].call(r.exports,r,r.exports,n),r.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var a in e)n.o(e,a)&&!n.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nc=void 0;var a={};return(()=>{"use strict";n.r(a),n.d(a,{GanttChart:()=>w,Project:()=>o,ProjectPlanner:()=>y}),n(707);const t=class{ID=null;Name="";Description="";Tag=null;StartDelay=0;Duration=1;PredecessorTaskID=null;IsCollated=!1;CollatedTaskID=null;ActuWorkHours=null;Progress=0;Resources=[];constructor(t){Object.assign(this,t)}},e=class extends t{Order=null;StartDate=null;FinishDate=null;CalcWorkHours=0;Level=0;Tasks=[];constructor(t){super(),Object.assign(this,t)}},o=class{constructor(t){const e=this,n=Object.assign(e.DefaultOptions,t);e.Debug=!0,e.Project=n,e.Tasks=[]}get StartDate(){return new Date(this.Project.StartDate)}get FinishDate(){let t=new Date(this.Project.StartDate);return this.ExportTasks().forEach((e=>{null!=e.FinishDate&&(t=Date.max(t,e.FinishDate))})),t}get Duration(){return Date.diffDays(this.StartDate,this.FinishDate)}get DefaultOptions(){return{Name:"",Description:"",StartDate:Date.today(),Tag:null,StartOfWeek:1,WorkHours:[0,7.5,7.5,7.5,7.5,7.5,0]}}AddTask(n){const a=this,o=new t(n),r=new e(o);if(null==r.PredecessorTaskID&&null==r.CollatedTaskID)a.Tasks.push(r);else if(null!=r.PredecessorTaskID){let t=a.FindTask(r.PredecessorTaskID);null!=t?t.Tasks.push(r):a.#t("Task not found ("+r.PredecessorTaskID+")")}else if(null!=r.CollatedTaskID){let t=a.FindTask(r.CollatedTaskID);null!=t?t.Tasks.push(r):a.#t("Task not found ("+r.CollatedTaskID+")")}else a.#t("Task not found ("+r.ID+")")}Clear(){this.Tasks=[]}ExportTasks(){let t=this.Tasks.copy().flatten("Tasks");for(var e=0;e Set StartDate from Predecessor"))}else if(null!=o.CollatedTaskID){const e=t.first("ID",o.CollatedTaskID);null!=e&&null!=e.StartDate&&(o.StartDate=Date.addDays(e.StartDate,o.StartDelay),n.#t("> Set StartDate from Group"))}else o.StartDate=Date.addDays(n.Project.StartDate,o.StartDelay),n.#t("> Set StartDate from Project");if(o.Tasks.length>0&&(n.#e(t,o.Tasks),n.#t("> Calc inner")),null!=o.StartDate)if(o.IsCollated){const t=o.Tasks.select("CollatedTaskID",o.ID);t.length<=0?(o.FinishDate=o.StartDate,o.Duration=0,n.#t("> Set FinishDate from Group (0)")):t.any("FinishDate",null)||(o.FinishDate=t.orderByDesc("FinishDate")[0].FinishDate,o.Duration=Date.diffDays(o.StartDate,o.FinishDate),n.#t("> Set FinishDate from Group"))}else o.FinishDate=Date.addDays(o.StartDate,o.Duration),n.#t("> Set FinishDate")}}#a(t){const e=this;if(Array.isEmpty(t.Tasks))return;t.Tasks.orderBy("StartDelay");const n=t.Tasks.notSelect("PredecessorTaskID",null);n.length>0&&(t.Tasks.removeRange(n),t.Tasks.addRange(n)),t.Tasks.forEach((t=>{e.#a(t)}))}};var r=n(72),s=n.n(r),i=n(825),l=n.n(i),c=n(659),h=n.n(c),d=n(56),u=n.n(d),p=n(540),C=n.n(p),f=n(113),g=n.n(f),D=n(25),v={};v.styleTagTransform=g(),v.setAttributes=u(),v.insert=h().bind(null,"head"),v.domAPI=l(),v.insertStyleElement=C(),s()(D.A,v),D.A&&D.A.locals&&D.A.locals;const y=class{constructor(t){const e=this;e.Container=t,e.Columns=[null,null,"Task Name","Duration","Start","Finish","Predecessor","Resource Names",null],e.Tasks=[],e.#o()}#o(){const t=this;t.Container.classList.contains("literyzjs-project")||t.Container.classList.add("literyzjs-project");let e="";e+="",e+=t.#r(),e+="",e+=t.#s(),e+="",e+="
",t.Container.innerHTML=e}Clear(){this.Load([])}Load(t){const e=this;e.Tasks=t,e.Container.classList.contains("literyzjs-project")||e.Container.classList.add("literyzjs-project");let n="";n+="",n+=e.#r(),n+="",t.forEach((t=>{n+=e.#i(t)})),n+="",n+="
",e.Container.innerHTML=n}#r(){let t="";return t+="",t+="",this.Columns.forEach((e=>{t+=""+(e??"")+""})),t+="",t+="",t}#s(){let t="";return t+="",t+="",t+="Loading...",t+="",t}#i(t){let e="";1==t.IsCollated?e+="":e+="",e+=""+t.Order+"",e+="",e+="";for(let n=0;n";return e+="",e+="",e+=""+t.Duration+" day"+(1==parseInt(t.Duration)?"":"s")+"",e+=""+new Date(t.StartDate).toLocaleDateString()+"",e+=""+new Date(t.FinishDate).toLocaleDateString()+"",e+=""+this.#l(t.PredecessorTaskID)+"",e+="",e+="",e+="",e}#l(t){if(null==t)return"";const e=this.Tasks.first("ID",t);return null==e?"":e.Order}},x=class{constructor(t){const e=this;e.el=t,e.BorderWidth=2,e.ScrollbarWidth=11,e.Padding={Top:0,Right:0,Bottom:0,Left:0},e.EnableDock=!0,e.#o()}#o(){const t=this;null!=t.el&&(t.el.innerHTML="
",t.Invalidate(),t.Clear())}get FlowContainer(){return this.el.getElementsByTagName("div")[0]}get CanvasContainer(){return this.FlowContainer.getElementsByTagName("canvas")[0]}get CanvasContext(){return this.CanvasContainer.getContext("2d")}get Height(){const t=this;return null==t.CanvasContainer?0:t.#c(t.CanvasContainer)}set Height(t){const e=this;null!=e.FlowContainer&&(e.FlowContainer.style.height=t+"px"),null!=e.CanvasContainer&&(e.CanvasContainer.style.height=t+"px"),null!=e.CanvasContext&&(e.CanvasContext.canvas.height=t)}get Width(){const t=this;return null==t.CanvasContainer?0:t.#h(t.CanvasContainer)}set Width(t){const e=this;null!=e.FlowContainer&&(e.FlowContainer.style.width=t+"px"),null!=e.CanvasContainer&&(e.CanvasContainer.style.width=t+"px"),null!=e.CanvasContext&&(e.CanvasContext.canvas.width=t)}get Size(){return{W:this.Width,H:this.Height}}set Size(t){this.Width=t.W,this.Height=t.H}get ClientRectangle(){const t=this;return{X:t.Padding.Left,Y:t.Padding.Top,W:t.Width-(t.Padding.Left+t.Padding.Right),H:t.Height-(t.Padding.Top+t.Padding.Bottom)}}get Rectangle(){return{X:0,Y:0,W:this.Width,H:this.Height}}Clear(){const t=this;null!=t.CanvasContext&&t.CanvasContext.clearRect(0,0,t.CanvasContext.canvas.width,t.CanvasContext.canvas.height)}DrawArrowS(t,e,n){const a=this;if(null==a.CanvasContext)return;const o=Object.assign({LineWidth:1,LineDash:[],FillColour:null},n);t.X+=.5,t.Y+=.5,t.W-=o.LineWidth,t.H-=o.LineWidth,a.CanvasContext.beginPath(),a.CanvasContext.strokeStyle=e,a.CanvasContext.lineWidth=o.LineWidth,a.CanvasContext.setLineDash(o.LineDash),a.CanvasContext.moveTo(t.X,t.Y),a.CanvasContext.lineTo(t.X+t.W,t.Y),a.CanvasContext.lineTo(t.X+Math.half(t.W),t.Y+t.H),a.CanvasContext.closePath(),null!=o.FillColour&&(a.CanvasContext.fillStyle=o.FillColour,a.CanvasContext.fill()),a.CanvasContext.stroke()}DrawCircle(t,e,n,a,o){const r=this;if(null==r.CanvasContext)return;const s=Object.assign({LineWidth:1,LineDash:[],FillColour:null},o);let i={X:t+Math.half(n),Y:e+Math.half(n),W:Math.half(n),H:Math.half(n)};i.X+=.5,i.Y+=.5,i.W-=Math.half(s.LineWidth),i.H-=Math.half(s.LineWidth),r.CanvasContext.beginPath(),r.CanvasContext.strokeStyle=a,r.CanvasContext.lineWidth=s.LineWidth,r.CanvasContext.setLineDash(s.LineDash),r.CanvasContext.arc(i.X,i.Y,i.W,0,2*Math.PI,!1),r.CanvasContext.closePath(),null!=s.FillColour&&(r.CanvasContext.fillStyle=s.FillColour,r.CanvasContext.fill()),r.CanvasContext.stroke()}DrawDiamond(t,e,n){const a=this;if(null==a.CanvasContext)return;const o=Object.assign({LineWidth:1,LineDash:[],FillColour:null},n);t.X+=.5,t.Y+=.5,t.W-=o.LineWidth,t.H-=o.LineWidth,a.CanvasContext.beginPath(),a.CanvasContext.strokeStyle=e,a.CanvasContext.lineWidth=o.LineWidth,a.CanvasContext.setLineDash(o.LineDash),a.CanvasContext.moveTo(t.X+Math.half(t.W),t.Y),a.CanvasContext.lineTo(t.X+t.W,t.Y+Math.half(t.H)),a.CanvasContext.lineTo(t.X+Math.half(t.W),t.Y+t.H),a.CanvasContext.lineTo(t.X,t.Y+Math.half(t.H)),a.CanvasContext.closePath(),null!=o.FillColour&&(a.CanvasContext.fillStyle=o.FillColour,a.CanvasContext.fill()),a.CanvasContext.stroke()}DrawRectangle(t,e,n){const a=this;if(null==a.CanvasContext)return;const o=Object.assign({LineWidth:1,LineDash:[],FillColour:null},n);t.X+=.5,t.Y+=.5,t.W-=o.LineWidth,t.H-=o.LineWidth,a.CanvasContext.beginPath(),a.CanvasContext.strokeStyle=e,a.CanvasContext.lineWidth=o.LineWidth,a.CanvasContext.setLineDash(o.LineDash),a.CanvasContext.rect(t.X,t.Y,t.W,t.H),null!=o.FillColour&&(a.CanvasContext.fillStyle=o.FillColour,a.CanvasContext.fill()),a.CanvasContext.closePath(),a.CanvasContext.stroke()}DrawLine(t,e,n,a,o,r){const s=this;if(null==s.CanvasContext)return;const i=Object.assign({LineWidth:1,LineDash:[]},r);e-=.5,s.CanvasContext.beginPath(),s.CanvasContext.strokeStyle=o,s.CanvasContext.lineWidth=i.LineWidth,s.CanvasContext.setLineDash(i.LineDash),s.CanvasContext.moveTo(t,e),s.CanvasContext.lineTo(n,a),s.CanvasContext.stroke()}DrawLines(t,e,n){const a=this;if(null==a.CanvasContext)return;if(null==t)return;if(t.length<=0)return;const o=Object.assign({LineWidth:1,LineDash:[]},n);a.CanvasContext.beginPath(),a.CanvasContext.strokeStyle=e,a.CanvasContext.lineWidth=o.LineWidth,a.CanvasContext.setLineDash(o.LineDash),a.CanvasContext.moveTo(t[0].X,t[0].Y);for(let e=1;et.#h(t.FlowContainer)+2*t.BorderWidth?(t.FlowContainer.classList.add("scroll-x"),t.FlowContainer.style.height=t.#c(t.CanvasContainer)+t.ScrollbarWidth+"px"):(t.FlowContainer.classList.remove("scroll-x"),t.FlowContainer.style.height=t.#c(t.CanvasContainer)+"px")}MeasureText(t,e){const n=this;if(null==n.CanvasContext)return null;n.CanvasContext.font=t;const a=n.CanvasContext.measureText(e);return{W:a.width,H:Math.round(a.fontBoundingBoxDescent+a.fontBoundingBoxAscent)}}#h(t){return null==t||void 0===t?0:t.offsetWidth||t.innerWidth||t.clientWidth}#c(t){return null==t||void 0===t?0:t.offsetHeight||t.innerHeight||t.clientHeight}},w=class{constructor(t,e){const n=this;n.Canvas=new x(t),n.Options=Object.assign(n.DefaultOptions,e),n.Debug=!1,n.Tasks=[],n.StartDate=null,n.Duration=30,n.StartOfWeek=1,n.#o()}#o(){const t=this;t.Canvas.el.classList.contains("literyzjs-project")||t.Canvas.el.classList.add("literyzjs-project"),t.Canvas.FlowContainer.classList.contains("border")&&t.Canvas.FlowContainer.classList.remove("border"),t.Canvas.FlowContainer.classList.contains("gantt-chart")||t.Canvas.FlowContainer.classList.add("gantt-chart")}get DefaultOptions(){return{DayWidth:24,HeaderRow:{Height:[20,21]},Row:{Height:28,BackColour:"rgba(235, 235, 235, 0.3)",Task:{Height:14,BorderColour:"#555555",FillColour:"#D8EEDB"},OrphanTask:{Height:14,BorderColour:"#555555",FillColour:"#9CC2E6"},ChildTask:{Height:14,BorderColour:"#555555",FillColour:"#FFF5C1"},CollatedTask:{Height:6,BorderColour:"#555555",FillColour:"#555555"}},Column:{SatColour:"rgba(233, 237, 239, 0.8)",SunColour:"rgba(233, 237, 239, 0.9)"},Line:{Colour:"#555555",Width:1,ArrowSize:5},DateFont:"7pt sans-serif",DateForeColour:"#636363",BorderWidth:1,BorderColour:"#B8B8B8",BorderDashPattern:[1,1],MinimumRowCount:6,ShowDateLines:!0,ShowStartDayOfWeekLine:!0,ShowRowLines:!0,ShowRowStripes:!0}}get HeaderRow1Rectangle(){return{X:0,Y:0,W:this.Canvas.Width,H:this.Options.HeaderRow.Height[0]-this.Options.BorderWidth}}get HeaderRow2Rectangle(){return{X:0,Y:this.Options.HeaderRow.Height[0],W:this.Canvas.Width,H:this.Options.HeaderRow.Height[1]-this.Options.BorderWidth}}get HeaderHeight(){return this.Options.HeaderRow.Height[0]+this.Options.HeaderRow.Height[1]}Clear(){const t=this;t.Canvas.Clear(),t.StartDate=new Date,t.Duration=30,t.StartOfWeek=1,t.Tasks=[],t.Invalidate()}Invalidate(){const t=this;t.Canvas.Clear();const e=(t.Duration+2)*t.Options.DayWidth,n=Math.max(t.Tasks.length,t.Options.MinimumRowCount)*t.Options.Row.Height+t.HeaderHeight;t.Canvas.Size={W:e,H:n},t.Canvas.Invalidate(),t.#d(),t.#u(),t.#p(),t.#C(),t.#f()}Load(t){const e=this;e.Canvas.Clear(),null!=t&&(e.StartDate=new Date(t.StartDate),e.Duration=t.Duration,e.StartOfWeek=t.Project.StartOfWeek,e.Tasks=t.ExportTasks(),e.Invalidate())}#d(){const t=this,e=t.Duration+2;t.Debug&&(t.Canvas.DrawRectangle(t.HeaderRow1Rectangle,"red",{}),t.Canvas.DrawRectangle(t.HeaderRow2Rectangle,"orange",{}));let n=new Date(t.StartDate);n.addDays(-1),t.#g(t.Options.HeaderRow.Height[0]);for(let n=1;n