Commit 7a515e8e by Tuukka Kivilahti

Merge branch 'placeChange' into 'master'

Selfservice placechange



See merge request !366
2 parents 8d71ba5f 55018d3e
package fi.codecrew.moya.exceptions;
import fi.codecrew.moya.model.Place;
import javax.ejb.EJBException;
public class PlaceAlreadyTakenException extends EJBException {
public PlaceAlreadyTakenException(Place p) {
super("Place " + (p != null ? p.toString():"") + "already taken");
this.place = p;
}
private final Place place;
public Place getPlace() {
return place;
}
}
......@@ -145,6 +145,7 @@ public class MenuBean implements MenuBeanLocal {
userkauppa.addPage(menuitemfacade.findOrCreate("/shop/createBill"), BillPermission.CREATE_BILL);
userkauppa.addPage(menuitemfacade.findOrCreate("/neomap/reserve"), MapPermission.BUY_PLACES);
userkauppa.addPage(menuitemfacade.findOrCreate("/neomap/moveplaces"), MapPermission.MOVE_PLACES);
userkauppa.addPage(menuitemfacade.findOrCreate("/neomap/notenoughslots"), UserPermission.ANYUSER).setVisible(false);
userkauppa.addPage(menuitemfacade.findOrCreate("/shop/shopClosed"), BillPermission.CREATE_BILL).setVisible(false);
......
......@@ -62,7 +62,7 @@ import fi.codecrew.moya.model.User;
MapPermission.S_MANAGE_MAPS,
MapPermission.S_MANAGE_OTHERS,
MapPermission.S_BUY_PLACES,
// MapPermission.S_RELEASE_PLACE,
MapPermission.S_MOVE_PLACES,
ShopPermission.S_LIST_ALL_PRODUCTS,
ShopPermission.S_LIST_USERPRODUCTS,
......@@ -192,8 +192,7 @@ public class PermissionBean implements PermissionBeanLocal {
EventUser defaultUser = eventUserFacade.findByLogin(User.ANONYMOUS_LOGINNAME);
if (defaultUser == null) {
User user = userfacade.findByLogin(User.ANONYMOUS_LOGINNAME);
if (user == null)
{
if (user == null) {
defaultUser = new EventUser(new User(), eventbean.getCurrentEvent(), null);
defaultUser.getUser().setLogin(User.ANONYMOUS_LOGINNAME);
defaultUser.getUser().setNick(User.ANONYMOUS_LOGINNAME);
......
......@@ -25,6 +25,7 @@ public enum MapPermission implements IAppPermission {
BUY_PLACES, // ("Reserve and buy places from map"),
VIEW, // ("View maps"),
MANAGE_MAPS,
MOVE_PLACES,
//RELEASE_PLACE, // ("Create and modify maps")
;
......@@ -33,14 +34,15 @@ public enum MapPermission implements IAppPermission {
public static final String S_BUY_PLACES = "MAP/BUY_PLACES";
public static final String S_VIEW = "MAP/VIEW";
public static final String S_MANAGE_MAPS = "MAP/MANAGE_MAPS";
public static final String S_RELEASE_PLACE = "MAP/RELEASE_PLACE";
public static final String S_MOVE_PLACES = "MAP/MOVE_PLACES";
private final String fullName;
private final String key;
private static final String I18N_HEADER = "bortalApplication.map.";
private MapPermission() {
key = I18N_HEADER + name();
fullName = new StringBuilder().append(getParent().toString()).append(DELIMITER).append(toString()).toString();
fullName = getParent().toString() + DELIMITER + this.toString();
}
......
......@@ -10,25 +10,23 @@
xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView"
listener="#{mapPlacechangeView.initView()}" />
<f:viewParam name="userId" value="#{mapPlacechangeView.userId}"/>
<f:event type="preRenderView" listener="#{mapPlacechangeView.initView()}"/>
</f:metadata>
<ui:define name="content">
<h:outputScript target="head" library="seatjs" name="d3.min.js" />
<h:outputScript target="head" library="seatjs" name="d3-tip.js" />
<h:outputScript target="head" library="seatjs" name="seatmap.js" />
<h:outputStylesheet library="seatjs" name="placemap.css" />
<h:outputScript target="head" library="seatjs" name="d3.min.js"/>
<h:outputScript target="head" library="seatjs" name="d3-tip.js"/>
<h:outputScript target="head" library="seatjs" name="seatmap.js"/>
<h:outputStylesheet library="seatjs" name="placemap.css"/>
<!-- Place slot count -->
<h3>
<h:outputText value="#{i18n['mapView.yourPlaces']}" />
<h:outputText value="#{i18n['placemove.header']}"/>
</h3>
<p:fragment id="placeselector">
<h:form>
......@@ -37,22 +35,27 @@
value="#{mapPlacechangeView.slots}">
<!-- rowStyleClass="#{mapPlacechangeView.srcPlace.contains(slot.place) ? 'selected' : 'unselected'}" -->
<p:column headerText="#{i18n['mapView.productcount.productname']}">
<h:outputText value="#{slot.src.product.name}" />
<p:column headerText="#{i18n['placemove.productname']}">
<h:outputText value="#{slot.src.product.name}"/>
</p:column>
<p:column headerText="#{i18n['mapView.productcount.unused']}">
<p:column headerText="#{i18n['placemove.placename']}">
<h:outputText renderer="#{!empty slot.src.place}"
value="#{slot.src.place.name}" />
</p:column>
value="#{slot.src.place.name}"/>
<p:column headerText="#{i18n['mapView.productcount.selected']}">
<h:outputText renderer="#{!empty slot.moving}"
value="#{slot.moving}" />
</p:column>
<p:column headerText="#{i18n['mapView.productcount.selected']}">
<p:column headerText="#{i18n['placemove.placeuser']}">
<h:outputText rendered="#{!empty slot.src.place.currentUser}"
value="#{slot.src.place.currentUser.wholeNmae}"/>
<h:outputText rendered="#{empty slot.src.place.currentUser}"
value="-"/>
</p:column>
<p:column headerText="#{i18n['placemove.dstplace']}">
<div style="padding: 0.3em 0;">
<h:outputText renderer="#{!empty slot.dst}"
value="#{slot.dst.name}" />
value="#{slot.dst.name}"/>
</div>
</p:column>
<p:column>
......@@ -61,37 +64,40 @@
actionListener="#{mapPlacechangeView.selectSlot}"
rendered="#{!slot.isMoving()}"
value="#{i18n['placemove.selectSlotForMove']}"
update="placeselector" />
update="placeselector"/>
<p:commandButton
actionListener="#{mapPlacechangeView.unselectSlot}"
rendered="#{slot.moving}" value="#{i18n['placemove.deselect']}"
update="placeselector" />
update="placeselector"/>
</ui:fragment>
</p:column>
</p:dataTable>
</h:form>
<script type="text/javascript">
toggleSuccess = #{mapPlacechangeView.toggleSuccess};
var toggleSuccess = #{mapPlacechangeView.toggleSuccess};
</script>
</p:fragment>
<div style="padding: 1em 0;">
<h:form id="placemove">
<p:commandButton
disabled="#{!mapPlacechangeView.isReadyForCommit()}"
rendered="#{ajaxMapView.canUserBuy()}"
value="#{i18n['mapPlacechange.commitMove']}"
action="#{mapPlacechangeView.commitMove()}" />
value="#{i18n['placemove.commitMove']}"
action="#{mapPlacechangeView.commitMove()}" ajax="false"/>
</h:form>
</div>
</p:fragment>
<svg id="seatmap" style="margin: auto; border: 1px solid black;"
width="#{ajaxMapView.map.width}px"
height="#{ajaxMapView.map.height}px" />
height="#{ajaxMapView.map.height}px"/>
<h:form>
<p:remoteCommand name="toggleDstPlace"
action="#{mapPlacechangeView.toggleDstPlace()}"
update="placeselector" oncomplete="afterToggle()"></p:remoteCommand>
update="placeselector" oncomplete="afterToggle()"/>
</h:form>
<script type="text/javascript">
......@@ -102,26 +108,26 @@
moyaurl: "#{request.contextPath}",
map_id: #{ajaxMapView.map.id},
});
px.toggleaction = function(d){
px.toggleaction = function (d) {
latestPlace = d;
toggleDstPlace([{name:"placeId", value:d.id} ])
toggleDstPlace([{name: "placeId", value: d.id}])
};
function afterToggle(){
if(toggleSuccess){
if(latestPlace.state === "F"){
function afterToggle() {
if (toggleSuccess) {
if (latestPlace.state === "F") {
latestPlace.state = "T";
}else {
} else {
latestPlace.state = "F";
}
px.update_placeobj([latestPlace]);
}
}
// ]]>
// ]]>
</script>
<map:legend />
<map:legend/>
</ui:define>
</ui:composition>
......
<!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:c="http://java.sun.com/jsp/jstl/core"
xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui">
<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:c="http://java.sun.com/jsp/jstl/core"
xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<ui:param name="thispage" value="page.place.mygroups" />
<ui:param name="thispage" value="page.place.mygroups"/>
<f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{userView.initView}" />
<f:viewParam name="userid" value="#{userView.userid}"/>
<f:event type="preRenderView" listener="#{userView.initView}"/>
</f:metadata>
<ui:define name="title">
......@@ -16,57 +18,70 @@
<!-- <users:usertabs tabId="groups" /> -->
</ui:define>
<ui:define name="edittab">
<users:usertabs tabId="groups" />
<users:usertabs tabId="groups"/>
</ui:define>
<ui:define name="content">
<h:outputText rendered="#{empty placeGroupView.groupMemberships}" value="#{i18n['placegroupview.noMemberships']}" />
<h:link outcome="/neomap/moveplaces" value="#{i18n['placegroupview.moveUsersPlaces']}">
<f:param name="userId" value="#{userView.user.user.id}"/>
</h:link>
<h:outputText rendered="#{empty placeGroupView.groupMemberships}"
value="#{i18n['placegroupview.noMemberships']}"/>
<h:form rendered="#{!empty placeGroupView.groupMemberships}" id="placelistform">
<h:dataTable value="#{placeGroupView.groupMemberships}" var="member">
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.reservationName']}" />
<h:outputText value="#{i18n['placegroupview.reservationName']}"/>
</f:facet>
<h:link value="#{member.placeReservation.name}" outcome="/place/edit">
<f:param name="placeid" value="#{member.placeReservation.id}" />
<f:param name="placeid" value="#{member.placeReservation.id}"/>
</h:link>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.token']}" />
<h:outputText value="#{i18n['placegroupview.token']}"/>
</f:facet>
<h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}" />
<h:link rendered="#{!empty member.user}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" outcome="/place/adminGroups">
<f:param name="userid" value="#{member.user.user.id}" />
<h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}"/>
<h:link rendered="#{!empty member.user}"
value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})"
outcome="/place/adminGroups">
<f:param name="userid" value="#{member.user.user.id}"/>
</h:link>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.groupCreator']}" />
<h:outputText value="#{i18n['placegroupview.groupCreator']}"/>
</f:facet>
<h:link value="#{member.placeGroup.creator.firstnames} #{member.placeGroup.creator.lastname} (#{member.placeGroup.creator.nick})" outcome="/place/adminGroups">
<f:param name="userid" value="#{member.placeGroup.creator.user.id}" />
<h:link
value="#{member.placeGroup.creator.firstnames} #{member.placeGroup.creator.lastname} (#{member.placeGroup.creator.nick})"
outcome="/place/adminGroups">
<f:param name="userid" value="#{member.placeGroup.creator.user.id}"/>
</h:link>
</h:column>
<h:column>
<h:commandButton rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull}" action="#{placeGroupView.releasePlace()}"
value="#{i18n['placegroupview.releasePlace']}" />
<h:commandButton
rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull}"
action="#{placeGroupView.releasePlace()}"
value="#{i18n['placegroupview.releasePlace']}"/>
</h:column>
</h:dataTable>
</h:form>
<p>
<input type="button" onclick="location.replace('#{request.contextPath}/PlaceGroupPdf?eventuserId=#{placeGroupView.user.id}');" value="#{i18n['placegroup.printPdf']}" />
<input type="button"
onclick="location.replace('#{request.contextPath}/PlaceGroupPdf?eventuserId=#{placeGroupView.user.id}');"
value="#{i18n['placegroup.printPdf']}"/>
</p>
<h2>#{i18n['placetoken.pageHeader']}</h2>
<p>#{i18n['placetoken.topText']}</p>
<h:form id="placeTokenForm">
<h:outputLabel value="#{i18n['placetoken.token']}:" />
<h:inputText value="#{tokenView.token}" />
<h:commandButton id="commitbtn" action="#{tokenView.saveToken()}" value="#{i18n['placetoken.commit']}" />
<h:outputLabel value="#{i18n['placetoken.token']}:"/>
<h:inputText value="#{tokenView.token}"/>
<h:commandButton id="commitbtn" action="#{tokenView.saveToken()}" value="#{i18n['placetoken.commit']}"/>
</h:form>
<h2>Place slots</h2>
......@@ -74,38 +89,43 @@
<p:dataTable var="slot" value="#{placeGroupView.placeslots}" id="placeslots">
<p:column headerText="#{i18n['placeslot.id']}">
<h:outputText value="#{slot.id}" />
<h:outputText value="#{slot.id}"/>
</p:column>
<p:column headerText="#{i18n['placeslot.state']}">
<h:outputText value="#{slot.bill.expired ? i18n['placeslot.state.expired'] : ( slot.bill.paid ? i18n['placeslot.state.paid'] : i18n['placeslot.state.notPaid'])}" />
<h:outputText
value="#{slot.bill.expired ? i18n['placeslot.state.expired'] : ( slot.bill.paid ? i18n['placeslot.state.paid'] : i18n['placeslot.state.notPaid'])}"/>
</p:column>
<p:column headerText="#{i18n['placeslot.product']}">
<h:outputText value="#{slot.product.name}" />
<h:outputText value="#{slot.product.name}"/>
</p:column>
<p:column headerText="#{i18n['placeslot.place']}">
<h:link value="#{slot.place.name}" rendered="#{!empty slot.place}" outcome="/place/edit">
<f:param name="placeid" value="#{slot.place.id}" />
<f:param name="placeid" value="#{slot.place.id}"/>
</h:link>
</p:column>
<p:column headerText="#{i18n['placeslot.used']}">
<h:outputText value="#{slot.used}">
<f:convertDateTime timeZone="#{sessionHandler.timezone}" pattern="#{sessionHandler.shortDatetimeFormat}" />
<f:convertDateTime timeZone="#{sessionHandler.timezone}"
pattern="#{sessionHandler.shortDatetimeFormat}"/>
</h:outputText>
</p:column>
<p:column headerText="#{i18n['placeslot.bill']}">
<h:link outcome="/bill/showBill" value="#{i18n['bill.billNumber']}: #{slot.bill.id}">
<f:param name="billid" value="#{slot.bill.id}" />
<f:param name="billid" value="#{slot.bill.id}"/>
</h:link>
</p:column>
<p:column>
<p:commandButton rendered="#{empty slot.place and empty slot.used}" value="#{i18n['placeslot.lockSlot']}" actionListener="#{placeGroupView.lockSlot}" update="placeslots" />
<p:commandButton rendered="#{empty slot.place and not empty slot.used}" value="#{i18n['placeslot.releaseSlot']}" actionListener="#{placeGroupView.releaseSlot}" update="placeslots" />
<p:commandButton rendered="#{empty slot.place and empty slot.used}"
value="#{i18n['placeslot.lockSlot']}"
actionListener="#{placeGroupView.lockSlot}" update="placeslots"/>
<p:commandButton rendered="#{empty slot.place and not empty slot.used}"
value="#{i18n['placeslot.releaseSlot']}"
actionListener="#{placeGroupView.releaseSlot}" update="placeslots"/>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
......
......@@ -57,7 +57,7 @@
<h:outputText value="#{dependency.priority}"/>
</h:column>
<h:column>
<p:commandButton action="#{productView.deleteProductDependency}" value="#{i18n['productDependency.delete']}" update=":dependencies"/>
<p:commandButton action="#{productView.deleteProductDependency}" value="#{i18n['product.dependency.delete']}" update=":dependencies"/>
</h:column>
<!-- Not yet in use.
......
......@@ -11,6 +11,7 @@ import javax.faces.context.FacesContext;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import fi.codecrew.moya.exceptions.PlaceAlreadyTakenException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -79,10 +80,30 @@ public class MapPlacechangeView extends GenericCDIView {
}
public boolean isReadyForCommit() {
// If anything is not selected for commit, we are not ready..
boolean movingAny = false;
for (MoveContainer mc : moveContainers) {
// If we are moving, but destination is not selected, we are not ready..
if (mc.isMoving()) {
movingAny = true;
if (mc.getDst() == null) {
return false;
}
}
}
return movingAny;
}
public void initView() {
// If we are overriding user, check permission.
if (getSlots() == null) {
if (super.requirePermissions(
super.hasPermission(MapPermission.MOVE_PLACES) ||
super.hasPermission(MapPermission.MANAGE_MAPS)
) && getSlots() == null) {
if (userId != null && super.requirePermissions(MapPermission.MANAGE_OTHERS)) {
user = userbean.findByUserId(userId, false);
} else if (super.requirePermissions(MapPermission.BUY_PLACES)) {
......@@ -93,23 +114,38 @@ public class MapPlacechangeView extends GenericCDIView {
super.beginConversation();
moveContainers = MoveContainer.init(placebean.getPlaceslots(user));
slots = new ListDataModel<MoveContainer>(moveContainers);
slots = new ListDataModel<>(moveContainers);
}
}
public void commitMove(){
public String commitMove() {
HashMap<Place, Place> change = new HashMap<Place,Place>();
for(MoveContainer s : slots){
if(s.isMoving() && s.getDst() != null){
HashMap<Place, Place> change = new HashMap<Place, Place>();
for (MoveContainer s : slots) {
if (s.isMoving() && s.getDst() != null) {
change.put(s.getSrc().getPlace(), s.getDst());
}
}
try {
placebean.movePlaces(change);
} catch (PlaceAlreadyTakenException pt) {
String placename = "";
if (pt.getPlace() != null) {
placename = pt.getPlace().getName();
for (MoveContainer mv : slots) {
if (pt.getPlace().equals(mv.getDst())) {
mv.setDst(null);
}
}
}
super.addFaceMessage("placemove.alreadyTaken", placename);
return null;
slots = null;
initView();
}
// slots = null;
// initView();
return "/place/myGroups?faces_redirect=true";
}
public void toggleDstPlace() {
......@@ -117,14 +153,14 @@ public class MapPlacechangeView extends GenericCDIView {
Integer placeId = new Integer(paramMap.get("placeId"));
Place place = placebean.find(placeId);
setToggleSuccess(false);
toggleSuccess = false;
for (MoveContainer mc : getMoveContainers()) {
if (place.equals(mc.getSrc().getPlace())) {
setSlotState(mc, !mc.isMoving());
return;
}
if (place.equals(mc.getDst())) {
setToggleSuccess(true);
toggleSuccess = true;
mc.setDst(null);
return;
}
......@@ -135,7 +171,7 @@ public class MapPlacechangeView extends GenericCDIView {
}
for (MoveContainer mc : moveContainers) {
if (mc.isMoving() && mc.dst == null && mc.getSrc().getProduct().equals(place.getProduct())) {
setToggleSuccess(true);
toggleSuccess = true;
mc.setDst(place);
return;
}
......
......@@ -731,7 +731,7 @@ place.release = Release this place
place.releasetime = Release time
place.reserveForUser = Reserve for the user
place.reservetime = Reservetime
place.send = Transfer place
place.send = Assign to user
place.width = Width
placeReservation.buyConfirm.content = Are you sure, this is difficult to cancel?
......@@ -782,6 +782,15 @@ placegroupview.token = Place token / user
placegroupview.toptext = \
placegroupview.unlockedPlacesNotification = You have unlocked places, you must lock them before you can see your tickets!
placemove.commitMove = Move places
placemove.deselect = Cancel relocation
placemove.dstplace = New location
placemove.header = Relocate places
placemove.placename = Place
placemove.placeuser = User
placemove.productname = Ticket type
placemove.selectSlotForMove = Select for relocation
placeslot.add = Add place slot
placeslot.bill = Bill
placeslot.id = ID
......@@ -1589,6 +1598,7 @@ reservequeue.reservingTimeIsUpAlert=Timeslot for your place reservation has time
mapView.reserveTimeLeft=Time to reserve places
queuemgmt.queueEnabled=Queue is ENABLED
queuemgmt.queueDisabled=Queue is DISABLED (enable from Edit event -page)
product.dependency.add=Add product dependency
product.dependency.create=Create
product.dependency.supporter=Depended product
......@@ -1597,3 +1607,5 @@ product.dependency.priority=Priority
productDependency.delete=Delete
product.dependency.multiplier=Multiplier
product.dependency.MAX_SUPPORTED_COUNT=Only up to same number of products can be bought
submenu.neomap.moveplaces=Change places
......@@ -992,7 +992,7 @@ place.release = Release this place
place.releasetime = Release time
place.reserveForUser = Reserve for the user
place.reservetime = Reservetime
place.send = Transfer place
place.send = Assign to user
place.width = Width
placeReservation.buyConfirm.content = Are you sure, this is difficult to cancel?
......@@ -1042,6 +1042,15 @@ placegroupview.reserveForSelf = Select the place for yourself
placegroupview.token = Place token / user
placegroupview.unlockedPlacesNotification = You have unlocked places, you must lock them before you can see your tickets!
placemove.commitMove = Move places
placemove.deselect = Cancel relocation
placemove.dstplace = New location
placemove.header = Relocate places
placemove.placename = Place
placemove.placeuser = User
placemove.productname = Ticket type
placemove.selectSlotForMove = Select for relocation
placeslot.add = Add place slot
placeslot.bill = Bill
placeslot.id = ID
......@@ -1867,11 +1876,17 @@ reservequeue.reservingTimeIsUpAlert=Timeslot for your place reservation has time
mapView.reserveTimeLeft=Time to reserve places
queuemgmt.queueEnabled=Queue is ENABLED
queuemgmt.queueDisabled=Queue is DISABLED (enable from Edit event -page)
product.dependency.add=Add product dependency
product.dependency.create=Create
product.dependency.supporter=Depended product
product.dependency.type=Dependency type
product.dependency.priority=Priority
productDependency.delete=Delete
product.dependency.delete=Delete
product.dependency.multiplier=Multiplier
product.dependency.MAX_SUPPORTED_COUNT=Only up to same number of products can be bought
placemove.alreadyTaken=Moving the places was cancelled because place {0} was already taken.
placegroupview.moveUsersPlaces=Move users places
submenu.neomap.moveplaces=Change places
......@@ -979,7 +979,7 @@ place.release = Vapauta paikka
place.releasetime = Vapautusaika
place.reserveForUser = Varaa k\u00E4ytt\u00E4j\u00E4lle
place.reservetime = Varaamisaika
place.send = Siirr\u00E4 paikka
place.send = Luovuta k\u00E4ytt\u00E4j\u00E4lle
place.width = Leveys
placeReservation.buyConfirm.content = Oletko varma, t\u00E4t\u00E4 on vaikea peruuttaa?
......@@ -1029,6 +1029,15 @@ placegroupview.reserveForSelf = Valitse paikka itsellesi
placegroupview.token = Paikkakoodi / k\u00E4ytt\u00E4j\u00E4
placegroupview.unlockedPlacesNotification = Sinulla on lukitsemattomia paikkoja, sinun tulee lukita ne ennenkuin voit tarkastella lippuasi!
placemove.commitMove = Siirr\u00E4 paikat
placemove.deselect = Peru siirto
placemove.dstplace = Uusi paikka
placemove.header = Siirr\u00E4 paikkoja
placemove.placename = Paikka
placemove.placeuser = K\u00E4ytt\u00E4j\u00E4
placemove.productname = Lipputyyppi
placemove.selectSlotForMove = Valitse siirrett\u00E4v\u00E4ksi
placeslot.add = Lis\u00E4\u00E4 paikkaslotti
placeslot.bill = Lasku
placeslot.id = ID
......@@ -1854,11 +1863,16 @@ reservequeue.reservingTimeIsUpAlert=Sinulle varattu varausauka on kulunut loppuu
mapView.reserveTimeLeft=Aikaa varata paikkasi
queuemgmt.queueEnabled=Varausjono ON k\u00E4yt\u00F6ss\u00E4
queuemgmt.queueDisabled=K\u00E4ytt\u00E4j\u00E4jono EI OLE k\u00E4yt\u00F6ss\u00E4 (ota k\u00E4yttoon tapahtuman tiedot -sivulta)
product.dependency.add=Lis\u00E4\u00E4 tuoteriippuvuus
product.dependency.create=Luo uusi
product.dependency.supporter=Tuote josta on riippuvuus
product.dependency.type=Riippuvuuden tyyppi
product.dependency.priority=Prioriteetti
productDependency.delete=Poista
product.dependency.delete=Poista
product.dependency.multiplier=Kerroin
product.dependency.MAX_SUPPORTED_COUNT=Tuotteita voi ostaa enint\u00E4\u00E4n saman m\u00E4\u00E4r\u00E4n
placemove.alreadyTaken=Paikkojen siirto peruuntui koska paikka {0} oli jo varattu.
placegroupview.moveUsersPlaces=Siirr\u00E4 k\u00E4ytt\u00E4j\u00E4n paikkoja
submenu.neomap.moveplaces=Vaihda paikkoja
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!