[jboss-cvs] JBossBlog SVN: r298 - in trunk: resources/META-INF and 6 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sat May 3 14:03:47 EDT 2008


Author: adamw
Date: 2008-05-03 14:03:47 -0400 (Sat, 03 May 2008)
New Revision: 298

Added:
   trunk/src/action/org/jboss/blog/session/feed/dao/IndividualPostsFeedDao.java
   trunk/src/action/org/jboss/blog/session/feed/mod/IndividualFeedModBean.java
   trunk/src/model/org/jboss/blog/model/feed/IndividualPostInfo.java
   trunk/src/model/org/jboss/blog/model/feed/IndividualPostsFeed.java
   trunk/view/manage/individual/
   trunk/view/manage/individual/individual_add.xhtml
   trunk/view/manage/individual/individual_edit.xhtml
   trunk/view/manage/individual/post_add.xhtml
Modified:
   trunk/resources/META-INF/persistence-design.xml
   trunk/resources/META-INF/persistence-dev.xml
   trunk/resources/META-INF/persistence-prod.xml
   trunk/resources/WEB-INF/pages.xml
   trunk/resources/messages_en.properties
Log:


Modified: trunk/resources/META-INF/persistence-design.xml
===================================================================
--- trunk/resources/META-INF/persistence-design.xml	2008-04-30 12:50:33 UTC (rev 297)
+++ trunk/resources/META-INF/persistence-design.xml	2008-05-03 18:03:47 UTC (rev 298)
@@ -13,6 +13,8 @@
         <class>org.jboss.blog.model.feed.RemoteFeed</class>
         <class>org.jboss.blog.model.feed.AggregatedFeed</class> 
         <class>org.jboss.blog.model.feed.HighlightsFeed</class>
+        <class>org.jboss.blog.model.feed.IndividualPostsFeed</class>
+        <class>org.jboss.blog.model.feed.IndividualPostInfo</class>
         <class>org.jboss.blog.model.Category</class>
         <class>org.jboss.blog.model.Post</class>
         <class>org.jboss.blog.model.Enclosure</class>

Modified: trunk/resources/META-INF/persistence-dev.xml
===================================================================
--- trunk/resources/META-INF/persistence-dev.xml	2008-04-30 12:50:33 UTC (rev 297)
+++ trunk/resources/META-INF/persistence-dev.xml	2008-05-03 18:03:47 UTC (rev 298)
@@ -12,7 +12,9 @@
         <class>org.jboss.blog.model.feed.Feed</class>
         <class>org.jboss.blog.model.feed.RemoteFeed</class>
         <class>org.jboss.blog.model.feed.AggregatedFeed</class>
-        <class>org.jboss.blog.model.feed.HighlightsFeed</class>
+        <class>org.jboss.blog.model.feed.HighlightsFeed</class>        
+        <class>org.jboss.blog.model.feed.IndividualPostsFeed</class>
+        <class>org.jboss.blog.model.feed.IndividualPostInfo</class>
         <class>org.jboss.blog.model.Category</class>
         <class>org.jboss.blog.model.Post</class>
         <class>org.jboss.blog.model.Enclosure</class>

Modified: trunk/resources/META-INF/persistence-prod.xml
===================================================================
--- trunk/resources/META-INF/persistence-prod.xml	2008-04-30 12:50:33 UTC (rev 297)
+++ trunk/resources/META-INF/persistence-prod.xml	2008-05-03 18:03:47 UTC (rev 298)
@@ -13,6 +13,8 @@
         <class>org.jboss.blog.model.feed.RemoteFeed</class>
         <class>org.jboss.blog.model.feed.AggregatedFeed</class>
         <class>org.jboss.blog.model.feed.HighlightsFeed</class>
+        <class>org.jboss.blog.model.feed.IndividualPostsFeed</class>
+        <class>org.jboss.blog.model.feed.IndividualPostInfo</class>
         <class>org.jboss.blog.model.Category</class>
         <class>org.jboss.blog.model.Post</class>
         <class>org.jboss.blog.model.Enclosure</class>

