Commit 1ddcd4e6 by Tuukka Kivilahti

Merge remote-tracking branch 'origin/master'

2 parents f7afe184 002c7791
Showing with 1077 additions and 61 deletions
......@@ -244,7 +244,10 @@ public class BootstrapBean implements BootstrapBeanLocal {
dbUpdates.add(new String[] {
"ALTER TABLE group_memberships ADD COLUMN entered_event_admin_id INTEGER",
"ALTER TABLE group_memberships ADD CONSTRAINT FK_group_memberships_entered_event_admin_id FOREIGN KEY (entered_event_admin_id) REFERENCES event_users (id)",
});
dbUpdates.add(new String[] {
"ALTER TABLE group_memberships DROP COLUMN place_product",
});
}
......
......@@ -71,10 +71,6 @@ public class GroupMembership extends GenericEntity {
@JoinColumn(name = "place_reservation_id", referencedColumnName = "id", nullable = true, unique = true)
private Place placeReservation;
@ManyToOne
@JoinColumn(name = "place_product")
private Product placeProduct;
@JoinColumn(name = EVENTUSER_ID, referencedColumnName = EventUser.ID_COLUMN)
@ManyToOne
private EventUser user;
......@@ -181,17 +177,4 @@ public class GroupMembership extends GenericEntity {
return inviteToken;
}
/**
*
* PlaceProduct is part of membership BEFORE user has selected place.
*
* @return
*/
public Product getPlaceProduct() {
return placeProduct;
}
public void setPlaceProduct(Product placeProduct) {
this.placeProduct = placeProduct;
}
}
......@@ -21,6 +21,7 @@
<javaee-api-version>7.0</javaee-api-version>
<!-- EJB spec version -->
<ejb-spec-version>3.2</ejb-spec-version>
<swagger.version>1.3.12</swagger.version>
</properties>
<url>http://codecrew.fi</url>
<organization>
......
......@@ -48,4 +48,11 @@
</distributionManagement>
<dependencies>
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.3.12</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -19,10 +19,12 @@
package fi.codecrew.moya.rest.pojo.map.v1;
import java.util.List;
import com.wordnik.swagger.annotations.ApiModel;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@ApiModel("Map")
public class MapRoot {
private List<MapPojo> maps;
......
......@@ -22,6 +22,9 @@ import java.util.Calendar;
import javax.xml.bind.annotation.XmlElement;
import com.wordnik.swagger.annotations.ApiModel;
@ApiModel
public class PlacePojo {
private Integer id;
......
......@@ -19,10 +19,12 @@
package fi.codecrew.moya.rest.pojo.map.v1;
import java.util.List;
import com.wordnik.swagger.annotations.ApiModel;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@ApiModel
public class PlaceRoot {
public PlaceRoot() {
......
......@@ -18,8 +18,11 @@
*/
package fi.codecrew.moya.rest.pojo.network.v1;
import com.wordnik.swagger.annotations.ApiModel;
import javax.xml.bind.annotation.XmlElement;
@ApiModel
public class NetworkAssociationInfoPojo {
private String createTime;
private String modifyTime;
......
......@@ -21,6 +21,9 @@ package fi.codecrew.moya.rest.pojo.network.v1;
import java.util.ArrayList;
import java.util.List;
import com.wordnik.swagger.annotations.ApiModel;
@ApiModel
public class NetworkAssociationResponseRoot {
private RESTCallResultPojo result;
private List<NetworkAssociationActionPojo> additions;
......
......@@ -20,6 +20,9 @@ package fi.codecrew.moya.rest.pojo.network.v1;
import javax.xml.bind.annotation.XmlElement;
import com.wordnik.swagger.annotations.ApiModel;
@ApiModel
public class RESTCallResultPojo {
private Integer resultCode;
private String resultMessage;
......
......@@ -25,6 +25,9 @@ import javax.xml.bind.annotation.XmlElement;
import fi.codecrew.moya.rest.pojo.userinfo.v1.EventUserRestPojo;
import fi.codecrew.moya.rest.pojo.userinfo.v1.PrintedCardRestPojo;
import com.wordnik.swagger.annotations.ApiModel;
@ApiModel
public class ReaderEventRestPojo {
private EventUserRestPojo eventUser;
private PrintedCardRestPojo printedCard;
......
......@@ -18,8 +18,11 @@
*/
package fi.codecrew.moya.rest.pojo.reader.v1;
import com.wordnik.swagger.annotations.ApiModel;
import javax.xml.bind.annotation.XmlElement;
@ApiModel
public class ReaderRestPojo {
private Integer readerId;
......
......@@ -18,8 +18,14 @@
*/
package fi.codecrew.moya.rest.pojo.userinfo.v1;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiModel;
import com.wordnik.swagger.annotations.ApiModelProperty;
import javax.xml.bind.annotation.XmlElement;
@ApiModel("EventUser")
@Api("Event user")
public class EventUserRestPojo {
private String nick = "";
......@@ -35,34 +41,40 @@ public class EventUserRestPojo {
@XmlElement(name = "nick")
@ApiModelProperty("Nickname")
public String getNick() {
return nick;
}
@XmlElement(name = "login")
@ApiModelProperty("Login name")
public String getLogin()
{
return login;
}
@XmlElement(name = "eventuserId")
@ApiModelProperty("EventUser entity ID")
public Integer getEventuserId()
{
return eventuserId;
}
@XmlElement(name = "userId")
@ApiModelProperty("User entity ID")
public Integer getuserId()
{
return getUserId();
}
@XmlElement(name = "firstname")
@ApiModelProperty("First name")
public String getFirstname() {
return firstname;
}
@XmlElement(name = "lastname")
@ApiModelProperty("Last name")
public String getLastname() {
return lastname;
}
......
......@@ -18,12 +18,12 @@
*/
package fi.codecrew.moya.rest.pojo.userinfo.v1;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.wordnik.swagger.annotations.ApiModel;
import javax.xml.bind.annotation.XmlElement;
@ApiModel
public class PrintedCardRestPojo {
private Integer eventuserId;
......
......@@ -20,10 +20,12 @@ package fi.codecrew.moya.rest.pojo.userinfo.v1;
import java.util.ArrayList;
import java.util.List;
import com.wordnik.swagger.annotations.ApiModel;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement()
@ApiModel
public class SimpleEventuserRoot {
private List<EventUserRestPojo> eventusers;
......
......@@ -20,6 +20,9 @@ package fi.codecrew.moya.rest.pojo.userinfo.v1;
import javax.xml.bind.annotation.XmlElement;
import com.wordnik.swagger.annotations.ApiModel;
@ApiModel
public class UserPermissionRestPojo {
public UserPermissionRestPojo(EventUserRestPojo eventUserRestPojo, boolean granted)
......
......@@ -9,7 +9,7 @@
<f:event type="preRenderView" listener="#{billListView.initSummaryView}" />
</f:metadata>
<ui:define name="content">
<h:dataTable border="0" id="billSummary" value="#{billListView.billsummary}" var="sumline">
<h:dataTable border="0" id="billSummary" value="#{billListView.billsummary}" var="sumline" styleClass="moya_datatable2">
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['product.name']}" />
......
......@@ -13,7 +13,6 @@
</f:metadata>
<ui:define name="content">
<bills:list />
<br /><br />
<p:outputPanel rendered="#{placeGroupView.useEticket}" >
<p>
<p:button outcome="/place/myEtickets" value="#{i18n['placegroup.showEticket']}" />
......
......@@ -21,7 +21,9 @@
<h1>#{i18n['user.foodwavelist.title']}</h1>
</ui:define>
<ui:define name="content">
<h:form id="foodwave" styleClass="moya_datatable3">
<foodwave:list outcome="/foodwave/listProducts" />
</h:form>
</ui:define>
</ui:composition>
......
......@@ -22,9 +22,8 @@
</ui:define>
<ui:define name="content">
<!-- products:shop commitaction="#{foodWaveFoodView.commitShoppingCart()}" items="#{foodWaveFoodView.shoppingcart}" commitValue="#{i18n['productshop.commit']}" /-->
<!-- products:shop commitaction="#{foodWaveFoodView.commitShoppingCart()}" items="#{foodWaveFoodView.shoppingcart}" commitValue="#{i18n['productshop.commit']}" /-->
<foodwave:listFoods selectaction="#{foodWaveFoodView.buyFromInternet()}" items="#{foodWaveFoodView.shoppingcart}" commitValue="foodshop.buyProceedToPay"/>
</ui:define>
......
......@@ -5,6 +5,7 @@
xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:user="http://java.sun.com/jsf/composite/cditools/user" xmlns:infoview="http://java.sun.com/jsf/composite/cditools/infoview">
<h:body>
<ui:composition template="/resources/templates/#{sessionHandler.infoscreen}/template.xhtml">
<ui:param name="ignorenavigationleft" value="true" />
<f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" />
......
......@@ -16,7 +16,7 @@
<ui:define name="content">
<h:outputText rendered="#{empty placeGroupView.groupMemberships}" value="#{i18n['placegroupview.noMemberships']}" />
<h:form rendered="#{!empty placeGroupView.groupMemberships}" id="placelistform">
<h:form rendered="#{!empty placeGroupView.groupMemberships}" id="placelistform" styleClass="moya_datatable2">
<p:dataTable value="#{placeGroupView.groupMemberships}" var="member" id="placestable">
......
......@@ -14,7 +14,7 @@
<ui:define name="content">
<h1>Kyselyt</h1>
<h:form>
<h:dataTable border="0" id="poll" value="#{pollView.polls}" var="poll">
<h:dataTable border="0" id="poll" value="#{pollView.polls}" styleClass="moya_datatable1" var="poll">
<h:column>
<h:outputText value="#{poll.name}" />
</h:column>
......
......@@ -25,7 +25,7 @@
</h:form>
<h:form rendered="#{billListView.bills.rowCount gt 0}">
<h:form rendered="#{billListView.bills.rowCount gt 0}" id="billList" styleClass="moya_datatable3">
<p:dataTable styleClass="bordertable" id="billList"
value="#{billListView.bills}" var="bill"
......
......@@ -111,16 +111,13 @@
</p:columnGroup>
</p:dataTable>
<br />
<h:panelGrid columns="3" rendered="#{productShopView.checkAllowStats}">
<h:outputText for="allowStats" value="#{i18n['bill.allowStatistics']}" />
<p><h:outputText for="allowStats" value="#{i18n['bill.allowStatistics']}" /></p>
<h:selectBooleanCheckbox id="allowStats"
value="#{productShopView.allowStatistics}" />
<h:message for="allowStats" />
<p><h:message for="allowStats" /></p>
</h:panelGrid>
<br />
<h:panelGroup rendered="#{productShopView.gatherBillInfo}">
<h2>
<p:outputLabel value="#{i18n['bill.notes.title']}" />
......@@ -128,7 +125,6 @@
<p:inputTextarea cols="50" value="#{productShopView.otherInfo}"
label="#{i18n['otherInfo']}" />
</h:panelGroup>
<br />
<!-- Paytrail needs to initialize after the ajax call is complete -->
<!-- This function is to be override by the paytrail init function -->
......
......@@ -172,7 +172,7 @@
</ui:fragment>
<h:form>
<h:form id="userSelectableRoles">
<p:fieldset legend="#{i18n['user.userSelectableRoles']}" rendered="#{userView.showUserSelectableRoles and cc.attrs.showRoles}">
<p:panelGrid columns="2" styleClass="noBorders">
<p:selectManyCheckbox converter="#{roleConverter}" layout="pageDirection" value="#{userView.userSelectableRoles}">
......
@media screen and (max-width: 1600px) {
#header_first h1 { font-size: 24px; }
}
@media screen and (max-width: 1250px) {
#content-wrapper { overflow: visible; }
header#top #user-mode .ui-button-text {
padding: 10px !important;
background: #70cbc3 !important }
header#top #user-mode .ui-button-text:hover { background: #263238 !important; }
}
@media screen and (max-width: 1000px) {
nav#menu h3 a { font-size: 12px !important; }
body, p, label { font-size: 12px !important; }
img { max-width: 100%; height: auto; }
}
@media screen and (max-width: 900px) {
.ui-panelgrid .ui-panelgrid-cell { padding: 0; }
#main .ui-fieldset { padding: 0 !important ;}
header#top { height: auto !important; }
header#top #header_first { width: 50%; height: 100px; }
header#top #header_second { width: 45%; background: #70cbc3; height: 100px; margin-left: 0; padding-left: 5%;}
header#top #header_third { width: 47%; height: auto; margin-left: 0 !important; padding-left: 3%;}
header#top #header_fourth { width: 45%; margin-left: 0 !important; float: right; }
#content-wrapper #left-bar { width: 30% !important; }
#content-wrapper #main { width: 65%; }
#content-wrapper #main.span_10_of_10 { width: 100% !important; }
}
@media screen and (max-width: 760px) {
#main table table thead td { padding: 10px; text-align: left;}
#main table table tr { padding: 10px 0;}
#main table thead th { padding: 10px;}
#main table tr, #main table td, #main table th{ display: block; width: 100%;}
table tr:nth-child(odd) { background: #eee; }
h1 { font-size: 24px; }
h2 { font-size: 20px; }
h3 { font-size: 16px; }
h4 { font-size: 12px; }
#header_first a { padding: 15px 0; }
#header_second #event-info { padding: 15px 0; }
.grid, #content-wrapper.grid {display: block !important;}
.col { width: 100% !important; float: none !important; display: block;}
#user-login { position: inherit !important;}
#toggle-navigation { display: block !important; }
#content-wrapper #left-bar { display: none; }
#content-wrapper .col { display: block; }
#content-wrapper #left-bar #moya-logo { display: none; }
#main table thead th { font-size: 10px; word-break: break-all}
.content-padding { padding: 10px; }
#user-login .col.currentnick { width:70% !important; float: left !important; line-height: 50px; }
#user-login #log-out { width: 30% !important; float: left !important; line-height: 35px; min-height: auto; }
#user-login #log-out a { min-height: 50px; }
#logged-in { height: auto;}
#content-wrapper #left-bar { width: 100% !important; height: auto; }
header#top .col { text-align: center; height: auto !important; margin-left: 0 !important; padding-left: 0 !important; }
}
\ No newline at end of file
@media print {
}
\ No newline at end of file
/* This is file for styling (colors and font-sizes) */
.ui-widget {
font-size: 95% !important;
}
.bgColor1.ui-layout-unit {
}
.bgColor1 .ui-layout-unit-content {
background-image: none;
}
.bgColor1 .ui-layout-unit-header {
background-image: none;
}
.missing_i18n {
color: red;
-webkit-animation-name: blinker;
-webkit-animation-duration: 1s;
-webkit-animation-timing-function: linear;
-webkit-animation-iteration-count: infinite;
-moz-animation-name: blinker;
-moz-animation-duration: 1s;
-moz-animation-timing-function: linear;
-moz-animation-iteration-count: infinite;
animation-name: blinker;
animation-duration: 1s;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
@-moz-keyframes blinker {
0% { opacity: 1.0; }
50% { opacity: 0.0; }
100% { opacity: 1.0; }
}
@-webkit-keyframes blinker {
0% { opacity: 1.0; }
50% { opacity: 0.0; }
100% { opacity: 1.0; }
}
@keyframes blinker {
0% { opacity: 1.0; }
50% { opacity: 0.0; }
100% { opacity: 1.0; }
}
/*
TABNAV
*/
#edit { float: left; width:100%; border-bottom: 1px solid black; }
ul#usertabnav li {
display:inline;
list-style:none;
}
ul#usertabnav li a {
display:inline-block;
text-decoration:none;
padding: 15px 20px;
background: #70cbc3;
color: #FFF;
}
ul#usertabnava:hover {text-decoration:none; color:rgb(50,50,50);}
ul#usertabnav li.active {font-weight: bold; background-color:rgba(250,250,250,0.4); color: rgba(0,0,0,1); border-radius: 12px 12px 0 0; border: 1px solid black; border-bottom: none }
\ No newline at end of file
......@@ -10,5 +10,8 @@ $(document).ready(function() {
$('#not-logged').slideToggle(300);
$(this).toggleClass('active');
});
$('#toggle-navigation').click(function() {
$('#left-bar').slideToggle(300);
});
});
\ No newline at end of file
......@@ -15,9 +15,8 @@
<h1>#{i18n['page.product.createBill.header']}</h1>
</ui:define>
<ui:define name="content">
<h:form id="billshopform">
<h:form id="billshopform" styleClass="moya_datatable2">
<products:shop commitaction="#{productShopView.commitBillCart()}" items="#{productShopView.shoppingcart}" commitValue="#{i18n['productshop.commit']}" />
</h:form>
</ui:define>
</ui:composition>
......
/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
body {
line-height: 1;
}
ol,
ul {
list-style: none;
}
blockquote,
q {
quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
<!DOCTYPE html>
<html>
<head>
<title>Swagger UI</title>
<link href='//fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'/>
<link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
<link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>
<script type="text/javascript" src="lib/shred.bundle.js"></script>
<script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
<script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
<script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
<script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
<script src='lib/handlebars-1.0.0.js' type='text/javascript'></script>
<script src='lib/underscore-min.js' type='text/javascript'></script>
<script src='lib/backbone-min.js' type='text/javascript'></script>
<script src='lib/swagger.js' type='text/javascript'></script>
<script src='lib/swagger-client.js' type='text/javascript'></script>
<script src='swagger-ui.js' type='text/javascript'></script>
<script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
<!-- enabling this will enable oauth2 implicit scope support -->
<script src='lib/swagger-oauth.js' type='text/javascript'></script>
<script type="text/javascript">
$(function () {
var url = window.location.protocol + '//' + window.location.host + '/MoyaWeb/rest/api-docs';
if (!url || url.length < 1) {
url = "http://localhost:8080/MoyaWeb/rest/api-docs";
}
window.swaggerUi = new SwaggerUi({
url: url,
dom_id: "swagger-ui-container",
supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
onComplete: function(swaggerApi, swaggerUi){
log("Loaded SwaggerUI");
if(typeof initOAuth == "function") {
/*
initOAuth({
clientId: "your-client-id",
realm: "your-realms",
appName: "your-app-name"
});
*/
}
$('pre code').each(function(i, e) {
hljs.highlightBlock(e)
});
},
onFailure: function(data) {
log("Unable to Load SwaggerUI");
},
docExpansion: "none",
sorter : "alpha"
});
function addApiKeyAuthorization() {
var key = $('#input_apiKey')[0].value;
log("key: " + key);
if(key && key.trim() != "") {
log("added key " + key);
window.authorizations.add("api_key", new ApiKeyAuthorization("api_key", key, "query"));
}
}
$('#input_apiKey').change(function() {
addApiKeyAuthorization();
});
// if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
/*
var apiKey = "myApiKeyXXXX123456789";
$('#input_apiKey').val(apiKey);
addApiKeyAuthorization();
*/
window.swaggerUi.load();
});
</script>
</head>
<body class="swagger-section">
<div id='header'>
<div class="swagger-ui-wrap">
<a id="logo" href="http://swagger.io">swagger</a>
<form id='api_selector'>
<div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
<div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
<div class='input'><a id="explore" href="#">Explore</a></div>
</form>
</div>
</div>
<div id="message-bar" class="swagger-ui-wrap">&nbsp;</div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</body>
</html>
var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(q){function o(s,r){return RegExp(s,"m"+(q.cI?"i":"")+(r?"g":""))}function p(y,w){if(y.compiled){return}y.compiled=true;var s=[];if(y.k){var r={};function z(A,t){t.split(" ").forEach(function(B){var C=B.split("|");r[C[0]]=[A,C[1]?Number(C[1]):1];s.push(C[0])})}y.lR=o(y.l||hljs.IR,true);if(typeof y.k=="string"){z("keyword",y.k)}else{for(var x in y.k){if(!y.k.hasOwnProperty(x)){continue}z(x,y.k[x])}}y.k=r}if(w){if(y.bWK){y.b="\\b("+s.join("|")+")\\s"}y.bR=o(y.b?y.b:"\\B|\\b");if(!y.e&&!y.eW){y.e="\\B|\\b"}if(y.e){y.eR=o(y.e)}y.tE=y.e||"";if(y.eW&&w.tE){y.tE+=(y.e?"|":"")+w.tE}}if(y.i){y.iR=o(y.i)}if(y.r===undefined){y.r=1}if(!y.c){y.c=[]}for(var v=0;v<y.c.length;v++){if(y.c[v]=="self"){y.c[v]=y}p(y.c[v],y)}if(y.starts){p(y.starts,w)}var u=[];for(var v=0;v<y.c.length;v++){u.push(y.c[v].b)}if(y.tE){u.push(y.tE)}if(y.i){u.push(y.i)}y.t=u.length?o(u.join("|"),true):{exec:function(t){return null}}}p(q)}function d(D,E){function o(r,M){for(var L=0;L<M.c.length;L++){var K=M.c[L].bR.exec(r);if(K&&K.index==0){return M.c[L]}}}function s(K,r){if(K.e&&K.eR.test(r)){return K}if(K.eW){return s(K.parent,r)}}function t(r,K){return K.i&&K.iR.test(r)}function y(L,r){var K=F.cI?r[0].toLowerCase():r[0];return L.k.hasOwnProperty(K)&&L.k[K]}function G(){var K=l(w);if(!A.k){return K}var r="";var N=0;A.lR.lastIndex=0;var L=A.lR.exec(K);while(L){r+=K.substr(N,L.index-N);var M=y(A,L);if(M){v+=M[1];r+='<span class="'+M[0]+'">'+L[0]+"</span>"}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'<span class="'+L.cN+'">':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+="</span>"}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},b]}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);
\ No newline at end of file
/*
* jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
* http://benalman.com/projects/jquery-bbq-plugin/
*
* Copyright (c) 2010 "Cowboy" Ben Alman
* Dual licensed under the MIT and GPL licenses.
* http://benalman.com/about/license/
*/
(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
/*
* jQuery hashchange event - v1.2 - 2/11/2010
* http://benalman.com/projects/jquery-hashchange-plugin/
*
* Copyright (c) 2010 "Cowboy" Ben Alman
* Dual licensed under the MIT and GPL licenses.
* http://benalman.com/about/license/
*/
(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
\ No newline at end of file
(function(b){b.fn.slideto=function(a){a=b.extend({slide_duration:"slow",highlight_duration:3E3,highlight:true,highlight_color:"#FFFF99"},a);return this.each(function(){obj=b(this);b("body").animate({scrollTop:obj.offset().top},a.slide_duration,function(){a.highlight&&b.ui.version&&obj.effect("highlight",{color:a.highlight_color},a.highlight_duration)})})}})(jQuery);
/*
jQuery Wiggle
Author: WonderGroup, Jordan Thomas
URL: http://labs.wondergroup.com/demos/mini-ui/index.html
License: MIT (http://en.wikipedia.org/wiki/MIT_License)
*/
jQuery.fn.wiggle=function(o){var d={speed:50,wiggles:3,travel:5,callback:null};var o=jQuery.extend(d,o);return this.each(function(){var cache=this;var wrap=jQuery(this).wrap('<div class="wiggle-wrap"></div>').css("position","relative");var calls=0;for(i=1;i<=o.wiggles;i++){jQuery(this).animate({left:"-="+o.travel},o.speed).animate({left:"+="+o.travel*2},o.speed*2).animate({left:"-="+o.travel},o.speed,function(){calls++;if(jQuery(cache).parent().hasClass('wiggle-wrap')){jQuery(cache).parent().replaceWith(cache);}
if(calls==o.wiggles&&jQuery.isFunction(o.callback)){o.callback();}});}});};
\ No newline at end of file
// The purpose of the `Content` object is to abstract away the data conversions
// to and from raw content entities as strings. For example, you want to be able
// to pass in a Javascript object and have it be automatically converted into a
// JSON string if the `content-type` is set to a JSON-based media type.
// Conversely, you want to be able to transparently get back a Javascript object
// in the response if the `content-type` is a JSON-based media-type.
// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5).
// The `Content` constructor takes an options object, which *must* have either a
// `body` or `data` property and *may* have a `type` property indicating the
// media type. If there is no `type` attribute, a default will be inferred.
var Content = function(options) {
this.body = options.body;
this.data = options.data;
this.type = options.type;
};
Content.prototype = {
// Treat `toString()` as asking for the `content.body`. That is, the raw content entity.
//
// toString: function() { return this.body; }
//
// Commented out, but I've forgotten why. :/
};
// `Content` objects have the following attributes:
Object.defineProperties(Content.prototype,{
// - **type**. Typically accessed as `content.type`, reflects the `content-type`
// header associated with the request or response. If not passed as an options
// to the constructor or set explicitly, it will infer the type the `data`
// attribute, if possible, and, failing that, will default to `text/plain`.
type: {
get: function() {
if (this._type) {
return this._type;
} else {
if (this._data) {
switch(typeof this._data) {
case "string": return "text/plain";
case "object": return "application/json";
}
}
}
return "text/plain";
},
set: function(value) {
this._type = value;
return this;
},
enumerable: true
},
// - **data**. Typically accessed as `content.data`, reflects the content entity
// converted into Javascript data. This can be a string, if the `type` is, say,
// `text/plain`, but can also be a Javascript object. The conversion applied is
// based on the `processor` attribute. The `data` attribute can also be set
// directly, in which case the conversion will be done the other way, to infer
// the `body` attribute.
data: {
get: function() {
if (this._body) {
return this.processor.parser(this._body);
} else {
return this._data;
}
},
set: function(data) {
if (this._body&&data) Errors.setDataWithBody(this);
this._data = data;
return this;
},
enumerable: true
},
// - **body**. Typically accessed as `content.body`, reflects the content entity
// as a UTF-8 string. It is the mirror of the `data` attribute. If you set the
// `data` attribute, the `body` attribute will be inferred and vice-versa. If
// you attempt to set both, an exception is raised.
body: {
get: function() {
if (this._data) {
return this.processor.stringify(this._data);
} else {
return this._body.toString();
}
},
set: function(body) {
if (this._data&&body) Errors.setBodyWithData(this);
this._body = body;
return this;
},
enumerable: true
},
// - **processor**. The functions that will be used to convert to/from `data` and
// `body` attributes. You can add processors. The two that are built-in are for
// `text/plain`, which is basically an identity transformation and
// `application/json` and other JSON-based media types (including custom media
// types with `+json`). You can add your own processors. See below.
processor: {
get: function() {
var processor = Content.processors[this.type];
if (processor) {
return processor;
} else {
// Return the first processor that matches any part of the
// content type. ex: application/vnd.foobar.baz+json will match json.
var main = this.type.split(";")[0];
var parts = main.split(/\+|\//);
for (var i=0, l=parts.length; i < l; i++) {
processor = Content.processors[parts[i]]
}
return processor || {parser:identity,stringify:toString};
}
},
enumerable: true
},
// - **length**. Typically accessed as `content.length`, returns the length in
// bytes of the raw content entity.
length: {
get: function() {
if (typeof Buffer !== 'undefined') {
return Buffer.byteLength(this.body);
}
return this.body.length;
}
}
});
Content.processors = {};
// The `registerProcessor` function allows you to add your own processors to
// convert content entities. Each processor consists of a Javascript object with
// two properties:
// - **parser**. The function used to parse a raw content entity and convert it
// into a Javascript data type.
// - **stringify**. The function used to convert a Javascript data type into a
// raw content entity.
Content.registerProcessor = function(types,processor) {
// You can pass an array of types that will trigger this processor, or just one.
// We determine the array via duck-typing here.
if (types.forEach) {
types.forEach(function(type) {
Content.processors[type] = processor;
});
} else {
// If you didn't pass an array, we just use what you pass in.
Content.processors[types] = processor;
}
};
// Register the identity processor, which is used for text-based media types.
var identity = function(x) { return x; }
, toString = function(x) { return x.toString(); }
Content.registerProcessor(
["text/html","text/plain","text"],
{ parser: identity, stringify: toString });
// Register the JSON processor, which is used for JSON-based media types.
Content.registerProcessor(
["application/json; charset=utf-8","application/json","json"],
{
parser: function(string) {
return JSON.parse(string);
},
stringify: function(data) {
return JSON.stringify(data); }});
var qs = require('querystring');
// Register the post processor, which is used for JSON-based media types.
Content.registerProcessor(
["application/x-www-form-urlencoded"],
{ parser : qs.parse, stringify : qs.stringify });
// Error functions are defined separately here in an attempt to make the code
// easier to read.
var Errors = {
setDataWithBody: function(object) {
throw new Error("Attempt to set data attribute of a content object " +
"when the body attributes was already set.");
},
setBodyWithData: function(object) {
throw new Error("Attempt to set body attribute of a content object " +
"when the data attributes was already set.");
}
}
module.exports = Content;
\ No newline at end of file
var appName;
var popupMask;
var popupDialog;
var clientId;
var realm;
function handleLogin() {
var scopes = [];
var auths = window.swaggerUi.api.authSchemes || window.swaggerUi.api.securityDefinitions;
if(auths) {
var key;
var defs = auths;
for(key in defs) {
var auth = defs[key];
if(auth.type === 'oauth2' && auth.scopes) {
var scope;
if(Array.isArray(auth.scopes)) {
// 1.2 support
var i;
for(i = 0; i < auth.scopes.length; i++) {
scopes.push(auth.scopes[i]);
}
}
else {
// 2.0 support
for(scope in auth.scopes) {
scopes.push({scope: scope, description: auth.scopes[scope]});
}
}
}
}
}
if(window.swaggerUi.api
&& window.swaggerUi.api.info) {
appName = window.swaggerUi.api.info.title;
}
popupDialog = $(
[
'<div class="api-popup-dialog">',
'<div class="api-popup-title">Select OAuth2.0 Scopes</div>',
'<div class="api-popup-content">',
'<p>Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.',
'<a href="#">Learn how to use</a>',
'</p>',
'<p><strong>' + appName + '</strong> API requires the following scopes. Select which ones you want to grant to Swagger UI.</p>',
'<ul class="api-popup-scopes">',
'</ul>',
'<p class="error-msg"></p>',
'<div class="api-popup-actions"><button class="api-popup-authbtn api-button green" type="button">Authorize</button><button class="api-popup-cancel api-button gray" type="button">Cancel</button></div>',
'</div>',
'</div>'].join(''));
$(document.body).append(popupDialog);
popup = popupDialog.find('ul.api-popup-scopes').empty();
for (i = 0; i < scopes.length; i ++) {
scope = scopes[i];
str = '<li><input type="checkbox" id="scope_' + i + '" scope="' + scope.scope + '"/>' + '<label for="scope_' + i + '">' + scope.scope;
if (scope.description) {
str += '<br/><span class="api-scope-desc">' + scope.description + '</span>';
}
str += '</label></li>';
popup.append(str);
}
var $win = $(window),
dw = $win.width(),
dh = $win.height(),
st = $win.scrollTop(),
dlgWd = popupDialog.outerWidth(),
dlgHt = popupDialog.outerHeight(),
top = (dh -dlgHt)/2 + st,
left = (dw - dlgWd)/2;
popupDialog.css({
top: (top < 0? 0 : top) + 'px',
left: (left < 0? 0 : left) + 'px'
});
popupDialog.find('button.api-popup-cancel').click(function() {
popupMask.hide();
popupDialog.hide();
popupDialog.empty();
popupDialog = [];
});
popupDialog.find('button.api-popup-authbtn').click(function() {
popupMask.hide();
popupDialog.hide();
var authSchemes = window.swaggerUi.api.authSchemes;
var host = window.location;
var pathname = location.pathname.substring(0, location.pathname.lastIndexOf("/"));
var redirectUrl = host.protocol + '//' + host.host + pathname + '/o2c.html';
var url = null;
for (var key in authSchemes) {
if (authSchemes.hasOwnProperty(key)) {
if(authSchemes[key].type === 'oauth2' && authSchemes[key].flow === 'implicit') {
var dets = authSchemes[key];
url = dets.authorizationUrl + '?response_type=token';
window.swaggerUi.tokenName = dets.tokenUrl || 'access_token';
}
else if(authSchemes[key].grantTypes) {
// 1.2 support
var o = authSchemes[key].grantTypes;
for(var t in o) {
if(o.hasOwnProperty(t) && t === 'implicit') {
var dets = o[t];
var ep = dets.loginEndpoint.url;
url = dets.loginEndpoint.url + '?response_type=token';
window.swaggerUi.tokenName = dets.tokenName;
}
}
}
}
}
var scopes = []
var o = $('.api-popup-scopes').find('input:checked');
for(k =0; k < o.length; k++) {
scopes.push($(o[k]).attr('scope'));
}
window.enabledScopes=scopes;
url += '&redirect_uri=' + encodeURIComponent(redirectUrl);
url += '&realm=' + encodeURIComponent(realm);
url += '&client_id=' + encodeURIComponent(clientId);
url += '&scope=' + encodeURIComponent(scopes);
window.open(url);
});
popupMask.show();
popupDialog.show();
return;
}
function handleLogout() {
for(key in window.authorizations.authz){
window.authorizations.remove(key)
}
window.enabledScopes = null;
$('.api-ic.ic-on').addClass('ic-off');
$('.api-ic.ic-on').removeClass('ic-on');
// set the info box
$('.api-ic.ic-warning').addClass('ic-error');
$('.api-ic.ic-warning').removeClass('ic-warning');
}
function initOAuth(opts) {
var o = (opts||{});
var errors = [];
appName = (o.appName||errors.push('missing appName'));
popupMask = (o.popupMask||$('#api-common-mask'));
popupDialog = (o.popupDialog||$('.api-popup-dialog'));
clientId = (o.clientId||errors.push('missing client id'));
realm = (o.realm||errors.push('missing realm'));
if(errors.length > 0){
log('auth unable initialize oauth: ' + errors);
return;
}
$('pre code').each(function(i, e) {hljs.highlightBlock(e)});
$('.api-ic').click(function(s) {
if($(s.target).hasClass('ic-off'))
handleLogin();
else {
handleLogout();
}
false;
});
}
function onOAuthComplete(token) {
if(token) {
if(token.error) {
var checkbox = $('input[type=checkbox],.secured')
checkbox.each(function(pos){
checkbox[pos].checked = false;
});
alert(token.error);
}
else {
var b = token[window.swaggerUi.tokenName];
if(b){
// if all roles are satisfied
var o = null;
$.each($('.auth #api_information_panel'), function(k, v) {
var children = v;
if(children && children.childNodes) {
var requiredScopes = [];
$.each((children.childNodes), function (k1, v1){
var inner = v1.innerHTML;
if(inner)
requiredScopes.push(inner);
});
var diff = [];
for(var i=0; i < requiredScopes.length; i++) {
var s = requiredScopes[i];
if(window.enabledScopes && window.enabledScopes.indexOf(s) == -1) {
diff.push(s);
}
}
if(diff.length > 0){
o = v.parentNode;
$(o.parentNode).find('.api-ic.ic-on').addClass('ic-off');
$(o.parentNode).find('.api-ic.ic-on').removeClass('ic-on');
// sorry, not all scopes are satisfied
$(o).find('.api-ic').addClass('ic-warning');
$(o).find('.api-ic').removeClass('ic-error');
}
else {
o = v.parentNode;
$(o.parentNode).find('.api-ic.ic-off').addClass('ic-on');
$(o.parentNode).find('.api-ic.ic-off').removeClass('ic-off');
// all scopes are satisfied
$(o).find('.api-ic').addClass('ic-info');
$(o).find('.api-ic').removeClass('ic-warning');
$(o).find('.api-ic').removeClass('ic-error');
}
}
});
window.authorizations.add('oauth2', new ApiKeyAuthorization('Authorization', 'Bearer ' + b, 'header'));
}
}
}
}
\ No newline at end of file
<script>
var qp = null;
if(window.location.hash) {
qp = location.hash.substring(1);
}
else {
qp = location.search.substring(1);
}
qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
function(key, value) {
return key===""?value:decodeURIComponent(value) }
):{}
window.opener.onOAuthComplete(qp);
window.close();
</script>
\ No newline at end of file
This diff could not be displayed because it is too large.
......@@ -14,7 +14,7 @@
</ui:define>
<ui:define name="content">
<p:dataTable border="1" id="ac" value="#{userView.user.accountEvents}" var="ac">
<p:dataTable border="1" id="ac" styleClass="moya_datatable2" value="#{userView.user.accountEvents}" var="ac">
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.productname']}" />
......
......@@ -12,13 +12,10 @@
<h1>#{i18n['user.page.invite']}</h1>
</ui:define>
<ui:define name="content">
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="invite" value="#{i18n['user.invitemail']}" />
<h:inputText id="invite" value="#{inviteView.invitemail}" size="40" required="true" />
<h:message for="invite" />
</h:panelGrid>
<p><h:outputLabel for="invite" value="#{i18n['user.invitemail']}" /></p>
<h:inputText id="invite" value="#{inviteView.invitemail}" size="40" required="true" />
<p><h:message for="invite" /></p>
<h:commandButton action="#{inviteView.invite()}" value="#{i18n['user.invite']}" />
</h:form>
......
......@@ -14,7 +14,7 @@
<h1>#{i18n['voting.allcompos.header']}</h1>
<p>#{i18n['voting.allcompos.description']}</p>
<h:form>
<h:form id="compolist" styleClass="moya_datatable2">
<h:dataTable styleClass="bordertable" rowClasses="roweven,rowodd" id="compolisttable" value="#{compoView.compos}" var="compo">
<h:column>
<f:facet name="header">
......
......@@ -13,7 +13,7 @@
<h1>My entries</h1>
<h:form>
<h:form id="myEntries" styleClass="moya_datatable2">
<h:dataTable styleClass="bordertable" rowClasses="roweven,rowodd" id="compolisttable" value="#{voteListView.entries}" var="entry">
<h:column>
<f:facet name="header">
......
......@@ -12,7 +12,7 @@
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
<packagingIncludes>WEB-INF/lib/moya-restpojo*,WEB-INF/lib/javamelody-core*,WEB-INF/lib/primefaces*,WEB-INF/lib/*-1.0.8.jar,**/*.xml,**/*.xhtml,**/*.properties,**/*.class,**/*.png,**/*.css,**/*.js,resources/*</packagingIncludes>
<packagingIncludes>WEB-INF/lib/swagger*,WEB-INF/lib/moya-restpojo*,WEB-INF/lib/javamelody-core*,WEB-INF/lib/primefaces*,WEB-INF/lib/*-1.0.8.jar,**/*.xml,**/*.xhtml,**/*.properties,**/*.class,**/*.png,**/*.css,**/*.js,resources/*</packagingIncludes>
</configuration>
</plugin>
</plugins>
......@@ -46,6 +46,21 @@
<artifactId>moya-restpojo</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-servlet_2.11</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-jaxrs_2.11</artifactId>
<version>${swagger.version}</version>
</dependency>
</dependencies>
<parent>
<groupId>fi.codecrew.moya</groupId>
......
......@@ -23,6 +23,9 @@ import java.util.Calendar;
import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.TreeMap;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiResponse;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
......@@ -43,6 +46,7 @@ import fi.codecrew.moya.rest.highcharts.HcSeriesRoot;
@Path("/acc")
//@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
//@Produces({ MediaType.APPLICATION_JSON })
@Api(value = "/acc", description = "Access account events")
public class AccountEventRestView {
@EJB
......@@ -53,6 +57,8 @@ public class AccountEventRestView {
@GET
@Produces({ MediaType.APPLICATION_JSON + "; charset=UTF-8" })
@Path("/boughtTimecount/{productId}")
@ApiOperation("Ask how many times a product has been bought")
@ApiResponse(code = 200, message = "What is this this returned?")
public ArrayList<HcSeriesRoot> boughtTimecount(@PathParam("productId") Integer productId) {
Product product = productBean.findById(productId);
......
......@@ -38,6 +38,10 @@ import javax.ws.rs.core.Response.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiResponse;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.EventMapBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
......@@ -57,6 +61,7 @@ import fi.codecrew.moya.rest.pojo.map.v1.PlaceRoot;
@Path("/placeadmin")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON })
@Api(value = "/placeadmin", description = "Administer places")
public class MapAdminView {
@EJB
......@@ -76,6 +81,7 @@ public class MapAdminView {
@GET
@Path("/background/{mapId}")
@ApiResponse(code = 200, message = "Return backround map as JPEG")
public Response getMapBg(@PathParam("mapId") Integer mapid)
{
EventMap map = placebean.findMap(mapid);
......@@ -85,6 +91,8 @@ public class MapAdminView {
@GET
@Path("/maps")
@ApiOperation(value = "Get All maps", response = MapRoot.class)
@ApiResponse(code = 200, message = "Return all maps")
public MapRoot getAllMaps() {
MapRoot ret = PojoUtils.parseMaps(eventbean.getCurrentEvent().getEventMaps());
logger.info("getallmaps called! {}", ret);
......@@ -93,6 +101,7 @@ public class MapAdminView {
@GET
@Path("/places/{mapId}")
@ApiOperation(value = "Get places by mapId", response = PlaceRoot.class)
public PlaceRoot getPlaces(@PathParam("mapId") Integer mapid) {
EventMap map = placebean.findMap(mapid);
PlaceRoot ret = PojoUtils.initPlaceRoot(map);
......@@ -102,6 +111,7 @@ public class MapAdminView {
@DELETE
@Path("/place/{id}")
@ApiOperation("Delete a place")
public Response deletePlace(@PathParam("id") Integer id) {
Place place = eventmapbean.findPlace(id);
eventmapbean.deletePlace(place);
......@@ -110,15 +120,18 @@ public class MapAdminView {
@GET
@Path("/place/")
@ApiOperation(value = "Always returns 406 - Not acceptable")
@ApiResponse(code = 406, message = "Nope. Not acceptable.")
public Response getPlaceError() {
ResponseBuilder ret = Response.ok();
ret = ret.status(Status.METHOD_NOT_ALLOWED);
ret = ret.status(Status.NOT_ACCEPTABLE);
ret.entity("Method not allowed!\nGET is not supported for /place/. See api for correct use!");
return ret.build();
}
@POST
@Path("/place/")
@ApiOperation(value = "Create a place", response = PlacePojo.class)
public Response createPlace(PlacePojo create) {
logger.info("Finding map with id {}", create.getMapId());
EventMap map = eventmapbean.find(create.getMapId());
......@@ -138,6 +151,7 @@ public class MapAdminView {
@PUT
@Path("/place/{id}")
@ApiOperation(value = "Set a place", response = PlacePojo.class)
public Response updatePlace(@PathParam("id") Integer id, PlacePojo update) {
if (update == null || id == null) {
return Response.serverError().entity("'id' field is required!").build();
......@@ -156,6 +170,7 @@ public class MapAdminView {
@PUT
@Path("/place/{placeId}/release")
@ApiOperation("Release a class")
public Response releasePlace(@PathParam("placeId") Integer placeId) {
Place place = eventmapbean.findPlace(placeId);
if (place == null) {
......@@ -169,6 +184,7 @@ public class MapAdminView {
@PUT
@Path("/place/{placeId}/reserve/{eventuserId}")
@ApiOperation("Reserve a place")
public Response reserve(@PathParam("placeId") Integer placeId, @PathParam("eventuserId") Integer eventuserId) {
Place place = eventmapbean.findPlace(placeId);
EventUser eventuser = eventuserbean.findByEventUserId(eventuserId);
......
......@@ -43,6 +43,10 @@ import javax.ws.rs.core.Response.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import fi.codecrew.moya.beans.CardTemplateBeanLocal;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
......@@ -62,6 +66,7 @@ import fi.codecrew.moya.utilities.SearchResult;
@Path("/user")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON + "; charset=UTF-8" })
@Api("/user")
public class UserRestView {
@EJB
......@@ -138,6 +143,7 @@ public class UserRestView {
@GET
@Path("/eventusers")
@ApiOperation(value = "Get EventUsers", response = SimpleEventuserRoot.class)
public SimpleEventuserRoot getEventUsers(
@DefaultValue("0") @QueryParam("pagesize") Integer pagesize,
@DefaultValue("0") @QueryParam("page") Integer page,
......@@ -151,7 +157,9 @@ public class UserRestView {
@GET
@Path("/card/{eventuserId}")
public PrintedCardRestPojo getUsersCard(@PathParam("eventuserId") Integer eventuserid) {
@ApiOperation(value = "Get PrintedCard for EventUser", response = PrintedCardRestPojo.class)
public PrintedCardRestPojo getUsersCard(
@ApiParam("EventUser entity ID") @PathParam("eventuserId") Integer eventuserid) {
EventUser user = userbean.findByEventUserId(eventuserid);
return PojoUtils.initPrintedCardRestPojo(cardbean.checkPrintedCard(user));
......@@ -159,7 +167,9 @@ public class UserRestView {
@GET
@Path("/eventuser/{cardauthcode}")
public EventUserRestPojo getEventUser(@PathParam("cardauthcode") String code) {
@ApiOperation(value = "Get EventUser by cardAuthCode", response = EventUserRestPojo.class)
public EventUserRestPojo getEventUser(
@ApiParam("Card authentication code") @PathParam("cardauthcode") String code) {
EventUser user = userbean.getUserByAuthcode(code);
if (user != null)
......
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
\ No newline at end of file
......@@ -32,6 +32,11 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.model.EventUser;
......@@ -39,6 +44,7 @@ import fi.codecrew.moya.model.EventUser;
@Path("/meta/v1/eventuser")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON + "; charset=UTF-8" })
@Api(value="/meta/v1/eventuser", description = "Access EventUser meta data")
public class EventUserRestViewV1 extends AbstractRestViewV1 {
@EJB
......@@ -46,8 +52,10 @@ public class EventUserRestViewV1 extends AbstractRestViewV1 {
@GET
@Path("/{id}/{path:.*}")
public String getMeta(@PathParam("id") Integer id,
@PathParam("path") List<PathSegment> path) {
@ApiOperation(value = "Get metadata for EventUser by id")
public String getMeta(
@ApiParam("EventUser entity ID") @PathParam("id") Integer id,
@ApiParam("Path in JSON metadata object") @PathParam("path") List<PathSegment> path) {
EventUser eventUser = userBean.findByEventUserId(id);
return getEntityMeta(eventUser, path);
......@@ -55,8 +63,12 @@ public class EventUserRestViewV1 extends AbstractRestViewV1 {
@PUT
@Path("/{id}/{path:.*}")
public void putMeta(@PathParam("id") Integer id,
@PathParam("path") List<PathSegment> path, String jsonString) {
@ApiOperation(value="Set EventUser metada path", notes ="foo")
@ApiResponse(code = 200, message = "OK")
public void putMeta(
@ApiParam("EventUser entity ID") @PathParam("id") Integer id,
@ApiParam("Path in metadata JSON object") @PathParam("path") List<PathSegment> path,
@ApiParam("JSON to store") String jsonString) {
EventUser eventUser = userBean.findByEventUserId(id);
setEntityMeta(eventUser, path, jsonString);
......@@ -65,7 +77,9 @@ public class EventUserRestViewV1 extends AbstractRestViewV1 {
@POST
@Path("/{id}/{path:.*}")
public void postMeta(@PathParam("id") Integer id,
@ApiOperation("Set EventUser metadata path with POST")
public void postMeta(
@PathParam("id") Integer id,
@PathParam("path") List<PathSegment> path, String jsonString) {
EventUser eventUser = userBean.findByEventUserId(id);
......
......@@ -32,6 +32,11 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import fi.codecrew.moya.beans.CardTemplateBeanLocal;
import fi.codecrew.moya.model.PrintedCard;
......@@ -39,6 +44,7 @@ import fi.codecrew.moya.model.PrintedCard;
@Path("/meta/v1/printedcard")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON + "; charset=UTF-8" })
@Api(value = "/meta/v1/printedcard", description = "PrintedCard metadata access")
public class PrintedCardRestViewV1 extends AbstractRestViewV1 {
@EJB
......@@ -46,8 +52,10 @@ public class PrintedCardRestViewV1 extends AbstractRestViewV1 {
@GET
@Path("/{id}/{path:.*}")
public String getMeta(@PathParam("id") Integer id,
@PathParam("path") List<PathSegment> path) {
@ApiOperation("Return PrintedCard metadata")
public String getMeta(
@ApiParam("PrintedCard entity ID") @PathParam("id") Integer id,
@ApiParam(value="Path in metadata JSON object") @PathParam("path") List<PathSegment> path) {
PrintedCard printedCard = cardTemplateBeanLocal.findCard(id);
return getEntityMeta(printedCard, path);
......@@ -55,8 +63,12 @@ public class PrintedCardRestViewV1 extends AbstractRestViewV1 {
@PUT
@Path("/{id}/{path:.*}")
public void putMeta(@PathParam("id") Integer id,
@PathParam("path") List<PathSegment> path, String jsonString) {
@ApiOperation("Set PrintedCard metadata path")
@ApiResponse(code = 200, message = "OK")
public void putMeta(
@ApiParam("PrintedCard entity ID") @PathParam("id") Integer id,
@ApiParam("Path in metadata JSON object") @PathParam("path") List<PathSegment> path,
@ApiParam("JSON object to store in metadata") String jsonString) {
PrintedCard printedCard = cardTemplateBeanLocal.findCard(id);
setEntityMeta(printedCard, path, jsonString);
......@@ -65,6 +77,7 @@ public class PrintedCardRestViewV1 extends AbstractRestViewV1 {
@POST
@Path("/{id}/{path:.*}")
@ApiOperation("Set PrintedCard metadata path. Please use PUT.")
public void postMeta(@PathParam("id") Integer id,
@PathParam("path") List<PathSegment> path, String jsonString) {
......
......@@ -30,6 +30,10 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.model.User;
......@@ -37,6 +41,7 @@ import fi.codecrew.moya.model.User;
@Path("/meta/v1/user")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON + "; charset=UTF-8" })
@Api(value = "/meta/v1/user", description = "Access User metadata")
public class UserRestViewV1 extends AbstractRestViewV1 {
@EJB
......@@ -44,8 +49,10 @@ public class UserRestViewV1 extends AbstractRestViewV1 {
@GET
@Path("/{id}/{path:.*}")
public String getMeta(@PathParam("id") Integer id,
@PathParam("path") List<PathSegment> path) {
@ApiOperation("Get metadata for user")
public String getMeta(
@ApiParam("User entity ID") @PathParam("id") Integer id,
@ApiParam("Path in metadata JSON object") @PathParam("path") List<PathSegment> path) {
User user = userBean.getUser(id);
return getEntityMeta(user, path);
......
package fi.codecrew.moya.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.wordnik.swagger.config.ConfigFactory;
import com.wordnik.swagger.config.ScannerFactory;
import com.wordnik.swagger.config.SwaggerConfig;
import com.wordnik.swagger.jaxrs.config.ReflectiveJaxrsScanner;
import com.wordnik.swagger.jaxrs.reader.DefaultJaxrsApiReader;
import com.wordnik.swagger.reader.ClassReaders;
import fi.codecrew.moya.rest.RestApplicationEntrypoint;
@WebServlet(name = "SwaggerJaxrsConfig", loadOnStartup = 1, description = "Configure Swaggered API documentation")
public class SwaggerJaxrsConfig extends HttpServlet {
private static final long serialVersionUID = 35868122371671912L;
private static final Logger log = LoggerFactory.getLogger(SwaggerJaxrsConfig.class);
// TODO: Make API url configurable or invent something smart to overcome
// the need of base url.
private static final String BASE_URL = "http://localhost:49080/MoyaWeb";
private static final String API_RESOURCE_PACKAGE = "fi.codecrew.moya.rest";
@Override
public void init() throws ServletException {
log.info("Initializing Swagger configuration servlet");
try {
// Configure basic API settings shown in API doc JSON.
SwaggerConfig swaggerConfig = new SwaggerConfig();
swaggerConfig.setBasePath(BASE_URL + RestApplicationEntrypoint.REST_PATH);
swaggerConfig.setApiVersion("1.0.0");
ConfigFactory.setConfig(swaggerConfig);
// Configure scanning for API annotations in desired packaget
// ServletScanner scanner = new ServletScanner();
// scanner.setResourcePackage(API_RESOURCE_PACKAGE);
// DefaultJaxrsScanner scanner = new DefaultJaxrsScanner();
ReflectiveJaxrsScanner scanner = new ReflectiveJaxrsScanner();
scanner.setResourcePackage(API_RESOURCE_PACKAGE);
ScannerFactory.setScanner(scanner);
// Reads annotations from the scanned classes.
ClassReaders.setReader(new DefaultJaxrsApiReader());
log.info("Initializing Swagger configuration succeeded.");
} catch (Exception e) {
log.error("Initializing Swagger configuration failed", e);
}
}
@Override
public void destroy() {
log.info("Destroying Swagger configuration servlet");
}
}
......@@ -552,7 +552,7 @@ incomingflow.alreadyShowingUser.title = Valmiiksi valittu
incomingflow.barcode = Viivakoodi
incomingflow.cardCodes = Korttiin liitetyt koodit
incomingflow.cardfiling.label = Kortin kansiointi:
incomingflow.changereader = Vaihda / vallitse lukija
incomingflow.changereader = Vaihda / valitse lukija
incomingflow.codeattached.message = Piipattu koodi liitetty aktiiviseen k\u00E4ytt\u00E4j\u00E4\u00E4n
incomingflow.codeattached.title = Koodi liitetty
incomingflow.giveplace = Merkitse annetuksi
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!