mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-17 01:31:01 +00:00
Merge remote-tracking branch 'origin/master' into raceboardmodes
Conflicts: java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorRaceChart.java java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
This commit is contained in:
commit
8af77a9671
32 files changed
+320
-156
No files matched your search
Binary file not shown.
+1
-1
@@ -62,7 +62,7 @@ public class WebSocketConnectionManager implements LiveDataConnection {
|
||||
private static final long CONNECTION_TIMEOUT_IN_MILLIS = 5000;
|
||||
|
||||
public WebSocketConnectionManager(IgtimiConnectionFactoryImpl connectionFactory, Iterable<String> deviceSerialNumbers, Account account) throws Exception {
|
||||
this.timer = new Timer("Timer for WebSocketConnectionManager for units "+deviceSerialNumbers+" and account "+account);
|
||||
this.timer = new Timer("Timer for WebSocketConnectionManager for units "+deviceSerialNumbers+" and account "+account, /* isDaemon */ true);
|
||||
this.deviceIds = deviceSerialNumbers;
|
||||
this.account = account;
|
||||
this.fixFactory = new FixFactory();
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ public class Simulator {
|
||||
private final WindStore windStore;
|
||||
private boolean stopped;
|
||||
private Duration advanceInMillis = Duration.NULL.minus(1);
|
||||
private Timer timer = new Timer("Timer for TracTrac Simulator");
|
||||
private Timer timer = new Timer("Timer for TracTrac Simulator", /* isDaemon */ true);
|
||||
private final Duration offsetToStart;
|
||||
|
||||
public Simulator(WindStore windStore, Duration offsetToStart) {
|
||||
|
||||
+1
-1
@@ -339,7 +339,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
|
||||
|
||||
private void initTransientFields() {
|
||||
this.raceDetailsAtEndOfTrackingCache = new HashMap<com.sap.sse.common.Util.Pair<TrackedRace,Competitor>, RunnableFuture<RaceDetails>>();
|
||||
this.raceDetailsExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
|
||||
this.raceDetailsExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true));
|
||||
this.cacheInvalidationListeners = new HashSet<CacheInvalidationListener>();
|
||||
// When many updates are triggered in a short period of time by a single thread, ensure that the single thread
|
||||
// providing the updates is not outperformed by all the re-calculations happening here. Leave at least one
|
||||
|
||||
+1
-1
@@ -505,7 +505,7 @@ public class TrackBasedEstimationWindTrackImpl extends VirtualWindTrackImpl {
|
||||
invalidateCache();
|
||||
} else {
|
||||
final Timer cacheInvalidationTimer = new Timer(
|
||||
"TrackBasedEstimationWindTrackImpl cache invalidation timer for race " + getTrackedRace().getRace());
|
||||
"TrackBasedEstimationWindTrackImpl cache invalidation timer for race " + getTrackedRace().getRace(), /* isDaemon */ true);
|
||||
cacheInvalidationTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
+1
-1
@@ -1982,7 +1982,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
|
||||
synchronized (cacheInvalidationTimerLock) {
|
||||
if (cacheInvalidationTimer == null) {
|
||||
cacheInvalidationTimer = new Timer("Cache invalidation timer for TrackedRaceImpl "
|
||||
+ getRace().getName());
|
||||
+ getRace().getName(), /* isDaemon */ true);
|
||||
cacheInvalidationTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
+8
@@ -90,11 +90,19 @@ public class BoatClassImageResolver {
|
||||
boatClassIconsMap.put(BoatClassMasterdata.PIRATE.getDisplayName(), imageResources.PiratIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.PLATU_25.getDisplayName(), imageResources.Platu25Icon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.PWA.getDisplayName(), imageResources.PWAIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS100.getDisplayName(), imageResources.RS100Icon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS200.getDisplayName(), imageResources.RS200Icon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS400.getDisplayName(), imageResources.RS400Icon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS500.getDisplayName(), imageResources.RS500Icon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS800.getDisplayName(), imageResources.RS800Icon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS_AERO.getDisplayName(), imageResources.RSAEROIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS_X.getDisplayName(), imageResources.RSXIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.RS_FEVA.getDisplayName(), imageResources.RSFevaIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.SONAR.getDisplayName(), imageResources.SonarIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.SOLING.getDisplayName(), imageResources.SolingIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.SPLASH_BLUE.getDisplayName(), imageResources.SplashBlueIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.SPLASH_RED.getDisplayName(), imageResources.SplashRedIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.SPLASH_GREEN.getDisplayName(), imageResources.SplashGreenIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.STAR.getDisplayName(), imageResources.StarIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.STREAMLINE.getDisplayName(), imageResources.StreamlineIcon());
|
||||
boatClassIconsMap.put(BoatClassMasterdata.SUNBEAM_22.getDisplayName(), imageResources.Sunbeam22Icon());
|
||||
|
||||
+4
-2
@@ -178,9 +178,11 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
|
||||
|
||||
leaderboardsPanel.add(filterLeaderboardPanel);
|
||||
leaderboardTable.ensureDebugId("AvailableLeaderboardsTable");
|
||||
addColumnsToLeaderboardTableAndSetSelectionModel(leaderboardTable, tableRes, leaderboardList);
|
||||
addColumnsToLeaderboardTableAndSetSelectionModel(leaderboardTable, tableRes,
|
||||
filterLeaderboardPanel.getAllListDataProvider());
|
||||
@SuppressWarnings("unchecked")
|
||||
RefreshableMultiSelectionModel<StrippedLeaderboardDTO> multiSelectionModel = (RefreshableMultiSelectionModel<StrippedLeaderboardDTO>) leaderboardTable.getSelectionModel();
|
||||
RefreshableMultiSelectionModel<StrippedLeaderboardDTO> multiSelectionModel = (RefreshableMultiSelectionModel<StrippedLeaderboardDTO>) leaderboardTable
|
||||
.getSelectionModel();
|
||||
leaderboardSelectionModel = multiSelectionModel;
|
||||
leaderboardTable.setWidth("100%");
|
||||
leaderboardSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
|
||||
+22
-17
@@ -98,7 +98,7 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
|
||||
|
||||
protected void createUI() {
|
||||
AdminConsoleTableResources tableResources = GWT.create(AdminConsoleTableResources.class);
|
||||
raceList = new ListDataProvider<RaceDTO>();
|
||||
raceList = new ListDataProvider<>();
|
||||
settings = new TrackedRacesSettings();
|
||||
settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l);
|
||||
VerticalPanel panel = new VerticalPanel();
|
||||
@@ -116,6 +116,22 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
|
||||
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
raceTable = new FlushableCellTable<RaceDTO>(/* pageSize */10000, tableRes);
|
||||
raceTable.ensureDebugId("TrackedRacesCellTable");
|
||||
|
||||
filterablePanelRaces = new LabeledAbstractFilterablePanel<RaceDTO>(lblFilterRaces, allRaces, raceTable,
|
||||
raceList) {
|
||||
@Override
|
||||
public List<String> getSearchableStrings(RaceDTO t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
strings.add(t.getName());
|
||||
strings.add(t.boatClass);
|
||||
strings.add(t.getRegattaName());
|
||||
strings.add(t.toString());
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
filterablePanelRaces.getTextBox().ensureDebugId("TrackedRacesFilterTextBox");
|
||||
|
||||
filterPanel.add(filterablePanelRaces);
|
||||
final EntityIdentityComparator<RaceDTO> entityIdentityComparator = new EntityIdentityComparator<RaceDTO>() {
|
||||
@Override
|
||||
public boolean representSameEntity(RaceDTO dto1, RaceDTO dto2) {
|
||||
@@ -130,12 +146,13 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
|
||||
this.selectionCheckboxColumn = new SelectionCheckboxColumn<RaceDTO>(
|
||||
tableResources.cellTableStyle().cellTableCheckboxSelected(),
|
||||
tableResources.cellTableStyle().cellTableCheckboxDeselected(),
|
||||
tableResources.cellTableStyle().cellTableCheckboxColumnCell(),
|
||||
entityIdentityComparator, raceList, raceTable);
|
||||
tableResources.cellTableStyle().cellTableCheckboxColumnCell(), entityIdentityComparator,
|
||||
filterablePanelRaces.getAllListDataProvider(), raceTable);
|
||||
refreshableSelectionModel = selectionCheckboxColumn.getSelectionModel();
|
||||
raceTable.setSelectionModel(refreshableSelectionModel, this.selectionCheckboxColumn.getSelectionManager());
|
||||
} else {
|
||||
refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>(entityIdentityComparator, raceList);
|
||||
refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>(entityIdentityComparator,
|
||||
filterablePanelRaces.getAllListDataProvider());
|
||||
raceTable.setSelectionModel(refreshableSelectionModel);
|
||||
}
|
||||
|
||||
@@ -153,19 +170,7 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
|
||||
makeControlsReactToSelectionChange(selectedRaces);
|
||||
}
|
||||
});
|
||||
filterablePanelRaces = new LabeledAbstractFilterablePanel<RaceDTO>(lblFilterRaces, allRaces, raceTable, raceList) {
|
||||
@Override
|
||||
public List<String> getSearchableStrings(RaceDTO t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
strings.add(t.getName());
|
||||
strings.add(t.boatClass);
|
||||
strings.add(t.getRegattaName());
|
||||
strings.add(t.toString());
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
filterablePanelRaces.getTextBox().ensureDebugId("TrackedRacesFilterTextBox");
|
||||
filterPanel.add(filterablePanelRaces);
|
||||
|
||||
HorizontalPanel trackedRacesButtonPanel = new HorizontalPanel();
|
||||
trackedRacesButtonPanel.setSpacing(10);
|
||||
panel.add(trackedRacesButtonPanel);
|
||||
|
||||
+1
@@ -230,6 +230,7 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
|
||||
return string;
|
||||
}
|
||||
};
|
||||
registerSelectionModelOnNewDataProvider(filterField.getAllListDataProvider());
|
||||
|
||||
//CompetitorTableEditFeatures
|
||||
ImagesBarColumn<CompetitorDTO, CompetitorConfigImagesBarCell> competitorActionColumn = new ImagesBarColumn<CompetitorDTO, CompetitorConfigImagesBarCell>(
|
||||
|
||||
+16
-15
@@ -152,21 +152,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
|
||||
eventControlsPanel.add(removeEventsButton);
|
||||
|
||||
eventListDataProvider = new ListDataProvider<EventDTO>();
|
||||
eventTable = createEventTable();
|
||||
eventTable.ensureDebugId("EventsCellTable");
|
||||
refreshableEventSelectionModel = (RefreshableMultiSelectionModel<EventDTO>) eventTable.getSelectionModel();
|
||||
eventTable.setVisible(false);
|
||||
|
||||
this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
final boolean somethingSelected = !refreshableEventSelectionModel.getSelectedSet().isEmpty();
|
||||
removeEventsButton.setEnabled(somethingSelected);
|
||||
}
|
||||
});
|
||||
|
||||
filterTextbox = new LabeledAbstractFilterablePanel<EventDTO>(new Label(stringMessages.filterEventsByName()), allEvents,
|
||||
eventTable, eventListDataProvider) {
|
||||
new CellTable<EventDTO>(), eventListDataProvider) {
|
||||
@Override
|
||||
public Iterable<String> getSearchableStrings(EventDTO t) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
@@ -181,6 +168,20 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
|
||||
return result;
|
||||
}
|
||||
};
|
||||
eventTable = createEventTable();
|
||||
eventTable.ensureDebugId("EventsCellTable");
|
||||
filterTextbox.setTable(eventTable);
|
||||
refreshableEventSelectionModel = (RefreshableMultiSelectionModel<EventDTO>) eventTable.getSelectionModel();
|
||||
eventTable.setVisible(false);
|
||||
|
||||
this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
final boolean somethingSelected = !refreshableEventSelectionModel.getSelectedSet().isEmpty();
|
||||
removeEventsButton.setEnabled(somethingSelected);
|
||||
}
|
||||
});
|
||||
|
||||
panel.add(filterTextbox);
|
||||
panel.add(eventTable);
|
||||
|
||||
@@ -211,7 +212,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
|
||||
public int hashCode(EventDTO t) {
|
||||
return t.id.hashCode();
|
||||
}
|
||||
},eventListDataProvider,table);
|
||||
},filterTextbox.getAllListDataProvider(),table);
|
||||
|
||||
AnchorCell anchorCell = new AnchorCell();
|
||||
Column<EventDTO, SafeHtml> eventNameColumn = new Column<EventDTO, SafeHtml>(anchorCell) {
|
||||
|
||||
+5
-3
@@ -80,18 +80,20 @@ public class IgtimiAccountsPanel extends FlowPanel {
|
||||
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
allAccounts = new BaseCelltable<String>(/* pageSize */10000, tableRes);
|
||||
final ListDataProvider<String> filteredAccounts = new ListDataProvider<String>();
|
||||
refreshableAccountsSelectionModel = new RefreshableSingleSelectionModel<String>(null, filteredAccounts);
|
||||
allAccounts.setSelectionModel(refreshableAccountsSelectionModel);
|
||||
ListHandler<String> accountColumnListHandler = new ListHandler<String>(filteredAccounts.getList());
|
||||
filteredAccounts.addDataDisplay(allAccounts);
|
||||
final List<String> emptyList = Collections.emptyList();
|
||||
filterAccountsPanel = new LabeledAbstractFilterablePanel<String>(new Label(stringMessages.igtimiAccounts()), emptyList, allAccounts, filteredAccounts) {
|
||||
filterAccountsPanel = new LabeledAbstractFilterablePanel<String>(new Label(stringMessages.igtimiAccounts()),
|
||||
emptyList, allAccounts, filteredAccounts) {
|
||||
@Override
|
||||
public Iterable<String> getSearchableStrings(String t) {
|
||||
Set<String> strings = Collections.singleton(t);
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
refreshableAccountsSelectionModel = new RefreshableSingleSelectionModel<String>(null,
|
||||
filterAccountsPanel.getAllListDataProvider());
|
||||
allAccounts.setSelectionModel(refreshableAccountsSelectionModel);
|
||||
final Panel controlsPanel = new HorizontalPanel();
|
||||
final Button removeAccountButton = new Button(stringMessages.remove());
|
||||
removeAccountButton.setEnabled(false);
|
||||
|
||||
+12
-11
@@ -191,6 +191,16 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
|
||||
ListHandler<StrippedLeaderboardDTO> leaderboardsListHandler = new ListHandler<StrippedLeaderboardDTO>(leaderboardsProvider.getList());
|
||||
leaderboardsTable = new FlushableCellTable<StrippedLeaderboardDTO>(10000, tableRes);
|
||||
leaderboardsTable.ensureDebugId("LeaderboardsCellTable");
|
||||
leaderboardsFilterablePanel = new LabeledAbstractFilterablePanel<StrippedLeaderboardDTO>(
|
||||
filterLeaderboardsLabel, availableLeaderboards, leaderboardsTable, leaderboardsProvider) {
|
||||
@Override
|
||||
public Iterable<String> getSearchableStrings(StrippedLeaderboardDTO t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
strings.add(t.name);
|
||||
strings.add(t.displayName);
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
SelectionCheckboxColumn<StrippedLeaderboardDTO> leaderboardTableSelectionColumn =
|
||||
new SelectionCheckboxColumn<StrippedLeaderboardDTO>(
|
||||
tableResources.cellTableStyle().cellTableCheckboxSelected(),
|
||||
@@ -205,18 +215,9 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
|
||||
public int hashCode(StrippedLeaderboardDTO t) {
|
||||
return t.name.hashCode();
|
||||
}
|
||||
}, leaderboardsProvider, leaderboardsTable);
|
||||
}, leaderboardsFilterablePanel.getAllListDataProvider(), leaderboardsTable);
|
||||
refreshableLeaderboardsSelectionModel = leaderboardTableSelectionColumn.getSelectionModel();
|
||||
leaderboardsTable.setSelectionModel(refreshableLeaderboardsSelectionModel, leaderboardTableSelectionColumn.getSelectionManager());
|
||||
leaderboardsFilterablePanel = new LabeledAbstractFilterablePanel<StrippedLeaderboardDTO>(filterLeaderboardsLabel, availableLeaderboards, leaderboardsTable, leaderboardsProvider) {
|
||||
@Override
|
||||
public Iterable<String> getSearchableStrings(StrippedLeaderboardDTO t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
strings.add(t.name);
|
||||
strings.add(t.displayName);
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
leaderboardsFilterablePanel.getTextBox().ensureDebugId("LeaderboardsFilterTextBox");
|
||||
leaderboardsFunctionPanel.add(leaderboardsFilterablePanel);
|
||||
|
||||
@@ -588,7 +589,7 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
|
||||
public int hashCode(LeaderboardGroupDTO t) {
|
||||
return t.getId().hashCode();
|
||||
}
|
||||
}, groupsProvider);
|
||||
}, groupsFilterablePanel.getAllListDataProvider());
|
||||
refreshableGroupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
|
||||
+23
-9
@@ -36,6 +36,8 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
|
||||
import com.sap.sse.common.util.NaturalComparator;
|
||||
import com.sap.sse.gwt.client.celltable.BaseCelltable;
|
||||
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
|
||||
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
|
||||
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
|
||||
|
||||
public class LeaderboardGroupSelectorComposite extends Composite implements HasValueChangeHandlers<Iterable<LeaderboardGroupDTO>> {
|
||||
@@ -47,7 +49,7 @@ public class LeaderboardGroupSelectorComposite extends Composite implements HasV
|
||||
|
||||
private LabeledAbstractFilterablePanel<LeaderboardGroupDTO> availableLeaderboardGroupsFilterablePanel;
|
||||
private CellTable<LeaderboardGroupDTO> availableLeaderboardGroupsTable;
|
||||
private MultiSelectionModel<LeaderboardGroupDTO> availableLeaderboardGroupsSelectionModel;
|
||||
private RefreshableMultiSelectionModel<LeaderboardGroupDTO> availableLeaderboardGroupsSelectionModel;
|
||||
private ListDataProvider<LeaderboardGroupDTO> availableLeaderboardGroupsProvider;
|
||||
|
||||
private List<LeaderboardGroupDTO> availableLeaderboardGroups;
|
||||
@@ -136,14 +138,6 @@ public class LeaderboardGroupSelectorComposite extends Composite implements HasV
|
||||
private Widget createAvailableLeaderboardGroupsPanel() {
|
||||
availableLeaderboardGroupsTable = new BaseCelltable<LeaderboardGroupDTO>(10000000, tableRes);
|
||||
CaptionPanel result = new CaptionPanel(stringMessages.availableLeaderboardGroups());
|
||||
availableLeaderboardGroupsSelectionModel = new MultiSelectionModel<>();
|
||||
availableLeaderboardGroupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
addToEventButton.setEnabled(!availableLeaderboardGroupsSelectionModel.getSelectedSet().isEmpty());
|
||||
}
|
||||
});
|
||||
availableLeaderboardGroupsTable.setSelectionModel(availableLeaderboardGroupsSelectionModel);
|
||||
availableLeaderboardGroupsProvider = new ListDataProvider<>();
|
||||
availableLeaderboardGroupsProvider.setList(availableLeaderboardGroups);
|
||||
availableLeaderboardGroupsProvider.addDataDisplay(availableLeaderboardGroupsTable);
|
||||
@@ -157,6 +151,26 @@ public class LeaderboardGroupSelectorComposite extends Composite implements HasV
|
||||
return result;
|
||||
}
|
||||
};
|
||||
availableLeaderboardGroupsSelectionModel = new RefreshableMultiSelectionModel<>(
|
||||
new EntityIdentityComparator<LeaderboardGroupDTO>() {
|
||||
|
||||
@Override
|
||||
public boolean representSameEntity(LeaderboardGroupDTO dto1, LeaderboardGroupDTO dto2) {
|
||||
return dto1.getName().equals(dto2.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode(LeaderboardGroupDTO t) {
|
||||
return t.getName().hashCode();
|
||||
}
|
||||
}, availableLeaderboardGroupsFilterablePanel.getAllListDataProvider());
|
||||
availableLeaderboardGroupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
addToEventButton.setEnabled(!availableLeaderboardGroupsSelectionModel.getSelectedSet().isEmpty());
|
||||
}
|
||||
});
|
||||
availableLeaderboardGroupsTable.setSelectionModel(availableLeaderboardGroupsSelectionModel);
|
||||
VerticalPanel vp = new VerticalPanel();
|
||||
vp.add(availableLeaderboardGroupsFilterablePanel);
|
||||
vp.add(availableLeaderboardGroupsTable);
|
||||
|
||||
+6
-3
@@ -112,13 +112,14 @@ public class MediaPanel extends FlowPanel {
|
||||
});
|
||||
buttonAndFilterPanel.add(addUrlButton);
|
||||
add(buttonAndFilterPanel);
|
||||
createMediaTracksTable();
|
||||
|
||||
Label lblFilterRaces = new Label(stringMessages.filterMediaByName() + ":");
|
||||
lblFilterRaces.setWordWrap(false);
|
||||
buttonAndFilterPanel.setSpacing(5);
|
||||
buttonAndFilterPanel.add(lblFilterRaces);
|
||||
buttonAndFilterPanel.setCellVerticalAlignment(lblFilterRaces, HasVerticalAlignment.ALIGN_MIDDLE);
|
||||
this.filterableMediaTracks = new LabeledAbstractFilterablePanel<MediaTrack>(lblFilterRaces, allMediaTracks, mediaTracksTable, mediaTrackListDataProvider) {
|
||||
this.filterableMediaTracks = new LabeledAbstractFilterablePanel<MediaTrack>(lblFilterRaces, allMediaTracks,
|
||||
new CellTable<MediaTrack>(), mediaTrackListDataProvider) {
|
||||
@Override
|
||||
public List<String> getSearchableStrings(MediaTrack t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
@@ -131,6 +132,8 @@ public class MediaPanel extends FlowPanel {
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
createMediaTracksTable();
|
||||
filterableMediaTracks.setTable(mediaTracksTable);
|
||||
filterableMediaTracks.getTextBox().ensureDebugId("MediaTracksFilterTextBox");
|
||||
buttonAndFilterPanel.add(filterableMediaTracks);
|
||||
}
|
||||
@@ -178,7 +181,7 @@ public class MediaPanel extends FlowPanel {
|
||||
public int hashCode(MediaTrack t) {
|
||||
return t.dbId.hashCode();
|
||||
}
|
||||
}, mediaTrackListDataProvider);
|
||||
}, filterableMediaTracks.getAllListDataProvider());
|
||||
mediaTracksTable.setSelectionModel(refreshableSelectionModel,
|
||||
DefaultSelectionEventManager.<MediaTrack> createDefaultManager());
|
||||
|
||||
|
||||
+7
-6
@@ -97,13 +97,9 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
|
||||
panel.add(noRegattasLabel);
|
||||
|
||||
regattaListDataProvider = new ListDataProvider<RegattaDTO>();
|
||||
regattaTable = createRegattaTable();
|
||||
regattaTable.ensureDebugId("RegattasCellTable");
|
||||
refreshableRegattaMultiSelectionModel = (RefreshableMultiSelectionModel<RegattaDTO>) regattaTable.getSelectionModel();
|
||||
regattaTable.setVisible(false);
|
||||
|
||||
filterablePanelRegattas = new LabeledAbstractFilterablePanel<RegattaDTO>(filterRegattasLabel, allRegattas,
|
||||
regattaTable, regattaListDataProvider) {
|
||||
new CellTable<RegattaDTO>(), regattaListDataProvider) {
|
||||
@Override
|
||||
public Iterable<String> getSearchableStrings(RegattaDTO t) {
|
||||
List<String> string = new ArrayList<String>();
|
||||
@@ -115,6 +111,11 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
|
||||
}
|
||||
};
|
||||
filterablePanelRegattas.getTextBox().ensureDebugId("RegattasFilterTextBox");
|
||||
regattaTable = createRegattaTable();
|
||||
regattaTable.ensureDebugId("RegattasCellTable");
|
||||
filterablePanelRegattas.setTable(regattaTable);
|
||||
refreshableRegattaMultiSelectionModel = (RefreshableMultiSelectionModel<RegattaDTO>) regattaTable.getSelectionModel();
|
||||
regattaTable.setVisible(false);
|
||||
panel.add(filterablePanelRegattas);
|
||||
|
||||
panel.add(regattaTable);
|
||||
@@ -142,7 +143,7 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
|
||||
public int hashCode(RegattaDTO t) {
|
||||
return t.getRegattaIdentifier().hashCode();
|
||||
}
|
||||
},regattaListDataProvider, table);
|
||||
}, filterablePanelRegattas.getAllListDataProvider(), table);
|
||||
|
||||
ListHandler<RegattaDTO> columnSortHandler = new ListHandler<RegattaDTO>(regattaListDataProvider.getList());
|
||||
table.addColumnSortHandler(columnSortHandler);
|
||||
|
||||
+6
-5
@@ -64,11 +64,9 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel {
|
||||
remoteServersPanel.setContentWidget(remoteServersContentPanel);
|
||||
|
||||
serverDataProvider = new ListDataProvider<RemoteSailingServerReferenceDTO>();
|
||||
CellTable<RemoteSailingServerReferenceDTO> remoteServersTable = createRemoteServersTable();
|
||||
serverDataProvider.addDataDisplay(remoteServersTable);
|
||||
|
||||
filteredServerTablePanel = new LabeledAbstractFilterablePanel<RemoteSailingServerReferenceDTO>(
|
||||
new Label(stringMessages.filterBy() + ":"), Collections.<RemoteSailingServerReferenceDTO>emptyList(), remoteServersTable, serverDataProvider) {
|
||||
new Label(stringMessages.filterBy() + ":"), Collections.<RemoteSailingServerReferenceDTO> emptyList(),
|
||||
new CellTable<RemoteSailingServerReferenceDTO>(), serverDataProvider) {
|
||||
@Override
|
||||
public List<String> getSearchableStrings(RemoteSailingServerReferenceDTO t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
@@ -82,6 +80,9 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel {
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
CellTable<RemoteSailingServerReferenceDTO> remoteServersTable = createRemoteServersTable();
|
||||
filteredServerTablePanel.setTable(remoteServersTable);
|
||||
serverDataProvider.addDataDisplay(remoteServersTable);
|
||||
|
||||
remoteServersContentPanel.add(filteredServerTablePanel);
|
||||
remoteServersContentPanel.add(remoteServersTable);
|
||||
@@ -173,7 +174,7 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel {
|
||||
public int hashCode(RemoteSailingServerReferenceDTO t) {
|
||||
return t.getUrl().hashCode();
|
||||
}
|
||||
}, serverDataProvider);
|
||||
}, filteredServerTablePanel.getAllListDataProvider());
|
||||
serverTable.setSelectionModel(refreshableServerSelectionModel);
|
||||
|
||||
return serverTable;
|
||||
|
||||
+20
-21
@@ -264,27 +264,6 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
|
||||
raceTable.addColumn(raceStartTimeColumn, stringConstants.startTime());
|
||||
raceTable.setWidth("300px");
|
||||
raceList = new ListDataProvider<SwissTimingRaceRecordDTO>();
|
||||
raceTable.setSelectionModel(new RefreshableMultiSelectionModel<SwissTimingRaceRecordDTO>(
|
||||
new EntityIdentityComparator<SwissTimingRaceRecordDTO>() {
|
||||
@Override
|
||||
public boolean representSameEntity(SwissTimingRaceRecordDTO dto1, SwissTimingRaceRecordDTO dto2) {
|
||||
return dto1.raceId.equals(dto2.raceId);
|
||||
}
|
||||
@Override
|
||||
public int hashCode(SwissTimingRaceRecordDTO t) {
|
||||
return t.raceId.hashCode();
|
||||
}
|
||||
}, raceList) {
|
||||
});
|
||||
|
||||
trackableRacesPanel.add(raceTable);
|
||||
raceList.addDataDisplay(raceTable);
|
||||
Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), regattaNameColumn, seriesNameColumn,
|
||||
raceNameColumn, raceStartTimeColumn, raceIdColumn, boatClassColumn, genderColumn, raceStatusColumn);
|
||||
raceTable.addColumnSortHandler(columnSortHandler);
|
||||
|
||||
trackedRacesPanel.add(trackedRacesListComposite);
|
||||
|
||||
filterablePanelEvents = new LabeledAbstractFilterablePanel<SwissTimingRaceRecordDTO>(lblFilterEvents,
|
||||
availableSwissTimingRaces, raceTable, raceList) {
|
||||
@Override
|
||||
@@ -302,6 +281,26 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
raceTable.setSelectionModel(new RefreshableMultiSelectionModel<SwissTimingRaceRecordDTO>(
|
||||
new EntityIdentityComparator<SwissTimingRaceRecordDTO>() {
|
||||
@Override
|
||||
public boolean representSameEntity(SwissTimingRaceRecordDTO dto1, SwissTimingRaceRecordDTO dto2) {
|
||||
return dto1.raceId.equals(dto2.raceId);
|
||||
}
|
||||
@Override
|
||||
public int hashCode(SwissTimingRaceRecordDTO t) {
|
||||
return t.raceId.hashCode();
|
||||
}
|
||||
}, filterablePanelEvents.getAllListDataProvider()) {
|
||||
});
|
||||
|
||||
trackableRacesPanel.add(raceTable);
|
||||
raceList.addDataDisplay(raceTable);
|
||||
Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), regattaNameColumn, seriesNameColumn,
|
||||
raceNameColumn, raceStartTimeColumn, raceIdColumn, boatClassColumn, genderColumn, raceStatusColumn);
|
||||
raceTable.addColumnSortHandler(columnSortHandler);
|
||||
|
||||
trackedRacesPanel.add(trackedRacesListComposite);
|
||||
filterPanel.add(filterablePanelEvents);
|
||||
HorizontalPanel racesButtonPanel = new HorizontalPanel();
|
||||
trackableRacesPanel.add(racesButtonPanel);
|
||||
|
||||
+9
-11
@@ -192,6 +192,14 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane
|
||||
raceTable.addColumn(raceStartTrackingColumn, stringMessages.startTime());
|
||||
raceTable.setWidth("300px");
|
||||
raceList = new ListDataProvider<SwissTimingReplayRaceDTO>();
|
||||
filterablePanelEvents = new LabeledAbstractFilterablePanel<SwissTimingReplayRaceDTO>(lblFilterEvents, availableSwissTimingRaces, raceTable, raceList) {
|
||||
@Override
|
||||
public List<String> getSearchableStrings(SwissTimingReplayRaceDTO t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
strings.addAll(Arrays.asList(t.boat_class, t.flight_number, t.getName(), t.race_id, t.rsc));
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
raceTable.setSelectionModel(new RefreshableMultiSelectionModel<SwissTimingReplayRaceDTO>(
|
||||
new EntityIdentityComparator<SwissTimingReplayRaceDTO>() {
|
||||
@Override
|
||||
@@ -202,7 +210,7 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane
|
||||
public int hashCode(SwissTimingReplayRaceDTO t) {
|
||||
return t.race_id.hashCode();
|
||||
}
|
||||
}, raceList) {
|
||||
}, filterablePanelEvents.getAllListDataProvider()) {
|
||||
});
|
||||
|
||||
racesHorizontalPanel.add(raceTable);
|
||||
@@ -210,16 +218,6 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane
|
||||
raceList.addDataDisplay(raceTable);
|
||||
Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), raceNameColumn, boatClassNamesColumn, raceStartTrackingColumn);
|
||||
raceTable.addColumnSortHandler(columnSortHandler);
|
||||
|
||||
filterablePanelEvents = new LabeledAbstractFilterablePanel<SwissTimingReplayRaceDTO>(lblFilterEvents, availableSwissTimingRaces, raceTable, raceList) {
|
||||
@Override
|
||||
public List<String> getSearchableStrings(SwissTimingReplayRaceDTO t) {
|
||||
List<String> strings = new ArrayList<String>();
|
||||
strings.addAll(Arrays.asList(t.boat_class, t.flight_number, t.getName(), t.race_id, t.rsc));
|
||||
return strings;
|
||||
}
|
||||
};
|
||||
|
||||
filterPanel.add(filterablePanelEvents);
|
||||
|
||||
Label lblTrackSettings = new Label(stringMessages.trackNewEvent());
|
||||
|
||||
+40
-19
@@ -27,12 +27,15 @@ import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
|
||||
*/
|
||||
public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> implements IsWidget {
|
||||
protected final FlushableCellTable<T> table;
|
||||
private final S selectionModel;
|
||||
protected final ListDataProvider<T> dataProvider;
|
||||
private S selectionModel;
|
||||
protected ListDataProvider<T> dataProvider;
|
||||
protected VerticalPanel mainPanel;
|
||||
protected final SailingServiceAsync sailingService;
|
||||
protected final ErrorReporter errorReporter;
|
||||
protected final StringMessages stringMessages;
|
||||
private final boolean multiSelection;
|
||||
private SelectionCheckboxColumn<T> selectionCheckboxColumn;
|
||||
private final EntityIdentityComparator<T> entityIdentityComparator;
|
||||
|
||||
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
private final ListHandler<T> columnSortHandler;
|
||||
@@ -49,6 +52,8 @@ public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> im
|
||||
|
||||
public TableWrapper(SailingServiceAsync sailingService, final StringMessages stringMessages, ErrorReporter errorReporter,
|
||||
boolean multiSelection, boolean enablePager, EntityIdentityComparator<T> entityIdentityComparator) {
|
||||
this.entityIdentityComparator = entityIdentityComparator;
|
||||
this.multiSelection = multiSelection;
|
||||
this.sailingService = sailingService;
|
||||
this.errorReporter = errorReporter;
|
||||
this.stringMessages = stringMessages;
|
||||
@@ -57,23 +62,7 @@ public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> im
|
||||
this.dataProvider = new ListDataProvider<T>();
|
||||
this.columnSortHandler = new ListHandler<T>(dataProvider.getList());
|
||||
table.addColumnSortHandler(this.columnSortHandler);
|
||||
if (multiSelection) {
|
||||
SelectionCheckboxColumn<T> selectionCheckboxColumn = new SelectionCheckboxColumn<T>(
|
||||
tableRes.cellTableStyle().cellTableCheckboxSelected(),
|
||||
tableRes.cellTableStyle().cellTableCheckboxDeselected(),
|
||||
tableRes.cellTableStyle().cellTableCheckboxColumnCell(), entityIdentityComparator, dataProvider, table);
|
||||
columnSortHandler.setComparator(selectionCheckboxColumn, selectionCheckboxColumn.getComparator());
|
||||
@SuppressWarnings("unchecked")
|
||||
S typedSelectionModel = (S) selectionCheckboxColumn.getSelectionModel();
|
||||
selectionModel = typedSelectionModel;
|
||||
table.setSelectionModel(selectionModel, selectionCheckboxColumn.getSelectionManager());
|
||||
table.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader());
|
||||
} else {
|
||||
@SuppressWarnings("unchecked")
|
||||
S typedSelectionModel = (S) new RefreshableSingleSelectionModel<T>(entityIdentityComparator, dataProvider);
|
||||
selectionModel = typedSelectionModel;
|
||||
table.setSelectionModel(selectionModel);
|
||||
}
|
||||
registerSelectionModelOnNewDataProvider(dataProvider);
|
||||
mainPanel = new VerticalPanel();
|
||||
dataProvider.addDataDisplay(table);
|
||||
mainPanel.add(table);
|
||||
@@ -118,4 +107,36 @@ public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> im
|
||||
Util.addAll(newItems, dataProvider.getList());
|
||||
dataProvider.flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method allows you to change the data base for the {@link RefreshableSelectionModel}. Therefore a new
|
||||
* {@link ListDataProvider} is needed.
|
||||
*
|
||||
* @param dataProvider
|
||||
* {@link ListDataProvider} as data base for the {@link RefreshableSelectionModel}.
|
||||
*/
|
||||
public void registerSelectionModelOnNewDataProvider(ListDataProvider<T> dataProvider) {
|
||||
this.dataProvider = dataProvider;
|
||||
if (multiSelection) {
|
||||
if (selectionCheckboxColumn != null) {
|
||||
table.removeColumn(selectionCheckboxColumn);
|
||||
}
|
||||
selectionCheckboxColumn = new SelectionCheckboxColumn<T>(
|
||||
tableRes.cellTableStyle().cellTableCheckboxSelected(),
|
||||
tableRes.cellTableStyle().cellTableCheckboxDeselected(),
|
||||
tableRes.cellTableStyle().cellTableCheckboxColumnCell(), entityIdentityComparator, dataProvider,
|
||||
table);
|
||||
columnSortHandler.setComparator(selectionCheckboxColumn, selectionCheckboxColumn.getComparator());
|
||||
@SuppressWarnings("unchecked")
|
||||
S typedSelectionModel = (S) selectionCheckboxColumn.getSelectionModel();
|
||||
selectionModel = typedSelectionModel;
|
||||
table.setSelectionModel(selectionModel, selectionCheckboxColumn.getSelectionManager());
|
||||
table.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader());
|
||||
} else {
|
||||
@SuppressWarnings("unchecked")
|
||||
S typedSelectionModel = (S) new RefreshableSingleSelectionModel<T>(entityIdentityComparator, dataProvider);
|
||||
selectionModel = typedSelectionModel;
|
||||
table.setSelectionModel(selectionModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -392,7 +392,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel {
|
||||
public int hashCode(TracTracRaceRecordDTO t) {
|
||||
return t.id.hashCode();
|
||||
}
|
||||
}, raceList, racesTable);
|
||||
}, racesFilterablePanel.getAllListDataProvider(), racesTable);
|
||||
racesTable.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader());
|
||||
racesTable.addColumn(regattaNameColumn, stringMessages.event());
|
||||
racesTable.addColumn(raceNameColumn, stringMessages.race());
|
||||
|
||||
+2
-3
@@ -253,9 +253,8 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
|
||||
|
||||
private void doLoadDataForCompetitorsAndDataType(final Date from, final Date to, final boolean append,
|
||||
ArrayList<CompetitorDTO> competitorsToLoad, final DetailType selectedDataTypeToRetrieve) {
|
||||
long stepSize = (from==null||to==null) ?
|
||||
getStepSizeInMillis() :
|
||||
Math.max(getStepSizeInMillis(), Math.abs(to.getTime()-from.getTime())/SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY);
|
||||
long stepSize = Math.max(getStepSizeInMillis(),
|
||||
from==null||to==null ? 0 : Math.abs(to.getTime()-from.getTime())/SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY);
|
||||
GetCompetitorsRaceDataAction getCompetitorsRaceDataAction = new GetCompetitorsRaceDataAction(sailingService,
|
||||
selectedRaceIdentifier, competitorsToLoad, from, to, stepSize, selectedDataTypeToRetrieve,
|
||||
leaderboardGroupName, leaderboardName);
|
||||
|
||||
+7
@@ -91,6 +91,9 @@ public class LeaderboardDetailsPanelPO extends PageArea {
|
||||
@FindBy(how = BySeleniumId.class, using = "TrackedRacesListComposite")
|
||||
private WebElement trackedRacesListComposite;
|
||||
|
||||
@FindBy(how = BySeleniumId.class, using = "TrackedRacesFilterTextBox")
|
||||
private WebElement trackedRacesFilterTextBox;
|
||||
|
||||
public LeaderboardDetailsPanelPO(WebDriver driver, WebElement element) {
|
||||
super(driver, element);
|
||||
}
|
||||
@@ -214,6 +217,10 @@ public class LeaderboardDetailsPanelPO extends PageArea {
|
||||
return new LeaderboardRacesTablePO(driver, this.racesCellTable);
|
||||
}
|
||||
|
||||
public void filter(String s) {
|
||||
trackedRacesFilterTextBox.sendKeys(s);
|
||||
}
|
||||
|
||||
private CellTablePO<DataEntryPO> getTrackedRacesTable() {
|
||||
WebElement table = findElementBySeleniumId(this.trackedRacesListComposite, "TrackedRacesCellTable");
|
||||
|
||||
|
||||
+37
-1
@@ -18,6 +18,7 @@ import com.sap.sailing.selenium.core.WindowManager;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.AdminConsolePage;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.connectors.SmartphoneTrackingEventManagementPanelPO;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardConfigurationPanelPO;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardDetailsPanelPO;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardDetailsPanelPO.RaceDescriptor;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaDetailsCompositePO;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaStructureManagementPanelPO;
|
||||
@@ -28,6 +29,7 @@ import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetit
|
||||
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorsPanelPO;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorTablePO.CompetitorEntry;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesListPO.TrackedRaceDescriptor;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.tractrac.TracTracEventManagementPanelPO;
|
||||
import com.sap.sailing.selenium.pages.adminconsole.tractrac.TracTracEventManagementPanelPO.TrackableRaceDescriptor;
|
||||
import com.sap.sailing.selenium.pages.gwt.CellTablePO;
|
||||
import com.sap.sailing.selenium.pages.gwt.DataEntryPO;
|
||||
@@ -50,6 +52,9 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
|
||||
private static final String EVENT = "IDM 5O5 2013"; //$NON-NLS-1$
|
||||
private static final String BOAT_CLASS = "5O5"; //$NON-NLS-1$
|
||||
private static final String RACE = "Race %d"; //$NON-NLS-1$
|
||||
|
||||
private static final String IDM_5O5_2013_JSON_URL =
|
||||
"http://traclive.dk/events/event_20130917_IDMO/jsonservice.php"; //$NON-NLS-1$
|
||||
|
||||
private RegattaDescriptor regatta;
|
||||
|
||||
@@ -171,7 +176,7 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
|
||||
TrackableRaceDescriptor trackableRace = new TrackableRaceDescriptor(EVENT, raceName, BOAT_CLASS);
|
||||
TrackedRaceDescriptor trackedRace = new TrackedRaceDescriptor(this.regatta.toString(), BOAT_CLASS,
|
||||
raceName);
|
||||
RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("R%s", i), "Default", false, false, 0);
|
||||
RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("D%s", i), "Default", false, false, 0);
|
||||
|
||||
this.trackableRaces.add(trackableRace);
|
||||
this.trackedRaces.add(trackedRace);
|
||||
@@ -198,6 +203,7 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
|
||||
LeaderboardConfigurationPanelPO leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
|
||||
leaderboardConfiguration.createRegattaLeaderboard(this.regatta);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRefreshOfDependingUIElements() {
|
||||
windowForSelection.switchToWindow();
|
||||
@@ -252,4 +258,34 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
|
||||
final int newAnzRaceColumns = raceColumnTable.getEntries().size();
|
||||
assertEquals(7, newAnzRaceColumns);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMaintenanceOfSelectionAfterFilteringTrackedracesOnLeaderboardConfigPanel() {
|
||||
windowForSelection.switchToWindow();
|
||||
setUpTestRefreshOfDependingUIElements();
|
||||
AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot());
|
||||
LeaderboardConfigurationPanelPO leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
|
||||
leaderboardConfiguration.getLeaderboardDetails(LEADERBOARD);
|
||||
|
||||
// Start the tracking for the races and wait until they are ready to use
|
||||
TracTracEventManagementPanelPO tracTracEvents = adminConsole.goToTracTracEvents();
|
||||
tracTracEvents.listTrackableRaces(IDM_5O5_2013_JSON_URL);
|
||||
tracTracEvents.setReggataForTracking(this.regatta);
|
||||
tracTracEvents.setTrackSettings(false, false, false);
|
||||
// TODO: There exists a bug in Selenium with key modifiers (Issue 3734 and 6817), so we can't use multi
|
||||
// selection (Firefox on Windows)
|
||||
//tracTracEvents.startTrackingForRaces(this.trackableRaces);
|
||||
for(int i =0; i<2;i++) {
|
||||
tracTracEvents.startTrackingForRace(trackableRaces.get(i));
|
||||
}
|
||||
|
||||
leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
|
||||
LeaderboardDetailsPanelPO leaderboardDetails = leaderboardConfiguration.getLeaderboardDetails(this.regatta.toString());
|
||||
|
||||
leaderboardDetails.linkRace(this.leaderboardRaces.get(0), this.trackedRaces.get(0));
|
||||
assertEquals("Yes", leaderboardDetails.getRacesTable().getEntries().get(0).getColumnContent(3));
|
||||
|
||||
leaderboardDetails.filter("sgfoganafen");
|
||||
assertEquals("Yes", leaderboardDetails.getRacesTable().getEntries().get(0).getColumnContent(3));
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -27,7 +27,6 @@ import com.google.gwt.view.client.SingleSelectionModel;
|
||||
public class RefreshableSingleSelectionModel<T> extends SingleSelectionModel<T> implements RefreshableSelectionModel<T> {
|
||||
private final EntityIdentityComparator<T> comp;
|
||||
private boolean dontcheckSelectionState = false;
|
||||
private final ListDataProvider<T> listDataProvider;
|
||||
|
||||
/**
|
||||
* @param comp
|
||||
@@ -44,8 +43,7 @@ public class RefreshableSingleSelectionModel<T> extends SingleSelectionModel<T>
|
||||
}
|
||||
});
|
||||
this.comp = comp;
|
||||
this.listDataProvider = listDataProvider;
|
||||
this.listDataProvider.addDataDisplay(new HasDataAdapter<T>(this, listDataProvider));
|
||||
listDataProvider.addDataDisplay(new HasDataAdapter<T>(this, listDataProvider));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+66
-16
@@ -1,8 +1,6 @@
|
||||
package com.sap.sse.gwt.client.panels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.event.dom.client.KeyUpEvent;
|
||||
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||
@@ -15,6 +13,10 @@ import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.view.client.ListDataProvider;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.AbstractListFilter;
|
||||
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
|
||||
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
|
||||
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
|
||||
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
|
||||
|
||||
/**
|
||||
* This Panel contains a text box. Text entered into the text box filters the {@link CellTable} passed to
|
||||
@@ -35,8 +37,8 @@ import com.sap.sse.common.filter.AbstractListFilter;
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
protected List<T> all;
|
||||
protected final AbstractCellTable<T> display;
|
||||
protected ListDataProvider<T> all;
|
||||
protected AbstractCellTable<T> display;
|
||||
protected final ListDataProvider<T> filtered;
|
||||
protected final TextBox textBox;
|
||||
|
||||
@@ -55,6 +57,7 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
*/
|
||||
public AbstractFilterablePanel(Iterable<T> all, AbstractCellTable<T> display, final ListDataProvider<T> filtered) {
|
||||
setSpacing(5);
|
||||
this.all = new ListDataProvider<>();
|
||||
this.display = display;
|
||||
this.filtered = filtered;
|
||||
this.textBox = new TextBox();
|
||||
@@ -71,10 +74,10 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
}
|
||||
|
||||
private void setAll(Iterable<T> all) {
|
||||
this.all = new ArrayList<T>();
|
||||
this.all.getList().clear();
|
||||
if (all != null) {
|
||||
for (T t : all) {
|
||||
this.all.add(t);
|
||||
this.all.getList().add(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -102,7 +105,7 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
* Adds an object and applies the search filter.
|
||||
*/
|
||||
public void add(T object) {
|
||||
all.add(object);
|
||||
all.getList().add(object);
|
||||
filter();
|
||||
}
|
||||
|
||||
@@ -110,7 +113,7 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
* Adds an object at a certain position and applies the search filter.
|
||||
*/
|
||||
public void add(int index, T object) {
|
||||
all.add(index, object);
|
||||
all.getList().add(index, object);
|
||||
filter();
|
||||
}
|
||||
|
||||
@@ -118,19 +121,19 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
* Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
|
||||
*/
|
||||
public int indexOf(T object) {
|
||||
return all.indexOf(object);
|
||||
return all.getList().indexOf(object);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes an object and applies the search filter.
|
||||
*/
|
||||
public void remove(T object) {
|
||||
all.remove(object);
|
||||
all.getList().remove(object);
|
||||
filter();
|
||||
}
|
||||
|
||||
public void addAll(Iterable<T> objects) {
|
||||
Util.addAll(objects, all);
|
||||
Util.addAll(objects, all.getList());
|
||||
filter();
|
||||
}
|
||||
|
||||
@@ -140,24 +143,27 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
* <code>removeAll(all)</code> with <code>all</code> being a copy of what you get when calling {@link #getAll()}.
|
||||
*/
|
||||
public void removeAll() {
|
||||
all.clear();
|
||||
all.getList().clear();
|
||||
filter();
|
||||
}
|
||||
|
||||
public void removeAll(Iterable<T> objects) {
|
||||
Util.removeAll(objects, all);
|
||||
Util.removeAll(objects, all.getList());
|
||||
filter();
|
||||
}
|
||||
|
||||
public void filter() {
|
||||
filtered.getList().clear();
|
||||
Util.addAll(filterer.applyFilter(Arrays.asList(getTextBox().getText().split(" ")), all), filtered.getList());
|
||||
Util.addAll(filterer.applyFilter(Arrays.asList(getTextBox().getText().split(" ")), all.getList()),
|
||||
filtered.getList());
|
||||
filtered.refresh();
|
||||
sort();
|
||||
}
|
||||
|
||||
private void sort(){
|
||||
ColumnSortEvent.fire(display, display.getColumnSortList());
|
||||
private void sort() {
|
||||
if (display != null) {
|
||||
ColumnSortEvent.fire(display, display.getColumnSortList());
|
||||
}
|
||||
}
|
||||
|
||||
public TextBox getTextBox() {
|
||||
@@ -165,6 +171,50 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
|
||||
}
|
||||
|
||||
public Iterable<T> getAll() {
|
||||
return all.getList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a {@link RefreshableSelectionModel} on the all data structure. So the selection can be maintained when
|
||||
* the {@link CellTable} is filtered. You can use the {@link RefreshableSelectionModel} returned by this method
|
||||
* e.g. for a {@link CellTable} using {@link CellTable#setSelectionModel(com.google.gwt.view.client.SelectionModel)}
|
||||
*
|
||||
* @param comp
|
||||
* {@link EntityIdentityComparator Comperator} to create the {@link RefreshableSelectionModel selection
|
||||
* model}
|
||||
* @param multiselection
|
||||
* set <code>true</code> when the {@link RefreshableSelectionModel selection model} should be a
|
||||
* {@link RefreshableMultiSelectionModel}. When it´s set <code>false</code> the
|
||||
* {@link RefreshableSelectionModel selection model} will be a {@link RefreshableSingleSelectionModel}.
|
||||
*/
|
||||
public RefreshableSelectionModel<T> registerSelectionModelOnAllElements(EntityIdentityComparator<T> comp,
|
||||
boolean multiselection) {
|
||||
if (multiselection) {
|
||||
return new RefreshableMultiSelectionModel<>(comp, all);
|
||||
} else {
|
||||
return new RefreshableSingleSelectionModel<>(comp, all);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* You can use this method to get the {@link ListDataProvider} that represents the all data structure. On this
|
||||
* {@link ListDataProvider} a {@link RefreshableSelectionModel} can be registered. So the selection can also be
|
||||
* maintained when the data is filtered.
|
||||
*
|
||||
* @return The original all data structure. It's no copy.
|
||||
*/
|
||||
public ListDataProvider<T> getAllListDataProvider() {
|
||||
return all;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method can be used to set the CellTable, when the {@link CellTable} on which this Panel should work is
|
||||
* created after this Panel. When the table isn't set correctly the order of elements, could be wrong after
|
||||
* filtering the data.
|
||||
*
|
||||
* @param table {@link AbstractCellTable} on which this panel works.
|
||||
*/
|
||||
public void setTable(AbstractCellTable<T> table) {
|
||||
display = table;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -276,7 +276,7 @@ public class ReplicationServiceImpl implements ReplicationService {
|
||||
public ReplicationServiceImpl(String exchangeName, String exchangeHost, int exchangePort,
|
||||
final ReplicationInstancesManager replicationInstancesManager, ReplicablesProvider replicablesProvider)
|
||||
throws IOException {
|
||||
timer = new Timer("ReplicationServiceImpl timer for delayed task sending");
|
||||
timer = new Timer("ReplicationServiceImpl timer for delayed task sending", /* isDaemon */ true);
|
||||
executionListenersByReplicableIdAsString = new HashMap<>();
|
||||
initialLoadChannels = new ConcurrentHashMap<>();
|
||||
this.replicationInstancesManager = replicationInstancesManager;
|
||||
|
||||
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: TracTrac Client module
|
||||
Bundle-SymbolicName: com.tractrac.clientmodule
|
||||
Bundle-Version: 3.2.0
|
||||
Bundle-Version: 3.2.1
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Bundle-ClassPath: .,
|
||||
lib/TracAPI.jar
|
||||
|
||||
@@ -16,6 +16,20 @@ It contains also some files:
|
||||
- test.sh -> script that compiles the code in the src folder, creates the test.jar library and execute the code of the example.
|
||||
- Manifest.txt -> manifest used to create the test.jar file
|
||||
|
||||
********************************************
|
||||
************* TracAPI 3.2.1 ****************
|
||||
********************************************
|
||||
This is a final version. Only fixes bugs in the implementation
|
||||
|
||||
Release date: 13/07/2016
|
||||
Build number: 12627
|
||||
|
||||
1) Bugs:
|
||||
|
||||
- If the Internet connection goes down, some threads can be hung despite of
|
||||
the consumer application calls the ISubscriber.stop method (Reported by
|
||||
Axel Uhl, 13/07/2016)
|
||||
|
||||
********************************************
|
||||
************* TracAPI 3.2.0 ****************
|
||||
********************************************
|
||||
@@ -24,13 +38,16 @@ This is a final version. New functionality added:
|
||||
Release date: 05/06/2016
|
||||
Build number: 12293
|
||||
|
||||
1) New functionality:
|
||||
1) Features:
|
||||
|
||||
- IRace adds the new property, status, returning a value of the enum RaceStatusType.
|
||||
|
||||
- IRace property visibility has changed to return a value of the enum RaceVisibilityType.
|
||||
|
||||
- IRaceCompetitor adds a new property: status of type RaceCompetitorStatusType.
|
||||
|
||||
- Competitor updates during a race will be propagated to all subscriptors.
|
||||
|
||||
|
||||
********************************************
|
||||
************* TracAPI 3.1.6 ****************
|
||||
********************************************
|
||||
|
||||
Executable → Regular
BIN
Binary file not shown.
Binary file not shown.
@@ -8,6 +8,6 @@
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>com.tractrac.clientmodule</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<version>3.2.1</version>
|
||||
<packaging>eclipse-plugin</packaging>
|
||||
</project>
|
||||
Reference in new issue
Block a user