Modified: trunk/resources/WEB-INF/pages.xml
===================================================================
--- trunk/resources/WEB-INF/pages.xml	2008-04-30 12:50:33 UTC (rev 297)
+++ trunk/resources/WEB-INF/pages.xml	2008-05-03 18:03:47 UTC (rev 298)
@@ -261,6 +261,39 @@
         </navigation>
     </page>
 
+    <!-- Manage individual posts feeds -->
+
+    <page view-id="/manage/individual/individual_add.xhtml" login-required="true">
+        <begin-conversation flush-mode="manual" join="true" />
+        <!-- Initializing the new feed, if not yet initialized -->
+        <action execute="#{individualFeedMod.getIndividualPostsFeed}" />
+        <navigation from-action="#{feedMod.saveNew}">
+            <end-conversation before-redirect="true" />
+            <redirect view-id="/manage/individual/individual_edit.xhtml" />
+        </navigation>
+    </page>
+
+    <page view-id="/manage/individual/individual_edit.xhtml" login-required="true">
+        <begin-conversation flush-mode="manual" join="true" />
+        <param name="name" converterId="feedConverter" value="#{feedMod.feed}" />
+        <param name="from" value="#{individualFeedMod.from}" />
+        <restrict>#{identity.hasPermission('feed', 'edit', feedMod.feed, feedMod.feed.group)}</restrict>
+        <navigation from-action="#{individualFeedMod.saveExisting}">
+            <end-conversation />
+            <redirect view-id="/manage/index.xhtml" />
+        </navigation>
+    </page>
+
+    <page view-id="/manage/individual/post_add.xhtml" login-required="true" conversation-required="true">
+        <restrict>#{identity.hasPermission('feed', 'edit', feedMod.feed, feedMod.feed.group)}</restrict>
+        <navigation from-action="#{individualFeedMod.addPost}">
+            <redirect view-id="/manage/individual/individual_edit.xhtml" />
+        </navigation>
+        <navigation from-action="#{individualFeedMod.reset}">
+            <redirect view-id="/manage/individual/individual_edit.xhtml" />
+        </navigation>
+    </page>
+
     <!-- Manage groups -->
 
     <page view-id="/manage/group/group_list.xhtml" login-required="true">

Modified: trunk/resources/messages_en.properties
===================================================================
--- trunk/resources/messages_en.properties	2008-04-30 12:50:33 UTC (rev 297)
+++ trunk/resources/messages_en.properties	2008-05-03 18:03:47 UTC (rev 298)
@@ -117,6 +117,9 @@
   as it appears in the feed, can be always overwritten by the blog author (which is configurable later) or can be \
   replaced by the blog author only when the post author is missing (default).
 
+blog.feed.individual.post.added=Post added.
+blog.feed.individual.post.deleted=Post deleted.
+
 blog.feed.aggregated.updated=Aggregated feed {0} changed.
 
 blog.feed.new.invalidname=Feed name may only contain small latin letters, numbers and _.

