diff --git a/docs/timeline/index.html b/docs/timeline/index.html index b7a14a1c..a547e993 100644 --- a/docs/timeline/index.html +++ b/docs/timeline/index.html @@ -339,7 +339,7 @@ var items = new vis.DataSet([
timeline.editable.overrideItems
is false).false
false
false
true
will NOT override horizontalScroll
. The scroll event will be vertically ignored, but a vertical scrollbar will be visible
+ true
will NOT override horizontalScroll
. The scroll event will be vertically ignored, but a vertical scrollbar will be visible
- Editing can be enabled/disabled for specific items. Setting the property editable
to true
or false
on a data item will override the timeline option.
+ Editing can be enabled/disabled for specific items. Setting the property editable
to true
or false
on a data item will override the timeline option except when timeline.editable.overrideItems
is set to true
.
diff --git a/examples/timeline/editing/overrideEditingItems.html b/examples/timeline/editing/overrideEditingItems.html new file mode 100644 index 00000000..c80f8b6b --- /dev/null +++ b/examples/timeline/editing/overrideEditingItems.html @@ -0,0 +1,99 @@ + + + ++ + + + diff --git a/lib/timeline/component/ItemSet.js b/lib/timeline/component/ItemSet.js index 9329263a..89348f93 100644 --- a/lib/timeline/component/ItemSet.js +++ b/lib/timeline/component/ItemSet.js @@ -48,7 +48,8 @@ function ItemSet(body, options) { updateTime: false, updateGroup: false, add: false, - remove: false + remove: false, + overrideItems: false }, groupEditable: { @@ -356,16 +357,17 @@ ItemSet.prototype.setOptions = function(options) { if ('editable' in options) { if (typeof options.editable === 'boolean') { - this.options.editable.updateTime = options.editable; - this.options.editable.updateGroup = options.editable; - this.options.editable.add = options.editable; - this.options.editable.remove = options.editable; + this.options.editable.updateTime = options.editable; + this.options.editable.updateGroup = options.editable; + this.options.editable.add = options.editable; + this.options.editable.remove = options.editable; + this.options.editable.overrideItems = options.editable; } else if (typeof options.editable === 'object') { - util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); + util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove', 'overrideItems'], this.options.editable, options.editable); } } - + if ('groupEditable' in options) { if (typeof options.groupEditable === 'boolean') { this.options.groupEditable.order = options.groupEditable; @@ -1216,14 +1218,15 @@ ItemSet.prototype._onDragStart = function (event) { if (item && (item.selected || this.options.itemsAlwaysDraggable)) { - if (!this.options.editable.updateTime && - !this.options.editable.updateGroup && - !item.editable) { + if (this.options.editable.overrideItems && + !this.options.editable.updateTime && + !this.options.editable.updateGroup) { return; } // override options.editable - if (item.editable === false) { + if ((item.editable === false || !item.editable) + && !this.options.editable.overrideItems) { return; } @@ -1358,7 +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; + var updateGroupAllowed = me.options.editable.updateGroup || + (!this.options.editable.overrideItems && selectedItem.editable === true); var newGroupBase = null; if (updateGroupAllowed && selectedItem) { if (selectedItem.data.group != undefined) { @@ -1384,12 +1388,12 @@ ItemSet.prototype._onDrag = function (event) { } var itemData = this._cloneItemData(props.item.data); // clone the data - if (props.item.editable === false) { + if (props.item.editable === false && !me.options.editable.overrideItems) { return; } - var updateTimeAllowed = me.options.editable.updateTime || - props.item.editable === true; + var updateTimeAllowed = me.options.editable.updateTime || ( + props.item.editable === true && !me.options.editable.overrideItems); if (updateTimeAllowed) { if (props.dragLeft) { // drag left side of a range item diff --git a/lib/timeline/component/item/Item.js b/lib/timeline/component/item/Item.js index 79535a93..a4b49da5 100644 --- a/lib/timeline/component/item/Item.js +++ b/lib/timeline/component/item/Item.js @@ -146,9 +146,10 @@ Item.prototype.repositionY = function() { * @protected */ Item.prototype._repaintDeleteButton = function (anchor) { - var editable = (this.options.editable.remove || - this.data.editable === true) && - this.data.editable !== false; + var editable = (this.options.editable.remove && + this.options.editable.overrideItems) + || (this.data.editable === true && + !this.options.editable.overrideItems); if (this.selected && editable && !this.dom.deleteButton) { // create and show button diff --git a/lib/timeline/optionsTimeline.js b/lib/timeline/optionsTimeline.js index 2e94ef2e..aadcf2ff 100644 --- a/lib/timeline/optionsTimeline.js +++ b/lib/timeline/optionsTimeline.js @@ -36,6 +36,7 @@ let allOptions = { remove: {boolean, 'undefined': 'undefined'}, updateGroup: {boolean, 'undefined': 'undefined'}, updateTime: {boolean, 'undefined': 'undefined'}, + overrideItems: {boolean, 'undefined': 'undefined'}, __type__: {boolean, object} }, end: {number, date, string, moment},Timeline | Individual editable items + + + + + + + + + +Specify individual items to be editable or readonly. Toggle edit options and override behavior from timeline.editable
+ + ++