SmartClient Version: v8.2p_2012-08-14/Enterprise Deployment (built 2012-08-14)
Happens in: IE 9, IE 9 Compatability Mode, Chrome 21.0.1180.79 m
Does not happen in FireFox 8.0.1
I have a ListGrid inside of a section stack panel. The first time I navigate to the page, it works correctly. If I navigate to another page, and then come back, when I click on a row in the grid, the entire grid shifts upward 44 pixels, putting the header under the section stack header.
Also, if I resize the page, the header returns to the correct position.
I used IE developer console to take a snapshot of the HTML before and after clicking on the row, and did a comparison, and the only difference is as follows:
Before (working):
After (Shifted up):
At the end, the attributes $yu and $yv change from 0 to 44.
Custom Widget
CSS
View
Main Page View
I can supply additional code if necessarily, if this is not enough to be of help.
Happens in: IE 9, IE 9 Compatability Mode, Chrome 21.0.1180.79 m
Does not happen in FireFox 8.0.1
I have a ListGrid inside of a section stack panel. The first time I navigate to the page, it works correctly. If I navigate to another page, and then come back, when I click on a row in the grid, the entire grid shifts upward 44 pixels, putting the header under the section stack header.
Also, if I resize the page, the header returns to the correct position.
I used IE developer console to take a snapshot of the HTML before and after clicking on the row, and did a comparison, and the only difference is as follows:
Before (working):
Code:
<DIV onblur=if(window.isc)isc.EH.blurFocusCanvas(isc_ListGrid_2_body,true); style="Z-INDEX: 201926; POSITION: absolute; WIDTH: 946px; HEIGHT: 392px; OVERFLOW: hidden; CURSOR: default; TOP: 44px; LEFT: 0px" onscroll="return isc_ListGrid_2_body.$lh()" id=isc_71 class=gridBody onfocus=isc.EH.focusInCanvas(isc_ListGrid_2_body,true); tabIndex=1248 eventProxy="isc_ListGrid_2_body" $ys="0" $yt="0">
Code:
<DIV onblur=if(window.isc)isc.EH.blurFocusCanvas(isc_ListGrid_2_body,true); style="Z-INDEX: 201926; POSITION: absolute; WIDTH: 946px; HEIGHT: 392px; OVERFLOW: hidden; CURSOR: default; TOP: 44px; LEFT: 0px" onscroll="return isc_ListGrid_2_body.$lh()" id=isc_71 class=gridBody onfocus=isc.EH.focusInCanvas(isc_ListGrid_2_body,true); tabIndex=1248 eventProxy="isc_ListGrid_2_body" $ys="0" $yt="0" $yu="44" $yv="44">
Custom Widget
Code:
public class CallCenterListGrid extends SectionStack implements HasRecordDoubleClickHandlers {
private final ListGrid grid;
private final boolean wrapHeaders;
private final Autofit autoFitApproach;
public CallCenterListGrid(boolean showFilterEditor, String gridTitle, boolean wrapHeaders, Autofit autoFitApproach)
{
this(showFilterEditor, gridTitle, wrapHeaders, autoFitApproach, null);
}
public CallCenterListGrid(boolean showFilterEditor, String gridTitle, boolean wrapHeaders, Autofit autoFitApproach, Integer height)
{
this.wrapHeaders = wrapHeaders;
this.autoFitApproach = autoFitApproach;
this.setWidth100();
if (height == null){
this.setHeight100();
} else {
this.setHeight(height);
}
this.setMinHeight(200);
SectionStackSection section = new SectionStackSection(gridTitle);
section.setCanCollapse(false);
section.setExpanded(true);
HeaderControl refresh = new HeaderControl(HeaderControl.REFRESH, new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
CallCenterListGrid.this.grid.invalidateCache();
}
});
section.setControls(refresh);
grid = new ListGrid();
if (wrapHeaders){
this.grid.setHeaderHeight(33);
} else {
this.grid.setHeaderHeight(22);
}
this.grid.setWidth100();
this.grid.setHeight100();
this.grid.setCanResizeFields(true);
this.grid.setAutoFetchData(true);
this.grid.setAutoFitFieldWidths(true);
this.grid.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
this.grid.setShowFilterEditor(showFilterEditor);
if (autoFitApproach.equals(Autofit.VERTICAL) || autoFitApproach.equals(Autofit.BOTH)) {
this.grid.setWrapCells(true);
this.grid.setFixedRecordHeights(false);
}
this.setStyleName("sectionStack list-grid");
section.setItems(grid);
this.addSection(section);
}
@Override
public HandlerRegistration addRecordDoubleClickHandler(
RecordDoubleClickHandler handler) {
return this.grid.addRecordDoubleClickHandler(handler);
}
public ListGrid getGrid() {
return grid;
}
public void setDataSource(DataSource datasource){
this.grid.setDataSource(datasource);
for (ListGridField field : this.grid.getFields()) {
// Wrap the headers
if (this.wrapHeaders){
String title = field.getTitle();
String[] parts = title.split(" ");
if (parts.length > 1) {
if (parts[0].length() > 1 && parts[parts.length - 1].length() > 1){
field.setWrap(true);
}
}
}
// Format all decimal fields as 0.00
if (field.getType() == ListGridFieldType.FLOAT){
field.setCellFormatter(new CellFormatter() {
public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
if(value == null) return null;
String val = null;
try {
NumberFormat nf = NumberFormat.getFormat("0.00");
val = nf.format(((Number) value).doubleValue());
} catch (Exception e) {
return value.toString();
}
return val;
}
});
}
}
}
}
Code:
.list-grid {
margin-bottom: 5px;
}
Code:
public class TransmitSessionDetailPageView extends ViewImpl implements TransmitSessionDetailPagePresenter.MyView {
// Overall layout of page. Root container.
private VLayout layout;
// Transmit Session Error Log
private HLayout errorLogBar;
// Transmit Session Details
private DetailGroupForm detailForm;
// In Process Transaction Grid
private CallCenterListGrid inProcessTransactionGrid;
// Transaction grid
private CallCenterListGrid transactionGrid;
private Button errorLogButton;
@Inject
public TransmitSessionDetailPageView() {
this.layout = new VLayout();
this.layout.setWidth100();
this.layout.setHeight100();
this.errorLogBar = new HLayout();
this.errorLogBar.setWidth100();
this.errorLogBar.setHeight(25);
this.errorLogBar.setAlign(Alignment.RIGHT);
errorLogButton = new Button("View Error Log");
errorLogButton.setShowRollOver(true);
errorLogButton.setShowDisabled(true);
errorLogButton.setShowDown(true);
errorLogButton.setWidth(150);
errorLogButton.setIcon("[SKIN]/FileBrowser/file.png");
this.errorLogBar.addMember(errorLogButton);
this.layout.addMember(errorLogBar);
this.detailForm = new DetailGroupForm();
this.layout.addMember(detailForm);
this.inProcessTransactionGrid = new CallCenterListGrid(true, "In Process Transactions", false, Autofit.HORIZONTAL, 200);
this.layout.addMember(inProcessTransactionGrid);
this.transactionGrid = new CallCenterListGrid(true, "Completed Transactions", false, Autofit.HORIZONTAL);
this.layout.addMember(transactionGrid);
}
@Override
public Widget asWidget() {
return this.layout;
}
@Override
public HasText getDetailGroup() {
return this.detailForm;
}
@Override
public void bindTransmissionDetail(DataSource transmissionDataSource, Integer id) {
this.detailForm.setDataSource(transmissionDataSource);
// Format Error Message
FormItem error = this.detailForm.getField("errorMessage");
error.setColSpan(10);
error.setRowSpan(3);
this.detailForm.fetchData(new Criteria("transmitSessionId", id.toString()), new DSCallback() {
@Override
public void execute(DSResponse response, Object rawData, DSRequest request) {
// Show error log icon if it exists
Boolean errorLogExists = response.getData()[0].getAttributeAsBoolean("errorLogExists");
if (errorLogExists != null && errorLogExists){
TransmitSessionDetailPageView.this.errorLogBar.show();
} else {
TransmitSessionDetailPageView.this.errorLogBar.hide();
}
}
});
}
@Override
public void bindTransactions(DataSource transactionDataSource, Integer id) {
this.transactionGrid.setDataSource(transactionDataSource);
this.transactionGrid.getGrid().fetchData(new Criteria("transmitSessionId", id.toString()), null);
}
@Override
public void bindInProcessTransactions(DataSource transactionDataSource, Integer id) {
this.inProcessTransactionGrid.setDataSource(transactionDataSource);
this.inProcessTransactionGrid.getGrid().fetchData(new Criteria("transmitSessionId", id.toString()), null);
}
@Override
public HasClickHandlers getViewErrorLogButton() {
return this.errorLogButton;
}
@Override
public HasRecordDoubleClickHandlers getTransactionSelected() {
return this.transactionGrid;
}
}
Code:
public class MainPageView extends ViewImpl implements MainPagePresenter.MyView {
// Layout values
private static final Integer PAGE_WIDTH = 960;
private static final Integer CONTENT_HEIGHT = 720;
private static final Integer DEFAULT_PADDING = 5;
private static final Integer HEADER_HEIGHT = 50;
private static final Integer TITLE_LOGO_WIDTH = 103;
private static final Integer TITLE_TEXT_WIDTH = (PAGE_WIDTH - (2 * TITLE_LOGO_WIDTH) - (4 * DEFAULT_PADDING));
private static final Integer TITLEBAR_HEIGHT = (int) (HEADER_HEIGHT * .8);
// Overall layout of page. Root container.
private VLayout layout;
// Header section common to all pages. Parent: layout
private VLayout masthead;
// Top of header, contains login info and title. Parent: masthead
private ToolStrip titleBar;
private Label usernameLabel;
// Bottom of header, contains breadcrumb navigation. Parent: masthead
private BreadCrumbs breadCrumbs;
// Main content section where pages will be revealed. Parent: layout
private VLayout workArea;
private ToolStripButton homeButton;
@Inject
public MainPageView() {
this.layout = new VLayout();
//this.layout.setPadding(DEFAULT_PADDING);
this.layout.setWidth(PAGE_WIDTH);
this.layout.setHeight100();
this.layout.setStyleName("main-layout");
this.masthead = new VLayout();
this.masthead.setHeight(HEADER_HEIGHT);
this.masthead.setWidth100();
this.masthead.setMargin(DEFAULT_PADDING);
this.layout.addMember(this.masthead);
this.titleBar = new ToolStrip();
this.titleBar.setHeight(TITLEBAR_HEIGHT);
this.titleBar.setPadding(DEFAULT_PADDING);
this.titleBar.setWidth100();
homeButton = new ToolStripButton();
homeButton.setIcon("ag-logo.png");
homeButton.setIconWidth(TITLE_LOGO_WIDTH);
homeButton.setIconHeight(31);
homeButton.setHeight(41);
homeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
}
});
Label titleLabel = new Label("Telxon USB Call Center");
titleLabel.setWidth(TITLE_TEXT_WIDTH);
titleLabel.setAlign(Alignment.CENTER);
titleLabel.setStyleName("title");
VLayout userNamePanel = new VLayout();
userNamePanel.setWidth("*");
userNamePanel.setAlign(Alignment.RIGHT);
userNamePanel.setAlign(VerticalAlignment.CENTER);
Label welcomeLabel = new Label("Welcome");
welcomeLabel.setHeight(22);
welcomeLabel.setAlign(Alignment.RIGHT);
welcomeLabel.setValign(VerticalAlignment.BOTTOM);
userNamePanel.addMember(welcomeLabel);
usernameLabel = new Label();
usernameLabel.setHeight(22);
usernameLabel.setAlign(Alignment.RIGHT);
usernameLabel.setValign(VerticalAlignment.TOP);
userNamePanel.addMember(usernameLabel);
this.titleBar.addButton(homeButton);
this.titleBar.addMember(titleLabel);
this.titleBar.addMember(userNamePanel);
this.masthead.addMember(this.titleBar);
this.breadCrumbs = new BreadCrumbs();
this.masthead.addMember(breadCrumbs);
this.workArea = new VLayout();
this.workArea.setWidth100();
this.workArea.setMargin(DEFAULT_PADDING);
this.workArea.setHeight("*");
this.layout.addMember(this.workArea);
}
@Override
public void setInSlot(Object slot, Widget content) {
this.workArea.removeMembers(this.workArea.getMembers());
if (slot == MainPagePresenter.TYPE_SetWorkAreaContent && content != null) {
this.workArea.setMembers((Canvas) content);
} else {
super.setInSlot(slot, content);
}
}
@Override
public Widget asWidget() {
return this.layout;
}
@Override
public Canvas getMasthead() {
return this.masthead;
}
@Override
public Canvas getBody() {
return this.workArea;
}
@Override
public void setUsername(String username) {
this.usernameLabel.setContents(username);
}
@Override
public HasClickHandlers getBreadcrumbs() {
return this.breadCrumbs;
}
@Override
public void refreshBreadcrumbs(PlaceManager placeManager) {
this.breadCrumbs.refreshBreadcrumbs(placeManager);
}
@Override
public HasClickHandlers getTitleLogoButton() {
return homeButton;
}
}
Comment