Copied: trunk/src/action/org/jboss/blog/session/feed/dao/IndividualPostsFeedDao.java (from rev 297, trunk/src/action/org/jboss/blog/session/feed/dao/AggregatedFeedDao.java)
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/dao/IndividualPostsFeedDao.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/feed/dao/IndividualPostsFeedDao.java	2008-05-03 18:03:47 UTC (rev 298)
@@ -0,0 +1,35 @@
+package org.jboss.blog.session.feed.dao;
+
+import org.jboss.blog.model.feed.IndividualPostsFeed;
+import org.jboss.blog.model.RestrictedPost;
+import org.jboss.blog.session.feed.posts.DatabaseFeedPosts;
+import org.jboss.blog.session.feed.type.FeedType;
+import org.jboss.blog.model.security.RestrictedMode;
+import org.jboss.seam.Component;
+
+import java.util.List;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at FeedType(
+        name = "individual posts",
+        addPage = "/manage/individual/individual_add.xhtml",
+        editPage = "/manage/individual/individual_edit.xhtml",
+        model = IndividualPostsFeed.class)
+public class IndividualPostsFeedDao implements FeedDao {
+    private IndividualPostsFeed individualPostsFeed;
+
+    public IndividualPostsFeedDao(IndividualPostsFeed individualPostsFeed) {
+        this.individualPostsFeed = individualPostsFeed;
+    }
+
+    public List<? extends RestrictedPost> getPosts(int from, int to, RestrictedMode restricted) {
+        return ((DatabaseFeedPosts) Component.getInstance("databaseFeedPosts")).getPosts(
+                individualPostsFeed, from, to);
+    }
+
+    public void update() {
+
+    }
+}
\ No newline at end of file

