eXo Platform 3.5

## Chapter 2. Applications

This chapter provides you a comprehensive view about applications in eXo Knowledge, including:

- Portlets

- Gadgets

These applications are packaged as Web application archives (WARs).

Also, you can specify the package of each portlet and gadget and its available preferences that allow you to extend the configuration choices for standard preferences.

## Portlets

### Forum Portlet

#### Overview

Portlet name | War name | Description
--- | --- | ---
ForumPortlet | forum.war | The Forum portlet is the application for users to post and read messages on different topics.

- Declaration template

    <portlet-application>

      <portlet>

        <application-ref>forum</application-ref>

        <portlet-ref>ForumPortlet</portlet-ref>

      </portlet>

    </portlet-application>

#### Portlet.xml

- See the portlet.xml file in the project following this path: forum/WEB-INF/portlet.xml.

#### Preferences

Preference name | Possible value | Default value | Description
--- | --- | --- | ---
useAjax | `true`, `false` | `true` | Define if links in the Forum will be plain hrefs or javascript ajax (better for SEO) or not.
showForumActionBar | `true`, `false` | `true` | This is the UIForumActionBar. If the value is set to "true", the UIForumActionBar will be shown. If false, the UIForumActionBar will be hidden.
forumNewPost | `day number` | `1` | Specify if a post is new. If the post is created within the set period, it is new in the Forum.
enableIPLogging | `true`, `false` | `true` | Enable the IP logging function in the Forum. IP addresses of all posts will be collected.
enableIPFiltering | `true`, `false` | `true` | Enable the IP filter function in Forum, enabling IP addresses to be blocked in the Forum.
invisibleCategories | `id categories` | `empty` | Hide some categories. If the value is set empty, all categories of the Forum will be shown.
invisibleForums | `id forums` | `empty` | Hide some Forums. All Forums will be shown if the value is set empty.
uploadFileSizeLimitMB | `integer` | `20` | Limit the size of uploaded files in MB in the Forum.
isShowForumJump | `true`, `false` | `true` | Specify if the Forum jump panel is shown or not.
isShowIconsLegend | `true`, `false` | `true` | Specify if the icon legends panel is shown or not.
isShowModerators | `true`, `false` | `true` | Specify if the moderators panel is shown or not.
isShowPoll | `true`, `false` | `true` | Specify if the poll panel is shown or not.
isShowQuickReply | `true`, `false` | `true` | Specify if the quick reply panel is shown or not.
isShowRules | `true`, `false` | `true` | Specify if the forum rules panel is shown or not.
isShowStatistics | `true`, `false` | `true` | Specify if the statistics panel is shown or not.

#### Events

Name | Description
--- | ---
ForumLinkEvent | Set the render for UIForumLinkPortlet and set values for UIForumLinks.
ReLoadPortletEvent | Reload UIForumPortlet.
OpenLink | Update values for UIForumLinks.
ForumPollEvent | Set the render for UIForumPollPortlet.
ForumModerateEvent | Set the render for UIForumModeratorPortlet.
ForumRuleEvent | Set the render for UIForumRulePortlet.
QuickReplyEvent | Set the render for UIForumQuickReplyPortlet.

##### ForumLinkEvent

This event is fired through UIForumLinkPortlet.

To receive ForumLinkEvent, you must use the ForumParameter class with two properties:

Name | Type | Possible value | Description
--- | --- | --- | ---
isRenderForumLink | `boolean` | true/false | If the value is set to true or false, the Forum link is rendered or not respectively.
path | `string` | The absolute path of the class node (including types: category, forum, topic) defined by JCR. | Set data for the UIForumLinkPortlet.

For example:

    PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();

    ActionResponse actionRes = (ActionResponse) pcontext.getResponse();

    ForumParameter param = new ForumParameter();

    String path = forum.getPath();

    if ( ...condition to render the UIForumLinkPortlet... ) {

      param.setRenderForumLink(true);

      param.setPath(path);

    } else {

      param.setRenderForumLink(false);

    }

    actionRes.setEvent(new QName("ForumLinkEvent"), param) ;

##### ReLoadPortletEvent

This event is fired through UIForumPortlet.

To receive ReLoadPortletEvent, you must use the ForumParameter class with two properties:

