diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9bb88d3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/.DS_Store
diff --git a/bugrap/.gitignore b/bugrap/.gitignore
index 3415bc6..c6f0364 100644
--- a/bugrap/.gitignore
+++ b/bugrap/.gitignore
@@ -4,3 +4,4 @@
/.settings/
/**/.DS_Store
/**/rebel.xml
+/.vaadin-designer2/
diff --git a/bugrap/.vaadin-designer2/designer-theme.css b/bugrap/.vaadin-designer2/designer-theme.css
index 80bcfdf..fe650de 100644
--- a/bugrap/.vaadin-designer2/designer-theme.css
+++ b/bugrap/.vaadin-designer2/designer-theme.css
@@ -12500,4 +12500,36 @@ div.v-layout.v-horizontal.v-widget {
display: inline-block;
width: 19px;
overflow: hidden;
+}
+
+.mytheme div.bar {
+ background-color: gray;
+ height: 20px;
+ width: 10px;
+ vertical-align: center;
+}
+
+.mytheme div.v-slot-removed-upload {
+ display: none;
+}
+
+.mytheme div.completed-upload div.v-button {
+ display: none;
+}
+
+.mytheme div.completed-upload:hover div.v-button {
+ display: inline-block;
+}
+
+.mytheme div.v-slot-completed-upload:hover {
+ color: #474747;
+ border-radius: 4px;
+ border: 1px solid #d5d5d5;
+ -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);
+}
+
+.mytheme div.v-slot-completed-upload div {
+ margin-bottom: 5px;
+ margin-left: 5px;
}
\ No newline at end of file
diff --git a/bugrap/pom.xml b/bugrap/pom.xml
index 4f63df3..ae2d8b5 100644
--- a/bugrap/pom.xml
+++ b/bugrap/pom.xml
@@ -105,8 +105,8 @@
update-widgetset
compile
+ compile-theme
diff --git a/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportDetailView.java b/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportDetailView.java
index ba8c0ec..f9bc4a8 100644
--- a/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportDetailView.java
+++ b/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportDetailView.java
@@ -1,39 +1,33 @@
package org.vaadin.bugrap.ui;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.OutputStream;
import java.util.List;
import org.vaadin.bugrap.domain.entities.Comment;
import org.vaadin.bugrap.domain.entities.Report;
+import org.vaadin.bugrap.ui.beans.FileUploadEvent;
import org.vaadin.bugrap.ui.generated.ReportDetailViewBase;
+import org.vaadin.bugrap.util.IUploadedFileListener;
import com.vaadin.data.Binder;
-import com.vaadin.server.FileDownloader;
-import com.vaadin.server.FileResource;
+import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Link;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;
-import com.vaadin.ui.ProgressBar;
-import com.vaadin.ui.Upload.ProgressListener;
-import com.vaadin.ui.Upload.Receiver;
+import com.vaadin.ui.Upload;
+import com.vaadin.ui.Upload.FinishedEvent;
+import com.vaadin.ui.Upload.FinishedListener;
import com.vaadin.ui.Upload.StartedEvent;
import com.vaadin.ui.Upload.StartedListener;
-import com.vaadin.ui.Upload.SucceededEvent;
-import com.vaadin.ui.Upload.SucceededListener;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class ReportDetailView extends ReportDetailViewBase
- implements Receiver, SucceededListener, StartedListener, ProgressListener {
+ implements StartedListener, Component.Listener, IUploadedFileListener, FinishedListener {
private ReportsModel model;
private Binder binder = new Binder();
- private ProgressBar uploadInProgress;
+ private int numOfOngoingUploads = 0;
public ReportDetailView(ReportsModel reportModel) {
model = reportModel;
@@ -55,11 +49,10 @@ private void initializeUIComponents() {
btnRevertReport.addClickListener(evt -> revertChanges());
btnDone.addClickListener(evt -> saveComment());
btnCancel.addClickListener(evt -> closeWindow());
- btnUpload.setReceiver(this);
btnUpload.addStartedListener(this);
- btnUpload.addSucceededListener(this);
- btnUpload.addProgressListener(this);
- txtComment.addValueChangeListener(evt -> commentsUpdated());
+ btnUpload.addFinishedListener(this);
+ txtComment.addValueChangeListener(evt -> setDoneButtonEnablement());
+ pnlAttachments.getContent().addListener(this);
}
private void init() {
@@ -73,7 +66,6 @@ private void init() {
private void cleanAttachments() {
((HorizontalLayout) pnlAttachments.getContent()).removeAllComponents();
- pnlAttachments.setVisible(false);
}
private void initializeComboContents() {
@@ -95,8 +87,13 @@ private void fillComments() {
btnDone.setEnabled(false);
}
- private void commentsUpdated() {
- btnDone.setEnabled(true);
+ private void setDoneButtonEnablement() {
+ boolean isEnabled = false;
+ if (numOfOngoingUploads > 0)
+ isEnabled = false;
+ else
+ isEnabled = !txtComment.isEmpty() || model.hasFilesToSave();
+ btnDone.setEnabled(isEnabled);
}
private void saveReport() {
@@ -119,55 +116,61 @@ private void saveComment() {
@Override
public void uploadStarted(StartedEvent event) {
- pnlAttachments.setVisible(true);
+ initiateUploadTracker(event);
+ addNewUpload();
+ numOfOngoingUploads++;
+ }
+
+ private void addNewUpload() {
+ HorizontalLayout layout = (HorizontalLayout) btnUpload.getParent();
+ Upload newUpload = new Upload();
+ newUpload.setButtonCaption("Attachments...");
+ newUpload.addStartedListener(this);
+ newUpload.addFinishedListener(this);
+ layout.addComponent(newUpload, layout.getComponentIndex(btnUpload));
+ btnUpload.setStyleName("removed-upload", true);
+ btnUpload = newUpload;
+ }
+
+ private void initiateUploadTracker(StartedEvent event) {
+ UploadTracker uploadTracker = new UploadTracker((Upload) event.getSource(), event.getFilename());
+ uploadTracker.setUploadedFileListener(this);
HorizontalLayout layout = (HorizontalLayout) pnlAttachments.getContent();
- ProgressBar progress = new ProgressBar();
- progress.setCaption(event.getFilename());
- uploadInProgress = progress;
- layout.addComponent(progress);
- btnDone.setEnabled(false);//disable done button until upload completes
+ layout.addComponent(uploadTracker);
+ }
+
+ private void closeWindow() {
+ Window window = (Window) getParent();
+ window.close();
}
@Override
- public void uploadSucceeded(SucceededEvent event) {
- HorizontalLayout layout = (HorizontalLayout) pnlAttachments.getContent();
- layout.removeComponent(uploadInProgress);
- uploadInProgress = null;
- FileResource file = new FileResource(new File(ReportsModel.FILEUPLOAD_PATH + event.getFilename()));
- try {
- model.attachFile(event.getFilename(), event.getMIMEType(), file.getStream());
- } catch (IOException e) {
- Notification.show("Error occurred while uploading the file", e.getMessage(), Type.ERROR_MESSAGE);
- }
- FileDownloader downloader = new FileDownloader(file);
- Link link = new Link();
- link.setCaption(event.getFilename());
- link.setStyleName("tiny");
- downloader.extend(link);
- layout.addComponent(link);
- commentsUpdated();
+ public void componentEvent(Event event) {
+ HorizontalLayout layout = (HorizontalLayout) event.getSource();
+ pnlAttachments.setVisible(layout.getComponentCount() > 0);
}
@Override
- public OutputStream receiveUpload(String filename, String mimeType) {
- FileOutputStream fos = null;
+ public void uploadedFileReceived(FileUploadEvent event) {
try {
- fos = new FileOutputStream(ReportsModel.FILEUPLOAD_PATH + filename);
- } catch (FileNotFoundException e) {
- Notification.show("Error occurred while uploading the file", e.getMessage(), Type.ERROR_MESSAGE);
- } finally {
- return fos;
+ model.attachFile(event.getSource(), event.getFilename(), event.getFilename(), event.getStream());
+ setDoneButtonEnablement();
+ } catch (IOException e) {
+ Notification.show("Error uploading file : " + event.getFilename(),
+ "There was an error while uploading the file :" + e.getMessage(),
+ com.vaadin.ui.Notification.Type.ERROR_MESSAGE);
}
}
@Override
- public void updateProgress(long readBytes, long contentLength) {
- if (uploadInProgress != null)
- uploadInProgress.setValue(((float) readBytes) / contentLength);
+ public void uploadFinished(FinishedEvent event) {
+ numOfOngoingUploads--;
+ setDoneButtonEnablement();
}
- private void closeWindow() {
- Window window = (Window) getParent();
- window.close();
+ @Override
+ public void uploadedFileDeleted(Object source) {
+ model.removeAttachedFile(source);
+ setDoneButtonEnablement();
}
}
diff --git a/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportsModel.java b/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportsModel.java
index 20ccd34..412dd0b 100644
--- a/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportsModel.java
+++ b/bugrap/src/main/java/org/vaadin/bugrap/ui/ReportsModel.java
@@ -1,13 +1,16 @@
package org.vaadin.bugrap.ui;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.vaadin.bugrap.BaseModel;
@@ -25,7 +28,6 @@
import com.vaadin.data.ValidationException;
import com.vaadin.navigator.Navigator;
-import com.vaadin.server.DownloadStream;
public class ReportsModel extends BaseModel {
@@ -35,13 +37,11 @@ public class ReportsModel extends BaseModel {
public static final int ASSIGNEE_ME = 0;
public static final int ASSIGNEE_ALL = 1;
-
- public static final int VERSIONID_ALL = 0;
- public static final String FILEUPLOAD_PATH = "/Users/onuridrisoglu/Downloads/temp/";
+ public static final int VERSIONID_ALL = 0;
private List selectedReports = new ArrayList();
- private List uploadedFilesToSave = new ArrayList();
+ private Map