Added: trunk/src/action/org/jboss/blog/session/feed/mod/IndividualFeedModBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/mod/IndividualFeedModBean.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/feed/mod/IndividualFeedModBean.java	2008-05-03 18:03:47 UTC (rev 298)
@@ -0,0 +1,283 @@
+package org.jboss.blog.session.feed.mod;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.security.Restrict;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.core.Events;
+import org.jboss.seam.faces.FacesMessages;
+import org.jboss.blog.model.feed.IndividualPostsFeed;
+import org.jboss.blog.model.feed.IndividualPostInfo;
+import org.jboss.blog.model.feed.Feed;
+import org.jboss.blog.model.Post;
+import org.jboss.blog.session.feed.InvalidFeedTypeException;
+import org.jboss.blog.session.parser.ParserException;
+import org.jboss.blog.session.parser.ParserService;
+import org.jboss.blog.session.merge.MergeServiceBean;
+import org.jboss.blog.tools.GeneralTools;
+import org.jboss.blog.tools.StringTools;
+
+import javax.persistence.EntityManager;
+import javax.faces.application.FacesMessage;
+import javax.faces.model.SelectItem;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Scope(ScopeType.CONVERSATION)
+ at Name("individualFeedMod")
+public class IndividualFeedModBean {
+    @In
+    private FeedModBean feedMod;
+
+    @In
+    private EntityManager entityManager;
+
+    @In
+    private FacesMessages facesMessages;
+
+    @In
+    private Events events;
+
+    @In
+    private ParserService parserService;
+
+    @In
+    private PostsValidator postsValidator;
+
+    @In
+    private MergeServiceBean mergeService;
+
+    private IndividualPostsFeed individualPostsFeed;
+
+    private String address;
+
+    private boolean parseOk;
+
+    private Feed parsedFeed;
+
+    private Post selectedPost;
+
+    private String selectedPostTitleAsId;
+
+    private String postAuthor;
+
+    private List<SelectItem> posts;
+
+    private List<IndividualPostInfo> postInfos;
+
+    private int from;
+
+    public IndividualPostsFeed getIndividualPostsFeed() throws InvalidFeedTypeException {
+        if (individualPostsFeed == null) {
+            if (feedMod.getFeed() == null) {
+                individualPostsFeed = new IndividualPostsFeed();
+                feedMod.initNewFeed(individualPostsFeed);
+
+                individualPostsFeed.setPostInfos(new ArrayList<IndividualPostInfo>());
+            } else {
+                if (feedMod.getFeed() instanceof IndividualPostsFeed) {
+                    individualPostsFeed = (IndividualPostsFeed) feedMod.getFeed();
+                } else {
+                    throw new InvalidFeedTypeException();
+                }
+            }
+        }
+
+        return individualPostsFeed;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public boolean isParseOk() {
+        return parseOk;
+    }
+
+    public void setParseOk(boolean parseOk) {
+        this.parseOk = parseOk;
+    }
+
+    public Feed getParsedFeed() {
+        return parsedFeed;
+    }
+
+    public void setParsedFeed(Feed parsedFeed) {
+        this.parsedFeed = parsedFeed;
+    }
+
+    public Post getSelectedPost() {
+        return selectedPost;
+    }
+
+    public void setSelectedPost(Post selectedPost) {
+        this.selectedPost = selectedPost;
+    }
+
+    public String getSelectedPostTitleAsId() {
+        return selectedPostTitleAsId;
+    }
+
+    public int getFrom() {
+        return from;
+    }
+
+    public void setFrom(int from) {
+        if (this.from != from) {
+            postInfos = null;
+        }
+
+        this.from = from;
+    }
+
+    public int getPostsOnPage() {
+        return 3;
+    }
+
+    public boolean getShowPrevious() {
+        return from != 0;
+    }
+
+    public boolean getShowNext() throws InvalidFeedTypeException {
+        return getPostInfos().size() == getPostsOnPage()+1;
+    }
+
+    public int getPreviousFrom() {
+        return Math.max(0, from - getPostsOnPage());
+    }
+
+    public int getNextFrom() {
+        return from + getPostsOnPage();
+    }
+
+    public List<IndividualPostInfo> getPostInfos() throws InvalidFeedTypeException {
+        if (postInfos == null) {
+            //noinspection unchecked
+            postInfos = entityManager
+                    .createQuery("SELECT pi FROM IndividualPostInfo pi WHERE pi.feed = ?1 ORDER BY pi.post.published")
+                    .setParameter(1, getIndividualPostsFeed())
+                    .setFirstResult(from)
+                    .setMaxResults(getPostsOnPage()+1)
+                    .getResultList();
+        }
+
+        return postInfos;
+    }
+
+    public void setPostInfos(List<IndividualPostInfo> postInfos) {
+        this.postInfos = postInfos;
+    }
+
+    public void setSelectedPostTitleAsId(String selectedPostTitleAsId) {
+        this.selectedPostTitleAsId = selectedPostTitleAsId;
+
+        if (parsedFeed != null) {
+            for (Post post : parsedFeed.getPosts()) {
+                if (GeneralTools.objectsEqual(post.getTitleAsId(), selectedPostTitleAsId)) {
+                    selectedPost = post;
+                    break;
+                }
+            }
+        }
+    }
+
+    public String getPostAuthor() {
+        return postAuthor;
+    }
+
+    public void setPostAuthor(String postAuthor) {
+        this.postAuthor = postAuthor;
+    }
+
+    public List<SelectItem> getPosts() {
+        return posts;
+    }
+
+    public void setPosts(List<SelectItem> posts) {
+        this.posts = posts;
+    }
+
+    public void updateSelectedPost() {
+        if (GeneralTools.objectsEqual(postAuthor, parsedFeed.getAuthor())) {
+            if (!StringTools.isEmpty(selectedPost.getAuthor())) {
+                postAuthor = selectedPost.getAuthor();
+            }
+        }
+    }
+
+    public void parseFeed() {
+        try {
+            parsedFeed = parserService.parse(getAddress());
+
+            if (!postsValidator.validatePosts(parsedFeed.getPosts(), true, "address")) {
+               throw new ParserException("Posts are missing some information.");
+            }
+
+            postAuthor = parsedFeed.getAuthor();
+
+            posts = new ArrayList<SelectItem>();
+            for (Post post : parsedFeed.getPosts()) {
+                posts.add(new SelectItem(post.getTitleAsId(), post.getTitle()));
+            }
+
+            setParseOk(true);
+        } catch (ParserException e) {
+            facesMessages.addToControlFromResourceBundle("parse", FacesMessage.SEVERITY_ERROR,
+                        "blog.feed.remote.parsenotok", e.getMessage());
+
+            setParseOk(false);
+        }
+    }
+
+    public void reset() {
+        parseOk = false;
+        address = "";
+        selectedPost = null;
+        selectedPostTitleAsId = null;
+    }
+
+    @Restrict("#{identity.hasPermission('feed', 'edit', feedMod.feed, feedMod.feed.group)}")
+    public void addPost() throws InvalidFeedTypeException {
+        mergeService.savePost(individualPostsFeed, selectedPost);
+
+        IndividualPostInfo postInfo = new IndividualPostInfo();
+        postInfo.setPost(selectedPost);
+        postInfo.setFeed(individualPostsFeed);
+        postInfo.setRemoteFeedAddress(address);
+
+        entityManager.persist(postInfo);
+       
+        individualPostsFeed.getPostInfos().add(postInfo);
+
+        entityManager.flush();
+
+        facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.updated",
+                getIndividualPostsFeed().getName());
+
+        events.raiseEvent("blog.feed.individual.post.added");
+
+        reset();
+    }
+
+    public void delete(IndividualPostInfo postInfo) throws InvalidFeedTypeException {
+        // TODO: delete post
+
+        individualPostsFeed.getPostInfos().remove(postInfo);
+        entityManager.remove(postInfo);
+
+        entityManager.flush();
+
+        facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.updated",
+                getIndividualPostsFeed().getName());
+
+        events.raiseEvent("blog.feed.individual.post.deleted");
+    }
+}

