Votes Module

The votes module allows users to vote for objects defined in the application. Users can vote by setting a rating value on an item (+1, -1 or any other integer value). The votes module makes sure that users can vote only once for an item. A global rating is associated with the item to give the vote summary. The vote can be associated with any database entity and it is not necessary to change other entities in your data model.

Integration

To be able to use the votes module, you will need to add the following line in your GNAT project file:

with "awa_votes";

The Vote_Module manages the votes on entities. It provides operations that are used by the vote beans or other services to vote for an item. An instance of the Vote_Module must be declared and registered in the AWA application.

The module instance can be defined as follows:

type Application is new AWA.Applications.Application with record
   Vote_Module : aliased AWA.Votes.Modules.Vote_Module;
end record;

And registered in the Initialize_Modules procedure by using:

Register (App    => App.Self.all'Access,
          Name   => AWA.Votes.Modules.NAME,
          URI    => "votes",
          Module => App.Vote_Module'Access);

Ada Beans

The Vote_Bean is a bean intended to be used in presentation files (XHTML facelet files) to vote for an item. The managed bean can be easily configured in the application XML configuration file. The permission and entity_type are the two properties that should be defined in the configuration. The permission is the name of the permission that must be used to verify that the user is allowed to vote for the item. The entity_type is the name of the entity (table name) used by the item. The example below defines the bean questionVote defined by the question module.

<managed-bean>
  <description>The vote bean that allows to vote for a question.</description>
  <managed-bean-name>questionVote</managed-bean-name>
  <managed-bean-class>AWA.Votes.Beans.Votes_Bean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>permission</property-name>
    <property-class>String</property-class>
    <value>answer-create</value>
  </managed-property>
  <managed-property>
    <property-name>entity_type</property-name>
    <property-class>String</property-class>
    <value>awa_question</value>
  </managed-property>
</managed-bean>

The vote concerns entities for the awa_question entity table. The permission answer-create is used to verify that the vote is allowed.

The managed bean defines three operations that can be called: vote_up, vote_down and vote to setup specific ratings.

Javascript integration

The votes module provides a Javascript support to help users vote for items. The Javascript file /js/awa-votes.js must be included in the Javascript page. It is based on jQuery and ASF. The vote actions are activated on the page items as follows in XHTML facelet files:

<util:script>
  $('.question-vote').votes({
    voteUrl: "#{contextPath}/questions/ajax/questionVote/vote?id=",
    itemPrefix: "vote_for-"
});
</util:script>

When the vote up or down HTML element is clicked, the vote operation of the managed bean questionVote is called. The operation will update the user's vote for the selected item (in the example "a question").

Data model