Name | Type | Possible value | Description
--- | --- | --- | ---
topicId | `string` | Id of topic. | Return the id of topic for UIForumPortlet
isRenderPoll | `boolean` | true/false | If the value is set to true or false, the UITopicPoll component is rendered or not respectively.

For example:

    ....

    ActionResponse actionRes = pcontext.getResponse() ;

    ForumParameter param = new ForumParameter() ;

    param.setRenderPoll(true);

    param.setTopicId(topic.get());

    actionRes.setEvent(new QName("ReLoadPortletEvent"), param) ;

    ....

##### OpenLink

This event is fired through UIForumPortlet.

To receive OpenLink, you must use the ForumParameter class with one property:

Name | Type | Possible value | Description
--- | --- | --- | ---
path | `string` | The absolute path of the node defined by JCR. | Set data for the UIForumPortlet.

For example:

    ....

    ActionResponse actionRes = pcontext.getResponse() ;

    ForumParameter param = new ForumParameter() ;

    param.setPath(path);

    actionRes.setEvent(new QName("OpenLink"), param) ;

    ....

##### ForumPollEvent

This event is fired through UIForumPollPortlet.

To receive ForumPollEvent, you must use the ForumParameter class with four properties:

Name | Type | Possible value | Description
--- | --- | --- | ---
isRenderPoll | `boolean` | True/false | If the value is set to true or false, the UIForumPollPortlet portlet is rendered or not respectively.
categoryId | `string` | Id of category | Return the Id of category for UIForumPollPortlet.
forumId | `string` | Id of forum | Return the Id of forum for UIForumPollPortlet.
topicId | `string` | Id of topic | Return the Id of topic for UIForumPollPortlet.

For example:

    ....

    ActionResponse actionRes = pcontext.getResponse() ;

    ForumParameter param = new ForumParameter() ;

    param.setCategoryId(categoryId) ;

    param.setForumId(forumId);

    param.setTopicId(topicId);

    param.setRenderPoll(topic.getIsPoll());

    actionRes.setEvent(new QName("ForumPollEvent"), param);

    ....

##### ForumModerateEvent

This event is fired through UIForumModeratePortlet.

To receive ForumModerateEvent, you must use the ForumParameter class with two properties:

Name | Type | Possible value | Description
--- | --- | --- | ---
isRenderModerator | `boolean` | True/false | If the value is set to true or false, the UIForumModeratePortlet portlet is rendered or not respectively.
moderator | `list of strings` | List of user name | Set data for UIForumModeratePortlet.

For example:

    ....

    List<String> moderators = Arays.asList(forum.getModerators());

    ActionResponse actionRes = pcontext.getResponse() ;

    ForumParameter param = new ForumParameter() ;

    param.setModerators(moderators);

    param.setRenderModerator(true);

    actionRes.setEvent(new QName("ForumPollEvent"), param);

    ....

##### ForumRuleEvent

This event is fired through UIForumRulePortlet.

To receive ForumRuleEvent, you must use the ForumParameter class with two properties:

Name | Type | Possible value | Description
--- | --- | --- | ---
isRenderRule | `boolean` | True/false | If the value is set to true or false, the UIForumRulePortlet portlet is rendered or not respectively.
infoRules | `list of strings` | The list of states: can create topic, can add post and topic has lock. | Set permissions for users in UIForumRulePortlet.

For example:

    ....

    ActionResponse actionRes = pcontext.getResponse() ;

    ForumParameter param = new ForumParameter() ;

    List<String> list = param.getInfoRules();

    if(forum.getIsClosed() || forum.getIsLock()) {

      list.set(0, "true");

    } else {

      list.set(0, "false");

    }

    list.set(1, String.valueOf(canCreateTopic));

    list.set(2, String.valueOf(isCanPost));

    param.setInfoRules(list);

    param.setRenderRule(true);

    actionRes.setEvent(new QName("ForumRuleEvent"), param) ;

    ....

##### QuickReplyEvent

This event is fired through UIQuickReplyPortlet.

To receive QuickReplyEvent, you must use the ForumParameter class with five properties:

Name | Type | Possible value | Description
--- | --- | --- | ---
isRenderQuickReply | `boolean` | True/false | If the value is set to true or false, the UIQuickReplyPortlet portlet is rendered or not respectively.
isModerator | `boolean` | True/false | Specify if the user is moderator of forum containing the topic with quick reply or not.
categoryId | `string` | Id of category | Return the Id of category for UIQuickReplyPortlet.
forumId | `string` | Id of forum | Return the Id of forum for UIQuickReplyPortlet.
topicId | `string` | Id of topic | Return the Id of topic for UIQuickReplyPortlet.

