ChangeScreen2: Add 'Diff against' to select base revision
Add dropdown on the Files header section to select
reference version for loading the revision.
Change-Id: I5c40a52b0018fea7e11ac67696ee6fb7b4674349
(cherry picked from commit 2d2a3c405e)
This commit is contained in:
committed by
Michael Zhou
parent
a310bbc448
commit
bdcb9cff23
@@ -58,6 +58,8 @@ import com.google.gwt.core.client.JsArrayString;
|
|||||||
import com.google.gwt.dom.client.AnchorElement;
|
import com.google.gwt.dom.client.AnchorElement;
|
||||||
import com.google.gwt.dom.client.Element;
|
import com.google.gwt.dom.client.Element;
|
||||||
import com.google.gwt.dom.client.NativeEvent;
|
import com.google.gwt.dom.client.NativeEvent;
|
||||||
|
import com.google.gwt.dom.client.SelectElement;
|
||||||
|
import com.google.gwt.event.dom.client.ChangeEvent;
|
||||||
import com.google.gwt.event.dom.client.ClickEvent;
|
import com.google.gwt.event.dom.client.ClickEvent;
|
||||||
import com.google.gwt.event.dom.client.ClickHandler;
|
import com.google.gwt.event.dom.client.ClickHandler;
|
||||||
import com.google.gwt.event.dom.client.KeyPressEvent;
|
import com.google.gwt.event.dom.client.KeyPressEvent;
|
||||||
@@ -73,6 +75,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
|
|||||||
import com.google.gwt.user.client.ui.Button;
|
import com.google.gwt.user.client.ui.Button;
|
||||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||||
import com.google.gwt.user.client.ui.Image;
|
import com.google.gwt.user.client.ui.Image;
|
||||||
|
import com.google.gwt.user.client.ui.ListBox;
|
||||||
import com.google.gwt.user.client.ui.ToggleButton;
|
import com.google.gwt.user.client.ui.ToggleButton;
|
||||||
import com.google.gwtexpui.clippy.client.CopyableLabel;
|
import com.google.gwtexpui.clippy.client.CopyableLabel;
|
||||||
import com.google.gwtexpui.globalkey.client.GlobalKey;
|
import com.google.gwtexpui.globalkey.client.GlobalKey;
|
||||||
@@ -124,6 +127,7 @@ public class ChangeScreen2 extends Screen {
|
|||||||
private Timestamp lastDisplayedUpdate;
|
private Timestamp lastDisplayedUpdate;
|
||||||
private UpdateAvailableBar updateAvailable;
|
private UpdateAvailableBar updateAvailable;
|
||||||
private boolean openReplyBox;
|
private boolean openReplyBox;
|
||||||
|
private boolean loaded;
|
||||||
|
|
||||||
@UiField HTMLPanel headerLine;
|
@UiField HTMLPanel headerLine;
|
||||||
@UiField Style style;
|
@UiField Style style;
|
||||||
@@ -151,6 +155,7 @@ public class ChangeScreen2 extends Screen {
|
|||||||
@UiField CommitBox commit;
|
@UiField CommitBox commit;
|
||||||
@UiField RelatedChanges related;
|
@UiField RelatedChanges related;
|
||||||
@UiField FileTable files;
|
@UiField FileTable files;
|
||||||
|
@UiField ListBox diffBase;
|
||||||
@UiField History history;
|
@UiField History history;
|
||||||
|
|
||||||
@UiField Button includedIn;
|
@UiField Button includedIn;
|
||||||
@@ -185,7 +190,7 @@ public class ChangeScreen2 extends Screen {
|
|||||||
@Override
|
@Override
|
||||||
public void onSuccess(ChangeInfo info) {
|
public void onSuccess(ChangeInfo info) {
|
||||||
info.init();
|
info.init();
|
||||||
loadConfigInfo(info);
|
loadConfigInfo(info, null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -194,9 +199,7 @@ public class ChangeScreen2 extends Screen {
|
|||||||
RestApi call = ChangeApi.detail(changeId.get());
|
RestApi call = ChangeApi.detail(changeId.get());
|
||||||
ChangeList.addOptions(call, EnumSet.of(
|
ChangeList.addOptions(call, EnumSet.of(
|
||||||
ListChangesOption.CURRENT_ACTIONS,
|
ListChangesOption.CURRENT_ACTIONS,
|
||||||
fg && revision != null
|
ListChangesOption.ALL_REVISIONS));
|
||||||
? ListChangesOption.ALL_REVISIONS
|
|
||||||
: ListChangesOption.CURRENT_REVISION));
|
|
||||||
if (!fg) {
|
if (!fg) {
|
||||||
call.background();
|
call.background();
|
||||||
}
|
}
|
||||||
@@ -444,25 +447,40 @@ public class ChangeScreen2 extends Screen {
|
|||||||
collapseAll.setVisible(false);
|
collapseAll.setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadConfigInfo(final ChangeInfo info) {
|
@UiHandler("diffBase")
|
||||||
|
void onChangeRevision(ChangeEvent e) {
|
||||||
|
int idx = diffBase.getSelectedIndex();
|
||||||
|
if (0 <= idx) {
|
||||||
|
String n = diffBase.getValue(idx);
|
||||||
|
loadConfigInfo(changeInfo, !n.isEmpty() ? n : null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadConfigInfo(final ChangeInfo info, final String base) {
|
||||||
info.revisions().copyKeysIntoChildren("name");
|
info.revisions().copyKeysIntoChildren("name");
|
||||||
final RevisionInfo rev = resolveRevisionToDisplay(info);
|
final RevisionInfo rev = resolveRevisionToDisplay(info);
|
||||||
|
|
||||||
CallbackGroup group = new CallbackGroup();
|
CallbackGroup group = new CallbackGroup();
|
||||||
loadDiff(rev, myLastReply(info), group);
|
loadDiff(info.revisions().get(base), rev, myLastReply(info), group);
|
||||||
loadCommit(rev, group);
|
loadCommit(rev, group);
|
||||||
|
|
||||||
|
if (loaded) {
|
||||||
|
group.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
RevisionInfoCache.add(changeId, rev);
|
RevisionInfoCache.add(changeId, rev);
|
||||||
ConfigInfoCache.add(info);
|
ConfigInfoCache.add(info);
|
||||||
ConfigInfoCache.get(info.project_name_key(),
|
ConfigInfoCache.get(info.project_name_key(),
|
||||||
group.add(new ScreenLoadCallback<ConfigInfoCache.Entry>(this) {
|
group.addFinal(new ScreenLoadCallback<ConfigInfoCache.Entry>(this) {
|
||||||
@Override
|
@Override
|
||||||
protected void preDisplay(Entry result) {
|
protected void preDisplay(Entry result) {
|
||||||
|
loaded = true;
|
||||||
commentLinkProcessor = result.getCommentLinkProcessor();
|
commentLinkProcessor = result.getCommentLinkProcessor();
|
||||||
setTheme(result.getTheme());
|
setTheme(result.getTheme());
|
||||||
renderChangeInfo(info);
|
renderChangeInfo(info);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
group.done();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Timestamp myLastReply(ChangeInfo info) {
|
private static Timestamp myLastReply(ChangeInfo info) {
|
||||||
@@ -478,16 +496,19 @@ public class ChangeScreen2 extends Screen {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDiff(final RevisionInfo rev, final Timestamp myLastReply,
|
private void loadDiff(final RevisionInfo base, final RevisionInfo rev,
|
||||||
CallbackGroup group) {
|
final Timestamp myLastReply, CallbackGroup group) {
|
||||||
final List<NativeMap<JsArray<CommentInfo>>> comments = loadComments(rev, group);
|
final List<NativeMap<JsArray<CommentInfo>>> comments = loadComments(rev, group);
|
||||||
final List<NativeMap<JsArray<CommentInfo>>> drafts = loadDrafts(rev, group);
|
final List<NativeMap<JsArray<CommentInfo>>> drafts = loadDrafts(rev, group);
|
||||||
DiffApi.list(changeId.get(),
|
DiffApi.list(changeId.get(),
|
||||||
|
base != null ? base.name() : null,
|
||||||
rev.name(),
|
rev.name(),
|
||||||
group.add(new AsyncCallback<NativeMap<FileInfo>>() {
|
group.add(new AsyncCallback<NativeMap<FileInfo>>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(NativeMap<FileInfo> m) {
|
public void onSuccess(NativeMap<FileInfo> m) {
|
||||||
files.setRevisions(null, new PatchSet.Id(changeId, rev._number()));
|
files.setRevisions(
|
||||||
|
base != null ? new PatchSet.Id(changeId, base._number()) : null,
|
||||||
|
new PatchSet.Id(changeId, rev._number()));
|
||||||
files.setValue(m, myLastReply, comments.get(0), drafts.get(0));
|
files.setValue(m, myLastReply, comments.get(0), drafts.get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -653,6 +674,7 @@ public class ChangeScreen2 extends Screen {
|
|||||||
|
|
||||||
renderOwner(info);
|
renderOwner(info);
|
||||||
renderActionTextDate(info);
|
renderActionTextDate(info);
|
||||||
|
renderDiffBaseListBox(info);
|
||||||
initIncludedInAction(info);
|
initIncludedInAction(info);
|
||||||
initRevisionsAction(info, revision);
|
initRevisionsAction(info, revision);
|
||||||
initDownloadAction(info, revision);
|
initDownloadAction(info, revision);
|
||||||
@@ -728,6 +750,28 @@ public class ChangeScreen2 extends Screen {
|
|||||||
actionDate.setInnerText(FormatUtil.relativeFormat(info.updated()));
|
actionDate.setInnerText(FormatUtil.relativeFormat(info.updated()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void renderDiffBaseListBox(ChangeInfo info) {
|
||||||
|
JsArray<RevisionInfo> list = info.revisions().values();
|
||||||
|
RevisionInfo.sortRevisionInfoByNumber(list);
|
||||||
|
for (int i = list.length() - 1; i >= 0; i--) {
|
||||||
|
RevisionInfo r = list.get(i);
|
||||||
|
diffBase.addItem(
|
||||||
|
r._number() + ": " + r.name().substring(0, 6),
|
||||||
|
r.name());
|
||||||
|
if (r.name().equals(revision)) {
|
||||||
|
SelectElement.as(diffBase.getElement()).getOptions()
|
||||||
|
.getItem(diffBase.getItemCount() - 1).setDisabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RevisionInfo rev = info.revisions().get(revision);
|
||||||
|
JsArray<CommitInfo> parents = rev.commit().parents();
|
||||||
|
diffBase.addItem(
|
||||||
|
parents.length() > 1 ? Util.C.autoMerge() : Util.C.baseDiffItem(),
|
||||||
|
"");
|
||||||
|
diffBase.setSelectedIndex(diffBase.getItemCount() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
void showUpdates(ChangeInfo newInfo) {
|
void showUpdates(ChangeInfo newInfo) {
|
||||||
if (!isAttached() || newInfo.updated().equals(lastDisplayedUpdate)) {
|
if (!isAttached() || newInfo.updated().equals(lastDisplayedUpdate)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -251,12 +251,27 @@ limitations under the License.
|
|||||||
.sectionHeader .headerButtons {
|
.sectionHeader .headerButtons {
|
||||||
top: 2px;
|
top: 2px;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
|
line-height: 18px;
|
||||||
border-left: 1px inset #fff;
|
border-left: 1px inset #fff;
|
||||||
padding-top: 3px;
|
padding-top: 3px;
|
||||||
padding-bottom: 3px;
|
padding-bottom: 3px;
|
||||||
}
|
}
|
||||||
.sectionHeader button { margin-top: 0; }
|
.sectionHeader button { margin-top: 0; }
|
||||||
|
|
||||||
|
.diffBase {
|
||||||
|
display: inline-block;
|
||||||
|
height: 18px;
|
||||||
|
line-height: 18px;
|
||||||
|
font-size: smaller;
|
||||||
|
font-weight: normal;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.diffBase select {
|
||||||
|
margin: 0;
|
||||||
|
border: 1px solid #bbb;
|
||||||
|
font-size: smaller;
|
||||||
|
}
|
||||||
|
|
||||||
.replyBox {
|
.replyBox {
|
||||||
background-color: trimColor;
|
background-color: trimColor;
|
||||||
}
|
}
|
||||||
@@ -390,6 +405,11 @@ limitations under the License.
|
|||||||
|
|
||||||
<div class='{style.sectionHeader}'>
|
<div class='{style.sectionHeader}'>
|
||||||
<ui:msg>Files</ui:msg>
|
<ui:msg>Files</ui:msg>
|
||||||
|
<div class='{style.headerButtons}'>
|
||||||
|
<div class='{style.diffBase}'>
|
||||||
|
<ui:msg>Diff against: <g:ListBox ui:field='diffBase' styleName=''/></ui:msg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<c:FileTable ui:field='files'/>
|
<c:FileTable ui:field='files'/>
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,13 @@ public class DiffApi {
|
|||||||
NONE, TRAILING, CHANGED, ALL;
|
NONE, TRAILING, CHANGED, ALL;
|
||||||
};
|
};
|
||||||
|
|
||||||
public static void list(int id, String revision,
|
public static void list(int id, String base, String revision,
|
||||||
AsyncCallback<NativeMap<FileInfo>> cb) {
|
AsyncCallback<NativeMap<FileInfo>> cb) {
|
||||||
ChangeApi.revision(id, revision)
|
RestApi api = ChangeApi.revision(id, revision).view("files");
|
||||||
.view("files")
|
if (base != null) {
|
||||||
.get(NativeMap.copyKeysIntoChildren("path", cb));
|
api.addParameter("base", base);
|
||||||
|
}
|
||||||
|
api.get(NativeMap.copyKeysIntoChildren("path", cb));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DiffApi diff(PatchSet.Id id, String path) {
|
public static DiffApi diff(PatchSet.Id id, String path) {
|
||||||
|
|||||||
Reference in New Issue
Block a user