2021-03-23 19:48:58 +01:00
|
|
|
/**
|
|
|
|
* @provides phabricator-diff-inline-content-state
|
|
|
|
* @requires javelin-dom
|
|
|
|
* @javelin
|
|
|
|
*/
|
|
|
|
|
|
|
|
JX.install('DiffInlineContentState', {
|
|
|
|
|
|
|
|
construct : function() {
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
properties: {
|
|
|
|
text: null,
|
|
|
|
suggestionText: null,
|
|
|
|
hasSuggestion: false
|
|
|
|
},
|
|
|
|
|
|
|
|
members: {
|
2021-03-23 20:02:32 +01:00
|
|
|
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);
|
|
|
|
},
|
|
|
|
|
2021-03-23 20:02:32 +01:00
|
|
|
_getSuggestionNode: function(row) {
|
|
|
|
try {
|
|
|
|
return JX.DOM.find(row, 'textarea', 'inline-content-suggestion');
|
|
|
|
} catch (ex) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2021-03-23 19:48:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
});
|