Compare commits
2 Commits
master
...
horizontal
Author | SHA1 | Date |
---|---|---|
lucio.lelii | f3a3166695 | |
lucio.lelii | 20226d30fb |
29
.classpath
29
.classpath
|
@ -1,12 +1,12 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" output="target/messages-2.4.0-SNAPSHOT/WEB-INF/classes" path="src/main/java">
|
<classpathentry kind="src" output="target/messages-2.5.0-SNAPSHOT/WEB-INF/classes" path="src/main/java">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="optional" value="true"/>
|
<attribute name="optional" value="true"/>
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry excluding="**" kind="src" output="target/messages-2.4.0-SNAPSHOT/WEB-INF/classes" path="src/main/resources">
|
<classpathentry excluding="**" kind="src" output="target/messages-2.5.0-SNAPSHOT/WEB-INF/classes" path="src/main/resources">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
|
@ -22,36 +22,19 @@
|
||||||
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
|
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="src" output="target/messages-2.4.0-SNAPSHOT/WEB-INF/classes" path="target/generated-sources/gwt">
|
<classpathentry kind="src" output="target/messages-2.5.0-SNAPSHOT/WEB-INF/classes" path="target/generated-sources/gwt">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="optional" value="true"/>
|
<attribute name="optional" value="true"/>
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="con" path="com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER/gwt-2.8.1"/>
|
<classpathentry kind="con" path="com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER"/>
|
||||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||||
<attributes>
|
<attributes>
|
||||||
|
<attribute name="test" value="true"/>
|
||||||
<attribute name="optional" value="true"/>
|
<attribute name="optional" value="true"/>
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
<attribute name="test" value="true"/>
|
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="lib" path="/Users/massi/portal/distro/GWT SDK/gwt-2.8.2/gwt-user.jar">
|
<classpathentry kind="output" path="target/messages-2.5.0-SNAPSHOT/WEB-INF/classes"/>
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="file:/Users/massi/portal/distro/GWT%20SDK/gwt-2.8.2/doc/javadoc/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="/Users/massi/portal/distro/GWT SDK/gwt-2.8.2/gwt-codeserver.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="file:/Users/massi/portal/distro/GWT%20SDK/gwt-2.8.2/doc/javadoc/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="/Users/massi/portal/distro/GWT SDK/gwt-2.8.2/gwt-dev.jar">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="javadoc_location" value="file:/Users/massi/portal/distro/GWT%20SDK/gwt-2.8.2/doc/javadoc/"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="lib" path="/Users/massi/portal/distro/GWT SDK/gwt-2.8.2/validation-api-1.0.0.GA-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="/Users/massi/portal/distro/GWT SDK/gwt-2.8.2/validation-api-1.0.0.GA.jar" sourcepath="/Users/massi/portal/distro/GWT SDK/gwt-2.8.2/validation-api-1.0.0.GA-sources.jar"/>
|
|
||||||
<classpathentry kind="output" path="target/messages-2.4.0-SNAPSHOT/WEB-INF/classes"/>
|
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
lastWarOutDir=${webappDirectory}
|
lastWarOutDir=${webappDirectory}
|
||||||
|
launchConfigExternalUrlPrefix=
|
||||||
warSrcDir=src/main/webapp
|
warSrcDir=src/main/webapp
|
||||||
warSrcDirIsOutput=false
|
warSrcDirIsOutput=false
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
encoding//src/main/java=UTF-8
|
encoding//src/main/java=UTF-8
|
||||||
encoding//src/main/resources=UTF-8
|
encoding//src/main/resources=UTF-8
|
||||||
|
encoding//src/test/java=UTF-8
|
||||||
encoding//target/generated-sources/gwt=UTF-8
|
encoding//target/generated-sources/gwt=UTF-8
|
||||||
encoding/<project>=UTF-8
|
encoding/<project>=UTF-8
|
||||||
|
|
|
@ -1,9 +1,112 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
|
||||||
|
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.APILeak=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info
|
||||||
|
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.deadCode=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.deprecation=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nullReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info
|
||||||
|
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
|
||||||
org.eclipse.jdt.core.compiler.release=disabled
|
org.eclipse.jdt.core.compiler.release=disabled
|
||||||
org.eclipse.jdt.core.compiler.source=1.8
|
org.eclipse.jdt.core.compiler.source=1.8
|
||||||
|
|
|
@ -1,11 +1,31 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
|
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
|
||||||
<wb-module deploy-name="messages">
|
|
||||||
|
|
||||||
|
<wb-module deploy-name="messages-2.5.0-SNAPSHOT">
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
|
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
|
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
|
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
|
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/target/generated-sources/gwt"/>
|
<wb-resource deploy-path="/WEB-INF/classes" source-path="/target/generated-sources/gwt"/>
|
||||||
|
|
||||||
|
|
||||||
<property name="java-output-path" value="/message-conversations/target/message-conversations-0.0.1-SNAPSHOT/WEB-INF/classes"/>
|
<property name="java-output-path" value="/message-conversations/target/message-conversations-0.0.1-SNAPSHOT/WEB-INF/classes"/>
|
||||||
|
|
||||||
|
|
||||||
<property name="context-root" value="messages"/>
|
<property name="context-root" value="messages"/>
|
||||||
|
|
||||||
|
|
||||||
</wb-module>
|
</wb-module>
|
||||||
|
|
||||||
|
|
||||||
</project-modules>
|
</project-modules>
|
||||||
|
|
8
pom.xml
8
pom.xml
|
@ -160,6 +160,11 @@
|
||||||
<groupId>com.github.gwtmaterialdesign</groupId>
|
<groupId>com.github.gwtmaterialdesign</groupId>
|
||||||
<artifactId>gwt-material-addins</artifactId>
|
<artifactId>gwt-material-addins</artifactId>
|
||||||
<version>${gwt-material.version}</version>
|
<version>${gwt-material.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.gwtmaterialdesign</groupId>
|
||||||
|
<artifactId>gwt-material-table</artifactId>
|
||||||
|
<version>${gwt-material.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.portal</groupId>
|
<groupId>org.gcube.portal</groupId>
|
||||||
|
@ -195,11 +200,12 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>slf4j-log4j12</artifactId>
|
<artifactId>slf4j-log4j12</artifactId>
|
||||||
|
<version>1.7.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
<scope>provided</scope>
|
<version>1.7.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||||
|
|
||||||
import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
||||||
import org.gcube.portets.user.message_conversations.shared.CurrUserAndPortalUsersWrapper;
|
import org.gcube.portets.user.message_conversations.shared.CurrUserAndPortalUsersWrapper;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.MessagesWindow;
|
||||||
import org.gcube.portets.user.message_conversations.shared.WSUser;
|
import org.gcube.portets.user.message_conversations.shared.WSUser;
|
||||||
|
|
||||||
import com.google.gwt.user.client.rpc.RemoteService;
|
import com.google.gwt.user.client.rpc.RemoteService;
|
||||||
|
@ -13,6 +14,7 @@ import com.google.gwt.user.client.rpc.RemoteService;
|
||||||
*/
|
*/
|
||||||
public interface MessageService extends RemoteService {
|
public interface MessageService extends RemoteService {
|
||||||
|
|
||||||
|
MessagesWindow getMessagesWindows(boolean sent, int limit, int offset);
|
||||||
ArrayList<ConvMessage> getMessages(boolean sent);
|
ArrayList<ConvMessage> getMessages(boolean sent);
|
||||||
ConvMessage getMessageById(String messageId, boolean sent);
|
ConvMessage getMessageById(String messageId, boolean sent);
|
||||||
CurrUserAndPortalUsersWrapper getWorkspaceUsers();
|
CurrUserAndPortalUsersWrapper getWorkspaceUsers();
|
||||||
|
|
|
@ -1,18 +1,49 @@
|
||||||
package org.gcube.portets.user.message_conversations.client.autocomplete;
|
package org.gcube.portets.user.message_conversations.client.autocomplete;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import com.google.gwt.dom.client.Document;
|
import com.google.gwt.dom.client.Document;
|
||||||
import com.google.gwt.event.dom.client.*;
|
import com.google.gwt.event.dom.client.BlurEvent;
|
||||||
import com.google.gwt.event.logical.shared.*;
|
import com.google.gwt.event.dom.client.BlurHandler;
|
||||||
|
import com.google.gwt.event.dom.client.ClickEvent;
|
||||||
|
import com.google.gwt.event.dom.client.FocusEvent;
|
||||||
|
import com.google.gwt.event.dom.client.FocusHandler;
|
||||||
|
import com.google.gwt.event.dom.client.KeyCodes;
|
||||||
|
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||||
|
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
|
||||||
|
import com.google.gwt.event.logical.shared.SelectionEvent;
|
||||||
|
import com.google.gwt.event.logical.shared.SelectionHandler;
|
||||||
|
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
||||||
|
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
||||||
import com.google.gwt.event.shared.HandlerRegistration;
|
import com.google.gwt.event.shared.HandlerRegistration;
|
||||||
import com.google.gwt.user.client.DOM;
|
import com.google.gwt.user.client.DOM;
|
||||||
import com.google.gwt.user.client.ui.*;
|
import com.google.gwt.user.client.ui.FlowPanel;
|
||||||
|
import com.google.gwt.user.client.ui.SuggestBox;
|
||||||
|
import com.google.gwt.user.client.ui.SuggestOracle;
|
||||||
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
|
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
|
||||||
|
import com.google.gwt.user.client.ui.TextBox;
|
||||||
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
|
|
||||||
import gwt.material.design.addins.client.MaterialAddins;
|
import gwt.material.design.addins.client.MaterialAddins;
|
||||||
import gwt.material.design.addins.client.autocomplete.constants.AutocompleteType;
|
import gwt.material.design.addins.client.autocomplete.constants.AutocompleteType;
|
||||||
import gwt.material.design.addins.client.base.constants.AddinsCssName;
|
import gwt.material.design.addins.client.base.constants.AddinsCssName;
|
||||||
import gwt.material.design.client.MaterialDesignBase;
|
import gwt.material.design.client.MaterialDesignBase;
|
||||||
import gwt.material.design.client.base.*;
|
import gwt.material.design.client.base.AbstractValueWidget;
|
||||||
import gwt.material.design.client.base.mixin.*;
|
import gwt.material.design.client.base.HasPlaceholder;
|
||||||
|
import gwt.material.design.client.base.HasProgress;
|
||||||
|
import gwt.material.design.client.base.HasReadOnly;
|
||||||
|
import gwt.material.design.client.base.HasType;
|
||||||
|
import gwt.material.design.client.base.MaterialWidget;
|
||||||
|
import gwt.material.design.client.base.mixin.CssTypeMixin;
|
||||||
|
import gwt.material.design.client.base.mixin.FocusableMixin;
|
||||||
|
import gwt.material.design.client.base.mixin.ProgressMixin;
|
||||||
|
import gwt.material.design.client.base.mixin.ReadOnlyMixin;
|
||||||
import gwt.material.design.client.constants.CssName;
|
import gwt.material.design.client.constants.CssName;
|
||||||
import gwt.material.design.client.constants.IconType;
|
import gwt.material.design.client.constants.IconType;
|
||||||
import gwt.material.design.client.constants.ProgressType;
|
import gwt.material.design.client.constants.ProgressType;
|
||||||
|
@ -23,9 +54,6 @@ import gwt.material.design.client.ui.html.Label;
|
||||||
import gwt.material.design.client.ui.html.ListItem;
|
import gwt.material.design.client.ui.html.ListItem;
|
||||||
import gwt.material.design.client.ui.html.UnorderedList;
|
import gwt.material.design.client.ui.html.UnorderedList;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author kevzlou7979
|
* @author kevzlou7979
|
||||||
|
@ -62,7 +90,6 @@ public class MaterialAutoComplete extends AbstractValueWidget<List<? extends Sug
|
||||||
private boolean directInputAllowed = true;
|
private boolean directInputAllowed = true;
|
||||||
private MaterialChipProvider chipProvider = new DefaultMaterialChipProvider();
|
private MaterialChipProvider chipProvider = new DefaultMaterialChipProvider();
|
||||||
|
|
||||||
private final ErrorMixin<AbstractValueWidget, MaterialLabel> errorMixin = new ErrorMixin<>(this, errorLabel, list, placeholderLabel);
|
|
||||||
|
|
||||||
private FocusableMixin<MaterialWidget> focusableMixin;
|
private FocusableMixin<MaterialWidget> focusableMixin;
|
||||||
private ReadOnlyMixin<MaterialAutoComplete, TextBox> readOnlyMixin;
|
private ReadOnlyMixin<MaterialAutoComplete, TextBox> readOnlyMixin;
|
||||||
|
@ -684,10 +711,6 @@ public class MaterialAutoComplete extends AbstractValueWidget<List<? extends Sug
|
||||||
itemBox.setEnabled(enabled);
|
itemBox.setEnabled(enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ErrorMixin<AbstractValueWidget, MaterialLabel> getErrorMixin() {
|
|
||||||
return errorMixin;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Label getPlaceholderLabel() {
|
public Label getPlaceholderLabel() {
|
||||||
return placeholderLabel;
|
return placeholderLabel;
|
||||||
|
|
|
@ -12,7 +12,12 @@ import org.gcube.portets.user.message_conversations.client.ui.resources.Messages
|
||||||
import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
||||||
import org.gcube.portets.user.message_conversations.shared.MessageUserModel;
|
import org.gcube.portets.user.message_conversations.shared.MessageUserModel;
|
||||||
|
|
||||||
|
import com.github.gwtbootstrap.client.ui.IconCell;
|
||||||
|
import com.github.gwtbootstrap.client.ui.constants.IconSize;
|
||||||
|
import com.google.gwt.cell.client.CheckboxCell;
|
||||||
|
import com.google.gwt.cell.client.TextCell;
|
||||||
import com.google.gwt.core.client.GWT;
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.google.gwt.dom.client.Style.Unit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -38,9 +43,16 @@ import com.google.gwt.core.client.GWT;
|
||||||
import com.google.gwt.event.dom.client.ClickEvent;
|
import com.google.gwt.event.dom.client.ClickEvent;
|
||||||
import com.google.gwt.event.logical.shared.ResizeEvent;
|
import com.google.gwt.event.logical.shared.ResizeEvent;
|
||||||
import com.google.gwt.event.logical.shared.ResizeHandler;
|
import com.google.gwt.event.logical.shared.ResizeHandler;
|
||||||
|
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
|
||||||
import com.google.gwt.uibinder.client.UiBinder;
|
import com.google.gwt.uibinder.client.UiBinder;
|
||||||
import com.google.gwt.uibinder.client.UiField;
|
import com.google.gwt.uibinder.client.UiField;
|
||||||
import com.google.gwt.uibinder.client.UiHandler;
|
import com.google.gwt.uibinder.client.UiHandler;
|
||||||
|
import com.google.gwt.user.cellview.client.CellTable;
|
||||||
|
import com.google.gwt.user.cellview.client.Column;
|
||||||
|
import com.google.gwt.user.cellview.client.RowStyles;
|
||||||
|
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
|
||||||
|
import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy;
|
||||||
|
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
|
||||||
import com.google.gwt.user.client.Window;
|
import com.google.gwt.user.client.Window;
|
||||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
import com.google.gwt.user.client.rpc.ServiceDefTarget;
|
import com.google.gwt.user.client.rpc.ServiceDefTarget;
|
||||||
|
@ -50,19 +62,22 @@ import com.google.gwt.user.client.ui.HTMLPanel;
|
||||||
import com.google.gwt.user.client.ui.RootPanel;
|
import com.google.gwt.user.client.ui.RootPanel;
|
||||||
import com.google.gwt.user.client.ui.ScrollPanel;
|
import com.google.gwt.user.client.ui.ScrollPanel;
|
||||||
import com.google.gwt.user.client.ui.Widget;
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
|
import com.google.gwt.view.client.DefaultSelectionEventManager;
|
||||||
|
import com.google.gwt.view.client.MultiSelectionModel;
|
||||||
|
import com.google.gwt.view.client.SelectionModel;
|
||||||
|
|
||||||
import gwt.material.design.client.constants.IconType;
|
import gwt.material.design.client.constants.IconType;
|
||||||
import gwt.material.design.client.constants.Position;
|
import gwt.material.design.client.constants.Position;
|
||||||
|
import gwt.material.design.client.data.DataSource;
|
||||||
import gwt.material.design.client.ui.MaterialAnchorButton;
|
import gwt.material.design.client.ui.MaterialAnchorButton;
|
||||||
import gwt.material.design.client.ui.MaterialBadge;
|
import gwt.material.design.client.ui.MaterialBadge;
|
||||||
import gwt.material.design.client.ui.MaterialCollection;
|
|
||||||
import gwt.material.design.client.ui.MaterialFAB;
|
import gwt.material.design.client.ui.MaterialFAB;
|
||||||
import gwt.material.design.client.ui.MaterialLink;
|
import gwt.material.design.client.ui.MaterialLink;
|
||||||
import gwt.material.design.client.ui.MaterialProgress;
|
import gwt.material.design.client.ui.MaterialProgress;
|
||||||
import gwt.material.design.client.ui.MaterialRow;
|
|
||||||
import gwt.material.design.client.ui.MaterialToast;
|
import gwt.material.design.client.ui.MaterialToast;
|
||||||
import gwt.material.design.client.ui.animate.MaterialAnimation;
|
import gwt.material.design.client.ui.animate.MaterialAnimation;
|
||||||
import gwt.material.design.client.ui.animate.Transition;
|
import gwt.material.design.client.ui.animate.Transition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Massimiliano Assante, CNR-ISTI
|
* @author Massimiliano Assante, CNR-ISTI
|
||||||
*/
|
*/
|
||||||
|
@ -83,20 +98,28 @@ public class ApplicationView extends Composite {
|
||||||
|
|
||||||
|
|
||||||
@UiField ScrollPanel scrollerPanel;
|
@UiField ScrollPanel scrollerPanel;
|
||||||
@UiField MaterialRow rightPanel;
|
//@UiField MaterialRow rightPanel;
|
||||||
@UiField HTMLPanel htmlPanel;
|
@UiField HTMLPanel htmlPanel;
|
||||||
@UiField MaterialFAB FAB;
|
@UiField MaterialFAB FAB;
|
||||||
@UiField MaterialLink menu, newMessage, switcher;
|
@UiField MaterialLink menu, newMessage, switcher;
|
||||||
@UiField MaterialAnchorButton replyAll, reply, forward;
|
@UiField MaterialAnchorButton replyAll, reply, forward;
|
||||||
@UiField MaterialCollection messagesCollection;
|
@UiField MaterialProgress messageLoader;
|
||||||
@UiField MaterialProgress messageLoader, messagesLoader;
|
|
||||||
@UiField MaterialBadge badge;
|
@UiField MaterialBadge badge;
|
||||||
|
@UiField ShowMorePagerPanel pagerPanel;
|
||||||
|
|
||||||
|
CellTable<ConvMessage> sentCellList;
|
||||||
|
|
||||||
|
MessageProvider mp;
|
||||||
|
|
||||||
|
DataSource<ConvMessage> dataSource = new MessageDataSource(false, convService);
|
||||||
|
//InfiniteScrollView scrollView = new InfiniteScrollView(dataSource);
|
||||||
|
|
||||||
private ConvMessage currentSelected;
|
private ConvMessage currentSelected;
|
||||||
private DisplayMessage displayMessage;
|
private DisplayMessage displayMessage;
|
||||||
private WriteMessage newMessageDisplay;
|
private WriteMessage newMessageDisplay;
|
||||||
private boolean isSendTo = false;
|
private boolean isSendTo = false;
|
||||||
|
|
||||||
|
|
||||||
public ApplicationView(String... sendToUserNames) {
|
public ApplicationView(String... sendToUserNames) {
|
||||||
initWidget(uiBinder.createAndBindUi(this));
|
initWidget(uiBinder.createAndBindUi(this));
|
||||||
((ServiceDefTarget) convService).setServiceEntryPoint(Utils.getServiceEntryPoint());
|
((ServiceDefTarget) convService).setServiceEntryPoint(Utils.getServiceEntryPoint());
|
||||||
|
@ -125,16 +148,96 @@ public class ApplicationView extends Composite {
|
||||||
isSendTo = true;
|
isSendTo = true;
|
||||||
messageLoader.setVisible(false);
|
messageLoader.setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GWT.log("application initialized");
|
||||||
|
|
||||||
|
sentCellList = new CellTable<ConvMessage>(ConvMessage.KEY_PROVIDER);
|
||||||
|
sentCellList.setPageSize(100);
|
||||||
|
sentCellList.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE);
|
||||||
|
sentCellList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);
|
||||||
|
sentCellList.setWidth("100%", false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
readUserMessages(false, isSendTo);
|
readUserMessages(false, isSendTo);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the columns to the table.
|
||||||
|
*/
|
||||||
|
private void initTableColumns(CellTable<ConvMessage> cellTable
|
||||||
|
,final SelectionModel<ConvMessage> selectionModel /*,
|
||||||
|
ListHandler<ConvMessage> sortHandler*/) {
|
||||||
|
// Checkbox column. This table will uses a checkbox column for selection.
|
||||||
|
// Alternatively, you can call cellTable.setSelectionEnabled(true) to enable
|
||||||
|
// mouse selection.
|
||||||
|
|
||||||
|
cellTable.setRowStyles(new RowStyles<ConvMessage>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getStyleNames(ConvMessage row, int rowIndex) {
|
||||||
|
if (row.isRead())
|
||||||
|
return "{style.read}";
|
||||||
|
else return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Column<ConvMessage, Boolean> checkColumn = new Column<ConvMessage, Boolean>(
|
||||||
|
new CheckboxCell(true, false)) {
|
||||||
|
@Override
|
||||||
|
public Boolean getValue(ConvMessage object) {
|
||||||
|
// Get the value from the selection model.
|
||||||
|
return selectionModel.isSelected(object);
|
||||||
|
//return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
cellTable.addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("</br>"));
|
||||||
|
cellTable.setColumnWidth(checkColumn, 80, Unit.PX);
|
||||||
|
|
||||||
|
// From.
|
||||||
|
Column<ConvMessage, String> fromColumn = new Column<ConvMessage, String>(
|
||||||
|
new TextCell()) {
|
||||||
|
@Override
|
||||||
|
public String getValue(ConvMessage object) {
|
||||||
|
return object.getOwner().getFullName();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
cellTable.addColumn(fromColumn, "From");
|
||||||
|
cellTable.setColumnWidth(fromColumn, 40, Unit.PCT);
|
||||||
|
|
||||||
|
// Subject.
|
||||||
|
Column<ConvMessage, String> subjectColumn = new Column<ConvMessage, String>(
|
||||||
|
new TextCell()) {
|
||||||
|
@Override
|
||||||
|
public String getValue(ConvMessage object) {
|
||||||
|
return object.getSubject();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
cellTable.addColumn(subjectColumn, "Subject");
|
||||||
|
cellTable.setColumnWidth(subjectColumn, 200, Unit.PCT);
|
||||||
|
|
||||||
|
// date.
|
||||||
|
Column<ConvMessage, String> dateColumn = new Column<ConvMessage, String>(
|
||||||
|
new TextCell()) {
|
||||||
|
@Override
|
||||||
|
public String getValue(ConvMessage object) {
|
||||||
|
return Utils.getFormatteDate(object.getDate());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
cellTable.addColumn(dateColumn, "Date");
|
||||||
|
cellTable.setColumnWidth(subjectColumn, 20, Unit.PCT);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param sent
|
* @param sent
|
||||||
*/
|
*
|
||||||
|
**/
|
||||||
public void readUserMessages(final boolean sent, boolean isSendTo) {
|
public void readUserMessages(final boolean sent, boolean isSendTo) {
|
||||||
messagesLoader.setVisible(true);
|
|
||||||
convService.getMessages(sent, new AsyncCallback<ArrayList<ConvMessage>>() {
|
convService.getMessages(sent, new AsyncCallback<ArrayList<ConvMessage>>() {
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(Throwable arg0) {
|
public void onFailure(Throwable arg0) {
|
||||||
|
@ -144,53 +247,35 @@ public class ApplicationView extends Composite {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(ArrayList<ConvMessage> messages) {
|
public void onSuccess(ArrayList<ConvMessage> messages) {
|
||||||
if (messages != null) {
|
if (messages != null) {
|
||||||
showMessages(messages, sent);
|
totalMessages = messages.size();
|
||||||
if (!isSendTo) {
|
mp = new MessageProvider(messages);
|
||||||
if (messages.size() > 0)
|
mp.addDataDisplay(sentCellList);
|
||||||
readUserMessage(messages.get(0).getId(), sent);
|
|
||||||
else {
|
// Add a selection model so we can select cells.
|
||||||
writeWelcomeMessage();
|
final SelectionModel<ConvMessage> selectionModel = new MultiSelectionModel<ConvMessage>(ConvMessage.KEY_PROVIDER);
|
||||||
|
sentCellList.setSelectionModel(selectionModel,
|
||||||
|
DefaultSelectionEventManager.<ConvMessage> createCheckboxManager());
|
||||||
|
|
||||||
|
|
||||||
|
initTableColumns(sentCellList, selectionModel);
|
||||||
|
|
||||||
|
pagerPanel.setDisplay(sentCellList);
|
||||||
|
pagerPanel.setIncrementSize(50);
|
||||||
messageLoader.setVisible(false);
|
messageLoader.setVisible(false);
|
||||||
}
|
readUserMessage(mp.getDataProvider().getList().get(0).getId(), sent);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
showErrorOccurred();
|
showErrorOccurred();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showErrorOccurred() {
|
private void showErrorOccurred() {
|
||||||
messagesCollection.clear();
|
//messagesCollection.clear();
|
||||||
messagesLoader.setVisible(false);
|
|
||||||
messageLoader.setVisible(false);
|
messageLoader.setVisible(false);
|
||||||
hideSidePanel();
|
hideSidePanel();
|
||||||
writeErrorMessage();
|
writeErrorMessage();
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param messages
|
|
||||||
* @param sent
|
|
||||||
*/
|
|
||||||
public void showMessages(ArrayList<ConvMessage> messages, boolean sent) {
|
|
||||||
messagesCollection.clear();
|
|
||||||
messagesLoader.setVisible(false);
|
|
||||||
messagesCollection.setVisible(true);
|
|
||||||
int scrollerHeight = Window.getClientHeight() - 100;
|
|
||||||
scrollerPanel.setHeight(scrollerHeight+"px");
|
|
||||||
for (ConvMessage convMessage : messages) {
|
|
||||||
messagesCollection.add(new MessageItem(convMessage, messagesCollection, this, sent));
|
|
||||||
if (! (sent || convMessage.isRead()))
|
|
||||||
unreadMessages++;
|
|
||||||
totalMessages++;
|
|
||||||
}
|
|
||||||
if (messages.size() > 0) {
|
|
||||||
MessageItem first = (MessageItem) messagesCollection.getChildrenList().get(0);
|
|
||||||
first.setSelected(true);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
|
||||||
updateBadge(sent);
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param sent
|
* @param sent
|
||||||
|
@ -321,7 +406,7 @@ public class ApplicationView extends Composite {
|
||||||
private void displayNewOrReplyMessage() {
|
private void displayNewOrReplyMessage() {
|
||||||
WRITING_MESSAGE = true;
|
WRITING_MESSAGE = true;
|
||||||
FAB.setVisible(false);
|
FAB.setVisible(false);
|
||||||
messagesCollection.clearActive();
|
//messagesCollection.clearActive();
|
||||||
scrollerPanel.clear();
|
scrollerPanel.clear();
|
||||||
scrollerPanel.add(newMessageDisplay);
|
scrollerPanel.add(newMessageDisplay);
|
||||||
newMessageDisplay.setFocusOnUsersInput();
|
newMessageDisplay.setFocusOnUsersInput();
|
||||||
|
@ -382,7 +467,6 @@ public class ApplicationView extends Composite {
|
||||||
displayMessage.getMainPanel().setGrid("l8 m12 s12");
|
displayMessage.getMainPanel().setGrid("l8 m12 s12");
|
||||||
newMessageDisplay.getMainPanel().setLeft(350);
|
newMessageDisplay.getMainPanel().setLeft(350);
|
||||||
newMessageDisplay.getMainPanel().setGrid("l8 m12 s12");
|
newMessageDisplay.getMainPanel().setGrid("l8 m12 s12");
|
||||||
rightPanel.setLeft(0);
|
|
||||||
toggle = ! toggle;
|
toggle = ! toggle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,7 +476,6 @@ public class ApplicationView extends Composite {
|
||||||
newMessageDisplay.getMainPanel().setLeft(0);
|
newMessageDisplay.getMainPanel().setLeft(0);
|
||||||
newMessageDisplay.getMainPanel().setGrid("l12 s12 m12");
|
newMessageDisplay.getMainPanel().setGrid("l12 s12 m12");
|
||||||
|
|
||||||
rightPanel.setLeft(-350);
|
|
||||||
toggle = ! toggle;
|
toggle = ! toggle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -409,9 +492,9 @@ public class ApplicationView extends Composite {
|
||||||
FAB.setVisible(false);
|
FAB.setVisible(false);
|
||||||
displayMessage.showMessage(welcomeMessage);
|
displayMessage.showMessage(welcomeMessage);
|
||||||
welcomeMessage.setContent(MessagesResources.WELCOME_MESSAGE.substring(0, 102)+ " ...");
|
welcomeMessage.setContent(MessagesResources.WELCOME_MESSAGE.substring(0, 102)+ " ...");
|
||||||
MessageItem item = new MessageItem(welcomeMessage, messagesCollection, this, false);
|
MessageItem item = new MessageItem(welcomeMessage, false);
|
||||||
item.hideMessageMenu();
|
//item.hideMessageMenu();
|
||||||
messagesCollection.add(item);
|
//messagesCollection.add(item);
|
||||||
totalMessages++;
|
totalMessages++;
|
||||||
updateBadge(false);
|
updateBadge(false);
|
||||||
}
|
}
|
||||||
|
@ -425,9 +508,9 @@ public class ApplicationView extends Composite {
|
||||||
FAB.setVisible(false);
|
FAB.setVisible(false);
|
||||||
displayMessage.showMessage(welcomeMessage);
|
displayMessage.showMessage(welcomeMessage);
|
||||||
welcomeMessage.setContent(MessagesResources.ERROR_MESSAGE.substring(0, 102)+ " ...");
|
welcomeMessage.setContent(MessagesResources.ERROR_MESSAGE.substring(0, 102)+ " ...");
|
||||||
MessageItem item = new MessageItem(welcomeMessage, messagesCollection, this, false);
|
MessageItem item = new MessageItem(welcomeMessage, false);
|
||||||
item.hideMessageMenu();
|
//item.hideMessageMenu();
|
||||||
messagesCollection.add(item);
|
//messagesCollection.add(item);
|
||||||
totalMessages++;
|
totalMessages++;
|
||||||
updateBadge(false);
|
updateBadge(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
|
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
|
||||||
xmlns:g='urn:import:com.google.gwt.user.client.ui' xmlns:m="urn:import:gwt.material.design.client.ui"
|
xmlns:g='urn:import:com.google.gwt.user.client.ui'
|
||||||
|
xmlns:m="urn:import:gwt.material.design.client.ui"
|
||||||
xmlns:ma="urn:import:gwt.material.design.addins.client"
|
xmlns:ma="urn:import:gwt.material.design.addins.client"
|
||||||
xmlns:mc="urn:import:org.gcube.portets.user.message_conversations.client.autocomplete">
|
xmlns:mc="urn:import:org.gcube.portets.user.message_conversations.client.autocomplete"
|
||||||
|
xmlns:s="urn:import:org.gcube.portets.user.message_conversations.client.ui">
|
||||||
|
|
||||||
<ui:style>
|
<ui:style>
|
||||||
.animation {
|
.animation {
|
||||||
|
@ -21,14 +23,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.marginTop {
|
.marginTop {
|
||||||
margin-top: 0px;
|
margin-top: 60px;
|
||||||
min-height: 850px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.overflowXHidden {
|
.overflowXHidden {
|
||||||
overflow-x: hidden !important; /* needed in windows */
|
overflow-x: hidden !important; /* needed in windows */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.read {
|
||||||
|
font-weight: bold; font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
.modalTitle {
|
.modalTitle {
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
|
@ -38,63 +43,61 @@
|
||||||
padding: 50px;
|
padding: 50px;
|
||||||
}
|
}
|
||||||
</ui:style>
|
</ui:style>
|
||||||
<g:HTMLPanel ui:field="htmlPanel">
|
<g:HTMLPanel ui:field="htmlPanel" >
|
||||||
<!-- TOP BAR -->
|
<!-- TOP BAR -->
|
||||||
<m:MaterialHeader ui:field="header">
|
<m:MaterialNavBar ui:field="navBar"
|
||||||
<m:MaterialNavBar ui:field="navBar" layoutPosition="FIXED"
|
layoutPosition="RELATIVE" addStyleNames="{style.topBar}" height="60"
|
||||||
addStyleNames="{style.topBar}" height="60" backgroundColor="WHITE">
|
backgroundColor="WHITE">
|
||||||
<m:MaterialNavSection float="LEFT" showOn="SHOW_ON_MED_DOWN">
|
<m:MaterialNavSection float="LEFT"
|
||||||
<m:MaterialLink iconType="MENU" iconColor="LIGHT_BLUE_DARKEN_2"
|
showOn="SHOW_ON_MED_DOWN">
|
||||||
paddingLeft="25" waves="DEFAULT" ui:field="menu" hideOn="HIDE_ON_MED_DOWN" />
|
<m:MaterialLink iconType="MENU"
|
||||||
<m:MaterialLink iconType="INBOX" textColor="LIGHT_BLUE_DARKEN_2"
|
iconColor="LIGHT_BLUE_DARKEN_2" paddingLeft="25" waves="DEFAULT"
|
||||||
ui:field="switcher" waves="DEFAULT" paddingLeft="25">
|
ui:field="menu" hideOn="HIDE_ON_MED_DOWN" />
|
||||||
<m:MaterialBadge text="22 unread" backgroundColor="LIGHT_BLUE_DARKEN_2"
|
<m:MaterialLink iconType="INBOX"
|
||||||
textColor="WHITE" circle="false" ui:field="badge" visible="false"
|
textColor="LIGHT_BLUE_DARKEN_2" ui:field="switcher"
|
||||||
|
waves="DEFAULT" paddingLeft="25">
|
||||||
|
<m:MaterialBadge text="22 unread"
|
||||||
|
backgroundColor="LIGHT_BLUE_DARKEN_2" textColor="WHITE"
|
||||||
|
circle="false" ui:field="badge" visible="false"
|
||||||
hideOn="HIDE_ON_MED_DOWN" />
|
hideOn="HIDE_ON_MED_DOWN" />
|
||||||
</m:MaterialLink>
|
</m:MaterialLink>
|
||||||
<m:MaterialLink ui:field="newMessage" text="New"
|
<m:MaterialLink ui:field="newMessage" text="New"
|
||||||
showOn="SHOW_ON_MED_DOWN" iconType="MESSAGE" textColor="LIGHT_BLUE_DARKEN_2"
|
showOn="SHOW_ON_MED_DOWN" iconType="MESSAGE"
|
||||||
waves="LIGHT" />
|
textColor="LIGHT_BLUE_DARKEN_2" waves="LIGHT" />
|
||||||
</m:MaterialNavSection>
|
</m:MaterialNavSection>
|
||||||
</m:MaterialNavBar>
|
</m:MaterialNavBar>
|
||||||
</m:MaterialHeader>
|
|
||||||
|
|
||||||
|
|
||||||
|
<div height='100%'>
|
||||||
|
|
||||||
<!-- SIDE PANEL -->
|
<!-- SIDE PANEL -->
|
||||||
<m:MaterialRow ui:field="rightPanel" overflow="AUTO"
|
<s:ShowMorePagerPanel ui:field='pagerPanel' addStyleNames="{style.overflowXHidden}" height="300px" />
|
||||||
depth="995" grid="l3 m3 s12" padding="0" backgroundColor="WHITE"
|
|
||||||
height="100%" layoutPosition="FIXED" top="60" left="0" width="350px"
|
|
||||||
addStyleNames="{style.animation} {style.borderRight}">
|
|
||||||
<m:MaterialProgress type="INDETERMINATE" ui:field="messagesLoader"
|
|
||||||
color="BLUE" />
|
|
||||||
<m:MaterialCollection ui:field="messagesCollection"
|
|
||||||
addStyleNames="{style.marginTop}" visible="false">
|
|
||||||
</m:MaterialCollection>
|
|
||||||
</m:MaterialRow>
|
|
||||||
|
|
||||||
<!-- MAIN WINDOW -->
|
<!-- MAIN WINDOW -->
|
||||||
<m:MaterialContainer fontSize="0.8em">
|
<m:MaterialContainer>
|
||||||
<m:MaterialRow layoutPosition="RELATIVE" grid="l8 s12 m12"
|
<m:MaterialRow fontSize="0.8em">
|
||||||
top="65">
|
|
||||||
<m:MaterialProgress type="INDETERMINATE"
|
<m:MaterialProgress type="INDETERMINATE"
|
||||||
ui:field="messageLoader" color="TEAL" />
|
ui:field="messageLoader" color="TEAL" />
|
||||||
<g:ScrollPanel height="600px" ui:field="scrollerPanel"
|
<g:ScrollPanel ui:field="scrollerPanel"
|
||||||
addStyleNames="{style.overflowXHidden}"></g:ScrollPanel>
|
addStyleNames="{style.overflowXHidden}"></g:ScrollPanel>
|
||||||
</m:MaterialRow>
|
</m:MaterialRow>
|
||||||
</m:MaterialContainer>
|
</m:MaterialContainer>
|
||||||
|
|
||||||
|
</div>
|
||||||
<!-- FAB -->
|
<!-- FAB -->
|
||||||
<m:MaterialFAB ui:field="FAB">
|
<m:MaterialFAB ui:field="FAB">
|
||||||
<m:MaterialButton type="FLOATING" backgroundColor="RED"
|
<m:MaterialButton type="FLOATING"
|
||||||
iconType="REPLY" size="LARGE" />
|
backgroundColor="RED" iconType="REPLY" size="LARGE" />
|
||||||
<m:MaterialFABList>
|
<m:MaterialFABList>
|
||||||
<m:MaterialAnchorButton type="FLOATING"
|
<m:MaterialAnchorButton type="FLOATING"
|
||||||
waves="LIGHT" backgroundColor="BLUE" ui:field="forward" iconType="FORWARD" />
|
waves="LIGHT" backgroundColor="BLUE" ui:field="forward"
|
||||||
|
iconType="FORWARD" />
|
||||||
<m:MaterialAnchorButton type="FLOATING"
|
<m:MaterialAnchorButton type="FLOATING"
|
||||||
waves="LIGHT" backgroundColor="AMBER" ui:field="replyAll" iconType="REPLY_ALL" />
|
waves="LIGHT" backgroundColor="AMBER" ui:field="replyAll"
|
||||||
|
iconType="REPLY_ALL" />
|
||||||
<m:MaterialAnchorButton type="FLOATING"
|
<m:MaterialAnchorButton type="FLOATING"
|
||||||
waves="LIGHT" backgroundColor="TEAL" ui:field="reply" iconType="REPLY" />
|
waves="LIGHT" backgroundColor="TEAL" ui:field="reply"
|
||||||
|
iconType="REPLY" />
|
||||||
</m:MaterialFABList>
|
</m:MaterialFABList>
|
||||||
</m:MaterialFAB>
|
</m:MaterialFAB>
|
||||||
</g:HTMLPanel>
|
</g:HTMLPanel>
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
package org.gcube.portets.user.message_conversations.client.ui;
|
||||||
|
|
||||||
|
import org.gcube.portets.user.message_conversations.client.MessageServiceAsync;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.MessagesWindow;
|
||||||
|
|
||||||
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
|
|
||||||
|
import gwt.material.design.client.data.DataSource;
|
||||||
|
import gwt.material.design.client.data.loader.LoadCallback;
|
||||||
|
import gwt.material.design.client.data.loader.LoadConfig;
|
||||||
|
import gwt.material.design.client.data.loader.LoadResult;
|
||||||
|
|
||||||
|
|
||||||
|
public class MessageDataSource implements DataSource<ConvMessage> {
|
||||||
|
|
||||||
|
private MessageServiceAsync convService;
|
||||||
|
private boolean sent;
|
||||||
|
|
||||||
|
public MessageDataSource(boolean sent, MessageServiceAsync convService) {
|
||||||
|
this.convService = convService;
|
||||||
|
this.sent= sent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load(LoadConfig<ConvMessage> loadConfig, LoadCallback<ConvMessage> callback) {
|
||||||
|
|
||||||
|
convService.getMessagesWindows(this.sent, loadConfig.getOffset(), loadConfig.getLimit(),
|
||||||
|
new AsyncCallback<MessagesWindow>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(MessagesWindow messages) {
|
||||||
|
callback.onSuccess(new LoadResult<>(messages.getMessages(), loadConfig.getOffset(), messages.getTotal()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable throwable) {
|
||||||
|
GWT.log("Getting people async call failed.", throwable);
|
||||||
|
callback.onFailure(throwable);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useRemoteSort() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -23,7 +23,6 @@ import com.google.gwt.user.client.ui.Composite;
|
||||||
import com.google.gwt.user.client.ui.Widget;
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
|
|
||||||
import gwt.material.design.client.constants.Color;
|
import gwt.material.design.client.constants.Color;
|
||||||
import gwt.material.design.client.ui.MaterialCollection;
|
|
||||||
import gwt.material.design.client.ui.MaterialCollectionItem;
|
import gwt.material.design.client.ui.MaterialCollectionItem;
|
||||||
import gwt.material.design.client.ui.MaterialDropDown;
|
import gwt.material.design.client.ui.MaterialDropDown;
|
||||||
import gwt.material.design.client.ui.MaterialIcon;
|
import gwt.material.design.client.ui.MaterialIcon;
|
||||||
|
@ -43,8 +42,6 @@ public class MessageItem extends Composite {
|
||||||
|
|
||||||
private boolean deleteClicked = true;
|
private boolean deleteClicked = true;
|
||||||
|
|
||||||
private ApplicationView ap;
|
|
||||||
private MaterialCollection parentCollection;
|
|
||||||
private ConvMessage myMessage;
|
private ConvMessage myMessage;
|
||||||
private boolean sent;
|
private boolean sent;
|
||||||
|
|
||||||
|
@ -64,13 +61,12 @@ public class MessageItem extends Composite {
|
||||||
MessagesResources images = GWT.create(MessagesResources.class);
|
MessagesResources images = GWT.create(MessagesResources.class);
|
||||||
|
|
||||||
|
|
||||||
public MessageItem(final ConvMessage m, MaterialCollection parentCollection, ApplicationView ap, boolean sent) {
|
public MessageItem(final ConvMessage m, boolean sent) {
|
||||||
initWidget(uiBinder.createAndBindUi(this));
|
initWidget(uiBinder.createAndBindUi(this));
|
||||||
item.getElement().getStyle().setCursor(Cursor.POINTER);
|
item.getElement().getStyle().setCursor(Cursor.POINTER);
|
||||||
this.sent = sent;
|
this.sent = sent;
|
||||||
this.myMessage = m;
|
this.myMessage = m;
|
||||||
this.ap = ap;
|
//this.parentCollection = parentCollection;
|
||||||
this.parentCollection = parentCollection;
|
|
||||||
if (m.hasAttachments())
|
if (m.hasAttachments())
|
||||||
attachmentsIcon.setVisibility(Visibility.VISIBLE);
|
attachmentsIcon.setVisibility(Visibility.VISIBLE);
|
||||||
if (!sent && !m.isRead())
|
if (!sent && !m.isRead())
|
||||||
|
@ -128,7 +124,7 @@ public class MessageItem extends Composite {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
/*
|
||||||
deleteButton.addClickHandler(new ClickHandler() {
|
deleteButton.addClickHandler(new ClickHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(ClickEvent event) {
|
public void onClick(ClickEvent event) {
|
||||||
|
@ -145,26 +141,14 @@ public class MessageItem extends Composite {
|
||||||
new MaterialToast(()->{doDelete(m.getSubject());}, link).toast("Deleting Message ("+m.getSubject()+")");
|
new MaterialToast(()->{doDelete(m.getSubject());}, link).toast("Deleting Message ("+m.getSubject()+")");
|
||||||
item.setVisible(false);
|
item.setVisible(false);
|
||||||
}
|
}
|
||||||
});
|
}); */
|
||||||
dd.getElement().getStyle().setWidth(300, Unit.PX);
|
dd.getElement().getStyle().setWidth(300, Unit.PX);
|
||||||
String activator = "activate"+Random.nextInt();
|
String activator = "activate"+Random.nextInt();
|
||||||
dd.setActivator(activator);
|
dd.setActivator(activator);
|
||||||
messageActionIcon.setActivates(activator);
|
messageActionIcon.setActivates(activator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
@UiHandler("setUnreadButton")
|
|
||||||
void onSetUnread(ClickEvent e) {
|
|
||||||
e.stopPropagation();
|
|
||||||
if (myMessage.isRead()) {
|
|
||||||
ap.setMessageUnread(myMessage, this.sent);
|
|
||||||
myMessage.setRead(false);
|
|
||||||
item.addStyleName("unread-message");
|
|
||||||
} else {
|
|
||||||
Window.alert("Message is marked as unread already.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void doDelete(String subject) {
|
private void doDelete(String subject) {
|
||||||
if (deleteClicked) {
|
if (deleteClicked) {
|
||||||
ap.deleteMessage(myMessage, this.sent);
|
ap.deleteMessage(myMessage, this.sent);
|
||||||
|
@ -172,6 +156,7 @@ public class MessageItem extends Composite {
|
||||||
else
|
else
|
||||||
deleteClicked = true;
|
deleteClicked = true;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
public void setSelected(boolean active) {
|
public void setSelected(boolean active) {
|
||||||
item.setBackgroundColor(Color.WHITE);
|
item.setBackgroundColor(Color.WHITE);
|
||||||
|
@ -180,22 +165,14 @@ public class MessageItem extends Composite {
|
||||||
myMessage.setRead(true);
|
myMessage.setRead(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
@UiHandler("item")
|
@UiHandler("item")
|
||||||
void onClickedMessage(ClickEvent e) {
|
void onClickedMessage(ClickEvent e) {
|
||||||
checkHideSideBarOnMobile();
|
checkHideSideBarOnMobile();
|
||||||
parentCollection.clearActive();
|
//parentCollection.clearActive();
|
||||||
ap.readUserMessage(myMessage.getId(), this.sent);
|
ap.readUserMessage(myMessage.getId(), this.sent);
|
||||||
setSelected(true);
|
setSelected(true);
|
||||||
myMessage.setRead(true);
|
myMessage.setRead(true);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
private void checkHideSideBarOnMobile() {
|
|
||||||
if (Utils.isMobile())
|
|
||||||
ap.hideSidePanel();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void hideMessageMenu() {
|
|
||||||
messageActionIcon.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
package org.gcube.portets.user.message_conversations.client.ui;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
||||||
|
|
||||||
|
import com.google.gwt.view.client.HasData;
|
||||||
|
import com.google.gwt.view.client.ListDataProvider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The data source for contact information used in the sample.
|
||||||
|
*/
|
||||||
|
public class MessageProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The singleton instance of the database.
|
||||||
|
|
||||||
|
private static MessageProvider instance;
|
||||||
|
|
||||||
|
|
||||||
|
* Get the singleton instance of the contact database.
|
||||||
|
*
|
||||||
|
* @return the singleton instance
|
||||||
|
|
||||||
|
public static MessageProvider get() {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new MessageProvider();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The provider that holds the list of contacts in the database.
|
||||||
|
*/
|
||||||
|
private ListDataProvider<ConvMessage> dataProvider = new ListDataProvider<ConvMessage>();
|
||||||
|
|
||||||
|
|
||||||
|
public MessageProvider(List<ConvMessage> messages) {
|
||||||
|
List<ConvMessage> contacts = dataProvider.getList();
|
||||||
|
contacts.addAll(messages);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new contact.
|
||||||
|
*
|
||||||
|
* @param contact the contact to add.
|
||||||
|
*/
|
||||||
|
public void addMessage(ConvMessage message) {
|
||||||
|
List<ConvMessage> contacts = dataProvider.getList();
|
||||||
|
// Remove the contact first so we don't add a duplicate.
|
||||||
|
contacts.remove(message);
|
||||||
|
contacts.add(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a display to the database. The current range of interest of the display
|
||||||
|
* will be populated with data.
|
||||||
|
*
|
||||||
|
* @param display a {@Link HasData}.
|
||||||
|
*/
|
||||||
|
public void addDataDisplay(HasData<ConvMessage> display) {
|
||||||
|
dataProvider.addDataDisplay(display);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ListDataProvider<ConvMessage> getDataProvider() {
|
||||||
|
return dataProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh all displays.
|
||||||
|
*/
|
||||||
|
public void refreshDisplays() {
|
||||||
|
dataProvider.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
package org.gcube.portets.user.message_conversations.client.ui;
|
||||||
|
|
||||||
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.google.gwt.event.dom.client.ScrollEvent;
|
||||||
|
import com.google.gwt.event.dom.client.ScrollHandler;
|
||||||
|
import com.google.gwt.user.cellview.client.AbstractPager;
|
||||||
|
import com.google.gwt.user.client.ui.ScrollPanel;
|
||||||
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
|
import com.google.gwt.view.client.HasRows;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A scrolling pager that automatically increases the range every time the
|
||||||
|
* scroll bar reaches the bottom.
|
||||||
|
*/
|
||||||
|
public class ShowMorePagerPanel extends AbstractPager {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default increment size.
|
||||||
|
*/
|
||||||
|
private static final int DEFAULT_INCREMENT = 20;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The increment size.
|
||||||
|
*/
|
||||||
|
private int incrementSize = DEFAULT_INCREMENT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The last scroll position.
|
||||||
|
*/
|
||||||
|
private int lastScrollPos = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The scrollable panel.
|
||||||
|
*/
|
||||||
|
private final ScrollPanel scrollable = new ScrollPanel();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new {@link ShowMorePagerPanel}.
|
||||||
|
*/
|
||||||
|
public ShowMorePagerPanel() {
|
||||||
|
initWidget(scrollable);
|
||||||
|
|
||||||
|
// Do not let the scrollable take tab focus.
|
||||||
|
scrollable.getElement().setTabIndex(-1);
|
||||||
|
|
||||||
|
// Handle scroll events.
|
||||||
|
scrollable.addScrollHandler(new ScrollHandler() {
|
||||||
|
public void onScroll(ScrollEvent event) {
|
||||||
|
// If scrolling up, ignore the event.
|
||||||
|
int oldScrollPos = lastScrollPos;
|
||||||
|
lastScrollPos = scrollable.getVerticalScrollPosition();
|
||||||
|
if (oldScrollPos >= lastScrollPos) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HasRows display = getDisplay();
|
||||||
|
if (display == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int maxScrollTop = scrollable.getWidget().getOffsetHeight()
|
||||||
|
- scrollable.getOffsetHeight();
|
||||||
|
if (lastScrollPos >= maxScrollTop) {
|
||||||
|
// We are near the end, so increase the page size.
|
||||||
|
int newPageSize = Math.min(
|
||||||
|
display.getVisibleRange().getLength() + incrementSize,
|
||||||
|
display.getRowCount());
|
||||||
|
display.setVisibleRange(0, newPageSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of rows by which the range is increased when the scrollbar
|
||||||
|
* reaches the bottom.
|
||||||
|
*
|
||||||
|
* @return the increment size
|
||||||
|
*/
|
||||||
|
public int getIncrementSize() {
|
||||||
|
return incrementSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDisplay(HasRows display) {
|
||||||
|
assert display instanceof Widget : "display must extend Widget";
|
||||||
|
scrollable.setWidget((Widget) display);
|
||||||
|
super.setDisplay(display);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the number of rows by which the range is increased when the scrollbar
|
||||||
|
* reaches the bottom.
|
||||||
|
*
|
||||||
|
* @param incrementSize the incremental number of rows
|
||||||
|
*/
|
||||||
|
public void setIncrementSize(int incrementSize) {
|
||||||
|
GWT.log("increment of "+ incrementSize);
|
||||||
|
this.incrementSize = incrementSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onRangeOrRowCountChanged() {
|
||||||
|
GWT.log("range changed ...");
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,12 +23,12 @@
|
||||||
layoutPosition="RELATIVE" marginBottom="0" grid="l8 m12 s12"
|
layoutPosition="RELATIVE" marginBottom="0" grid="l8 m12 s12"
|
||||||
paddingLeft="10" paddingRight="60" marginLeft="5" marginTop="-5"
|
paddingLeft="10" paddingRight="60" marginLeft="5" marginTop="-5"
|
||||||
addStyleNames="{style.animation} message-metadata" left="350">
|
addStyleNames="{style.animation} message-metadata" left="350">
|
||||||
<m:MaterialModalFooter textAlign="RIGHT">
|
<m:MaterialFooter textAlign="RIGHT">
|
||||||
<m:MaterialButton ui:field="btnCloseModal" text="Cancel"
|
<m:MaterialButton ui:field="btnCloseModal" text="Cancel"
|
||||||
type="FLAT" textColor="BLACK" waves="DEFAULT"/>
|
type="FLAT" textColor="BLACK" waves="DEFAULT"/>
|
||||||
<m:MaterialButton text="Send" type="FLAT" textColor="WHITE"
|
<m:MaterialButton text="Send" type="FLAT" textColor="WHITE"
|
||||||
backgroundColor="BLUE" waves="DEFAULT" ui:field="btnSendModal" />
|
backgroundColor="BLUE" waves="DEFAULT" ui:field="btnSendModal" />
|
||||||
</m:MaterialModalFooter>
|
</m:MaterialFooter>
|
||||||
<m:MaterialPanel ui:field="sendingLoader" visible="false"
|
<m:MaterialPanel ui:field="sendingLoader" visible="false"
|
||||||
addStyleNames="{style.alignCenter}">
|
addStyleNames="{style.alignCenter}">
|
||||||
<m:MaterialLabel text="Sending message ..."
|
<m:MaterialLabel text="Sending message ..."
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
||||||
import org.gcube.portets.user.message_conversations.shared.CurrUserAndPortalUsersWrapper;
|
import org.gcube.portets.user.message_conversations.shared.CurrUserAndPortalUsersWrapper;
|
||||||
import org.gcube.portets.user.message_conversations.shared.FileModel;
|
import org.gcube.portets.user.message_conversations.shared.FileModel;
|
||||||
import org.gcube.portets.user.message_conversations.shared.MessageUserModel;
|
import org.gcube.portets.user.message_conversations.shared.MessageUserModel;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.MessagesWindow;
|
||||||
import org.gcube.portets.user.message_conversations.shared.WSUser;
|
import org.gcube.portets.user.message_conversations.shared.WSUser;
|
||||||
import org.gcube.vomanagement.usermanagement.GroupManager;
|
import org.gcube.vomanagement.usermanagement.GroupManager;
|
||||||
import org.gcube.vomanagement.usermanagement.UserManager;
|
import org.gcube.vomanagement.usermanagement.UserManager;
|
||||||
|
@ -54,10 +55,22 @@ public class ConvServiceImpl extends RemoteServiceServlet implements MessageServ
|
||||||
private PortalContext pContext;
|
private PortalContext pContext;
|
||||||
private UserManager um;
|
private UserManager um;
|
||||||
|
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
um = new LiferayUserManager();
|
um = new LiferayUserManager();
|
||||||
pContext = PortalContext.getConfiguration();
|
pContext = PortalContext.getConfiguration();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MessagesWindow getMessagesWindows(boolean sent, int limit, int offset) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return true if you're running into the portal, false if in development
|
* @return true if you're running into the portal, false if in development
|
||||||
|
@ -66,8 +79,7 @@ public class ConvServiceImpl extends RemoteServiceServlet implements MessageServ
|
||||||
try {
|
try {
|
||||||
UserLocalServiceUtil.getService();
|
UserLocalServiceUtil.getService();
|
||||||
return true;
|
return true;
|
||||||
}
|
}catch (com.liferay.portal.kernel.bean.BeanLocatorException ex) {
|
||||||
catch (com.liferay.portal.kernel.bean.BeanLocatorException ex) {
|
|
||||||
_log.trace("Development Mode ON");
|
_log.trace("Development Mode ON");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
package org.gcube.portets.user.message_conversations.server;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.gcube.portets.user.message_conversations.client.MessageService;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.ConvMessage;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.CurrUserAndPortalUsersWrapper;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.MessageUserModel;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.MessagesWindow;
|
||||||
|
import org.gcube.portets.user.message_conversations.shared.WSUser;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
||||||
|
|
||||||
|
public class FakeConvServiceImpl extends RemoteServiceServlet implements MessageService{
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 7437932085896191683L;
|
||||||
|
private static final Logger _log = LoggerFactory.getLogger(FakeConvServiceImpl.class);
|
||||||
|
|
||||||
|
|
||||||
|
ArrayList<ConvMessage> receivedMessages;
|
||||||
|
ArrayList<ConvMessage> sentMessages;
|
||||||
|
|
||||||
|
Map<String,ConvMessage> receivedMessagesMap = new HashMap<>();
|
||||||
|
Map<String,ConvMessage> sentMessagesMap = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
final int messageReceivedNumberToTest = 1000;
|
||||||
|
final int messageSentNumberToTest = 200;
|
||||||
|
|
||||||
|
public void init() {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
MessageUserModel mu = new MessageUserModel("andrea.rossi");
|
||||||
|
|
||||||
|
List<MessageUserModel> recipients = Arrays.asList(new MessageUserModel("lucio.lelii"));
|
||||||
|
|
||||||
|
String prefix ="received";
|
||||||
|
receivedMessages = new ArrayList<>();
|
||||||
|
for (int i =0; i<3000; i++) {
|
||||||
|
String id = "id-"+prefix+i;
|
||||||
|
ConvMessage msg= new ConvMessage(id, prefix+i, mu, recipients, new Date(cal.getTimeInMillis()), prefix+i, false, false);
|
||||||
|
receivedMessages.add(msg);
|
||||||
|
receivedMessagesMap.put(id, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix ="sent";
|
||||||
|
sentMessages = new ArrayList<>();
|
||||||
|
for (int i =0; i<3000; i++) {
|
||||||
|
String id = "id-"+prefix+i;
|
||||||
|
ConvMessage msg= new ConvMessage(id, prefix+i, mu, recipients, new Date(cal.getTimeInMillis()), prefix+i, false, false);
|
||||||
|
sentMessages.add(msg);
|
||||||
|
sentMessagesMap.put(id, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<ConvMessage> getMessages(boolean sent) {
|
||||||
|
if (sent) {
|
||||||
|
_log.info("sent messages call with sent {}",sent);
|
||||||
|
return new ArrayList<>(sentMessages.subList(0, messageSentNumberToTest));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_log.info("received messages call with sent {}",sent);
|
||||||
|
return new ArrayList<>(receivedMessages.subList(0, messageReceivedNumberToTest));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConvMessage getMessageById(String messageId, boolean sent) {
|
||||||
|
_log.info("get messageById called with id {} and sent {}", messageId,sent );
|
||||||
|
|
||||||
|
ConvMessage msg;
|
||||||
|
if (sent)
|
||||||
|
msg = sentMessagesMap.get(messageId);
|
||||||
|
else msg = receivedMessagesMap.get(messageId);
|
||||||
|
msg.setRead(true);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CurrUserAndPortalUsersWrapper getWorkspaceUsers() {
|
||||||
|
_log.debug("trying to get WorkspaceUsers ..");
|
||||||
|
WSUser currUser = new WSUser("andrea.rossi", "andrea.rossi", "Andrea Rossi", "m.assante@gmail.com");
|
||||||
|
ArrayList<WSUser> portalUsers = new ArrayList<WSUser>();
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
portalUsers.add(new WSUser(""+i, "username"+i, "userGetFullname()"+i, "user.getEmail()"+i));
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrUserAndPortalUsersWrapper toReturn = new CurrUserAndPortalUsersWrapper(currUser, portalUsers);
|
||||||
|
return toReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<WSUser> getUsersInfo(String[] usernames) {
|
||||||
|
return new ArrayList<>(Arrays.asList(new WSUser("andrea.rossi", "andrea.rossi", "Andrea Rossi", "m.assante@gmail.com")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<WSUser> searchUsers(String keyword) {
|
||||||
|
return new ArrayList<>(Arrays.asList(new WSUser("andrea.rossi", "andrea.rossi", "Andrea Rossi", "m.assante@gmail.com")));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean sendToById(ArrayList<String> recipientIds, ArrayList<String> listAttachmentsId, String subject,
|
||||||
|
String body) {
|
||||||
|
_log.info("email sent");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteMessageById(String messageId, boolean sent) {
|
||||||
|
_log.info("message deleted");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAttachmentDownloadURL(String itemId) {
|
||||||
|
return "www.google.it";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean saveAttachmentToWorkspaceFolder(String itemId, String destinationFolderId) {
|
||||||
|
_log.info("attachment saved");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean markMessageUnread(String messageId, boolean sent) {
|
||||||
|
_log.info("message marked");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MessagesWindow getMessagesWindows(boolean sent, int limit, int offset) {
|
||||||
|
_log.info("get Message Window called limit {} offset {}", limit, offset);
|
||||||
|
if (sent) {
|
||||||
|
List<ConvMessage> messages = sentMessages.subList(0, messageSentNumberToTest);
|
||||||
|
return new MessagesWindow(messages.size(), new ArrayList<>(messages.subList(offset, offset+limit)));
|
||||||
|
} else {
|
||||||
|
List<ConvMessage> messages = receivedMessages.subList(0, messageReceivedNumberToTest);
|
||||||
|
return new MessagesWindow(messages.size(), new ArrayList<>(messages.subList(offset, offset+limit)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.google.gwt.user.client.rpc.IsSerializable;
|
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||||
|
import com.google.gwt.view.client.ProvidesKey;
|
||||||
|
|
||||||
|
|
||||||
public class ConvMessage implements IsSerializable{
|
public class ConvMessage implements IsSerializable{
|
||||||
|
@ -18,6 +19,14 @@ public class ConvMessage implements IsSerializable{
|
||||||
private ArrayList<FileModel> attachments;
|
private ArrayList<FileModel> attachments;
|
||||||
private boolean hasAttachments;
|
private boolean hasAttachments;
|
||||||
|
|
||||||
|
|
||||||
|
public static final ProvidesKey<ConvMessage> KEY_PROVIDER = new ProvidesKey<ConvMessage>() {
|
||||||
|
@Override
|
||||||
|
public Object getKey(ConvMessage item) {
|
||||||
|
return item == null ? null : item.getId();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public ConvMessage() {
|
public ConvMessage() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
@ -157,8 +166,30 @@ public class ConvMessage implements IsSerializable{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
ConvMessage other = (ConvMessage) obj;
|
||||||
|
if (id == null) {
|
||||||
|
if (other.id != null)
|
||||||
|
return false;
|
||||||
|
} else if (!id.equals(other.id))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.gcube.portets.user.message_conversations.shared;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||||
|
|
||||||
|
public class MessagesWindow implements IsSerializable {
|
||||||
|
|
||||||
|
private int total;
|
||||||
|
private ArrayList<ConvMessage> messages;
|
||||||
|
|
||||||
|
public MessagesWindow() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessagesWindow(int total, ArrayList<ConvMessage> messages) {
|
||||||
|
super();
|
||||||
|
this.total = total;
|
||||||
|
this.messages = messages;
|
||||||
|
}
|
||||||
|
public int getTotal() {
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
public ArrayList<ConvMessage> getMessages() {
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -18,4 +18,4 @@ log4j.logger.org.gcube.contentmanager=WARN
|
||||||
log4j.logger.org.gcube.resources.discovery=WARN
|
log4j.logger.org.gcube.resources.discovery=WARN
|
||||||
log4j.logger.com.liferay.portal.kernel.bean.PortalBeanLocatorUtil=OFF
|
log4j.logger.com.liferay.portal.kernel.bean.PortalBeanLocatorUtil=OFF
|
||||||
log4j.logger.com.liferay.portal.kernel.log.Jdk14LogImpl=OFF
|
log4j.logger.com.liferay.portal.kernel.log.Jdk14LogImpl=OFF
|
||||||
log4j.logger.org.eclipse.jetty=ERROR
|
log4j.logger.org.eclipse.jetty=INFO
|
|
@ -3,6 +3,7 @@
|
||||||
<!-- Inherit the core Web Toolkit stuff. -->
|
<!-- Inherit the core Web Toolkit stuff. -->
|
||||||
<inherits name='com.google.gwt.user.User' />
|
<inherits name='com.google.gwt.user.User' />
|
||||||
|
|
||||||
|
<inherits name="com.google.gwt.logging.Logging" />
|
||||||
<!-- Inherit the default GWT style sheet. You can change -->
|
<!-- Inherit the default GWT style sheet. You can change -->
|
||||||
<!-- the theme of your GWT application by uncommenting -->
|
<!-- the theme of your GWT application by uncommenting -->
|
||||||
<!-- any one of the following lines. -->
|
<!-- any one of the following lines. -->
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
<!-- Servlets -->
|
<!-- Servlets -->
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>convServlet</servlet-name>
|
<servlet-name>convServlet</servlet-name>
|
||||||
<servlet-class>org.gcube.portets.user.message_conversations.server.ConvServiceImpl</servlet-class>
|
<servlet-class>org.gcube.portets.user.message_conversations.server.FakeConvServiceImpl</servlet-class>
|
||||||
|
|
||||||
</servlet>
|
</servlet>
|
||||||
|
|
||||||
<servlet-mapping>
|
<servlet-mapping>
|
||||||
|
@ -20,7 +21,7 @@
|
||||||
<servlet-class>com.liferay.portal.kernel.servlet.PortalDelegateServlet</servlet-class>
|
<servlet-class>com.liferay.portal.kernel.servlet.PortalDelegateServlet</servlet-class>
|
||||||
<init-param>
|
<init-param>
|
||||||
<param-name>servlet-class</param-name>
|
<param-name>servlet-class</param-name>
|
||||||
<param-value>org.gcube.portets.user.message_conversations.server.ConvServiceImpl</param-value>
|
<param-value>org.gcube.portets.user.message_conversations.server.FakeConvServiceImpl</param-value>
|
||||||
</init-param>
|
</init-param>
|
||||||
<init-param>
|
<init-param>
|
||||||
<param-name>sub-context</param-name>
|
<param-name>sub-context</param-name>
|
||||||
|
|
Loading…
Reference in New Issue