1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-10-23 17:18:51 +02:00
phorge-phorge/webroot/rsrc/js/application/diff/DiffInlineContentState.js

138 lines
2.7 KiB
JavaScript
Raw Normal View History

/**
* @provides phabricator-diff-inline-content-state
* @requires javelin-dom
* @javelin
*/
JX.install('DiffInlineContentState', {
construct : function() {
},
properties: {
text: null,
suggestionText: null,
hasSuggestion: false
},
members: {
readForm: function(row) {
var node;
try {
node = JX.DOM.find(row, 'textarea', 'inline-content-text');
this.setText(node.value);
} catch (ex) {
this.setText(null);
}
node = this._getSuggestionNode(row);
if (node) {
this.setSuggestionText(node.value);
} else {
this.setSuggestionText(null);
}
return this;
},
getWireFormat: function() {
return {
text: this.getText(),
suggestionText: this.getSuggestionText(),
hasSuggestion: this.getHasSuggestion()
};
},
readWireFormat: function(map) {
this.setText(map.text || null);
this.setSuggestionText(map.suggestionText || null);
this.setHasSuggestion(!!map.hasSuggestion);
return this;
},
getTextForQuote: function() {
var text = this.getText();
text = '> ' + text.replace(/\n/g, '\n> ') + '\n\n';
return text;
},
Update client logic for inline comment "Save" and "Cancel" actions Summary: Ref T13559. Substantially correct the client logic for "Save" and "Cancel" actions to handle unusual cases. Test Plan: Quoting behavior: - Quoted a comment. - Cancelled the quoted comment without modifying anything. - Reloaded page. - Before changes: quoted comment still exists. - After changes: quoted comment is deleted. - Looked at comment count in header, saw consistent behavior (before: weird behavior). Empty suggestion behavior: - Created a new comment on a suggestable file. - Clicked "Suggest Edit" to enable suggestions. - Without making any text or suggestion changes, clicked "Save". - Before changes: comment saves, but is empty. - After changes: comment deletes itself without undo. General behavior: - Created and saved an empty comment (deletes itself). - Created and saved a nonempty comment (saves as draft). - Created and saved an empty comment with an edit suggestion (saves). - Created and saved an empty comment with a suggestion to entirely delete lines -- that is, no suggestion text (saves). - Edited a comment, saved without changes (save). - Edited a comment, save deleting all text (saves -- note that this is intentionally without undo, since this is a lot of steps to do by accident). - Cancel editing an unchanged comment (cancels without undo). - Cancel editing a changed comment (cancels with undo). - Undo'd, got text back. - Cancel new comment with no text (deletes without undo). - Cancel new comment with text (deletes with undo). - Undo'd, got text back. - Saved a quoted comment with no changes (saves -- note that this is intentionally not a "delete", since just quoting someone seems fine if you click "Save" -- maybe you want to come back to it later). Maniphest Tasks: T13559 Differential Revision: https://secure.phabricator.com/D21654
2021-03-25 21:28:04 +01:00
isStateEmpty: function() {
return (this.isTextEmpty() && this.isSuggestionEmpty());
},
isTextEmpty: function() {
var text = this.getText();
if (text === null) {
return true;
}
if (this._isStringSimilar(text, '')) {
return true;
}
return false;
},
isSuggestionEmpty: function() {
if (!this.getHasSuggestion()) {
return true;
}
var suggestion = this.getSuggestionText();
if (suggestion === null) {
return true;
}
if (this._isStringSimilar(suggestion, '')) {
return true;
}
return false;
},
isTextSimilar: function(v) {
if (!v) {
return false;
}
var us = this.getText();
var vs = v.getText();
return this._isStringSimilar(us, vs);
},
isSuggestionSimilar: function(v) {
// If we don't have a comparison state, treat them as dissimilar. This
// is expected to occur in old inline comments that did not save an
// initial state.
if (!v) {
return false;
}
var us = this.getSuggestionText();
var vs = v.getSuggestionText();
return this._isStringSimilar(us, vs);
},
_isStringSimilar: function(u, v) {
u = u || '';
v = v || '';
return (u === v);
},
_getSuggestionNode: function(row) {
try {
return JX.DOM.find(row, 'textarea', 'inline-content-suggestion');
} catch (ex) {
return null;
}
}
}
});