Added: trunk/src/model/org/jboss/blog/model/feed/IndividualPostInfo.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/feed/IndividualPostInfo.java	                        (rev 0)
+++ trunk/src/model/org/jboss/blog/model/feed/IndividualPostInfo.java	2008-05-03 18:03:47 UTC (rev 298)
@@ -0,0 +1,73 @@
+package org.jboss.blog.model.feed;
+
+import org.jboss.blog.model.Post;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class IndividualPostInfo {
+    @Id
+    @GeneratedValue
+    private int id;
+
+    @ManyToOne
+    private IndividualPostsFeed feed;
+
+    @ManyToOne
+    private Post post;
+
+    private String remoteFeedAddress;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public IndividualPostsFeed getFeed() {
+        return feed;
+    }
+
+    public void setFeed(IndividualPostsFeed feed) {
+        this.feed = feed;
+    }
+
+    public Post getPost() {
+        return post;
+    }
+
+    public void setPost(Post post) {
+        this.post = post;
+    }
+
+    public String getRemoteFeedAddress() {
+        return remoteFeedAddress;
+    }
+
+    public void setRemoteFeedAddress(String remoteFeedAddress) {
+        this.remoteFeedAddress = remoteFeedAddress;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof IndividualPostInfo)) return false;
+
+        IndividualPostInfo that = (IndividualPostInfo) o;
+
+        if (id != that.id) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        return id;
+    }
+}

Copied: trunk/src/model/org/jboss/blog/model/feed/IndividualPostsFeed.java (from rev 286, trunk/src/model/org/jboss/blog/model/feed/HighlightsFeed.java)
===================================================================
--- trunk/src/model/org/jboss/blog/model/feed/IndividualPostsFeed.java	                        (rev 0)
+++ trunk/src/model/org/jboss/blog/model/feed/IndividualPostsFeed.java	2008-05-03 18:03:47 UTC (rev 298)
@@ -0,0 +1,27 @@
+package org.jboss.blog.model.feed;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.CascadeType;
+import java.util.List;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class IndividualPostsFeed extends Feed {
+    @OneToMany(mappedBy = "feed", cascade = CascadeType.ALL)
+    private List<IndividualPostInfo> postInfos;
+
+    public List<IndividualPostInfo> getPostInfos() {
+        return postInfos;
+    }
+
+    public void setPostInfos(List<IndividualPostInfo> postInfos) {
+        this.postInfos = postInfos;
+    }
+}
\ No newline at end of file

