diff --git a/docs/timeline/index.html b/docs/timeline/index.html index 5cfc8949..e1219ee0 100644 --- a/docs/timeline/index.html +++ b/docs/timeline/index.html @@ -237,7 +237,7 @@ var items = new vis.DataSet([ The item properties are defined as:

- +
@@ -335,11 +335,30 @@ var items = new vis.DataSet([ Types 'box' and 'point' need a start date, the types 'range' and 'background' needs both a start and end date. - - - + + + + + + + + + + + + + + + + + + + + + +
Name Type
editableBoolean
editableBoolean or Object no Override the editable option of the timeline for a specific item (assuming timeline.editable.overrideItems is false).

Groups

diff --git a/examples/timeline/editing/individualEditableItems.html b/examples/timeline/editing/individualEditableItems.html index d6210305..c004473a 100644 --- a/examples/timeline/editing/individualEditableItems.html +++ b/examples/timeline/editing/individualEditableItems.html @@ -34,16 +34,21 @@
diff --git a/lib/timeline/component/ItemSet.js b/lib/timeline/component/ItemSet.js index 852e0c0d..3f64c0e4 100644 --- a/lib/timeline/component/ItemSet.js +++ b/lib/timeline/component/ItemSet.js @@ -361,7 +361,7 @@ ItemSet.prototype.setOptions = function(options) { this.options.editable.updateGroup = options.editable; this.options.editable.add = options.editable; this.options.editable.remove = options.editable; - this.options.editable.overrideItems = options.editable; + this.options.editable.overrideItems = false; } else if (typeof options.editable === 'object') { util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove', 'overrideItems'], this.options.editable, options.editable); @@ -1225,8 +1225,8 @@ ItemSet.prototype._onDragStart = function (event) { } // override options.editable - if ((item.editable === false || !item.editable) - && !this.options.editable.overrideItems) { + if ((item.editable != null && !item.editable.updateTime && !item.editable.updateGroup) + && !this.options.editable.overrideItems) { return; } @@ -1361,8 +1361,8 @@ ItemSet.prototype._onDrag = function (event) { //only calculate the new group for the item that's actually dragged var selectedItem = this.touchParams.selectedItem; - var updateGroupAllowed = me.options.editable.updateGroup || - (!this.options.editable.overrideItems && selectedItem.editable === true); + var updateGroupAllowed = ((this.options.editable.overrideItems || selectedItem.editable == null) && this.options.editable.updateGroup) || + (!this.options.editable.overrideItems && selectedItem.editable != null && selectedItem.editable.updateGroup); var newGroupBase = null; if (updateGroupAllowed && selectedItem) { if (selectedItem.data.group != undefined) { @@ -1388,12 +1388,15 @@ ItemSet.prototype._onDrag = function (event) { } var itemData = this._cloneItemData(props.item.data); // clone the data - if (props.item.editable === false && !me.options.editable.overrideItems) { + if (props.item.editable != null + && !props.item.editable.updateTime + && !props.item.editable.updateGroup + && !me.options.editable.overrideItems) { return; } - var updateTimeAllowed = me.options.editable.updateTime || ( - props.item.editable === true && !me.options.editable.overrideItems); + var updateTimeAllowed = ((this.options.editable.overrideItems || selectedItem.editable == null) && this.options.editable.updateTime) || + (!this.options.editable.overrideItems && selectedItem.editable != null && selectedItem.editable.updateTime); if (updateTimeAllowed) { if (props.dragLeft) { // drag left side of a range item @@ -1456,8 +1459,6 @@ ItemSet.prototype._onDrag = function (event) { } } - var updateGroupAllowed = me.options.editable.updateGroup || - props.item.editable === true; if (updateGroupAllowed && (!props.dragLeft && !props.dragRight) && newGroupBase!=null) { if (itemData.group != undefined) { diff --git a/lib/timeline/component/item/Item.js b/lib/timeline/component/item/Item.js index e7bafc04..9057dd66 100644 --- a/lib/timeline/component/item/Item.js +++ b/lib/timeline/component/item/Item.js @@ -30,10 +30,18 @@ function Item (data, conversion, options) { this.height = null; this.editable = null; - if (this.data && - this.data.hasOwnProperty('editable') && - typeof this.data.editable === 'boolean') { - this.editable = data.editable; + if (this.data && this.data.hasOwnProperty('editable')){ + if(typeof this.data.editable === 'boolean') { + this.editable = { + updateTime: this.data.editable, + updateGroup: this.data.editable, + remove: this.data.editable + } + } + else if(typeof options.editable === 'object') { + this.editable = {}; + util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, data.editable); + }; } } @@ -68,8 +76,18 @@ Item.prototype.setData = function(data) { this.parent.itemSet._moveToGroup(this, data.group); } - if (data.hasOwnProperty('editable') && typeof data.editable === 'boolean') { - this.editable = data.editable; + if (data.hasOwnProperty('editable')){ + if (typeof data.editable === 'boolean') { + this.editable = { + updateTime: this.data.editable, + updateGroup: this.data.editable, + remove: this.data.editable + } + } + else if(typeof options.editable === 'object') { + this.editable = {}; + util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, data.editable); + } } this.data = data; @@ -182,10 +200,8 @@ Item.prototype._repaintDragCenter = function () { * @protected */ Item.prototype._repaintDeleteButton = function (anchor) { - var editable = (this.options.editable.remove && - this.options.editable.overrideItems) - || (this.data.editable === true && - !this.options.editable.overrideItems); + var editable = ((this.options.editable.overrideItems || this.editable == null) && this.options.editable.remove) || + (!this.options.editable.overrideItems && this.editable != null && this.editable.remove); if (this.selected && editable && !this.dom.deleteButton) { // create and show button