{"version":3,"file":"kendo.gantt.data.min.js","names":["factory","define","amd","$","undefined$1","isArray","Array","extend","map","kendoData","kendo","data","Query","DataSource","TreeListDataSource","TreeListModel","createDataSource","type","name","options","dataSource","Error","dateCompareValidator","input","filter","length","editable","model","field","attr","picker","widgetInstance","ui","dates","container","window","parent","indexOf","plannedStart","plannedEnd","start","end","value","parseDate","val","GanttDependency","Model","id","fields","predecessorId","successorId","GanttDependencyDataSource","init","fn","call","this","schema","modelBase","dependencies","predecessors","successors","push","apply","_dependencies","view","operator","toArray","create","GanttTask","parentId","defaultValue","validation","required","nullable","orderId","title","dateCompare","message","percentComplete","min","max","step","summary","expanded","duration","plannedDuration","isMilestone","_offset","newValue","i","Date","get","getTime","set","_offsetPlanned","base","parentIdField","GanttDataSource","sort","dir","add","task","_toGanttTask","insert","taskSiblings","index","_reorderSiblings","_resolveSummaryFields","taskParent","remove","children","taskAllChildren","_removeItems","_childRemoved","that","callback","tasks","taskChildren","fromView","taskId","order","_sort","taskLevel","level","taskTree","current","l","update","taskInfo","oldValue","modelChangeHandler","e","sender","_resolveSummaryStart","parentTask","offset","offsetChildren","_resolveSummaryEnd","_resolveSummaryPlannedStart","offsetChildrenPlanned","_resolveSummaryPlannedEnd","_resolveSummaryPercentComplete","bind","unbind","_updateSummary","_updateSummaryRecursive","currentMin","currentMax","aggregate","average","oldOrderId","direction","startIndex","endIndex","newIndex","siblings","Math","_createNewModel","accept","childCount","jQuery"],"sources":["kendo.gantt.data.js"],"mappings":"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","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.data', 'kendo.treelist'], factory) :\n factory();\n})((function () {\n var __meta__ = {\n id: \"gantt.data\",\n name: \"GanttData\",\n category: \"web\",\n description: \"The Gantt Data.\",\n depends: [ \"data\", \"treelist\" ],\n hidden: true\n };\n\n (function($, undefined$1) {\n var isArray = Array.isArray,\n extend = $.extend,\n map = $.map,\n\n kendoData = kendo.data,\n Query = kendoData.Query,\n DataSource = kendoData.DataSource,\n TreeListDataSource = kendoData.TreeListDataSource,\n TreeListModel = kendoData.TreeListModel,\n\n PARENTIDFIELD = \"parentId\";\n\n var createDataSource = function(type, name) {\n return function(options) {\n options = isArray(options) ? { data: options } : options;\n\n var dataSource = options || {};\n var data = dataSource.data;\n\n dataSource.data = data;\n\n if (!(dataSource instanceof type) && dataSource instanceof DataSource) {\n throw new Error(\"Incorrect DataSource type. Only \" + name + \" instances are supported\");\n }\n\n return dataSource instanceof type ? dataSource : new type(dataSource);\n };\n };\n\n var dateCompareValidator = function(input) {\n if (input.filter(\"[name=end], [name=start], [name=plannedEnd], [name=plannedStart]\").length) {\n var field = input.attr(\"name\"),\n picker = kendo.widgetInstance(input, kendo.ui),\n dates = {},\n container = input,\n editable,\n model;\n\n while (container !== window && !editable) {\n container = container.parent();\n\n editable = container.data(\"kendoEditable\");\n }\n\n model = editable ? editable.options.model : null;\n\n if (!model) {\n return true;\n }\n\n if (field.indexOf(\"planned\") >= 0) {\n dates.plannedStart = model.plannedStart;\n dates.plannedEnd = model.plannedEnd;\n } else {\n dates.start = model.start;\n dates.end = model.end;\n }\n\n dates[field] = picker ? picker.value() : kendo.parseDate(input.val());\n\n if (field.indexOf(\"planned\") >= 0) {\n return dates.plannedStart <= dates.plannedEnd;\n } else {\n return dates.start <= dates.end;\n }\n }\n\n return true;\n };\n\n var GanttDependency = kendo.data.Model.define({\n id: \"id\",\n fields: {\n id: { type: \"number\", editable: false },\n predecessorId: { type: \"number\" },\n successorId: { type: \"number\" },\n type: { type: \"number\" }\n }\n });\n\n var GanttDependencyDataSource = DataSource.extend({\n init: function(options) {\n DataSource.fn.init.call(this, extend(true, {}, {\n schema: {\n modelBase: GanttDependency,\n model: GanttDependency\n }\n }, options));\n },\n\n dependencies: function(id) {\n var predecessors = this.predecessors(id),\n successors = this.successors(id);\n\n predecessors.push.apply(predecessors, successors);\n\n return predecessors;\n },\n\n predecessors: function(id) {\n return this._dependencies(\"successorId\", id);\n },\n\n successors: function(id) {\n return this._dependencies(\"predecessorId\", id);\n },\n\n _dependencies: function(field, id) {\n var data = this.view();\n var filter = {\n field: field,\n operator: \"eq\",\n value: id\n };\n\n data = new Query(data).filter(filter).toArray();\n\n return data;\n }\n });\n\n GanttDependencyDataSource.create = createDataSource(GanttDependencyDataSource, \"GanttDependencyDataSource\");\n\n var GanttTask = TreeListModel.define({\n fields: {\n id: { type: \"number\", editable: false },\n parentId: { type: \"number\", defaultValue: null, validation: { required: true }, nullable: true },\n orderId: { type: \"number\", validation: { required: true } },\n title: { type: \"string\", defaultValue: \"New task\" },\n start: { type: \"date\", validation: { required: true } },\n end: {\n type: \"date\",\n validation: {\n required: true,\n dateCompare: dateCompareValidator,\n message: \"End date should be after or equal to the start date\"\n }\n },\n percentComplete: { type: \"number\", validation: { required: true, min: 0, max: 1, step: 0.01 } },\n summary: { type: \"boolean\" },\n expanded: { type: \"boolean\", defaultValue: true },\n plannedStart: { type: \"date\", defaultValue: null, nullable: true },\n plannedEnd: {\n type: \"date\",\n defaultValue: null,\n nullable: true,\n validation: {\n dateCompare: dateCompareValidator,\n message: \"Planned end date should be after or equal to the planned start date\"\n }\n }\n },\n\n duration: function() {\n var end = this.end,\n start = this.start;\n\n return end - start;\n },\n\n plannedDuration: function() {\n var end = this.plannedEnd,\n start = this.plannedStart;\n\n if (end && start) {\n return end - start;\n }\n\n return 0;\n },\n\n isMilestone: function() {\n return this.duration() === 0;\n },\n\n _offset: function(value) {\n var field = [\"start\", \"end\"],\n newValue;\n\n for (var i = 0; i < field.length; i++) {\n newValue = new Date(this.get(field[i]).getTime() + value);\n this.set(field[i], newValue);\n }\n },\n\n _offsetPlanned: function(value) {\n var field = [\"plannedStart\", \"plannedEnd\"],\n newValue;\n\n for (var i = 0; i < field.length; i++) {\n newValue = new Date(this.get(field[i]).getTime() + value);\n this.set(field[i], newValue);\n }\n }\n });\n\n GanttTask.define = function(base, options) {\n if (options === undefined$1) {\n options = base;\n base = GanttTask;\n }\n\n var parentId = options.parentId || PARENTIDFIELD;\n\n options.parentIdField = parentId;\n\n var model = TreeListModel.define(base, options);\n\n if (parentId) {\n model.parentIdField = parentId;\n }\n\n return model;\n };\n\n var GanttDataSource = TreeListDataSource.extend({\n init: function(options) {\n TreeListDataSource.fn.init.call(this, extend(true, {}, {\n schema: {\n modelBase: GanttTask,\n model: GanttTask\n },\n sort: { field: \"orderId\", dir: \"asc\" }\n }, options));\n },\n\n add: function(task) {\n if (!task) {\n return;\n }\n\n task = this._toGanttTask(task);\n\n return this.insert(this.taskSiblings(task).length, task);\n },\n\n insert: function(index, task) {\n if (!task) {\n return;\n }\n\n task = this._toGanttTask(task);\n\n task.set(\"orderId\", index);\n\n task = DataSource.fn.insert.call(this, index, task);\n\n this._reorderSiblings(task, this.taskSiblings(task).length - 1);\n this._resolveSummaryFields(this.taskParent(task));\n\n return task;\n },\n\n remove: function(task) {\n var parentId = task.get(\"parentId\"),\n children = this.taskAllChildren(task);\n\n this._removeItems(children);\n\n task = TreeListDataSource.fn.remove.call(this, task);\n\n this._childRemoved(parentId, task.get(\"orderId\"));\n\n return task;\n },\n\n taskAllChildren: function(task) {\n var data = [],\n that = this;\n var callback = function(task) {\n var tasks = that.taskChildren(task);\n\n data.push.apply(data, tasks);\n map(tasks, callback);\n };\n\n if (!!task) {\n callback(task);\n } else {\n data = this.view();\n }\n\n return data;\n },\n\n taskChildren: function(task, fromView) {\n var filter = {\n field: \"parentId\",\n operator: \"eq\",\n value: null\n };\n\n var order = (this._sort && this._sort.length) ? this._sort : {\n field: \"orderId\",\n dir: \"asc\"\n };\n var taskId, data;\n\n if (fromView) {\n data = this.view();\n } else {\n data = this.data();\n }\n\n if (!!task) {\n taskId = task.get(\"id\");\n\n if (taskId === undefined$1 || taskId === null || taskId === \"\") {\n return [];\n }\n\n filter.value = taskId;\n }\n\n data = new Query(data).filter(filter).sort(order).toArray();\n\n return data;\n },\n\n taskLevel: function(task) {\n var level = 0,\n parent = this.taskParent(task);\n\n while (parent !== null) {\n level += 1;\n parent = this.taskParent(parent);\n }\n\n return level;\n },\n\n taskParent: function(task) {\n if (!task || task.get(\"parentId\") === null) {\n return null;\n }\n return this.get(task.parentId);\n },\n\n taskSiblings: function(task) {\n if (!task) {\n return null;\n }\n\n var parent = this.taskParent(task);\n\n return this.taskChildren(parent);\n },\n\n taskTree: function(task) {\n var data = [],\n current,\n tasks = this.taskChildren(task, true);\n\n for (var i = 0, l = tasks.length; i < l; i++) {\n current = tasks[i];\n data.push(current);\n\n if (current.get(\"expanded\")) {\n var children = this.taskTree(current);\n\n data.push.apply(data, children);\n }\n }\n\n return data;\n },\n\n update: function(task, taskInfo) {\n var that = this,\n oldValue;\n\n var offsetChildren = function(parentTask, offset) {\n var children = that.taskAllChildren(parentTask);\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i]._offset(offset);\n }\n };\n\n var offsetChildrenPlanned = function(parentTask, offset) {\n var children = that.taskAllChildren(parentTask);\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i]._offsetPlanned(offset);\n }\n };\n\n var modelChangeHandler = function(e) {\n var field = e.field,\n model = e.sender;\n\n switch (field) {\n case \"start\":\n that._resolveSummaryStart(that.taskParent(model));\n\n offsetChildren(model, model.get(field).getTime() - oldValue.getTime());\n break;\n case \"end\":\n that._resolveSummaryEnd(that.taskParent(model));\n break;\n case \"plannedStart\":\n that._resolveSummaryPlannedStart(that.taskParent(model));\n\n if (model.get(field) && oldValue) {\n offsetChildrenPlanned(model, model.get(field).getTime() - oldValue.getTime());\n }\n break;\n case \"plannedEnd\":\n that._resolveSummaryPlannedEnd(that.taskParent(model));\n break;\n case \"percentComplete\":\n that._resolveSummaryPercentComplete(that.taskParent(model));\n break;\n case \"orderId\":\n that._reorderSiblings(model, oldValue);\n break;\n }\n };\n\n if (taskInfo.parentId !== undefined$1) {\n oldValue = task.get(\"parentId\");\n\n if (oldValue !== taskInfo.parentId) {\n task.set(\"parentId\", taskInfo.parentId);\n\n that._childRemoved(oldValue, task.get(\"orderId\"));\n\n task.set(\"orderId\", that.taskSiblings(task).length - 1);\n that._resolveSummaryFields(that.taskParent(task));\n }\n\n delete taskInfo.parentId;\n }\n\n task.bind(\"change\", modelChangeHandler);\n task.bind(\"equalSet\", modelChangeHandler);\n\n for (var field in taskInfo) {\n oldValue = task.get(field);\n\n if (field === \"plannedStart\" || field === \"plannedEnd\") {\n // Update plannedStart and plannedEnd only when oldValue is not undefined or new value is not null\n // That limitation is needed to avoid redundant update requests when custom edit template is used\n // and the plannedStart and plannedEnd fields are not updated upon edit\n if (oldValue !== undefined$1 || taskInfo[field] !== null) {\n task.set(field, taskInfo[field]);\n }\n } else if (field === \"start\" || field === \"end\") {\n task.set(field, taskInfo[field]);\n } else if (task.get(field) !== taskInfo[field]) {\n task.set(field, taskInfo[field]);\n }\n }\n\n task.unbind(\"change\", modelChangeHandler);\n task.unbind(\"equalSet\", modelChangeHandler);\n },\n\n _childRemoved: function(parentId, index) {\n var parent = parentId === null ? null : this.get(parentId),\n children = this.taskChildren(parent);\n\n for (var i = index, l = children.length; i < l; i++) {\n children[i].set(\"orderId\", i);\n }\n\n this._resolveSummaryFields(parent);\n },\n\n _resolveSummaryFields: function(summary) {\n if (!summary) {\n return;\n }\n\n this._updateSummary(summary);\n\n if (!this.taskChildren(summary).length) {\n return;\n }\n\n this._resolveSummaryStart(summary);\n this._resolveSummaryEnd(summary);\n this._resolveSummaryPlannedStart(summary);\n this._resolveSummaryPlannedEnd(summary);\n this._resolveSummaryPercentComplete(summary);\n },\n\n _resolveSummaryStart: function(summary) {\n var that = this;\n var getSummaryStart = function(parentTask) {\n var children = that.taskChildren(parentTask);\n var min = children[0].start.getTime();\n var currentMin;\n\n for (var i = 1, l = children.length; i < l; i++) {\n currentMin = children[i].start.getTime();\n if (currentMin < min) {\n min = currentMin;\n }\n }\n\n return new Date(min);\n };\n\n this._updateSummaryRecursive(summary, \"start\", getSummaryStart);\n },\n\n _resolveSummaryEnd: function(summary) {\n var that = this;\n var getSummaryEnd = function(parentTask) {\n var children = that.taskChildren(parentTask);\n var max = children[0].end.getTime();\n var currentMax;\n\n for (var i = 1, l = children.length; i < l; i++) {\n currentMax = children[i].end.getTime();\n if (currentMax > max) {\n max = currentMax;\n }\n }\n\n return new Date(max);\n };\n\n this._updateSummaryRecursive(summary, \"end\", getSummaryEnd);\n },\n\n _resolveSummaryPlannedStart: function(summary) {\n var that = this;\n var getSummaryPlannedStart = function(parentTask) {\n var children = that.taskChildren(parentTask),\n min = null,\n currentMin;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i].plannedStart) {\n currentMin = children[i].plannedStart.getTime();\n if (!min || currentMin < min) {\n min = currentMin;\n }\n }\n }\n\n if (!min) {\n return null;\n }\n\n return new Date(min);\n };\n\n this._updateSummaryRecursive(summary, \"plannedStart\", getSummaryPlannedStart);\n },\n\n _resolveSummaryPlannedEnd: function(summary) {\n var that = this;\n var getSummaryPlannedEnd = function(parentTask) {\n var children = that.taskChildren(parentTask),\n max = null,\n currentMax;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i].plannedEnd) {\n currentMax = children[i].plannedEnd.getTime();\n if (!max || currentMax > max) {\n max = currentMax;\n }\n }\n }\n\n if (!max) {\n return null;\n }\n\n return new Date(max);\n };\n\n this._updateSummaryRecursive(summary, \"plannedEnd\", getSummaryPlannedEnd);\n },\n\n _resolveSummaryPercentComplete: function(summary) {\n var that = this;\n var getSummaryPercentComplete = function(parentTask) {\n var children = that.taskChildren(parentTask);\n var percentComplete = new Query(children).aggregate([{\n field: \"percentComplete\",\n aggregate: \"average\"\n }]);\n\n return percentComplete.percentComplete.average;\n };\n\n this._updateSummaryRecursive(summary, \"percentComplete\", getSummaryPercentComplete);\n },\n\n _reorderSiblings: function(task, oldOrderId) {\n var orderId = task.get(\"orderId\"),\n direction = orderId > oldOrderId,\n startIndex = direction ? oldOrderId : orderId,\n endIndex = direction ? orderId : oldOrderId,\n newIndex = direction ? startIndex : startIndex + 1,\n siblings = this.taskSiblings(task);\n\n if (!siblings.length) {\n return;\n }\n\n endIndex = Math.min(endIndex, siblings.length - 1);\n\n for (var i = startIndex; i <= endIndex; i++) {\n if (siblings[i] === task) {\n continue;\n }\n\n siblings[i].set(\"orderId\", newIndex);\n\n newIndex += 1;\n }\n },\n\n _toGanttTask: function(task) {\n if (!(task instanceof GanttTask)) {\n var taskInfo = task;\n\n task = DataSource.fn._createNewModel.call(this);\n task.accept(taskInfo);\n }\n\n return task;\n },\n\n _updateSummary: function(task) {\n if (task !== null) {\n var childCount = this.taskChildren(task).length;\n\n task.set(\"summary\", childCount > 0);\n }\n },\n\n _updateSummaryRecursive: function(summary, field, callback) {\n if (!summary) {\n return;\n }\n\n var value = callback(summary);\n\n summary.set(field, value);\n\n var parent = this.taskParent(summary);\n\n if (parent) {\n this._updateSummaryRecursive(parent, field, callback);\n }\n }\n });\n\n GanttDataSource.create = createDataSource(GanttDataSource, \"GanttDataSource\");\n\n extend(true, kendo.data, {\n GanttDataSource: GanttDataSource,\n GanttTask: GanttTask,\n GanttDependencyDataSource: GanttDependencyDataSource,\n GanttDependency: GanttDependency\n });\n })(window.kendo.jQuery);\n\n}));\n"]}