Commit 4cf1969d by Juho Juopperi

Merge branch 'eventCalendar' into 'master'

Event calendar

Calendar for events, also some nice stuff for event dates.

This must be done afther my other mergerequest, bcause this also contains it's stuff, sorry for that, my pad.
2 parents 39d85ac6 7d4faae0
......@@ -207,7 +207,11 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE group_memberships ADD COLUMN place_product INTEGER",
"ALTER TABLE group_memberships ADD CONSTRAINT FK_group_memberships_place_product FOREIGN KEY (place_product) REFERENCES products (id)"
});
}
dbUpdates.add(new String[] {
"ALTER TABLE events ADD COLUMN ticket_sales_begin timestamp without time zone DEFAULT null;",
});
} // start_time timestamp without time zone,
@EJB
private DBModelFacade dbModelFacade;
......
......@@ -292,4 +292,28 @@ public class EventBean implements EventBeanLocal {
return event;
}
@Override
@RolesAllowed(EventPermission.S_MANAGE_EVENT)
public List<LanEvent> findAllEvents() {
return eventFacade.findAll();
}
}
package fi.codecrew.moya.facade;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.codecrew.moya.model.LanEvent_;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEvent_;
@Stateless
@LocalBean
......@@ -46,4 +49,14 @@ public class EventFacade extends IntegerPkGenericFacade<LanEvent> {
}
public List<LanEvent> findAll() {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<LanEvent> cq = cb.createQuery(getEntityClass());
cq.select(cq.from(getEntityClass()));
TypedQuery<LanEvent> q = getEm().createQuery(cq);
return q.getResultList();
}
}
......@@ -43,5 +43,7 @@ public interface EventBeanLocal {
LanEvent deleteProperty(LanEventProperty property);
LanEvent deletePrivateProperty(LanEventPrivateProperty property);
List<LanEvent> findAllEvents();
}
package fi.codecrew.moya.model;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
......@@ -33,12 +33,16 @@ public class LanEvent extends GenericEntity {
@Column(name = "start_time")
@Temporal(TemporalType.TIMESTAMP)
private Calendar startTime;
private Date startTime;
@Column(name = "end_time")
@Temporal(TemporalType.TIMESTAMP)
private Calendar endTime;
private Date endTime;
@Column(name = "ticket_sales_begin")
@Temporal(TemporalType.TIMESTAMP)
private Date ticketSalesBegin;
@Column(name = "name", nullable = false, unique = true)
private String name;
......@@ -107,19 +111,19 @@ public class LanEvent extends GenericEntity {
}
public Calendar getStartTime() {
public Date getStartTime() {
return startTime;
}
public void setStartTime(Calendar startTime) {
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Calendar getEndTime() {
public Date getEndTime() {
return endTime;
}
public void setEndTime(Calendar endTime) {
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
......@@ -291,4 +295,12 @@ public class LanEvent extends GenericEntity {
this.games = games;
}
public Date getTicketSalesBegin() {
return ticketSalesBegin;
}
public void setTicketSalesBegin(Date ticketSalesBegin) {
this.ticketSalesBegin = ticketSalesBegin;
}
}
......@@ -9,11 +9,24 @@
<f:viewParam name="eventid" value="#{eventorgView.eventid}" />
<f:event type="preRenderView" listener="#{eventorgView.initEditEvent}" />
</f:metadata>
<ui:define name="title">
<h1>#{i18n['lecturegroup.list.title']}</h1>
</ui:define>
<ui:define name="content">
<h:form id="notifyForm">
<p:outputPanel rendered="#{eventorgView.showDatesError}">
<p class="error"><b>#{i18n['event.nodates.title']}</b></p>
<p class="error">#{i18n['event.nodates.message']}</p>
</p:outputPanel>
</h:form>
<h:form id="orgform">
<h:panelGrid columns="3">
<h:outputLabel for="id" value="#{i18n['event.id']}:" />
<h:inputText id="id" value="#{eventorgView.event.name}" />
<h:outputLabel id="id" value="#{eventorgView.event.id}" />
<h:message for="id" />
<h:outputLabel for="name" value="#{i18n['event.name']}:" />
......@@ -28,17 +41,19 @@
<h:inputText id="nextbillnr" value="#{eventorgView.event.nextBillNumber}" />
<h:message for="nextbillnr" />
<h:outputLabel for="salesBegin" value="#{i18n['event.ticketSalesBegin']}:" />
<p:calendar id="salesBegin" value="#{eventorgView.event.ticketSalesBegin}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" showOn="button" />
<h:message for="salesBegin" />
<h:outputLabel for="starttime" value="#{i18n['event.startTime']}:" />
<h:inputText id="starttime" value="#{eventorgView.event.startTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:inputText>
<p:calendar id="starttime" value="#{eventorgView.event.startTime}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" showOn="button" />
<h:message for="starttime" />
<h:outputLabel for="endTime" value="#{i18n['event.endTime']}:" />
<h:inputText id="endTime" value="#{eventorgView.event.endTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:inputText>
<p:calendar id="endTime" value="#{eventorgView.event.endTime}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" showOn="button" />
<h:message for="endTime" />
<h:outputLabel for="defaultrole" value="#{i18n['event.defaultRole']}:" />
<h:selectOneMenu id="defaultrole" converter="#{roleConverter}" value="#{eventorgView.event.defaultRole}">
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView" listener="#{eventorgView.initEditEvent}" />
</f:metadata>
<ui:define name="content">
<h:form>
<p:fieldset legend="#{i18n['event.calendar.title']}">
<p:schedule id="schedule" value="#{eventorgView.eventsCalendar}" rightHeaderTemplate="month" axisFormat="H:mm" timeFormat="H:mm" timeZone="#{sessionHandler.timezone}" locale="#{sessionHandler.locale}" tooltip="true" draggable="false" resizable="false" view="month" allDaySlot="true" />
</p:fieldset>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
......@@ -106,51 +106,6 @@
</p:tabView>
</h:form>
<script type="text/javascript">
PrimeFaces.locales['fi'] = {
closeText : 'Sulje',
prevText : 'Edellinen',
nextText : 'Seuraava',
currentText : 'Tänään',
monthNames : [ 'Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu','Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu', 'Joulukuu' ],
monthNamesShort : [ 'Tammikuu', 'Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu','Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
dayNames : [ 'Sunnuntai','Maanantai','Tiistain','Keskiviikko','Torstai','Perjantai','Lauantai' ],
dayNamesShort : [ 'Su','Ma','Ti','Ke','To','Pe','La' ],
dayNamesMin : [ 'Su','Ma','Ti','Ke','To','Pe','La' ],
weekHeader : 'vk',
firstDay : 1,
isRTL : false,
showMonthAfterYear : false,
yearSuffix : '',
month : 'Kuukausi',
week : 'Viikko',
day : 'Päivä',
allDayText : 'Koko päivä'
};
PrimeFaces.locales['und'] = {
closeText : 'Sulje',
prevText : 'Edellinen',
nextText : 'Seuraava',
currentText : 'Tänään',
monthNames : [ 'Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu','Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu', 'Joulukuu' ],
monthNamesShort : [ 'Tammikuu', 'Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu','Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
dayNames : [ 'Sunnuntai','Maanantai','Tiistain','Keskiviikko','Torstai','Perjantai','Lauantai' ],
dayNamesShort : [ 'Su','Ma','Ti','Ke','To','Pe','La' ],
dayNamesMin : [ 'Su','Ma','Ti','Ke','To','Pe','La' ],
weekHeader : 'vk',
firstDay : 1,
isRTL : false,
showMonthAfterYear : false,
yearSuffix : '',
month : 'Kuukausi',
week : 'Viikko',
day : 'Päivä',
allDayText : 'Koko päivä'
};
</script>
</ui:define>
......
......@@ -113,18 +113,28 @@
color: #006600;
}
.error {
color: red;
}
.success {
color: #006600;
}
.lectureCalendar,
.lectureCalendarParticipating,
.lectureCalendarDisabled {
.lectureCalendarDisabled,
.eventRunningCalendar,
.calendarEventStyle {
border: 1px solid black;
padding: 3px;
font-size: 11px;
}
.eventRunningCalendar {
background-color: #CC0000;
}
.lectureCalendarParticipating {
background-color: green;
}
......@@ -143,3 +153,8 @@
margin: 0;
padding-left: 40px !important;
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html class="no-js" xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<html class="no-js" xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<f:view contentType="text/html" locale="#{sessionHandler.locale}">
......@@ -14,13 +13,14 @@
<meta name="author" content="CodeCrew ry" />
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Language" content="#{sessionHandler.locale}" />
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/custom_components.css" />
<link rel="icon" href="#{request.contextPath}/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="#{request.contextPath}/resources/templates/template1/css/normalize.min.css" />
<link rel="stylesheet" href="#{request.contextPath}/resources/templates/template1/css//main.css" />
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/template1/css/style.css" />
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/template1/css/general.css" />
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/template1/css/print.css" />
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/custom_components.css" />
<script src="#{request.contextPath}/resources/templates/template1/js/modernizr-2.6.2.min.js"></script>
......@@ -192,6 +192,61 @@
<footer class="bgColor1"> </footer>
<script type="text/javascript">
PrimeFaces.locales['fi'] = {
closeText : 'Sulje',
prevText : 'Edellinen',
nextText : 'Seuraava',
currentText : 'Tänään',
monthNames : [ 'Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu',
'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu',
'Lokakuu', 'Marraskuu', 'Joulukuu' ],
monthNamesShort : [ 'Tammikuu', 'Helmikuu', 'Maaliskuu',
'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu',
'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu' ],
dayNames : [ 'Sunnuntai', 'Maanantai', 'Tiistain',
'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai' ],
dayNamesShort : [ 'Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La' ],
dayNamesMin : [ 'Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La' ],
weekHeader : 'vk',
firstDay : 1,
isRTL : false,
showMonthAfterYear : false,
yearSuffix : '',
month : 'Kuukausi',
week : 'Viikko',
day : 'Päivä',
allDayText : 'Koko päivä'
};
PrimeFaces.locales['und'] = {
closeText : 'Sulje',
prevText : 'Edellinen',
nextText : 'Seuraava',
currentText : 'Tänään',
monthNames : [ 'Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu',
'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu',
'Lokakuu', 'Marraskuu', 'Joulukuu' ],
monthNamesShort : [ 'Tammikuu', 'Helmikuu', 'Maaliskuu',
'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu',
'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu' ],
dayNames : [ 'Sunnuntai', 'Maanantai', 'Tiistain',
'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai' ],
dayNamesShort : [ 'Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La' ],
dayNamesMin : [ 'Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La' ],
weekHeader : 'vk',
firstDay : 1,
isRTL : false,
showMonthAfterYear : false,
yearSuffix : '',
month : 'Kuukausi',
week : 'Viikko',
day : 'Päivä',
allDayText : 'Koko päivä'
};
</script>
</h:body>
</f:view>
......
......@@ -127,17 +127,23 @@ error = Virhe
error.contact = If this happens again, contact Info with the following code:
error.error = You have encountered an error.
event.domains.title = Domain
event.edit = Edit
event.endTime = End time
event.id = Event ID
event.name = Event name
event.calendar.title = Tapahtumakalenteri
event.domains.title = Domain
event.edit = Edit
event.endTime = End time
event.id = Event ID
event.name = Event name
event.nextBillNumber = Initial bill number
event.nodates.message = Lis\u00E4\u00E4 tapahtumaan v\u00E4hint\u00E4\u00E4n aloitusp\u00E4iv\u00E4, lopetusp\u00E4iv\u00E4 sek\u00E4 lipunmyynnin aloitusp\u00E4iv\u00E4.
event.nodates.title = P\u00E4iv\u00E4m\u00E4\u00E4ri\u00E4 puuttuu!
event.privateProperties.title = Private Properties
event.properties.title = Properties
event.referenceNumberBase = Reference number base
event.save = Save
event.startTime = Start time
event.running = K\u00E4ynniss\u00E4
event.save = Save
event.startTime = Start time
event.ticketSale = Lipunmyynti
event.ticketSalesBegin = Lipunmyynti alkaa
eventdomain.add = Add event domain
eventdomain.domainname = Domain
......
......@@ -341,18 +341,24 @@ error = Error
error.contact = If this happens again, contact Info with the following code:
error.error = You have encountered an error.
event.defaultRole = Default user role
event.domains.title = Domain
event.edit = Edit
event.endTime = End time
event.id = Event ID
event.name = Event name
event.calendar.title = Event calendar
event.defaultRole = Default user role
event.domains.title = Domain
event.edit = Edit
event.endTime = End time
event.id = Event ID
event.name = Event name
event.nextBillNumber = Initial bill number
event.nodates.message = Remember to add event start-date, end-date and ticket's sales start-date.
event.nodates.title = Dates missing!
event.privateProperties.title = Private Properties
event.properties.title = Properties
event.referenceNumberBase = Reference number base
event.save = Save
event.startTime = Start time
event.running = Running
event.save = Save
event.startTime = Start time
event.ticketSale = Tickets sale
event.ticketSalesBegin = Ticket sales begin
eventdomain.add = Add event domain
eventdomain.domainname = Domain
......
......@@ -342,18 +342,24 @@ error = Virhe
error.contact = Jos t\u00E4m\u00E4 toistuu, ota seuraava koodi talteen ja ota yhteys Infoon:
error.error = Olet kohdannut virheen.
event.defaultRole = K\u00E4ytt\u00E4jien oletusrooli
event.domains.title = Verkkotunnus
event.edit = Muokkaa
event.endTime = Lopetusp\u00E4iv\u00E4
event.id = Eventin id
event.name = Tapahtuman nimi
event.calendar.title = Tapahtumakalenteri
event.defaultRole = K\u00E4ytt\u00E4jien oletusrooli
event.domains.title = Verkkotunnus
event.edit = Muokkaa
event.endTime = Lopetusp\u00E4iv\u00E4
event.id = Eventin id
event.name = Tapahtuman nimi
event.nextBillNumber = Seuraavan laskun numero
event.nodates.message = Lis\u00E4\u00E4 tapahtumaan v\u00E4hint\u00E4\u00E4n aloitusp\u00E4iv\u00E4, lopetusp\u00E4iv\u00E4 sek\u00E4 lipunmyynnin aloitusp\u00E4iv\u00E4.
event.nodates.title = P\u00E4iv\u00E4m\u00E4\u00E4ri\u00E4 puuttuu!
event.privateProperties.title = Yksityiset ominaisuudet
event.properties.title = Ominaisuudet
event.referenceNumberBase = Viitenumeron pohja
event.save = Tallenna
event.startTime = Aloitusp\u00E4iv\u00E4
event.running = K\u00E4ynniss\u00E4
event.save = Tallenna
event.startTime = Aloitusp\u00E4iv\u00E4
event.ticketSale = Lipunmyynti
event.ticketSalesBegin = Lipunmyynti alkaa
eventdomain.add = Lis\u00E4\u00E4 verkkotunnus tapahtumalle
eventdomain.domainname = Verkkotunnus
......
......@@ -9,6 +9,12 @@ import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.EventOrganiserBeanLocal;
import fi.codecrew.moya.enums.apps.EventPermission;
......@@ -16,6 +22,7 @@ import fi.codecrew.moya.model.EventOrganiser;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEventDomain;
import fi.codecrew.moya.utilities.I18n;
import fi.codecrew.moya.web.annotations.LoggedIn;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
......@@ -29,6 +36,8 @@ public class EventOrgView extends GenericCDIView {
private transient EventOrganiserBeanLocal eventorgbean;
@EJB
private transient EventBeanLocal eventbean;
private static final Logger logger = LoggerFactory.getLogger(EventOrgView.class);
@LoggedIn
@Inject
......@@ -49,6 +58,8 @@ public class EventOrgView extends GenericCDIView {
private transient ListDataModel<LanEventDomain> eventdomains;
ScheduleModel eventsCalendar = null;
public void initCreate()
{
if (super.requirePermissions(user.getUser().isSuperadmin())) {
......@@ -226,4 +237,39 @@ public class EventOrgView extends GenericCDIView {
this.eventdomains = eventdomains;
}
public boolean isShowDatesError() {
return (getEvent().getStartTime() == null || getEvent().getEndTime() == null || getEvent().getTicketSalesBegin() == null);
}
public ScheduleModel getEventsCalendar() {
if (eventsCalendar == null) {
eventsCalendar = new DefaultScheduleModel();
for (LanEvent lanEvent : eventbean.findAllEvents()) {
if (lanEvent.getStartTime() != null && lanEvent.getEndTime() != null && lanEvent.getTicketSalesBegin() != null) {
DefaultScheduleEvent event = new DefaultScheduleEvent("<"+lanEvent.getId() + "> " + lanEvent.getName() + ": " + I18n.get("event.ticketSale"), lanEvent.getTicketSalesBegin(), lanEvent.getEndTime());
event.setAllDay(true);
eventsCalendar.addEvent(event);
event.setStyleClass("calendarEventStyle");
event = new DefaultScheduleEvent( "<"+lanEvent.getId() + "> " + lanEvent.getName() + ": " + I18n.get("event.running"), lanEvent.getStartTime(), lanEvent.getEndTime());
event.setAllDay(true);
event.setStyleClass("eventRunningCalendar");
eventsCalendar.addEvent(event);
}
}
}
return eventsCalendar;
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!