1054 lines
48 KiB
JavaScript
1054 lines
48 KiB
JavaScript
/*
|
|
* (c) Copyright Ascensio System SIA 2010-2015
|
|
*
|
|
* This program is a free software product. You can redistribute it and/or
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
* of any third-party rights.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
*
|
|
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
|
* EU, LV-1021.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU AGPL version 3.
|
|
*
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
*
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
* well as technical writing content are licensed under the terms of the
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
*
|
|
*/
|
|
if (Common === undefined) {
|
|
var Common = {};
|
|
}
|
|
Common.Controllers = Common.Controllers || {};
|
|
define(["core", "common/main/lib/model/Comment", "common/main/lib/collection/Comments", "common/main/lib/view/Comments"], function () {
|
|
function buildCommentData() {
|
|
if (typeof asc_CCommentDataWord !== "undefined") {
|
|
return new asc_CCommentDataWord(null);
|
|
}
|
|
return new asc_CCommentData(null);
|
|
}
|
|
Common.Controllers.Comments = Backbone.Controller.extend(_.extend({
|
|
models: [],
|
|
collections: ["Common.Collections.Comments"],
|
|
views: ["Common.Views.Comments", "Common.Views.CommentsPopover"],
|
|
sdkViewName: "#id_main",
|
|
subEditStrings: {},
|
|
filter: undefined,
|
|
hintmode: false,
|
|
isSelectedComment: false,
|
|
uids: [],
|
|
oldUids: [],
|
|
isDummyComment: false,
|
|
initialize: function () {
|
|
this.addListeners({
|
|
"Common.Views.Comments": {
|
|
"comment:add": _.bind(this.onCreateComment, this),
|
|
"comment:change": _.bind(this.onChangeComment, this),
|
|
"comment:remove": _.bind(this.onRemoveComment, this),
|
|
"comment:resolve": _.bind(this.onResolveComment, this),
|
|
"comment:show": _.bind(this.onShowComment, this),
|
|
"comment:addReply": _.bind(this.onAddReplyComment, this),
|
|
"comment:changeReply": _.bind(this.onChangeReplyComment, this),
|
|
"comment:removeReply": _.bind(this.onRemoveReplyComment, this),
|
|
"comment:editReply": _.bind(this.onShowEditReplyComment, this),
|
|
"comment:closeEditing": _.bind(this.closeEditing, this),
|
|
"comment:disableHint": _.bind(this.disableHint, this),
|
|
"comment:addDummyComment": _.bind(this.onAddDummyComment, this)
|
|
}
|
|
});
|
|
Common.NotificationCenter.on("comments:updatefilter", _.bind(this.onUpdateFilter, this));
|
|
},
|
|
onLaunch: function () {
|
|
this.collection = this.getApplication().getCollection("Common.Collections.Comments");
|
|
if (this.collection) {
|
|
this.collection.comparator = function (collection) {
|
|
return -collection.get("time");
|
|
};
|
|
}
|
|
this.popoverComments = new Common.Collections.Comments();
|
|
if (this.popoverComments) {
|
|
this.popoverComments.comparator = function (collection) {
|
|
return -collection.get("time");
|
|
};
|
|
}
|
|
this.view = this.createView("Common.Views.Comments", {
|
|
store: this.collection,
|
|
popoverComments: this.popoverComments
|
|
});
|
|
this.view.render();
|
|
this.bindViewEvents(this.view, this.events);
|
|
},
|
|
setConfig: function (data, api) {
|
|
this.setApi(api);
|
|
if (data) {
|
|
this.currentUserId = data.config.user.id;
|
|
this.currentUserName = data.config.user.name;
|
|
this.sdkViewName = data["sdkviewname"] || this.sdkViewName;
|
|
this.hintmode = data["hintmode"] || false;
|
|
}
|
|
},
|
|
setApi: function (api) {
|
|
if (api) {
|
|
this.api = api;
|
|
this.api.asc_registerCallback("asc_onAddComment", _.bind(this.onApiAddComment, this));
|
|
this.api.asc_registerCallback("asc_onAddComments", _.bind(this.onApiAddComments, this));
|
|
this.api.asc_registerCallback("asc_onRemoveComment", _.bind(this.onApiRemoveComment, this));
|
|
this.api.asc_registerCallback("asc_onChangeComments", _.bind(this.onChangeComments, this));
|
|
this.api.asc_registerCallback("asc_onRemoveComments", _.bind(this.onRemoveComments, this));
|
|
this.api.asc_registerCallback("asc_onChangeCommentData", _.bind(this.onApiChangeCommentData, this));
|
|
this.api.asc_registerCallback("asc_onLockComment", _.bind(this.onApiLockComment, this));
|
|
this.api.asc_registerCallback("asc_onUnLockComment", _.bind(this.onApiUnLockComment, this));
|
|
this.api.asc_registerCallback("asc_onShowComment", _.bind(this.onApiShowComment, this));
|
|
this.api.asc_registerCallback("asc_onHideComment", _.bind(this.onApiHideComment, this));
|
|
this.api.asc_registerCallback("asc_onUpdateCommentPosition", _.bind(this.onApiUpdateCommentPosition, this));
|
|
this.api.asc_registerCallback("asc_onDocumentPlaceChanged", _.bind(this.onDocumentPlaceChanged, this));
|
|
}
|
|
},
|
|
setMode: function (mode) {
|
|
this.mode = mode;
|
|
return this;
|
|
},
|
|
onCreateComment: function (panel, commentVal, editMode, hidereply, documentFlag) {
|
|
if (this.api && commentVal && commentVal.length > 0) {
|
|
var comment = buildCommentData();
|
|
if (comment) {
|
|
this.showPopover = true;
|
|
this.editPopover = editMode ? true : false;
|
|
this.hidereply = hidereply;
|
|
this.isSelectedComment = false;
|
|
this.uids = [];
|
|
comment.asc_putText(commentVal);
|
|
comment.asc_putTime(this.utcDateToString(new Date()));
|
|
comment.asc_putUserId(this.currentUserId);
|
|
comment.asc_putUserName(this.currentUserName);
|
|
comment.asc_putSolved(false);
|
|
if (!_.isUndefined(comment.asc_putDocumentFlag)) {
|
|
comment.asc_putDocumentFlag(documentFlag);
|
|
}
|
|
this.api.asc_addComment(comment);
|
|
this.view.showEditContainer(false);
|
|
}
|
|
}
|
|
this.view.txtComment.focus();
|
|
},
|
|
onRemoveComment: function (id) {
|
|
if (this.api && id) {
|
|
this.api.asc_removeComment(id);
|
|
}
|
|
},
|
|
onResolveComment: function (uid, id) {
|
|
var t = this,
|
|
reply = null,
|
|
addReply = null,
|
|
ascComment = buildCommentData(),
|
|
comment = t.findComment(uid, id);
|
|
if (_.isUndefined(uid)) {
|
|
uid = comment.get("uid");
|
|
}
|
|
if (ascComment && comment) {
|
|
ascComment.asc_putText(comment.get("comment"));
|
|
ascComment.asc_putQuoteText(comment.get("quote"));
|
|
ascComment.asc_putTime(t.utcDateToString(new Date(comment.get("time"))));
|
|
ascComment.asc_putUserId(t.currentUserId);
|
|
ascComment.asc_putUserName(t.currentUserName);
|
|
ascComment.asc_putSolved(!comment.get("resolved"));
|
|
if (!_.isUndefined(ascComment.asc_putDocumentFlag)) {
|
|
ascComment.asc_putDocumentFlag(comment.get("unattached"));
|
|
}
|
|
reply = comment.get("replys");
|
|
if (reply && reply.length) {
|
|
reply.forEach(function (reply) {
|
|
addReply = buildCommentData();
|
|
if (addReply) {
|
|
addReply.asc_putText(reply.get("reply"));
|
|
addReply.asc_putTime(t.utcDateToString(new Date(reply.get("time"))));
|
|
addReply.asc_putUserId(reply.get("userid"));
|
|
addReply.asc_putUserName(reply.get("username"));
|
|
ascComment.asc_addReply(addReply);
|
|
}
|
|
});
|
|
}
|
|
t.api.asc_changeComment(uid, ascComment);
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
onShowComment: function (id, selected) {
|
|
var comment = this.findComment(id, undefined);
|
|
if (comment) {
|
|
if (null !== comment.get("quote")) {
|
|
if (this.api) {
|
|
if (this.hintmode) {
|
|
this.animate = true;
|
|
if (comment.get("unattached")) {
|
|
if (this.getPopover()) {
|
|
this.getPopover().hide();
|
|
return;
|
|
}
|
|
}
|
|
} else {
|
|
var model = this.popoverComments.findWhere({
|
|
uid: id
|
|
});
|
|
if (model) {
|
|
return;
|
|
}
|
|
}
|
|
if (!_.isUndefined(selected) && this.hintmode) {
|
|
this.isSelectedComment = selected;
|
|
}
|
|
this.api.asc_selectComment(id);
|
|
this.api.asc_showComment(id, false);
|
|
}
|
|
} else {
|
|
if (this.hintmode) {
|
|
this.api.asc_selectComment(id);
|
|
}
|
|
if (this.getPopover()) {
|
|
this.getPopover().hide();
|
|
}
|
|
this.isSelectedComment = false;
|
|
this.uids = [];
|
|
}
|
|
}
|
|
},
|
|
onChangeComment: function (id, commentVal) {
|
|
if (commentVal && commentVal.length > 0) {
|
|
var t = this,
|
|
comment2 = null,
|
|
reply = null,
|
|
addReply = null,
|
|
ascComment = buildCommentData(),
|
|
comment = t.findComment(id);
|
|
if (comment && ascComment) {
|
|
ascComment.asc_putText(commentVal);
|
|
ascComment.asc_putQuoteText(comment.get("quote"));
|
|
ascComment.asc_putTime(t.utcDateToString(new Date(comment.get("time"))));
|
|
ascComment.asc_putUserId(t.currentUserId);
|
|
ascComment.asc_putUserName(t.currentUserName);
|
|
ascComment.asc_putSolved(comment.get("resolved"));
|
|
if (!_.isUndefined(ascComment.asc_putDocumentFlag)) {
|
|
ascComment.asc_putDocumentFlag(comment.get("unattached"));
|
|
}
|
|
comment.set("editTextInPopover", false);
|
|
comment2 = t.findPopupComment(id);
|
|
if (comment2) {
|
|
comment2.set("editTextInPopover", false);
|
|
}
|
|
if (t.subEditStrings[id]) {
|
|
delete t.subEditStrings[id];
|
|
}
|
|
if (t.subEditStrings[id + "-R"]) {
|
|
delete t.subEditStrings[id + "-R"];
|
|
}
|
|
reply = comment.get("replys");
|
|
if (reply && reply.length) {
|
|
reply.forEach(function (reply) {
|
|
addReply = buildCommentData();
|
|
if (addReply) {
|
|
addReply.asc_putText(reply.get("reply"));
|
|
addReply.asc_putTime(t.utcDateToString(new Date(reply.get("time"))));
|
|
addReply.asc_putUserId(reply.get("userid"));
|
|
addReply.asc_putUserName(reply.get("username"));
|
|
ascComment.asc_addReply(addReply);
|
|
}
|
|
});
|
|
}
|
|
t.api.asc_changeComment(id, ascComment);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
onChangeReplyComment: function (id, replyId, replyVal) {
|
|
if (replyVal && replyVal.length > 0) {
|
|
var me = this,
|
|
reply = null,
|
|
addReply = null,
|
|
ascComment = buildCommentData(),
|
|
comment = me.findComment(id);
|
|
if (ascComment && comment) {
|
|
ascComment.asc_putText(comment.get("comment"));
|
|
ascComment.asc_putQuoteText(comment.get("quote"));
|
|
ascComment.asc_putTime(me.utcDateToString(new Date(comment.get("time"))));
|
|
ascComment.asc_putUserId(comment.get("userid"));
|
|
ascComment.asc_putUserName(comment.get("username"));
|
|
ascComment.asc_putSolved(comment.get("resolved"));
|
|
if (!_.isUndefined(ascComment.asc_putDocumentFlag)) {
|
|
ascComment.asc_putDocumentFlag(comment.get("unattached"));
|
|
}
|
|
reply = comment.get("replys");
|
|
if (reply && reply.length) {
|
|
reply.forEach(function (reply) {
|
|
addReply = buildCommentData();
|
|
if (addReply) {
|
|
if (reply.get("id") === replyId && !_.isUndefined(replyVal)) {
|
|
addReply.asc_putText(replyVal);
|
|
addReply.asc_putUserId(me.currentUserId);
|
|
addReply.asc_putUserName(me.currentUserName);
|
|
} else {
|
|
addReply.asc_putText(reply.get("reply"));
|
|
addReply.asc_putUserId(reply.get("userid"));
|
|
addReply.asc_putUserName(reply.get("username"));
|
|
}
|
|
addReply.asc_putTime(me.utcDateToString(new Date(reply.get("time"))));
|
|
ascComment.asc_addReply(addReply);
|
|
}
|
|
});
|
|
}
|
|
me.api.asc_changeComment(id, ascComment);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
onAddReplyComment: function (id, replyVal) {
|
|
if (replyVal.length > 0) {
|
|
var me = this,
|
|
uid = null,
|
|
reply = null,
|
|
addReply = null,
|
|
ascComment = buildCommentData(),
|
|
comment = me.findComment(id);
|
|
if (ascComment && comment) {
|
|
uid = comment.get("uid");
|
|
if (uid) {
|
|
if (me.subEditStrings[uid]) {
|
|
delete me.subEditStrings[uid];
|
|
}
|
|
if (me.subEditStrings[uid + "-R"]) {
|
|
delete me.subEditStrings[uid + "-R"];
|
|
}
|
|
comment.set("showReplyInPopover", false);
|
|
}
|
|
ascComment.asc_putText(comment.get("comment"));
|
|
ascComment.asc_putQuoteText(comment.get("quote"));
|
|
ascComment.asc_putTime(me.utcDateToString(new Date(comment.get("time"))));
|
|
ascComment.asc_putUserId(comment.get("userid"));
|
|
ascComment.asc_putUserName(comment.get("username"));
|
|
ascComment.asc_putSolved(comment.get("resolved"));
|
|
if (!_.isUndefined(ascComment.asc_putDocumentFlag)) {
|
|
ascComment.asc_putDocumentFlag(comment.get("unattached"));
|
|
}
|
|
reply = comment.get("replys");
|
|
if (reply && reply.length) {
|
|
reply.forEach(function (reply) {
|
|
addReply = buildCommentData();
|
|
if (addReply) {
|
|
addReply.asc_putText(reply.get("reply"));
|
|
addReply.asc_putTime(me.utcDateToString(new Date(reply.get("time"))));
|
|
addReply.asc_putUserId(reply.get("userid"));
|
|
addReply.asc_putUserName(reply.get("username"));
|
|
ascComment.asc_addReply(addReply);
|
|
}
|
|
});
|
|
}
|
|
addReply = buildCommentData();
|
|
if (addReply) {
|
|
addReply.asc_putText(replyVal);
|
|
addReply.asc_putTime(me.utcDateToString(new Date()));
|
|
addReply.asc_putUserId(me.currentUserId);
|
|
addReply.asc_putUserName(me.currentUserName);
|
|
ascComment.asc_addReply(addReply);
|
|
me.api.asc_changeComment(id, ascComment);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
onRemoveReplyComment: function (id, replyId) {
|
|
if (!_.isUndefined(id) && !_.isUndefined(replyId)) {
|
|
var me = this,
|
|
replies = null,
|
|
addReply = null,
|
|
ascComment = buildCommentData(),
|
|
comment = me.findComment(id);
|
|
if (ascComment && comment) {
|
|
ascComment.asc_putText(comment.get("comment"));
|
|
ascComment.asc_putQuoteText(comment.get("quote"));
|
|
ascComment.asc_putTime(me.utcDateToString(new Date(comment.get("time"))));
|
|
ascComment.asc_putUserId(comment.get("userid"));
|
|
ascComment.asc_putUserName(comment.get("username"));
|
|
ascComment.asc_putSolved(comment.get("resolved"));
|
|
if (!_.isUndefined(ascComment.asc_putDocumentFlag)) {
|
|
ascComment.asc_putDocumentFlag(comment.get("unattached"));
|
|
}
|
|
replies = comment.get("replys");
|
|
if (replies && replies.length) {
|
|
replies.forEach(function (reply) {
|
|
if (reply.get("id") !== replyId) {
|
|
addReply = buildCommentData();
|
|
if (addReply) {
|
|
addReply.asc_putText(reply.get("reply"));
|
|
addReply.asc_putTime(me.utcDateToString(new Date(reply.get("time"))));
|
|
addReply.asc_putUserId(reply.get("userid"));
|
|
addReply.asc_putUserName(reply.get("username"));
|
|
ascComment.asc_addReply(addReply);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
me.api.asc_changeComment(id, ascComment);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
onShowEditReplyComment: function (id, replyId, inpopover) {
|
|
var i, model, repliesSrc, repliesCopy;
|
|
if (!_.isUndefined(id) && !_.isUndefined(replyId)) {
|
|
if (inpopover) {
|
|
model = this.popoverComments.findWhere({
|
|
uid: id
|
|
});
|
|
if (model) {
|
|
repliesSrc = model.get("replys");
|
|
repliesCopy = _.clone(model.get("replys"));
|
|
if (repliesCopy) {
|
|
for (i = 0; i < repliesCopy.length; ++i) {
|
|
if (replyId === repliesCopy[i].get("id")) {
|
|
repliesCopy[i].set("editTextInPopover", true);
|
|
repliesSrc.length = 0;
|
|
model.set("replys", repliesCopy);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
model = this.collection.findWhere({
|
|
uid: id
|
|
});
|
|
if (model) {
|
|
repliesSrc = model.get("replys");
|
|
repliesCopy = _.clone(model.get("replys"));
|
|
if (repliesCopy) {
|
|
for (i = 0; i < repliesCopy.length; ++i) {
|
|
if (replyId === repliesCopy[i].get("id")) {
|
|
repliesCopy[i].set("editText", true);
|
|
repliesSrc.length = 0;
|
|
model.set("replys", repliesCopy);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
onUpdateFilter: function (filter, applyOnly) {
|
|
if (filter) {
|
|
this.filter = {
|
|
property: filter.property,
|
|
value: filter.value
|
|
};
|
|
if (!applyOnly) {
|
|
if (this.getPopover()) {
|
|
this.getPopover().hide();
|
|
}
|
|
}
|
|
var t = this,
|
|
endComment = null;
|
|
this.collection.each(function (model) {
|
|
var prop = model.get(t.filter.property);
|
|
if (prop) {
|
|
model.set("hide", (null === prop.match(t.filter.value)));
|
|
}
|
|
if (model.get("last")) {
|
|
model.set("last", false);
|
|
}
|
|
if (!model.get("hide")) {
|
|
endComment = model;
|
|
}
|
|
});
|
|
if (endComment) {
|
|
endComment.set("last", true);
|
|
}
|
|
}
|
|
},
|
|
onApiAddComment: function (id, data) {
|
|
var comment = this.readSDKComment(id, data);
|
|
if (comment) {
|
|
this.collection.push(comment);
|
|
this.updateComments(true);
|
|
if (this.showPopover) {
|
|
if (null !== data.asc_getQuoteText()) {
|
|
this.api.asc_selectComment(id);
|
|
this.api.asc_showComment(id, true);
|
|
}
|
|
this.showPopover = undefined;
|
|
this.editPopover = false;
|
|
}
|
|
}
|
|
},
|
|
onApiAddComments: function (data) {
|
|
for (var i = 0; i < data.length; ++i) {
|
|
var comment = this.readSDKComment(data[i].Id, data[i].Comment);
|
|
this.collection.push(comment);
|
|
}
|
|
this.updateComments(true);
|
|
},
|
|
onApiRemoveComment: function (id, silentUpdate) {
|
|
if (this.collection.length) {
|
|
var model = this.collection.findWhere({
|
|
uid: id
|
|
});
|
|
if (model) {
|
|
this.collection.remove(model);
|
|
if (!silentUpdate) {
|
|
this.updateComments(true);
|
|
}
|
|
}
|
|
if (this.popoverComments.length) {
|
|
model = this.popoverComments.findWhere({
|
|
uid: id
|
|
});
|
|
if (model) {
|
|
this.popoverComments.remove(model);
|
|
if (0 === this.popoverComments.length) {
|
|
if (this.getPopover()) {
|
|
this.getPopover().hide();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onChangeComments: function (data) {
|
|
for (var i = 0; i < data.length; ++i) {
|
|
this.onApiChangeCommentData(data[i].Comment.Id, data[i].Comment, true);
|
|
}
|
|
this.updateComments(true);
|
|
},
|
|
onRemoveComments: function (data) {
|
|
for (var i = 0; i < data.length; ++i) {
|
|
this.onApiRemoveComment(data[i], true);
|
|
}
|
|
this.updateComments(true);
|
|
},
|
|
onApiChangeCommentData: function (id, data, silentUpdate) {
|
|
var t = this,
|
|
i = 0,
|
|
date = null,
|
|
replies = null,
|
|
repliesCount = 0,
|
|
dateReply = null,
|
|
comment = this.findComment(id);
|
|
if (comment) {
|
|
t = this;
|
|
date = (data.asc_getTime() == "") ? new Date() : new Date(this.stringUtcToLocalDate(data.asc_getTime()));
|
|
comment.set("comment", data.asc_getText());
|
|
comment.set("userid", data.asc_getUserId());
|
|
comment.set("username", data.asc_getUserName());
|
|
comment.set("resolved", data.asc_getSolved());
|
|
comment.set("quote", data.asc_getQuoteText());
|
|
comment.set("time", date.getTime());
|
|
comment.set("date", t.dateToLocaleTimeString(date));
|
|
replies = _.clone(comment.get("replys"));
|
|
replies.length = 0;
|
|
repliesCount = data.asc_getRepliesCount();
|
|
for (i = 0; i < repliesCount; ++i) {
|
|
dateReply = (data.asc_getReply(i).asc_getTime() == "") ? new Date() : new Date(this.stringUtcToLocalDate(data.asc_getReply(i).asc_getTime()));
|
|
replies.push(new Common.Models.Reply({
|
|
id: Common.UI.getId(),
|
|
userid: data.asc_getReply(i).asc_getUserId(),
|
|
username: data.asc_getReply(i).asc_getUserName(),
|
|
date: t.dateToLocaleTimeString(dateReply),
|
|
reply: data.asc_getReply(i).asc_getText(),
|
|
time: dateReply.getTime(),
|
|
editText: false,
|
|
editTextInPopover: false,
|
|
showReplyInPopover: false,
|
|
scope: t.view
|
|
}));
|
|
}
|
|
replies.sort(function (a, b) {
|
|
return a.get("time") - b.get("time");
|
|
});
|
|
comment.set("replys", replies);
|
|
if (!silentUpdate) {
|
|
this.updateComments(false, true);
|
|
if (this.getPopover() && this.getPopover().isVisible()) {
|
|
this.api.asc_showComment(id, true);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onApiLockComment: function (id, userId) {
|
|
var cur = this.findComment(id),
|
|
usersStore = null,
|
|
user = null;
|
|
if (cur) {
|
|
usersStore = this.getApplication().getCollection("Common.Collections.Users");
|
|
if (usersStore) {
|
|
user = usersStore.findWhere({
|
|
id: userId
|
|
});
|
|
if (user) {
|
|
cur.set("lock", true);
|
|
cur.set("lockuserid", this.view.getUserName(user.get("username")));
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onApiUnLockComment: function (id) {
|
|
var cur = this.findComment(id);
|
|
if (cur) {
|
|
cur.set("lock", false);
|
|
}
|
|
},
|
|
onApiShowComment: function (uids, posX, posY, leftX, opts, hint) {
|
|
if (hint && this.isSelectedComment && (0 === _.difference(this.uids, uids).length)) {
|
|
return;
|
|
}
|
|
if (this.getPopover()) {
|
|
this.clearDummyComment();
|
|
if (this.isSelectedComment && (0 === _.difference(this.uids, uids).length)) {
|
|
if (this.api) {
|
|
this.getPopover().commentsView.setFocusToTextBox(true);
|
|
this.api.asc_enableKeyEvents(true);
|
|
}
|
|
return;
|
|
}
|
|
var i = 0,
|
|
saveTxtId = "",
|
|
saveTxtReplyId = "",
|
|
comment = null,
|
|
text = "",
|
|
animate = true;
|
|
this.popoverComments.reset();
|
|
for (i = 0; i < uids.length; ++i) {
|
|
saveTxtId = uids[i];
|
|
saveTxtReplyId = uids[i] + "-R";
|
|
comment = this.findComment(saveTxtId);
|
|
if (this.subEditStrings[saveTxtId]) {
|
|
comment.set("editTextInPopover", true);
|
|
text = this.subEditStrings[saveTxtId];
|
|
} else {
|
|
if (this.subEditStrings[saveTxtReplyId]) {
|
|
comment.set("showReplyInPopover", true);
|
|
text = this.subEditStrings[saveTxtReplyId];
|
|
}
|
|
}
|
|
comment.set("hint", !_.isUndefined(hint) ? hint : false);
|
|
if (!hint && this.hintmode) {
|
|
if (0 === _.difference(this.uids, uids).length && (this.uids.length === 0)) {
|
|
animate = false;
|
|
}
|
|
if (this.oldUids.length && (0 === _.difference(this.oldUids, uids).length)) {
|
|
animate = false;
|
|
this.oldUids = [];
|
|
}
|
|
}
|
|
if (this.animate) {
|
|
animate = this.animate;
|
|
this.animate = false;
|
|
}
|
|
this.isSelectedComment = !hint;
|
|
this.uids = _.clone(uids);
|
|
this.popoverComments.push(comment);
|
|
}
|
|
if (this.getPopover().isVisible()) {
|
|
this.getPopover().hide();
|
|
}
|
|
this.getPopover().setLeftTop(posX, posY, leftX);
|
|
this.getPopover().show(animate, false, true, text);
|
|
}
|
|
},
|
|
onApiHideComment: function (hint) {
|
|
var t = this;
|
|
if (this.getPopover()) {
|
|
if (this.isSelectedComment && hint) {
|
|
return;
|
|
}
|
|
this.popoverComments.each(function (model) {
|
|
if (model.get("editTextInPopover")) {
|
|
t.subEditStrings[model.get("uid")] = t.getPopover().getEditText();
|
|
}
|
|
if (model.get("showReplyInPopover")) {
|
|
t.subEditStrings[model.get("uid") + "-R"] = t.getPopover().getEditText();
|
|
}
|
|
});
|
|
this.getPopover().saveText(true);
|
|
this.getPopover().hide();
|
|
this.collection.clearEditing();
|
|
this.popoverComments.clearEditing();
|
|
this.oldUids = _.clone(this.uids);
|
|
this.isSelectedComment = false;
|
|
this.uids = [];
|
|
this.popoverComments.reset();
|
|
}
|
|
},
|
|
onApiUpdateCommentPosition: function (uids, posX, posY, leftX) {
|
|
var i, useAnimation = false,
|
|
comment = null,
|
|
text = undefined,
|
|
saveTxtId = "",
|
|
saveTxtReplyId = "";
|
|
if (this.getPopover()) {
|
|
this.getPopover().saveText();
|
|
if (posY < 0 || this.getPopover().sdkBounds.height < posY || (!_.isUndefined(leftX) && this.getPopover().sdkBounds.width < leftX)) {
|
|
this.getPopover().hide();
|
|
} else {
|
|
if (0 === this.popoverComments.length) {
|
|
this.popoverComments.reset();
|
|
for (i = 0; i < uids.length; ++i) {
|
|
saveTxtId = uids[i];
|
|
saveTxtReplyId = uids[i] + "-R";
|
|
comment = this.findComment(saveTxtId);
|
|
if (this.subEditStrings[saveTxtId]) {
|
|
comment.set("editTextInPopover", true);
|
|
text = this.subEditStrings[saveTxtId];
|
|
} else {
|
|
if (this.subEditStrings[saveTxtReplyId]) {
|
|
comment.set("showReplyInPopover", true);
|
|
text = this.subEditStrings[saveTxtReplyId];
|
|
}
|
|
}
|
|
this.popoverComments.push(comment);
|
|
}
|
|
useAnimation = true;
|
|
this.getPopover().show(useAnimation, undefined, undefined, text);
|
|
} else {
|
|
if (!this.getPopover().isVisible()) {
|
|
this.getPopover().show(false, undefined, undefined, text);
|
|
}
|
|
}
|
|
this.getPopover().setLeftTop(posX, posY, leftX);
|
|
}
|
|
}
|
|
},
|
|
onDocumentPlaceChanged: function () {
|
|
if (this.isDummyComment && this.getPopover()) {
|
|
if (this.getPopover().isVisible()) {
|
|
var anchor = this.api.asc_getAnchorPosition();
|
|
if (anchor) {
|
|
this.getPopover().setLeftTop(anchor.asc_getX() + anchor.asc_getWidth(), anchor.asc_getY(), this.hintmode ? anchor.asc_getX() : undefined);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
updateComments: function (needRender, disableSort) {
|
|
var i, end = true;
|
|
if (_.isUndefined(disableSort)) {
|
|
this.collection.sort();
|
|
}
|
|
if (needRender) {
|
|
for (i = this.collection.length - 1; i >= 0; --i) {
|
|
if (end) {
|
|
this.collection.at(i).set("last", true, {
|
|
silent: true
|
|
});
|
|
} else {
|
|
if (this.collection.at(i).get("last")) {
|
|
this.collection.at(i).set("last", false, {
|
|
silent: true
|
|
});
|
|
}
|
|
}
|
|
end = false;
|
|
}
|
|
this.onUpdateFilter(this.filter, true);
|
|
this.view.render();
|
|
}
|
|
this.view.renderResolvedComboButtons();
|
|
this.view.update();
|
|
},
|
|
findComment: function (uid, id) {
|
|
if (_.isUndefined(uid)) {
|
|
return this.collection.findWhere({
|
|
id: id
|
|
});
|
|
}
|
|
return this.collection.findWhere({
|
|
uid: uid
|
|
});
|
|
},
|
|
findPopupComment: function (id) {
|
|
return this.popoverComments.findWhere({
|
|
id: id
|
|
});
|
|
},
|
|
closeEditing: function (id) {
|
|
var t = this;
|
|
if (!_.isUndefined(id)) {
|
|
var comment2 = this.findPopupComment(id);
|
|
if (comment2) {
|
|
comment2.set("editTextInPopover", false);
|
|
comment2.set("showReplyInPopover", false);
|
|
}
|
|
if (this.subEditStrings[id]) {
|
|
delete this.subEditStrings[id];
|
|
}
|
|
if (this.subEditStrings[id + "-R"]) {
|
|
delete this.subEditStrings[id + "-R"];
|
|
}
|
|
}
|
|
this.collection.clearEditing();
|
|
this.collection.each(function (model) {
|
|
var replies = _.clone(model.get("replys"));
|
|
model.get("replys").length = 0;
|
|
replies.forEach(function (reply) {
|
|
if (reply.get("editText")) {
|
|
reply.set("editText", false);
|
|
}
|
|
if (reply.get("editTextInPopover")) {
|
|
reply.set("editTextInPopover", false);
|
|
}
|
|
});
|
|
model.set("replys", replies);
|
|
});
|
|
this.view.showEditContainer(false);
|
|
this.view.update();
|
|
},
|
|
disableHint: function (comment) {
|
|
if (comment) {
|
|
comment.set("hint", false);
|
|
this.isSelectedComment = true;
|
|
}
|
|
},
|
|
blockPopover: function (flag) {
|
|
this.isSelectedComment = flag;
|
|
if (flag) {
|
|
if (this.getPopover().isVisible()) {
|
|
this.getPopover().hide();
|
|
}
|
|
}
|
|
},
|
|
getPopover: function () {
|
|
return this.view.getPopover(this.sdkViewName);
|
|
},
|
|
readSDKComment: function (id, data) {
|
|
var date = (data.asc_getTime() == "") ? new Date() : new Date(this.stringUtcToLocalDate(data.asc_getTime()));
|
|
var comment = new Common.Models.Comment({
|
|
uid: id,
|
|
userid: data.asc_getUserId(),
|
|
username: data.asc_getUserName(),
|
|
date: this.dateToLocaleTimeString(date),
|
|
quote: data.asc_getQuoteText(),
|
|
comment: data.asc_getText(),
|
|
resolved: data.asc_getSolved(),
|
|
unattached: !_.isUndefined(data.asc_getDocumentFlag) ? data.asc_getDocumentFlag() : false,
|
|
id: Common.UI.getId(),
|
|
time: date.getTime(),
|
|
showReply: false,
|
|
editText: false,
|
|
last: undefined,
|
|
editTextInPopover: (this.editPopover ? true : false),
|
|
showReplyInPopover: false,
|
|
hideAddReply: !_.isUndefined(this.hidereply) ? this.hidereply : (this.showPopover ? true : false),
|
|
scope: this.view
|
|
});
|
|
if (comment) {
|
|
var replies = this.readSDKReplies(data);
|
|
if (replies.length) {
|
|
comment.set("replys", replies);
|
|
}
|
|
}
|
|
return comment;
|
|
},
|
|
readSDKReplies: function (data) {
|
|
var i = 0,
|
|
replies = [],
|
|
date = null;
|
|
var repliesCount = data.asc_getRepliesCount();
|
|
if (repliesCount) {
|
|
for (i = 0; i < repliesCount; ++i) {
|
|
date = (data.asc_getReply(i).asc_getTime() == "") ? new Date() : new Date(this.stringUtcToLocalDate(data.asc_getReply(i).asc_getTime()));
|
|
replies.push(new Common.Models.Reply({
|
|
id: Common.UI.getId(),
|
|
userid: data.asc_getReply(i).asc_getUserId(),
|
|
username: data.asc_getReply(i).asc_getUserName(),
|
|
date: this.dateToLocaleTimeString(date),
|
|
reply: data.asc_getReply(i).asc_getText(),
|
|
time: date.getTime(),
|
|
editText: false,
|
|
editTextInPopover: false,
|
|
showReplyInPopover: false,
|
|
scope: this.view
|
|
}));
|
|
}
|
|
replies.sort(function (a, b) {
|
|
return a.get("time") - b.get("time");
|
|
});
|
|
}
|
|
return replies;
|
|
},
|
|
addDummyComment: function () {
|
|
if (this.api) {
|
|
var me = this,
|
|
anchor = null,
|
|
date = new Date(),
|
|
dialog = this.getPopover();
|
|
if (dialog) {
|
|
if (this.popoverComments.length) {
|
|
_.delay(function () {
|
|
me.api.asc_enableKeyEvents(false);
|
|
dialog.commentsView.setFocusToTextBox();
|
|
},
|
|
200);
|
|
return;
|
|
}
|
|
var comment = new Common.Models.Comment({
|
|
id: -1,
|
|
time: date.getTime(),
|
|
date: this.dateToLocaleTimeString(date),
|
|
userid: this.currentUserId,
|
|
username: this.currentUserName,
|
|
editTextInPopover: true,
|
|
showReplyInPopover: false,
|
|
hideAddReply: true,
|
|
scope: this.view,
|
|
dummy: true
|
|
});
|
|
this.popoverComments.reset();
|
|
this.popoverComments.push(comment);
|
|
this.uids = [];
|
|
this.isSelectedComment = true;
|
|
this.isDummyComment = true;
|
|
if (!_.isUndefined(this.api.asc_SetDocumentPlaceChangedEnabled)) {
|
|
me.api.asc_SetDocumentPlaceChangedEnabled(true);
|
|
}
|
|
dialog.handlerHide = (function () {});
|
|
if (dialog.isVisible()) {
|
|
dialog.hide();
|
|
}
|
|
dialog.handlerHide = (function () {
|
|
me.clearDummyComment();
|
|
});
|
|
anchor = this.api.asc_getAnchorPosition();
|
|
if (anchor) {
|
|
dialog.setLeftTop(anchor.asc_getX() + anchor.asc_getWidth(), anchor.asc_getY(), this.hintmode ? anchor.asc_getX() : undefined);
|
|
dialog.show(true, false, true);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onAddDummyComment: function (commentVal) {
|
|
if (this.api && commentVal && commentVal.length > 0) {
|
|
var comment = buildCommentData();
|
|
if (comment) {
|
|
this.showPopover = true;
|
|
this.editPopover = false;
|
|
this.hidereply = false;
|
|
this.isSelectedComment = false;
|
|
this.uids = [];
|
|
this.isDummyComment = false;
|
|
this.popoverComments.reset();
|
|
comment.asc_putText(commentVal);
|
|
comment.asc_putTime(this.utcDateToString(new Date()));
|
|
comment.asc_putUserId(this.currentUserId);
|
|
comment.asc_putUserName(this.currentUserName);
|
|
comment.asc_putSolved(false);
|
|
if (!_.isUndefined(comment.asc_putDocumentFlag)) {
|
|
comment.asc_putDocumentFlag(false);
|
|
}
|
|
this.api.asc_addComment(comment);
|
|
this.view.showEditContainer(false);
|
|
if (!_.isUndefined(this.api.asc_SetDocumentPlaceChangedEnabled)) {
|
|
this.api.asc_SetDocumentPlaceChangedEnabled(false);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
clearDummyComment: function () {
|
|
if (this.isDummyComment) {
|
|
this.isDummyComment = false;
|
|
this.showPopover = true;
|
|
this.editPopover = false;
|
|
this.hidereply = false;
|
|
this.isSelectedComment = false;
|
|
this.uids = [];
|
|
var dialog = this.getPopover();
|
|
if (dialog) {
|
|
dialog.handlerHide = (function () {});
|
|
if (dialog.isVisible()) {
|
|
dialog.hide();
|
|
}
|
|
}
|
|
this.popoverComments.reset();
|
|
if (!_.isUndefined(this.api.asc_SetDocumentPlaceChangedEnabled)) {
|
|
this.api.asc_SetDocumentPlaceChangedEnabled(false);
|
|
}
|
|
}
|
|
},
|
|
onEditComments: function (comments) {
|
|
if (this.api) {
|
|
var i = 0,
|
|
t = this,
|
|
comment = null;
|
|
var anchor = this.api.asc_getAnchorPosition();
|
|
if (anchor) {
|
|
this.isSelectedComment = true;
|
|
this.popoverComments.reset();
|
|
for (i = 0; i < comments.length; ++i) {
|
|
comment = this.findComment(comments[i].asc_getId());
|
|
comment.set("editTextInPopover", true);
|
|
comment.set("hint", false);
|
|
this.popoverComments.push(comment);
|
|
}
|
|
if (this.getPopover()) {
|
|
if (this.getPopover().isVisible()) {
|
|
this.getPopover().hide();
|
|
}
|
|
this.getPopover().setLeftTop(anchor.asc_getX() + anchor.asc_getWidth(), anchor.asc_getY(), this.hintmode ? anchor.asc_getX() : undefined);
|
|
this.getPopover().show(true, false, true);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
focusOnInput: function () {
|
|
if (this.view && this.api) {
|
|
var panel = $("#comments-new-comment-ct", this.view.el);
|
|
if (panel && panel.length) {
|
|
if ("none" !== panel.css("display")) {
|
|
this.api.asc_enableKeyEvents(false);
|
|
this.view.txtComment.focus();
|
|
}
|
|
}
|
|
}
|
|
},
|
|
timeZoneOffsetInMs: (new Date()).getTimezoneOffset() * 60000,
|
|
stringUtcToLocalDate: function (date) {
|
|
if (typeof date === "string") {
|
|
return parseInt(date) + this.timeZoneOffsetInMs;
|
|
}
|
|
return 0;
|
|
},
|
|
utcDateToString: function (date) {
|
|
if (Object.prototype.toString.call(date) === "[object Date]") {
|
|
return (date.getTime() - this.timeZoneOffsetInMs).toString();
|
|
}
|
|
return "";
|
|
},
|
|
dateToLocaleTimeString: function (date) {
|
|
function format(date) {
|
|
var strTime, hours = date.getHours(),
|
|
minutes = date.getMinutes(),
|
|
ampm = hours >= 12 ? "pm" : "am";
|
|
hours = hours % 12;
|
|
hours = hours ? hours : 12;
|
|
minutes = minutes < 10 ? "0" + minutes : minutes;
|
|
strTime = hours + ":" + minutes + " " + ampm;
|
|
return strTime;
|
|
}
|
|
return (date.getMonth() + 1) + "/" + (date.getDate()) + "/" + date.getFullYear() + " " + format(date);
|
|
}
|
|
},
|
|
Common.Controllers.Comments || {}));
|
|
}); |