For example:

    ....

    ActionResponse actionRes = pcontext.getResponse() ;

    ForumParameter param = new ForumParameter() ;

    param.setRenderQuickReply(isCanPost);

    param.setModerator(isMod);

    param.setCategoryId(categoryId) ;

    param.setForumId(forumId);

    param.setTopicId(topicId);

    actionRes.setEvent(new QName("QuickReplyEvent"), param) ;;

    ....

### Answers Portlet

#### Overview

Portlet name | War name | Description
--- | --- | ---
AnswersPortlet | faq.war | The Answers portlet is the application to create answers, to reply and manage questions.

#### Portlet.xml

- See the portlet.xml file in the project following this path: /webapps/faq/WEB-INF/portlet.xml.

#### Portlet Preferences

The Answers portlet consists of preferences as follows:

Preference name | Possible value | Default value | Description
--- | --- | --- | ---
enableViewAvatar | `true`, `false` | `true` | Enable users to view the avatar of owner posting the question.
enableAutomaticRSS | `true`, `false` | `true` | Enable users to get RSS automatically.
enableVotes AndComments | `true`, `false` | `true` | Enable users to give votes and comments for the question.
enableAnonymous SubmitQuestion | `true`, `false` | `true` | Enable anonymous users to submit questions.
display | `approved`, `both` | `both` | Enable administrators to view unapproved questions in the questions list in UIQuestions.
SendMailAdd NewQuestion | `string` | `empty` | Display the content of sent email when a new question is added.
SendMailEdit ResponseQuestion | `string` | `empty` | Display the email content when a response is edited.
emailMoveQuestion | `string` | `empty` | Display the email content when a question is moved.
orderBy | `alphabet`, `created` | `alphabet` | Arrange questions in the alphabet or created date order.
orderType | `asc`, `desc` | `asc` | Display questions in the ascending or descending order.
isDiscussForum | `true`, `false` | `false` | Enable the DiscussQuestions function.
idNameCategoryForum | `CategoryName,` ForumName`` | `empty` | Select categories and forums for the DiscussionQuestions function.
uploadFileSizeLimitMB | `integer` | `20` | Set the maximum size of uploaded files in MB.

### FAQ Portlet

#### Overview

Portlet name | War name | Description
--- | --- | ---
FAQPortlet | faq.war | The FAQ portlet which is the application to show questions and answers.

#### Portlet.xml

- See the portlet.xml file in the project following this path: /webapps/faq/WEB-INF/portlet.xml.

#### Portlet Preferences

The FAQ portlet includes some portlet preferences that you can configure to alter the behavior.

At runtime, you can use the EDIT mode portlet to set the preferences:

Alternatively, you can configure the portlet in the portet-preferences.xml file.

Preference name | Possible value | Default value | Description
--- | --- | --- | ---
useAjax | `true`, `false` | `false` | Specify if the AJAX load or HREF load is used.

### Polls Portlet

#### Overview

Portlet name | War name | Description
--- | --- | ---
PollPortlet | poll.war | The Poll portlet which is the application for users to vote any ideas, or activities.

#### Portlet.xml

- See the portlet.xml file in the project following this path: poll/WEB-INF/portlet.xml.

    <portlet-preferences>

      <preference>

        <name>pollIdShow</name>

        <value/> <!-- PollId -->

        <read-only>false</read-only>

      </preference>

    </portlet-preferences>

#### Portlet Preferences

Preference name | Possible value | Default value | Description
--- | --- | --- | ---
pollIdShow | `string` | `empty` | The Id of poll which is displayed in the Polls portlet.

## Gadgets

### Overview

eXo Platform provides a gadget which enables users to see a poll. The Poll Gadget is developed on the combination of Gagget by GateIn and Polls Service. The Poll Gadget allows users to apply functions of Polls, such as viewing and voting Polls.

Gadget name | War name | Description
--- | --- | ---
pollslist | poll.war | The list of Polls.

### Preferences

Preference name | Description
--- | ---
pollId | The Id of Polls which is displayed in the Polls gadget.

### Links to used REST services

- portal/rest/private/ks/poll/viewpoll/pollId

- portal/rest/private/ks/poll/votepoll/pollId/indexVote