Copied: trunk/view/manage/individual/individual_add.xhtml (from rev 293, trunk/view/manage/feed_add.xhtml)
===================================================================
--- trunk/view/manage/individual/individual_add.xhtml	                        (rev 0)
+++ trunk/view/manage/individual/individual_add.xhtml	2008-05-03 18:03:47 UTC (rev 298)
@@ -0,0 +1,21 @@
+<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:s="http://jboss.com/products/seam/taglib"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:rich="http://richfaces.org/rich"
+                xmlns:a="http://richfaces.org/a4j"
+                template="../../layout/template.xhtml">
+    <ui:define name="header">
+        Add a new individual posts feed - edit common data
+    </ui:define>
+
+    <ui:define name="body">
+        <ui:include src="../feed_mod.xhtml">
+            <ui:param name="new" value="true" />
+            <ui:param name="advanced" value="true" />
+        </ui:include>
+    </ui:define>
+</ui:composition>

Added: trunk/view/manage/individual/individual_edit.xhtml
===================================================================
--- trunk/view/manage/individual/individual_edit.xhtml	                        (rev 0)
+++ trunk/view/manage/individual/individual_edit.xhtml	2008-05-03 18:03:47 UTC (rev 298)
@@ -0,0 +1,67 @@
+<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:s="http://jboss.com/products/seam/taglib"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:rich="http://richfaces.org/rich"
+                xmlns:a="http://richfaces.org/a4j"
+                template="../../layout/template.xhtml">
+    <ui:define name="header">
+        Edit individual posts feed: #{feedMod.feed.name}
+    </ui:define>
+
+    <ui:define name="body">
+        <div class="blogFeedNav #{additionalStyle}">
+            <ul>
+                <ui:include src="../../common/next_previous_navigation.xhtml">
+                    <ui:param name="viewId" value="/manage/individual/individual_edit.xhtml" />
+                    <ui:param name="navigationBean" value="#{individualFeedMod}" />
+                    <ui:param name="showColon" value="false" />
+                </ui:include>
+            </ul>
+        </div>
+
+        <h:form>
+            <s:div rendered="#{individualFeedMod.individualPostsFeed.postInfos.size == 0}">
+                There are no posts included.
+            </s:div>
+
+            <s:div id="postsTable">
+                <table class="basetablestyle" >
+                    <a:repeat rowKeyVar="rowNumber" var="postInfo"
+                              value="#{individualFeedMod.postInfos}" rows="#{individualFeedMod.postsOnPage}">
+                        <tr class="#{(rowNumber%2 == 0) ? 'evenRow' : 'oddRow'}">
+                            <td>
+                                <ui:include src="../../common/post.xhtml">
+                                    <ui:param name="post" value="#{postInfo.post}" />
+                                    <ui:param name="showSummary" value="true" />
+                                    <ui:param name="showAddToHighlights" value="false" />
+                                </ui:include>
+                            </td>
+                            <td>
+                                <a:commandLink value="Delete" action="#{individualFeedMod.delete(postInfo)}"
+                                               reRender="postsTable" />
+                            </td>
+                        </tr>
+                    </a:repeat>
+                </table>
+            </s:div>
+
+            <s:div styleClass="formbuttons">
+                <ul>
+                    <li>
+                        <s:button value="Return" view="/manage/index.xhtml" propagation="end" styleClass="submit" />
+                    </li>
+                    <li>
+                        <s:button value="Add a new post" view="/manage/individual/post_add.xhtml" styleClass="submit" />
+                    </li>
+                    <li>
+                        <ui:include src="../../common/ajax_status.xhtml" />
+                    </li>
+                </ul>
+            </s:div>
+        </h:form>
+    </ui:define>
+</ui:composition>

