diff --git a/pom.xml b/pom.xml index 3a9cca0743..d980586388 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ 1.2.1 0.22 - 3.1.0 + 3.1.1-SNAPSHOT 3.0.2 3.0.1 diff --git a/zanata-war/src/main/java/org/zanata/dao/DocumentDAO.java b/zanata-war/src/main/java/org/zanata/dao/DocumentDAO.java index afe624c34a..27263f63dc 100644 --- a/zanata-war/src/main/java/org/zanata/dao/DocumentDAO.java +++ b/zanata-war/src/main/java/org/zanata/dao/DocumentDAO.java @@ -415,7 +415,7 @@ public List getAllByProjectIteration(final String projectSlug, session.createQuery("from HDocument d " + "where d.projectIteration.slug = :iterationSlug " + "and d.projectIteration.project.slug = :projectSlug " - + "and d.obsolete = false " + "order by d.name"); + + "and d.obsolete = false " + "order by d.path, d.name"); q.setParameter("iterationSlug", iterationSlug).setParameter( "projectSlug", projectSlug); q.setComment("DocumentDAO.getAllByProjectIteration"); diff --git a/zanata-war/src/main/java/org/zanata/service/impl/StatisticsServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/StatisticsServiceImpl.java index 28f5276edf..a74a7bc895 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/StatisticsServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/StatisticsServiceImpl.java @@ -345,13 +345,16 @@ public ContainerTranslationStatistics getDocStatistics(Long documentId, TranslationStatistics wordStatistics = result.getStats(localeId.getId(), StatUnit.WORD); - wordStatistics.setRemainingHours(getRemainingHours( - wordStatistics.getDraft(), wordStatistics.getUntranslated())); + + double remainingHours = + getRemainingHours(wordStatistics.getDraft(), + wordStatistics.getUntranslated()); + + wordStatistics.setRemainingHours(remainingHours); TranslationStatistics msgStatistics = result.getStats(localeId.getId(), StatUnit.MESSAGE); - msgStatistics.setRemainingHours(getRemainingHours( - msgStatistics.getDraft(), msgStatistics.getUntranslated())); + msgStatistics.setRemainingHours(remainingHours); return result; } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java index 9b9c3d4bc6..47c5e5f056 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java @@ -460,6 +460,7 @@ public void onProjectStatsUpdated(ProjectStatsUpdatedEvent event) { } else { currentWordStats.add(wordStats); } + refreshStatsDisplay(); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java index 6698738da6..8d35bcee95 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java @@ -28,6 +28,11 @@ import java.util.List; import java.util.Map.Entry; +import javax.servlet.http.HttpServletResponse; + +import net.customware.gwt.presenter.client.EventBus; +import net.customware.gwt.presenter.client.widget.WidgetPresenter; + import org.zanata.common.LocaleId; import org.zanata.common.ProjectType; import org.zanata.rest.dto.stats.ContainerTranslationStatistics; @@ -75,6 +80,7 @@ import org.zanata.webtrans.shared.rpc.GetDownloadAllFilesProgressResult; import org.zanata.webtrans.shared.rpc.RunDocValidationAction; import org.zanata.webtrans.shared.rpc.RunDocValidationResult; + import com.allen_sauer.gwt.log.client.Log; import com.google.common.base.Objects; import com.google.common.base.Strings; @@ -83,11 +89,6 @@ import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent; import com.google.inject.Inject; -import net.customware.gwt.presenter.client.EventBus; -import net.customware.gwt.presenter.client.widget.WidgetPresenter; - -import javax.servlet.http.HttpServletResponse; - public class DocumentListPresenter extends WidgetPresenter implements DocumentListDisplay.Listener, DocumentSelectionHandler, UserConfigChangeHandler, TransUnitUpdatedEventHandler, @@ -101,7 +102,7 @@ public class DocumentListPresenter extends WidgetPresenter private HashMap nodes; private HashMap pageRows; - private ArrayList sortedNodes; + private ArrayList filteredNodes; private final CachingDispatchAsync dispatcher; @@ -132,7 +133,7 @@ public DocumentListPresenter(DocumentListDisplay display, dispatcher); nodes = new HashMap(); - sortedNodes = new ArrayList(); + filteredNodes = new ArrayList(); pageRows = new HashMap(); localeId = @@ -274,17 +275,17 @@ public void onRevealDisplay() { // Auto-generated method stub } - public void setDocuments(List sortedList) { - nodes = new HashMap(sortedList.size()); - sortedNodes.clear(); + public void setDocuments(List sortedDocumentList) { + nodes = + new HashMap(sortedDocumentList.size()); + filteredNodes.clear(); - idsByPath = new HashMap(sortedList.size()); - for (DocumentInfo doc : sortedList) { + idsByPath = new HashMap(sortedDocumentList.size()); + for (DocumentInfo doc : sortedDocumentList) { idsByPath.put(doc.getPath() + doc.getName(), doc.getId()); DocumentNode node = new DocumentNode(doc); - node.setVisible(filter.accept(doc)); nodes.put(doc.getId(), node); - sortedNodes.add(node); + filteredNodes.add(node); } updatePageCountAndGotoFirstPage(); } @@ -294,13 +295,13 @@ public void queryStats() { ArrayList queueList = new ArrayList(); - for (int i = 0; i < sortedNodes.size();) { + for (int i = 0; i < filteredNodes.size();) { int fromIndex = i; int toIndex = - i + BATCH_SIZE > sortedNodes.size() ? sortedNodes.size() - : i + BATCH_SIZE; + i + BATCH_SIZE > filteredNodes.size() ? filteredNodes + .size() : i + BATCH_SIZE; List subList = - sortedNodes.subList(fromIndex, toIndex); + filteredNodes.subList(fromIndex, toIndex); queueList.add(new GetDocumentStats(convertFromNodetoId(subList))); i = toIndex; } @@ -314,7 +315,7 @@ public void queryStats() { protected void setStatesForTest(ArrayList sortedNodes, HashMap nodes) { if (!GWT.isClient()) { - this.sortedNodes = sortedNodes; + this.filteredNodes = sortedNodes; this.nodes = nodes; } } @@ -333,8 +334,8 @@ public void onSuccess(GetDocumentStatsResult result) { for (Entry entry : result .getStatsMap().entrySet()) { DocumentInfo docInfo = getDocumentInfo(entry.getKey()); - docInfo.setStats(entry.getValue()); + docInfo.setLastTranslated(result.getLastTranslatedMap() .get(entry.getKey())); @@ -365,7 +366,7 @@ private List convertFromNodetoId(List nodes) { private void updatePageCountAndGotoFirstPage() { int pageCount = - (int) Math.ceil(sortedNodes.size() + (int) Math.ceil(filteredNodes.size() * 1.0 / userOptionsService.getConfigHolder().getState() .getDocumentListPageSize()); @@ -379,10 +380,10 @@ private void gotoPage(int page) { .getDocumentListPageSize(); int fromIndex = (page - 1) * pageSize; int toIndex = - (fromIndex + pageSize) > sortedNodes.size() ? sortedNodes + (fromIndex + pageSize) > filteredNodes.size() ? filteredNodes .size() : fromIndex + pageSize; pageRows = - display.buildContent(sortedNodes.subList(fromIndex, toIndex)); + display.buildContent(filteredNodes.subList(fromIndex, toIndex)); display.getPageNavigation().setValue(page, false); } @@ -391,11 +392,10 @@ private void gotoPage(int page) { * filter patterns will show all documents. */ private void runFilter() { - sortedNodes.clear(); + filteredNodes.clear(); for (DocumentNode docNode : nodes.values()) { - docNode.setVisible(filter.accept(docNode.getDocInfo())); - if (docNode.isVisible()) { - sortedNodes.add(docNode); + if (filter.accept(docNode.getDocInfo())) { + filteredNodes.add(docNode); } } updatePageCountAndGotoFirstPage(); @@ -607,10 +607,12 @@ public void cancelFileUpload() { @Override public void onFileUploadComplete(SubmitCompleteEvent event) { display.closeFileUpload(); - if (event.getResults().contains(String.valueOf(HttpServletResponse.SC_OK))) { + if (event.getResults().contains( + String.valueOf(HttpServletResponse.SC_OK))) { if (event.getResults().contains("Warnings")) { eventBus.fireEvent(new NotificationEvent(Severity.Warning, - "File uploaded with warnings", event.getResults(), true, null)); + "File uploaded with warnings", event.getResults(), + true, null)); } else { eventBus.fireEvent(new NotificationEvent(Severity.Info, "File uploaded", event.getResults(), true, null)); @@ -698,9 +700,9 @@ public void onFailure(Throwable caught) { @Override public void sortList(String header, boolean asc) { HeaderComparator comparator = new HeaderComparator(header); - Collections.sort(sortedNodes, comparator); + Collections.sort(filteredNodes, comparator); if (!asc) { - Collections.reverse(sortedNodes); + Collections.reverse(filteredNodes); } gotoPage(1); } @@ -883,8 +885,8 @@ public void pagerValueChanged(Integer value) { gotoPage(value); } - public ArrayList getSortedNodes() { - return sortedNodes; + public ArrayList getFilteredNodes() { + return filteredNodes; } public void showLoading(boolean showLoading) { diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentListTable.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentListTable.java index 5bbf2f394d..47ea0986b1 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentListTable.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentListTable.java @@ -389,15 +389,15 @@ private Widget getIncompleteWidget(DocumentInfo docInfo, private Widget getRemainingWidget(DocumentInfo docInfo) { String text = "0"; if (docInfo.getStats() != null) { + String locale = + userWorkspaceContext.getWorkspaceContext().getWorkspaceId() + .getLocaleId().getId(); text = - messages.statusBarLabelHours(docInfo - .getStats() - .getStats( - userWorkspaceContext.getWorkspaceContext() - .getWorkspaceId().getLocaleId() - .getId(), StatUnit.WORD) + messages.statusBarLabelHours(docInfo.getStats() + .getStats(locale, StatUnit.WORD) .getRemainingHours()); } + return new InlineLabel(text); } @@ -474,17 +474,27 @@ public void updateStats(int row, ContainerTranslationStatistics stats, String locale = userWorkspaceContext.getWorkspaceContext().getWorkspaceId() .getLocaleId().toString(); + TranslationStatistics wordStats = + stats.getStats(locale, StatUnit.WORD); + if (statsByWords) { - translated.setText(String.valueOf(stats.getStats(locale, - StatUnit.WORD).getTranslatedAndApproved())); - untranslated.setText(String.valueOf(stats.getStats(locale, - StatUnit.WORD).getIncomplete())); + translated.setText(String.valueOf(wordStats + .getTranslatedAndApproved())); + untranslated.setText(String.valueOf(wordStats.getIncomplete())); } else { - translated.setText(String.valueOf(stats.getStats(locale, - StatUnit.MESSAGE).getTranslatedAndApproved())); - untranslated.setText(String.valueOf(stats.getStats(locale, - StatUnit.MESSAGE).getIncomplete())); + + TranslationStatistics msgStats = + stats.getStats(locale, StatUnit.MESSAGE); + + translated.setText(String.valueOf(msgStats + .getTranslatedAndApproved())); + untranslated.setText(String.valueOf(msgStats.getIncomplete())); } + + HasText remainingHour = + (HasText) this.getWidget(row, REMAINING_COLUMN); + remainingHour.setText(messages.statusBarLabelHours(wordStats + .getRemainingHours())); } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentNode.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentNode.java index 39a76da2ff..9cf38c8bbe 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentNode.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/DocumentNode.java @@ -24,7 +24,6 @@ public class DocumentNode { private DocumentInfo docInfo; - private boolean isVisible = true; public DocumentNode(DocumentInfo doc) { this.docInfo = doc; @@ -33,12 +32,4 @@ public DocumentNode(DocumentInfo doc) { public DocumentInfo getDocInfo() { return docInfo; } - - public boolean isVisible() { - return isVisible; - } - - public void setVisible(boolean isVisible) { - this.isVisible = isVisible; - } } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java index 5177dfc993..05ee083378 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java @@ -169,12 +169,12 @@ public void loadDocsIntoDataProvider() { // right amount of docs assertThat( "the data provider should have the same sized document list returned from the server", - documentListPresenter.getSortedNodes().size(), is(3)); + documentListPresenter.getFilteredNodes().size(), is(3)); ArrayList expectedDocs = buildSampleDocumentArray(); ArrayList actualDocInfos = new ArrayList(); - for (DocumentNode node : documentListPresenter.getSortedNodes()) { + for (DocumentNode node : documentListPresenter.getFilteredNodes()) { assertThat( "the data provider should have only documents that were returned from the server", node.getDocInfo(), isIn(expectedDocs)); @@ -389,7 +389,7 @@ public void exactSearchMatchesExactOnly() { expectedDocs.remove(2); // third doc does not match the filter expectedDocs.remove(0); // first doc does not match the filter ArrayList actualDocInfos = new ArrayList(); - for (DocumentNode node : documentListPresenter.getSortedNodes()) { + for (DocumentNode node : documentListPresenter.getFilteredNodes()) { assertThat( "the data provider should have only documents that exactly match the current filter", node.getDocInfo(), isIn(expectedDocs)); @@ -400,7 +400,7 @@ public void exactSearchMatchesExactOnly() { actualDocInfos, hasItems(expectedDocs.get(0))); assertThat( "the data provider list should contain exactly the number of documents matching the filter", - documentListPresenter.getSortedNodes().size(), is(1)); + documentListPresenter.getFilteredNodes().size(), is(1)); } // TODO test case sensitivity option @@ -426,7 +426,7 @@ public void commaSeparatedFilter() { expectedDocs.remove(1); // second doc does not match any of the filter // strings ArrayList actualDocInfos = new ArrayList(); - for (DocumentNode node : documentListPresenter.getSortedNodes()) { + for (DocumentNode node : documentListPresenter.getFilteredNodes()) { assertThat( "the data provider should have only documents that match the current filter", node.getDocInfo(), isIn(expectedDocs)); @@ -438,7 +438,7 @@ public void commaSeparatedFilter() { hasItems(expectedDocs.get(0), expectedDocs.get(1))); assertThat( "the data provider list should contain exactly the number of documents matching the filter", - documentListPresenter.getSortedNodes().size(), is(2)); + documentListPresenter.getFilteredNodes().size(), is(2)); } // TODO test case sensitive check updated from history