Author: alexsmirnov
Date: 2011-01-27 14:00:01 -0500 (Thu, 27 Jan 2011)
New Revision: 21294
Added:
trunk/ui/validator/ui/src/main/templates/messages.template.xml
Modified:
trunk/examples/validator-demo/src/main/webapp/examples/ajax-validator.xhtml
trunk/examples/validator-demo/src/main/webapp/examples/client-validator.xhtml
trunk/ui/validator/ui/src/main/config/messages.xml
trunk/ui/validator/ui/src/main/java/org/richfaces/renderkit/MessageRendererBase.java
trunk/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/msg.ecss
trunk/ui/validator/ui/src/main/resources/META-INF/richfaces/org.richfaces/message.library.properties
trunk/ui/validator/ui/src/test/java/org/richfaces/component/AjaxValidationTest.java
trunk/ui/validator/ui/src/test/java/org/richfaces/component/ClientValidationTest.java
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/MessageTestBase.java
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/SendMessageTest.java
Log:
RESOLVED - issue RF-10064: Finish rich:message HTML design
https://issues.jboss.org/browse/RF-10064
Modified: trunk/examples/validator-demo/src/main/webapp/examples/ajax-validator.xhtml
===================================================================
--- trunk/examples/validator-demo/src/main/webapp/examples/ajax-validator.xhtml 2011-01-27
18:56:39 UTC (rev 21293)
+++ trunk/examples/validator-demo/src/main/webapp/examples/ajax-validator.xhtml 2011-01-27
19:00:01 UTC (rev 21294)
@@ -12,5 +12,6 @@
<h:outputText id="out"
value="#{test.value}"></h:outputText>
<csv:message id="uiMessage" for="text" />
</h:form>
+ <csv:messages/>
</h:body>
</html>
Modified: trunk/examples/validator-demo/src/main/webapp/examples/client-validator.xhtml
===================================================================
---
trunk/examples/validator-demo/src/main/webapp/examples/client-validator.xhtml 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/examples/validator-demo/src/main/webapp/examples/client-validator.xhtml 2011-01-27
19:00:01 UTC (rev 21294)
@@ -12,5 +12,6 @@
<h:outputText id="out"
value="#{test.value}"></h:outputText>
<csv:message id="uiMessage" for="text" />
</h:form>
+ <csv:messages/>
</h:body>
</html>
Modified: trunk/ui/validator/ui/src/main/config/messages.xml
===================================================================
--- trunk/ui/validator/ui/src/main/config/messages.xml 2011-01-27 18:56:39 UTC (rev
21293)
+++ trunk/ui/validator/ui/src/main/config/messages.xml 2011-01-27 19:00:01 UTC (rev
21294)
@@ -17,4 +17,18 @@
</cdk:tag>
</component-extension>
</component>
+ <component>
+ <component-type>org.richfaces.Messages</component-type>
+
<component-class>org.richfaces.component.html.HtmlMessages</component-class>
+ <component-extension>
+ <cdk:generate>true</cdk:generate>
+
<cdk:base-class>javax.faces.component.UIMessages</cdk:base-class>
+
<cdk:component-family>javax.faces.Messages</cdk:component-family>
+
<cdk:renderer-type>org.richfaces.MessagesRenderer</cdk:renderer-type>
+ <cdk:tag>
+ <cdk:tag-name>messages</cdk:tag-name>
+ <cdk:tag-type>Facelets</cdk:tag-type>
+ </cdk:tag>
+ </component-extension>
+ </component>
</faces-config>
Modified:
trunk/ui/validator/ui/src/main/java/org/richfaces/renderkit/MessageRendererBase.java
===================================================================
---
trunk/ui/validator/ui/src/main/java/org/richfaces/renderkit/MessageRendererBase.java 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/ui/validator/ui/src/main/java/org/richfaces/renderkit/MessageRendererBase.java 2011-01-27
19:00:01 UTC (rev 21294)
@@ -25,11 +25,13 @@
import java.io.IOException;
import java.util.Iterator;
+import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIComponent;
import javax.faces.component.UIMessage;
+import javax.faces.component.UIMessages;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;
@@ -43,6 +45,7 @@
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.UnmodifiableIterator;
@@ -100,44 +103,78 @@
String forId = getFor(component);
Iterator<FacesMessage> messages = getMessages(context, forId, component);
UnmodifiableIterator<FacesMessage> filteredMessages =
- Iterators.filter(messages, getMessagesFilter(context, component));
+ Iterators.filter(messages, getMessagesLevelFilter(context, component));
return Lists.newArrayList(filteredMessages);
}
- private Predicate<FacesMessage> getMessagesFilter(FacesContext context,
UIComponent component) {
+ private Predicate<FacesMessage> getMessagesLevelFilter(FacesContext context,
UIComponent component) {
+ final Severity level = getLevel(component);
+ final boolean displayAll = component instanceof UIMessages;
+ Predicate<FacesMessage> predicate = new Predicate<FacesMessage>() {
+ private int count = 0;
+ public boolean apply(FacesMessage input) {
+ if(input.getSeverity().compareTo(level) >= 0){
+ return displayAll||0 == count++;
+ }
+ return false;
+ }
+ };
+ return predicate;
+ }
+
+ private Severity getLevel(UIComponent component) {
Object levelName = component.getAttributes().get("level");
final Severity level =
(Severity) (FacesMessage.VALUES_MAP.containsKey(levelName) ?
FacesMessage.VALUES_MAP.get(levelName)
: FacesMessage.SEVERITY_INFO);
- return new Predicate<FacesMessage>() {
- public boolean apply(FacesMessage input) {
- return input.getSeverity().compareTo(level) >= 0;
- }
- };
+ return level;
}
private String getFor(UIComponent component) {
- return (String) component.getAttributes().get("for");
+ if (component instanceof UIMessages) {
+ UIMessages messages = (UIMessages) component;
+ if(messages.isGlobalOnly()){
+ return "";
+ } else {
+ return messages.getFor();
+ }
+ } else if (component instanceof UIMessage) {
+ UIMessage message = (UIMessage) component;
+ return message.getFor();
+ } else {
+ return (String) component.getAttributes().get("for");
+ }
}
protected void encodeMessage(FacesContext facesContext, UIComponent component, Object
msg) throws IOException {
// TODO fix generator to properly detect iteration variable type
FacesMessage message = (FacesMessage) msg;
- UIMessage uiMessage = (UIMessage) component;
+ String summary = message.getSummary();
+ String detail = message.getDetail();
+ boolean showSummary = true;
+ boolean showDetail = false;
+ if (component instanceof UIMessage) {
+ UIMessage uiMessage = (UIMessage) component;
+ showSummary = uiMessage.isShowSummary();
+ showDetail = uiMessage.isShowDetail();
+ } else if (component instanceof UIMessages) {
+ UIMessages uiMessages = (UIMessages) component;
+ showSummary = uiMessages.isShowSummary();
+ showDetail = uiMessages.isShowDetail();
+ }
ResponseWriter responseWriter = facesContext.getResponseWriter();
// tooltip
- boolean wroteTooltip =
Boolean.TRUE.equals(uiMessage.getAttributes().get("tooltip"));
- String summary = message.getSummary();
+ boolean wroteTooltip =
Boolean.TRUE.equals(component.getAttributes().get("tooltip"));
if(wroteTooltip && !Strings.isNullOrEmpty(summary)){
responseWriter.writeAttribute("title", summary,null);
}
- if (!wroteTooltip && uiMessage.isShowSummary()) {
+ if (!wroteTooltip && showSummary) {
writeMessageLabel(responseWriter, summary, "rf-msg-sum");
}
- if (uiMessage.isShowDetail()) {
- writeMessageLabel(responseWriter, message.getDetail(),
"rf-msg-des");
+ if (showDetail) {
+ writeMessageLabel(responseWriter, detail, "rf-msg-des");
}
}
@@ -153,14 +190,30 @@
protected void encodeScript(FacesContext facesContext, UIComponent component) throws
IOException {
JavaScriptService javaScriptService =
ServiceTracker.getService(JavaScriptService.class);
JSFunction messageObject = new JSObject("RichFaces.ui.Message",
component.getClientId(facesContext));
- String forId = (String) component.getAttributes().get("for");
+ Map<String, Object> attributes = component.getAttributes();
+ Builder<String, Object> parametersBuilder = ImmutableMap.builder();
+ String forId = (String) attributes.get("for");
if (!Strings.isNullOrEmpty(forId)) {
UIComponent target = RendererUtils.getInstance().findComponentFor(component,
forId);
if (null != target) {
- messageObject.addParameter(ImmutableMap.<String, String>
of("forComponentId",
- target.getClientId(facesContext)));
+ parametersBuilder.put("forComponentId",
+ target.getClientId(facesContext));
}
}
+ Severity level = getLevel(component);
+ if(FacesMessage.SEVERITY_INFO != level){
+ parametersBuilder.put("level", level.getOrdinal());
+ }
+ if(!Boolean.TRUE.equals(attributes.get("showSummary"))){
+ parametersBuilder.put("showSummary", false);
+ }
+ if(Boolean.TRUE.equals(attributes.get("showDetail"))){
+ parametersBuilder.put("showDetail", true);
+ }
+ if(Boolean.TRUE.equals(attributes.get("tooltip"))){
+ parametersBuilder.put("tooltip", true);
+ }
+ messageObject.addParameter(parametersBuilder.build());
// RendererUtils.getInstance().writeScript(facesContext, component,
messageObject);
javaScriptService.addPageReadyScript(facesContext, messageObject);
}
Modified:
trunk/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/msg.ecss
===================================================================
---
trunk/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/msg.ecss 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/ui/validator/ui/src/main/resources/META-INF/resources/org.richfaces/msg.ecss 2011-01-27
19:00:01 UTC (rev 21294)
@@ -15,23 +15,23 @@
}
.rf-msg-err {
- background-image: url(#{resource['org.richfaces:error.png']});
+ background-image: "url(#{resource['org.richfaces:error.png']})";
color:'#{richSkin.errorColor}';
}
.rf-msg-ftl {
- background-image: url(#{resource['org.richfaces:fatal.png']});
+ background-image: "url(#{resource['org.richfaces:fatal.png']})";
color:'#{richSkin.errorColor}';
}
.rf-msg-inf {
- background-image: url(#{resource['org.richfaces:info.png']});
+ background-image: "url(#{resource['org.richfaces:info.png']})";
color:'#{richSkin.generalTextColor}';
}
.rf-msg-wrn {
- background-image: url(#{resource['org.richfaces:warning.png']});
+ background-image: "url(#{resource['org.richfaces:warning.png']})";
color:'#{richSkin.warningColor}';
}
.rf-msg-ok {
- background-image: url(#{resource['org.richfaces:ok.png']});
+ background-image: "url(#{resource['org.richfaces:ok.png']})";
color:'#{richSkin.generalTextColor}';
width:20px;
display:inline-block;
Modified:
trunk/ui/validator/ui/src/main/resources/META-INF/richfaces/org.richfaces/message.library.properties
===================================================================
---
trunk/ui/validator/ui/src/main/resources/META-INF/richfaces/org.richfaces/message.library.properties 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/ui/validator/ui/src/main/resources/META-INF/richfaces/org.richfaces/message.library.properties 2011-01-27
19:00:01 UTC (rev 21294)
@@ -1 +1 @@
-resources=jquery.js, richfaces.js, richfaces-event.js, richfaces-base-component.js,
org.richfaces:richfaces-message.js
\ No newline at end of file
+resources=jquery.js, richfaces.js, richfaces-event.js, richfaces-base-component.js,
org.richfaces:message.js
\ No newline at end of file
Added: trunk/ui/validator/ui/src/main/templates/messages.template.xml
===================================================================
--- trunk/ui/validator/ui/src/main/templates/messages.template.xml
(rev 0)
+++ trunk/ui/validator/ui/src/main/templates/messages.template.xml 2011-01-27 19:00:01 UTC
(rev 21294)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- JBoss, Home of Professional Open Source Copyright ${year}, Red Hat,
+ Inc. and individual contributors by the @authors tag. See the copyright.txt
+ in the distribution for a full listing of individual contributors. This is
+ free software; you can redistribute it and/or modify it under the terms of
+ the GNU Lesser General Public License as published by the Free Software Foundation;
+ either version 2.1 of the License, or (at your option) any later version.
+ This software is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ details. You should have received a copy of the GNU Lesser General Public
+ License along with this software; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the
+ FSF site:
http://www.fsf.org. -->
+<cdk:root
xmlns="http://jboss.org/schema/richfaces/cdk/xhtml-el"
+
xmlns:cdk="http://jboss.org/schema/richfaces/cdk/core"
xmlns:cc="http://jboss.org/schema/richfaces/cdk/jsf/composite"
+
xmlns:c="http://jboss.org/schema/richfaces/cdk/jstl/core"
xmlns:xi="http://www.w3.org/2001/XInclude">
+ <cc:interface>
+ <cdk:class>org.richfaces.renderkit.html.HtmlMessagesRenderer</cdk:class>
+ <cdk:superclass>org.richfaces.renderkit.MessageRendererBase</cdk:superclass>
+ <cdk:component-family>javax.faces.Messages</cdk:component-family>
+ <cdk:renderer-type>org.richfaces.MessagesRenderer</cdk:renderer-type>
+ <cdk:resource-dependency library="org.richfaces"
+ name="msg.ecss" />
+ <cdk:resource-dependency library="org.richfaces"
+ name="message.reslib" />
+ </cc:interface>
+ <cc:implementation>
+ <span id="#{clientId}" class="rf-msg
#{component.attributes['styleClass']}"
+ cdk:passThroughWithExclusions="id class">
+ <c:forEach var="msg"
+ items="#{getVisibleMessages(facesContext,component)}">
+ <span class="#{getMsgClass(facesContext,component,msg)}"
style="#{getMsgStyle(facesContext,component,msg)}">
+ <cdk:call>encodeMessage(facesContext,component,msg)</cdk:call>
+ </span>
+ </c:forEach>
+ <cdk:call>encodeScript(facesContext,component)</cdk:call>
+ </span>
+ </cc:implementation>
+</cdk:root>
Modified:
trunk/ui/validator/ui/src/test/java/org/richfaces/component/AjaxValidationTest.java
===================================================================
---
trunk/ui/validator/ui/src/test/java/org/richfaces/component/AjaxValidationTest.java 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/ui/validator/ui/src/test/java/org/richfaces/component/AjaxValidationTest.java 2011-01-27
19:00:01 UTC (rev 21294)
@@ -51,12 +51,12 @@
@Test
public void testSubmitTooShortValue() throws Exception {
- submitValueAndCheckMesage("",containsString("Error"));
+ submitValueAndCheckMesage("",not(equalTo("")));
}
@Test
public void testSubmitTooLongValue() throws Exception {
- submitValueAndCheckMesage("123456",containsString("Error"));
+ submitValueAndCheckMesage("123456",not(equalTo("")));
}
@Test
Modified:
trunk/ui/validator/ui/src/test/java/org/richfaces/component/ClientValidationTest.java
===================================================================
---
trunk/ui/validator/ui/src/test/java/org/richfaces/component/ClientValidationTest.java 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/ui/validator/ui/src/test/java/org/richfaces/component/ClientValidationTest.java 2011-01-27
19:00:01 UTC (rev 21294)
@@ -51,12 +51,12 @@
@Test
public void testSubmitTooShortValue() throws Exception {
- submitValueAndCheckMesage("",containsString("Error"));
+ submitValueAndCheckMesage("",not(equalTo("")));
}
@Test
public void testSubmitTooLongValue() throws Exception {
- submitValueAndCheckMesage("123456",containsString("Error"));
+ submitValueAndCheckMesage("123456",not(equalTo("")));
}
@Test
Modified:
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/MessageTestBase.java
===================================================================
---
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/MessageTestBase.java 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/MessageTestBase.java 2011-01-27
19:00:01 UTC (rev 21294)
@@ -82,4 +82,15 @@
return "new RichFaces.ui.Message(\"" + MY_MESSAGE + "\",
{forComponentId:\"" + COMPONENT +
"\""+messageOptions+"})";
}
+ protected void checkMessageContent(String summary) {
+ String text = getMessageAsText();
+ assertTrue(text.contains(summary));
+ }
+
+ protected String getMessageAsText() {
+ HtmlElement htmlElement = getMessageContentElement();
+ String text = htmlElement.asText();
+ return text;
+ }
+
}
Modified:
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/SendMessageTest.java
===================================================================
---
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/SendMessageTest.java 2011-01-27
18:56:39 UTC (rev 21293)
+++
trunk/ui/validator/ui/src/test/java/org/richfaces/javascript/client/message/SendMessageTest.java 2011-01-27
19:00:01 UTC (rev 21294)
@@ -27,26 +27,57 @@
import org.junit.Test;
-import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.DomElement;
+
/**
* <p class="changed_added_4_0"></p>
* @author asmirnov(a)exadel.com
*
*/
public class SendMessageTest extends MessageTestBase {
-
+
@Test
- public void testSend() throws Exception {
- setUpMessage(",showSummary:true");
+ public void testSendDefault() throws Exception {
+ setUpMessage();
sendMessage();
- checkMessageContent(getErrorMessage().getSummary());
+ String messageAsText = getMessageAsText();
+ assertTrue(messageAsText.contains(getErrorMessage().getSummary()));
+ assertFalse(messageAsText.contains(getErrorMessage().getDetail()));
+ checkTitle(DomElement.ATTRIBUTE_NOT_DEFINED);
}
- protected void checkMessageContent(String summary) {
- HtmlElement htmlElement = getMessageContentElement();
- String text = htmlElement.asText();
- assertTrue(text.contains(summary));
+ @Test
+ public void testSendWithDetail() throws Exception {
+ setUpMessage(",showDetail:true");
+ sendMessage();
+ String messageAsText = getMessageAsText();
+ assertTrue(messageAsText.contains(getErrorMessage().getSummary()));
+ assertTrue(messageAsText.contains(getErrorMessage().getDetail()));
+ checkTitle(DomElement.ATTRIBUTE_NOT_DEFINED);
}
+ @Test
+ public void testSendWithLevel() throws Exception {
+ setUpMessage(",level:3");
+ sendMessage();
+ String messageAsText = getMessageAsText();
+ assertTrue(messageAsText.isEmpty());
+ assertTrue(getMessageContentElement().getChildNodes().isEmpty());
+ }
+
+ @Test
+ public void testSendWithTooltip() throws Exception {
+ setUpMessage(",tooltip:true");
+ sendMessage();
+ String messageAsText = getMessageAsText();
+ assertFalse(messageAsText.contains(getErrorMessage().getSummary()));
+ assertFalse(messageAsText.contains(getErrorMessage().getDetail()));
+ checkTitle(getErrorMessage().getSummary());
+ }
+
+ private void checkTitle(String title) {
+ String attribute = ((DomElement)
getMessageContentElement().getFirstChild()).getAttribute("title");
+ assertEquals(title, attribute);
+ }
}