Added: trunk/view/manage/individual/post_add.xhtml
===================================================================
--- trunk/view/manage/individual/post_add.xhtml	                        (rev 0)
+++ trunk/view/manage/individual/post_add.xhtml	2008-05-03 18:03:47 UTC (rev 298)
@@ -0,0 +1,91 @@
+<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:s="http://jboss.com/products/seam/taglib"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:rich="http://richfaces.org/rich"
+                xmlns:a="http://richfaces.org/a4j"
+                template="../../layout/template.xhtml">
+    <ui:define name="header">
+        Edit individual posts feed: #{feedMod.feed.name}
+    </ui:define>
+
+    <ui:define name="body">
+        <div class="adminforms">
+            <h:form>
+                <h:panelGrid columns="2" id="form_data">
+                    <h:outputLabel><span class="required">*</span> Remote feed (atom/rss2) address:</h:outputLabel>
+                    <h:panelGroup>
+                        <h:inputText id="address" value="#{individualFeedMod.address}" required="true" size="55"
+                                     maxlength="64" disabled="#{individualFeedMod.parseOk}">
+                            <s:validate />
+                        </h:inputText>
+                        <a:outputPanel id="addressMessage">
+                            <h:message for="address" styleClass="error" />
+                        </a:outputPanel>
+                    </h:panelGroup>
+
+                    <h:panelGroup />
+                    <h:panelGroup id="parseStatus">
+                        <h:message for="parse" infoClass="info" warnClass="error" errorClass="error" fatalClass="error" />
+                    </h:panelGroup>
+
+                    <h:outputLabel rendered="#{individualFeedMod.parseOk}">
+                        <span class="required">*</span> Select post to include:
+                    </h:outputLabel>
+                    <h:panelGroup rendered="#{individualFeedMod.parseOk}">
+                        <h:selectOneMenu id="selectPost" required="true" value="#{individualFeedMod.selectedPostTitleAsId}"
+                                         style="width: 500px">
+                            <f:selectItems value="#{individualFeedMod.posts}" />
+                            <s:validate />
+                            <a:support event="onchange" reRender="postAuthor,selectPostMessage" ajaxSingle="true"
+                                       action="#{individualFeedMod.updateSelectedPost}" />
+                        </h:selectOneMenu>
+                        <a:outputPanel id="selectPostMessage">
+                            <h:message for="selectPost" styleClass="error" />
+                        </a:outputPanel>
+                    </h:panelGroup>
+
+                    <h:outputLabel rendered="#{individualFeedMod.parseOk}">
+                        <span class="required">*</span> Post author:
+                    </h:outputLabel>
+                    <h:panelGroup rendered="#{individualFeedMod.parseOk}">
+                        <h:inputText id="postAuthor" value="#{individualFeedMod.postAuthor}" required="true" size="55"
+                                     maxlength="64">
+                            <s:validate />
+                        </h:inputText>
+                        <a:outputPanel id="postAuthorMessage">
+                            <h:message for="postAuthor" styleClass="error" />
+                        </a:outputPanel>
+                    </h:panelGroup>
+                </h:panelGrid>
+
+                <s:div id="proceed" styleClass="formbuttons">
+                    <ul>
+                        <s:fragment rendered="#{!individualFeedMod.parseOk}">
+                            <li>
+                                <a:commandButton action="#{individualFeedMod.parseFeed}" value="Read and parse the feed"
+                                                 styleClass="submit" id="parse"
+                                                 reRender="form_data,proceed" />
+                            </li>
+                        </s:fragment>
+                        <s:fragment rendered="#{individualFeedMod.parseOk}">
+                            <li>
+                                <h:commandButton value="Add post" action="#{individualFeedMod.addPost}"
+                                                 styleClass="submit" />
+                            </li>
+                        </s:fragment>
+                        <li>
+                            <s:button value="Cancel" action="#{individualFeedMod.reset}" styleClass="submit" />
+                        </li>
+                        <li>
+                            <ui:include src="../../common/ajax_status.xhtml" />
+                        </li>
+                    </ul>
+                </s:div>
+            </h:form>
+        </div>
+    </ui:define>
+</ui:composition>




More information about the jboss-cvs-commits mailing list