[Libreoffice-commits] online.git: loleaflet/src
Scott Clarke (via logerrit)
logerrit at kemper.freedesktop.org
Mon Aug 19 14:45:40 UTC 2019
loleaflet/src/control/Control.Menubar.js | 8 -
loleaflet/src/layer/AnnotationManager.js | 213 +++++++++++++++++++++++--------
loleaflet/src/unocommands.js | 11 -
3 files changed, 171 insertions(+), 61 deletions(-)
New commits:
commit 4071f38635099a328ff03292d9da4ec0652bb0f6
Author: Scott Clarke <scott.clarke at codethink.co.uk>
AuthorDate: Thu May 23 17:03:15 2019 +0100
Commit: Henry Castro <hcastro at collabora.com>
CommitDate: Mon Aug 19 16:45:22 2019 +0200
Add ability to show/hide resolved comments
Add 'View:Resolved Comments' menu item
Hide all comments in a thread when resolving them
Connect Show/Hide resolved annotations to the annotation manager
Change-Id: Ib646bdea3dfc30fde6a11aa13562db147afd7ae0
Co-authored-by: Jim MacArthur <jim.macarthur at codethink.co.uk>
Reviewed-on: https://gerrit.libreoffice.org/76758
Reviewed-by: Henry Castro <hcastro at collabora.com>
Tested-by: Henry Castro <hcastro at collabora.com>
diff --git a/loleaflet/src/control/Control.Menubar.js b/loleaflet/src/control/Control.Menubar.js
index d968685f5..3a845f926 100644
--- a/loleaflet/src/control/Control.Menubar.js
+++ b/loleaflet/src/control/Control.Menubar.js
@@ -63,7 +63,9 @@ L.Control.Menubar = L.Control.extend({
{name: _('Reset zoom'), id: 'zoomreset', type: 'action'},
{name: _('Show Ruler'), id: 'showruler', type: 'action'},
{type: 'separator'},
- {uno: '.uno:ControlCodes'}
+ {uno: '.uno:ControlCodes'},
+ {type: 'separator'},
+ {name: _UNO('.uno:ShowResolvedAnnotations', 'text'), id: 'showresolved', type: 'action'}
]
},
{name: _UNO('.uno:InsertMenu', 'text'), type: 'menu', menu: [
@@ -445,7 +447,7 @@ L.Control.Menubar = L.Control.extend({
'downloadas-pdf', 'downloadas-odt', 'downloadas-doc', 'downloadas-docx', 'downloadas-rtf', // file menu
'downloadas-odp', 'downloadas-ppt', 'downloadas-pptx', 'print', // file menu
'downloadas-ods', 'downloadas-xls', 'downloadas-xlsx', 'closedocument', // file menu
- 'fullscreen', 'zoomin', 'zoomout', 'zoomreset', // view menu
+ 'fullscreen', 'zoomin', 'zoomout', 'zoomreset', 'showresolved', // view menu
'about', 'keyboard-shortcuts' // help menu
]
},
@@ -765,6 +767,8 @@ L.Control.Menubar = L.Control.extend({
this._map.fire('postMessage', {msgId: 'UI_InsertGraphic'});
} else if (id === 'zoomin' && this._map.getZoom() < this._map.getMaxZoom()) {
this._map.zoomIn(1);
+ } else if (id === 'showresolved') {
+ this._map.showResolvedComments(item);
} else if (id === 'zoomout' && this._map.getZoom() > this._map.getMinZoom()) {
this._map.zoomOut(1);
} else if (id === 'zoomreset') {
diff --git a/loleaflet/src/layer/AnnotationManager.js b/loleaflet/src/layer/AnnotationManager.js
index fcd0abbd1..da1161f06 100644
--- a/loleaflet/src/layer/AnnotationManager.js
+++ b/loleaflet/src/layer/AnnotationManager.js
@@ -16,6 +16,7 @@ L.AnnotationManager = L.Class.extend({
initialize: function (map, options) {
this._map = map;
this._items = [];
+ this._hiddenItems = 0;
this._selected = null;
L.setOptions(this, options);
this._arrow = L.polyline([], {color: 'darkblue', weight: 1});
@@ -23,10 +24,10 @@ L.AnnotationManager = L.Class.extend({
this._map.on('AnnotationCancel', this._onAnnotationCancel, this);
this._map.on('AnnotationClick', this._onAnnotationClick, this);
this._map.on('AnnotationReply', this._onAnnotationReply, this);
- this._map.on('AnnotationResolve', this._onAnnotationResolve, this);
this._map.on('AnnotationSave', this._onAnnotationSave, this);
this._map.on('RedlineAccept', this._onRedlineAccept, this);
this._map.on('RedlineReject', this._onRedlineReject, this);
+ this._showResolved = false;
},
// Remove only text comments from the document (excluding change tracking comments)
@@ -126,6 +127,10 @@ L.AnnotationManager = L.Class.extend({
comment.avatar = this._map._viewInfoByUserName[comment.author].userextrainfo.avatar;
}
this._items.push(L.annotation(this._map.options.docBounds.getSouthEast(), comment).addTo(this._map));
+ this.updateResolvedState(this._items[this._items.length - 1]);
+ if (this._items[this._items.length - 1]._data.resolved === 'true') {
+ this._hiddenItems++;
+ }
}
if (this._items.length > 0) {
if (!ordered) {
@@ -210,7 +215,7 @@ L.AnnotationManager = L.Class.extend({
},
getBounds: function () {
- if (this._items.length <= 0)
+ if (this._items.length <= 0 || this._items.length === this._hiddenItems)
return null;
var allCommentsBounds;
@@ -283,7 +288,7 @@ L.AnnotationManager = L.Class.extend({
},
updateDocBounds: function () {
- if (this._items.length === 0) {
+ if (this._items.length === 0 || this._items.length === this._hiddenItems) {
this._map.fire('updatemaxbounds', {sizeChanged: true});
}
},
@@ -343,13 +348,15 @@ L.AnnotationManager = L.Class.extend({
idx = 0;
for (idx = 0; idx < commentThread.length; ++idx) {
- latLng = this._map.layerPointToLatLng(pt);
- (new L.PosAnimation()).run(commentThread[idx]._container, this._map.latLngToLayerPoint(latLng));
- commentThread[idx].setLatLng(latLng, /*skip check bounds*/ true);
- commentThread[idx].show();
+ if (commentThread[idx]._data.resolved !== 'true' || this._showResolved) {
+ latLng = this._map.layerPointToLatLng(pt);
+ (new L.PosAnimation()).run(commentThread[idx]._container, this._map.latLngToLayerPoint(latLng));
+ commentThread[idx].setLatLng(latLng, /*skip check bounds*/ true);
+ commentThread[idx].show();
- var commentBounds = commentThread[idx].getBounds();
- pt = pt.add([0, commentBounds.getSize().y]);
+ var commentBounds = commentThread[idx].getBounds();
+ pt = pt.add([0, commentBounds.getSize().y]);
+ }
}
},
@@ -383,13 +390,15 @@ L.AnnotationManager = L.Class.extend({
idx = 0;
for (idx = 0; idx < commentThread.length; ++idx) {
- latLng = this._map.layerPointToLatLng(pt);
- (new L.PosAnimation()).run(commentThread[idx]._container, this._map.latLngToLayerPoint(latLng));
- commentThread[idx].setLatLng(latLng, /*skip check bounds*/ true);
- commentThread[idx].show();
+ if (commentThread[idx]._data.resolved !== 'true' || this._showResolved) {
+ latLng = this._map.layerPointToLatLng(pt);
+ (new L.PosAnimation()).run(commentThread[idx]._container, this._map.latLngToLayerPoint(latLng));
+ commentThread[idx].setLatLng(latLng, /*skip check bounds*/ true);
+ commentThread[idx].show();
- var commentBounds = commentThread[idx].getBounds();
- pt = pt.add([0, commentBounds.getSize().y]);
+ var commentBounds = commentThread[idx].getBounds();
+ pt = pt.add([0, commentBounds.getSize().y]);
+ }
}
},
@@ -457,21 +466,23 @@ L.AnnotationManager = L.Class.extend({
// Adjust child comments too, if any
for (idx = selectIndexFirst + 1; idx <= selectIndexLast; idx++) {
- if (zoom) {
- this._items[idx]._data.anchorPix = this._map._docLayer._twipsToPixels(this._items[idx]._data.anchorPos.min);
+ if (this._items[idx]._data.resolved !== 'true' || this._showResolved) {
+ if (zoom) {
+ this._items[idx]._data.anchorPix = this._map._docLayer._twipsToPixels(this._items[idx]._data.anchorPos.min);
+ }
+ latlng = this._map.layerPointToLatLng(layoutBounds.getBottomLeft());
+ (new L.PosAnimation()).run(this._items[idx]._container, layoutBounds.getBottomLeft());
+ this._items[idx].setLatLng(latlng, /*skip check bounds*/ true);
+ var commentBounds = this._items[idx].getBounds();
+ layoutBounds.extend(layoutBounds.max.add([0, commentBounds.getSize().y]));
}
- latlng = this._map.layerPointToLatLng(layoutBounds.getBottomLeft());
- (new L.PosAnimation()).run(this._items[idx]._container, layoutBounds.getBottomLeft());
- this._items[idx].setLatLng(latlng, /*skip check bounds*/ true);
-
- var commentBounds = this._items[idx].getBounds();
- layoutBounds.extend(layoutBounds.max.add([0, commentBounds.getSize().y]));
}
layoutBounds.min = layoutBounds.min.add([this.options.marginX, 0]);
layoutBounds.max = layoutBounds.max.add([this.options.marginX, 0]);
layoutBounds.extend(layoutBounds.min.subtract([0, this.options.marginY]));
layoutBounds.extend(layoutBounds.max.add([0, this.options.marginY]));
+
for (idx = selectIndexFirst - 1; idx >= 0;) {
var commentThread = [];
var tmpIdx = idx;
@@ -479,15 +490,23 @@ L.AnnotationManager = L.Class.extend({
if (zoom) {
this._items[idx]._data.anchorPix = this._map._docLayer._twipsToPixels(this._items[idx]._data.anchorPos.min);
}
- commentThread.push(this._items[tmpIdx]);
+ if (this._items[tmpIdx]._data.resolved !== 'true' || this._showResolved) {
+ commentThread.push(this._items[tmpIdx]);
+ }
+
tmpIdx = tmpIdx - 1;
} while (tmpIdx >= 0 && this._items[tmpIdx]._data.id === this._items[tmpIdx + 1]._data.parent);
- commentThread.reverse();
- // All will have some anchor position
- this.layoutUp(commentThread, this._map.unproject(L.point(topRight.x, commentThread[0]._data.anchorPix.y)), layoutBounds);
- idx = idx - commentThread.length;
+ if (commentThread.length > 0) {
+ commentThread.reverse();
+ // All will have some anchor position
+ this.layoutUp(commentThread, this._map.unproject(L.point(topRight.x, commentThread[0]._data.anchorPix.y)), layoutBounds);
+ idx = idx - commentThread.length;
+ } else {
+ idx = tmpIdx;
+ }
}
+
for (idx = selectIndexLast + 1; idx < this._items.length;) {
commentThread = [];
tmpIdx = idx;
@@ -495,20 +514,29 @@ L.AnnotationManager = L.Class.extend({
if (zoom) {
this._items[idx]._data.anchorPix = this._map._docLayer._twipsToPixels(this._items[idx]._data.anchorPos.min);
}
- commentThread.push(this._items[tmpIdx]);
+ if (this._items[tmpIdx]._data.resolved !== 'true' || this._showResolved) {
+ commentThread.push(this._items[tmpIdx]);
+ }
+
tmpIdx = tmpIdx + 1;
} while (tmpIdx < this._items.length && this._items[tmpIdx]._data.parent === this._items[tmpIdx - 1]._data.id);
+
// All will have some anchor position
- this.layoutDown(commentThread, this._map.unproject(L.point(topRight.x, commentThread[0]._data.anchorPix.y)), layoutBounds);
- idx = idx + commentThread.length;
+ if (commentThread.length > 0) {
+ this.layoutDown(commentThread, this._map.unproject(L.point(topRight.x, commentThread[0]._data.anchorPix.y)), layoutBounds);
+ idx = idx + commentThread.length;
+ } else {
+ idx = tmpIdx;
+ }
}
if (!this._selected.isEdit()) {
this._selected.show();
}
- } else if (this._items.length > 0) {
+ } else if (this._items.length > 0) { // If nothing is selected, but there are comments:
point = this._map.latLngToLayerPoint(this._map.unproject(L.point(topRight.x, this._items[0]._data.anchorPix.y)));
layoutBounds = L.bounds(point, point);
+ // Pass over all comments present
for (idx = 0; idx < this._items.length;) {
commentThread = [];
tmpIdx = idx;
@@ -516,12 +544,20 @@ L.AnnotationManager = L.Class.extend({
if (zoom) {
this._items[tmpIdx]._data.anchorPix = this._map._docLayer._twipsToPixels(this._items[tmpIdx]._data.anchorPos.min);
}
- commentThread.push(this._items[tmpIdx]);
+ // Add this item to the list of comments.
+ if (this._items[tmpIdx]._data.resolved !== 'true' || this._showResolved) {
+ commentThread.push(this._items[tmpIdx]);
+ }
tmpIdx = tmpIdx + 1;
+ // Continue this loop, until we reach the last item, or an item which is not a direct descendant of the previous item.
} while (tmpIdx < this._items.length && this._items[tmpIdx]._data.parent === this._items[tmpIdx - 1]._data.id);
- this.layoutDown(commentThread, this._map.unproject(L.point(topRight.x, commentThread[0]._data.anchorPix.y)), layoutBounds);
- idx = idx + commentThread.length;
+ if (commentThread.length > 0) {
+ this.layoutDown(commentThread, this._map.unproject(L.point(topRight.x, commentThread[0]._data.anchorPix.y)), layoutBounds);
+ idx = idx + commentThread.length;
+ } else {
+ idx = tmpIdx;
+ }
}
}
this._checkBounds();
@@ -546,6 +582,8 @@ L.AnnotationManager = L.Class.extend({
if (comment.parent && comment.parent > '0') {
var parentIdx = this.getIndexOf(comment.parent);
this._items.splice(parentIdx + 1, 0, annotation);
+ this.updateResolvedState(annotation);
+ this.showHideComment(annotation);
} else {
this._items.push(annotation);
}
@@ -575,7 +613,6 @@ L.AnnotationManager = L.Class.extend({
},
resolve: function (annotation) {
- // This is called by WriteTileLayer
var comment = {
Id: {
type: 'string',
@@ -583,8 +620,36 @@ L.AnnotationManager = L.Class.extend({
}
};
this._map.sendUnoCommand('.uno:ResolveComment', comment);
- annotation.update();
- this.update();
+ },
+
+ updateResolvedState: function (annotation) {
+ var threadIndexFirst = this.getRootIndexOf(annotation._data.id);
+ if (this._items[threadIndexFirst]._data.resolved !== annotation._data.resolved) {
+ annotation._data.resolved = this._items[threadIndexFirst]._data.resolved;
+ annotation.update();
+ this.update();
+ }
+ },
+
+ showHideComment: function (annotation) {
+ // This manually shows/hides comments
+ if (!this._showResolved) {
+ if (annotation.isVisible() && annotation._data.resolved === 'true') {
+ if (this._selected == annotation) {
+ this.unselect();
+ }
+ annotation.hide();
+ this._hiddenItems++;
+ annotation.update();
+ } else if (!annotation.isVisible() && annotation._data.resolved === 'false') {
+ annotation.show();
+ this._hiddenItems--;
+ annotation.update();
+ }
+ this.layout();
+ this.update();
+ this.updateDocBounds();
+ }
},
remove: function (id) {
@@ -711,6 +776,26 @@ L.AnnotationManager = L.Class.extend({
modified.update();
this.update();
}
+ } else if (action === 'Resolve') {
+ id = changetrack ? 'change-' + obj.redline.index : obj.comment.id;
+ var resolved = this.getItem(id);
+ if (resolved) {
+ var resolvedObj;
+ if (changetrack) {
+ if (!this.adjustRedLine(obj.redline)) {
+ // something wrong in this redline
+ return;
+ }
+ resolvedObj = obj.redline;
+ } else {
+ this.adjustComment(obj.comment);
+ resolvedObj = obj.comment;
+ }
+ resolved.setData(resolvedObj);
+ resolved.update();
+ this.showHideComment(resolved);
+ this.update();
+ }
}
},
@@ -747,22 +832,6 @@ L.AnnotationManager = L.Class.extend({
this._map.focus();
},
- _onAnnotationResolve: function (e) {
- var comment = {
- Id: {
- type: 'string',
- value: e.annotation._data.id
- },
- Text: {
- type: 'string',
- value: e.annotation._data.reply
- }
- };
- this._map.sendUnoCommand('.uno:ResolveComment', comment);
- this.unselect();
- this._map.focus();
- },
-
_onAnnotationSave: function (e) {
var comment;
if (e.annotation._data.id === 'new') {
@@ -881,6 +950,30 @@ L.AnnotationManager = L.Class.extend({
this._items[idx]._updateScaling(scaleFactor, this._initialLayoutData);
}
}
+ },
+
+ setViewResolved: function(state) {
+ this._showResolved = state;
+
+ for (var idx = 0; idx < this._items.length;idx++) {
+ if (this._items[idx]._data.resolved === 'true') {
+ if (state==false) {
+ if (this._selected == this._items[idx]) {
+ this.unselect();
+ }
+ this._items[idx].hide();
+ this._hiddenItems++;
+ } else {
+ this._items[idx].show();
+ this._hiddenItems--;
+ }
+ }
+ this._items[idx].update();
+ }
+ this.layout();
+ this.update();
+ if (state === false)
+ this.updateDocBounds();
}
});
@@ -900,6 +993,18 @@ L.Map.include({
id: 'new', // 'new' only when added by us
avatar: avatar
});
+ },
+
+ showResolvedComments: function(item) {
+ var unoCommand = '.uno:ShowResolvedAnnotations';
+ var on = $(item).hasClass('lo-menu-item-checked');
+ this.sendUnoCommand(unoCommand);
+ this._docLayer._annotations.setViewResolved(!on);
+ if (on) {
+ $(item).removeClass('lo-menu-item-checked');
+ } else {
+ $(item).addClass('lo-menu-item-checked');
+ }
}
});
diff --git a/loleaflet/src/unocommands.js b/loleaflet/src/unocommands.js
index bfef61bec..005f666b9 100644
--- a/loleaflet/src/unocommands.js
+++ b/loleaflet/src/unocommands.js
@@ -115,13 +115,13 @@ var unoCommandsArray = {
InsertField:{text:{menu:_('~More Fields...'),},},
InsertFootnote:{text:{menu:_('~Footnote'),},},
InsertGraphic:{global:{context:_('Insert Image...'),menu:_('~Image...'),},},
- InsertHardHyphen:{global:{menu:_('Non-br~eaking Hyphen'),},},
+ InsertHardHyphen:{global:{menu:_('Insert non-br~eaking hyphen'),},},
InsertHeaderFooterMenu:{text:{menu:_('He~ader and Footer'),},},
InsertIndexesEntry:{text:{menu:_('~Index Entry...'),},},
InsertLRM:{global:{menu:_('~Left-to-right Mark'),},},
InsertMenu:{global:{menu:_('~Insert'),},},
InsertNeutralParagraph:{text:{menu:_('Insert Unnumbered Entry'),},},
- InsertNonBreakingSpace:{global:{menu:_('~Non-breaking Space'),},},
+ InsertNonBreakingSpace:{global:{menu:_('Insert ~non-breaking space'),},},
InsertObjectChart:{global:{context:_('Insert Chart'),menu:_('~Chart...'),},},
InsertPageCountField:{text:{menu:_('Page ~Count'),},},
InsertPageFooter:{text:{menu:_('Foote~r'),},},
@@ -135,7 +135,7 @@ var unoCommandsArray = {
InsertRowsMenu:{spreadsheet:{menu:_('Insert ~Rows'),},},
InsertSection:{text:{menu:_('Se~ction...'),},},
InsertSlide:{presentation:{menu:_('~New Slide'),},},
- InsertSoftHyphen:{global:{menu:_('S~oft Hyphen'),},},
+ InsertSoftHyphen:{global:{menu:_('Insert s~oft Hyphen'),},},
InsertSymbol:{global:{context:_('Insert Special Character'),menu:_('S~pecial Character...'),},},
InsertTimeField:{global:{menu:_('Time Field'),},text:{menu:_('~Time'),},},
InsertTitleField:{text:{menu:_('T~itle'),},},
@@ -185,11 +185,10 @@ var unoCommandsArray = {
Redo:{global:{menu:_('~Redo'),},},
RejectAllTrackedChanges:{text:{menu:_('Reject All'),},},
Remove:{spreadsheet:{menu:_('~Delete Sheet...'),},},
- RemoveHyperlink:{text:{menu:_('Remove Hyperlink'),},},
+ RemoveHyperlink:{global:{menu:_('~Remove Hyperlink'),},},
RemoveTableOf:{text:{menu:_('Delete index'),},},
RenameTable:{spreadsheet:{menu:_('~Rename Sheet...'),},},
ReplyComment:{global:{menu:_('Reply Comment'),},},
- ResolveComment:{global:{menu:_('Resolve Comment'),},},
ResetAttributes:{global:{menu:_('~Clear Direct Formatting'),},spreadsheet:{context:_('Clear Direct Formatting'),menu:_('Clear ~Direct Formatting'),},text:{context:_('Clear Direct Formatting'),menu:_('Clear ~Direct Formatting'),},},
RightPara:{global:{context:_('Align Right'),menu:_('Right'),},},
RotateLeft:{text:{menu:_('Rotate 90° ~Left'),},},
@@ -216,9 +215,11 @@ var unoCommandsArray = {
Show:{spreadsheet:{menu:_('~Show Sheet...'),},},
ShowColumn:{spreadsheet:{context:_('S~how Columns'),menu:_('~Show'),},},
ShowDetail:{global:{menu:_('~Show Details'),},},
+ ShowResolvedAnnotations:{text:{menu:_('Resolved Comments'),},},
ShowRow:{spreadsheet:{context:_('Sho~w Rows'),menu:_('~Show'),},},
ShowTrackedChanges:{text:{menu:_('~Show'),},},
Shrink:{global:{menu:_('Decrease Size'),},},
+ Sidebar:{global:{menu:_('Sidebar'),},},
SlideMenu:{presentation:{menu:_('S~lide'),},},
SmallCaps:{global:{menu:_('Small capitals'),},},
SortAscending:{spreadsheet:{menu:_('Sort Ascending'),},},
More information about the Libreoffice-commits
mailing list