|
From: <jav...@us...> - 2011-07-08 07:55:19
|
Revision: 15662
http://dcm4che.svn.sourceforge.net/dcm4che/?rev=15662&view=rev
Author: javawilli
Date: 2011-07-08 07:55:11 +0000 (Fri, 08 Jul 2011)
Log Message:
-----------
[#WEB-410] Add Fuzzy Patient search to folder and worklist console.
Modified Paths:
--------------
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/pom.xml
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeBean.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeLocal.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListBean.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListFilter.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/util/QueryUtil.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistBean.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistFilter.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/folder/StudyListPage.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ViewPort.java
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/Mpps2MwlLinkPage$Mpps2MwlLinkPanelM.html
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/StudyListPage.html
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/folder-style.css
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package.properties
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package_de.properties
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.html
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package.properties
dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package_de.properties
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/pom.xml
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/pom.xml 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/pom.xml 2011-07-08 07:55:11 UTC (rev 15662)
@@ -22,12 +22,6 @@
</dependency>
<dependency>
<groupId>dcm4che.dcm4chee</groupId>
- <artifactId>dcm4chee-web-common</artifactId>
- <version>3.0.1</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>dcm4che.dcm4chee</groupId>
<artifactId>dcm4chee-arc-entities</artifactId>
<version>3.0.1</version>
<classifier>${db}</classifier>
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeBean.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeBean.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeBean.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -79,11 +79,15 @@
return (AE) q.getSingleResult();
}
- public void updateOrCreateAET(AE ae){
- if ( ae.getPk() == -1)
+ public AE updateOrCreateAET(AE ae){
+ if ( ae.getPk() == -1) {
em.persist(ae);
- else
+ return null;
+ } else {
+ AE oldAE = em.find(AE.class, ae.getPk());
em.merge(ae);
+ return oldAE;
+ }
}
public void removeAET(long pk) {
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeLocal.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeLocal.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/ae/AEHomeLocal.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -59,7 +59,7 @@
AE findByTitle(String title);
- void updateOrCreateAET(AE ae);
+ AE updateOrCreateAET(AE ae);
void removeAET(long pk);
}
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListBean.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListBean.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListBean.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -213,7 +213,11 @@
}
private static void appendPatFilter(StringBuilder ql, StudyListFilter filter) {
- QueryUtil.appendPatientNameFilter(ql, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ if (filter.isFuzzyPN()) {
+ QueryUtil.appendPatientNameFuzzyFilter(ql, filter.getPatientName());
+ } else {
+ QueryUtil.appendPatientNameFilter(ql, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ }
QueryUtil.appendPatientIDFilter(ql, QueryUtil.checkAutoWildcard(filter.getPatientID()));
QueryUtil.appendIssuerOfPatientIDFilter(ql, QueryUtil.checkAutoWildcard(filter.getIssuerOfPatientID()));
if ( filter.isExtendedQuery()) {
@@ -243,7 +247,11 @@
}
private static void setPatQueryParameters(Query query, StudyListFilter filter) {
- QueryUtil.setPatientNameQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ if (filter.isFuzzyPN()) {
+ QueryUtil.setPatientNameFuzzyQueryParameter(query, filter.getPatientName());
+ } else {
+ QueryUtil.setPatientNameQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ }
QueryUtil.setPatientIDQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getPatientID()));
QueryUtil.setIssuerOfPatientIDQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getIssuerOfPatientID()));
if ( filter.isExtendedQuery()) {
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListFilter.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListFilter.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/folder/StudyListFilter.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -43,6 +43,7 @@
import java.util.HashSet;
import java.util.Set;
+import org.dcm4chee.archive.conf.AttributeFilter;
import org.dcm4chee.usr.dao.UserAccess;
import org.dcm4chee.usr.model.AETGroup;
import org.dcm4chee.usr.util.JNDIUtils;
@@ -76,6 +77,7 @@
private boolean exactModalitiesInStudy;
private boolean exactSeriesIuid;
private int autoExpandLevel = -1;
+ private boolean fuzzyPN;
public StudyListFilter(String forUsername) {
clear();
@@ -93,6 +95,7 @@
withoutPps = false;
exactModalitiesInStudy = false;
exactSeriesIuid = false;
+ fuzzyPN = false;
}
public String getPatientName() {
@@ -103,6 +106,16 @@
this.patientName = patientName;
}
+ public boolean isFuzzyPNEnabled() {
+ return AttributeFilter.isSoundexEnabled();
+ }
+ public boolean isFuzzyPN() {
+ return fuzzyPN;
+ }
+ public void setFuzzyPN(boolean fuzzyPN) {
+ this.fuzzyPN = fuzzyPN;
+ }
+
public String getPatientID() {
return patientID;
}
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/util/QueryUtil.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/util/QueryUtil.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/util/QueryUtil.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -46,6 +46,10 @@
import javax.persistence.Query;
import javax.persistence.TemporalType;
+import org.dcm4che2.data.PersonName;
+import org.dcm4che2.data.Tag;
+import org.dcm4chee.archive.conf.AttributeFilter;
+
/**
* @author Franz Willer <fw...@gm...>
* @version $Revision$ $Date$
@@ -210,10 +214,44 @@
}
}
+ public static void appendPatientNameFuzzyFilter(StringBuilder ql, String patientName) {
+ appendPersonNameFuzzyFilter(ql, "p.patientFamilyNameSoundex", "p.patientGivenNameSoundex", patientName);
+ }
+ public static void appendPersonNameFuzzyFilter(StringBuilder ql, String fnField, String gnField, String name) {
+ PersonName pn = new PersonName(name);
+ String fnSoundex = AttributeFilter.toSoundexWithLike(pn, PersonName.FAMILY);
+ String gnSoundex = AttributeFilter.toSoundexWithLike(pn, PersonName.GIVEN);
+ if (fnSoundex != null && gnSoundex != null) {
+ ql.append(" AND ((").append(fnField).append(like(fnSoundex)).append(" :fnsx OR ").append(fnField).append(" ='*')")
+ .append(" AND (").append(gnField).append(like(gnSoundex)).append(" :gnsx OR ").append(gnField).append(" ='*')")
+ .append(" OR (").append(gnField).append(like(fnSoundex)).append(" :fnsx OR ").append(gnField).append(" ='*')")
+ .append(" AND (").append(fnField).append(like(gnSoundex)).append(" :gnsx OR ").append(fnField).append(" ='*'))");
+ } else if (fnSoundex!=null || gnSoundex!=null) {
+ String varName = fnSoundex!=null ? " :fnsx" : " :gnsx";
+ ql.append(" AND (").append(fnField).append(like(fnSoundex)).append(varName)
+ .append(" OR ").append(gnField).append(like(fnSoundex)).append(varName)
+ .append(" OR (").append(fnField).append(" ='*' AND ").append(gnField).append(" ='*'))");
+ }
+ }
+
+ private static String like(String soundex) {
+ return soundex != null && soundex.endsWith("%") ? " LIKE " : " = ";
+ }
+
public static void setPatientNameQueryParameter(Query query, String patientName) {
setPatientNameQueryParameter(query, "patientName", patientName);
}
+ public static void setPatientNameFuzzyQueryParameter(Query query, String patientName) {
+ PersonName pn = new PersonName(patientName);
+ String fnSoundex = AttributeFilter.toSoundexWithLike(pn, PersonName.FAMILY);
+ String gnSoundex = AttributeFilter.toSoundexWithLike(pn, PersonName.GIVEN);
+ if (fnSoundex != null)
+ query.setParameter("fnsx", fnSoundex);
+ if (gnSoundex != null)
+ query.setParameter("gnsx", gnSoundex);
+ }
+
public static void setPatientNameQueryParameter(Query query, String varName, String patientName) {
if (patientName!=null && !needEscape(patientName)) {
query.setParameter(varName, toPatientNameQueryString(patientName));
@@ -384,7 +422,9 @@
private static String toPatientNameQueryString(String patientName) {
int padcarets = 4;
StringBuilder param = new StringBuilder();
- StringTokenizer tokens = new StringTokenizer(patientName.toUpperCase(),
+ if (AttributeFilter.getPatientAttributeFilter().isICase(Tag.PatientName))
+ patientName = patientName.toUpperCase();
+ StringTokenizer tokens = new StringTokenizer(patientName,
"^*?_%", true);
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistBean.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistBean.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistBean.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -115,7 +115,11 @@
if (filter.isExtendedQuery() && !QueryUtil.isUniversalMatch(filter.getStudyInstanceUID())) {
ql.append(" AND m.studyInstanceUID = :studyInstanceUID");
} else {
- appendPatientNameFilter(ql, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ if (filter.isFuzzyPN()) {
+ QueryUtil.appendPatientNameFuzzyFilter(ql, filter.getPatientName());
+ } else {
+ QueryUtil.appendPatientNameFilter(ql, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ }
appendPatientIDFilter(ql, QueryUtil.checkAutoWildcard(filter.getPatientID()));
appendIssuerOfPatientIDFilter(ql, QueryUtil.checkAutoWildcard(filter.getIssuerOfPatientID()));
if (filter.isExtendedQuery()) {
@@ -136,7 +140,11 @@
if (filter.isExtendedQuery() && !QueryUtil.isUniversalMatch(filter.getStudyInstanceUID())) {
setStudyInstanceUIDQueryParameter(query, filter.getStudyInstanceUID());
} else {
- setPatientNameQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ if (filter.isFuzzyPN()) {
+ QueryUtil.setPatientNameFuzzyQueryParameter(query, filter.getPatientName());
+ } else {
+ QueryUtil.setPatientNameQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getPatientName()));
+ }
setPatientIDQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getPatientID()));
setIssuerOfPatientIDQueryParameter(query, QueryUtil.checkAutoWildcard(filter.getIssuerOfPatientID()));
if (filter.isExtendedQuery()) {
@@ -152,16 +160,6 @@
}
}
- private static void appendPatientNameFilter(StringBuilder ql,
- String patientName) {
- QueryUtil.appendPatientName(ql, "p.patientName", ":patientName", patientName);
- }
-
- private static void setPatientNameQueryParameter(Query query,
- String patientName) {
- QueryUtil.setPatientNameQueryParameter(query, "patientName", patientName);
- }
-
private static void appendPatientIDFilter(StringBuilder ql,
String patientID) {
QueryUtil.appendANDwithTextValue(ql, "p.patientID", "patientID", patientID);
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistFilter.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistFilter.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-ejb/src/main/java/org/dcm4chee/web/dao/worklist/modality/ModalityWorklistFilter.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -43,6 +43,7 @@
import java.util.HashSet;
import java.util.Set;
+import org.dcm4chee.archive.conf.AttributeFilter;
import org.dcm4chee.usr.dao.UserAccess;
import org.dcm4chee.usr.model.AETGroup;
import org.dcm4chee.usr.util.JNDIUtils;
@@ -71,7 +72,8 @@
private String SPSStatus;
private Date startDateMin;
private Date startDateMax;
-
+ private boolean fuzzyPN;
+
public ModalityWorklistFilter(String forUsername) {
clear();
}
@@ -92,6 +94,16 @@
this.patientName = patientName;
}
+ public boolean isFuzzyPNEnabled() {
+ return AttributeFilter.isSoundexEnabled();
+ }
+ public boolean isFuzzyPN() {
+ return fuzzyPN;
+ }
+ public void setFuzzyPN(boolean fuzzyPN) {
+ this.fuzzyPN = fuzzyPN;
+ }
+
public String getPatientID() {
return patientID;
}
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/folder/StudyListPage.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/folder/StudyListPage.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/folder/StudyListPage.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -53,6 +53,7 @@
import java.util.Set;
import java.util.Map.Entry;
+import javax.ejb.EJBException;
import javax.security.auth.Subject;
import javax.security.jacc.PolicyContext;
import javax.servlet.http.HttpServletRequest;
@@ -112,13 +113,18 @@
import org.apache.wicket.security.hive.authorization.Principal;
import org.apache.wicket.security.hive.authorization.SimplePrincipal;
import org.apache.wicket.security.swarm.strategies.SwarmStrategy;
+import org.apache.wicket.util.lang.Classes;
import org.apache.wicket.util.time.Duration;
+import org.apache.wicket.validation.IValidatable;
+import org.apache.wicket.validation.validator.AbstractValidator;
import org.dcm4che2.data.DateRange;
import org.dcm4che2.data.DicomObject;
+import org.dcm4che2.data.PersonName;
import org.dcm4che2.data.Tag;
import org.dcm4che2.data.VR;
import org.dcm4che2.io.DicomInputStream;
import org.dcm4chee.archive.common.PrivateTag;
+import org.dcm4chee.archive.conf.AttributeFilter;
import org.dcm4chee.archive.entity.Patient;
import org.dcm4chee.archive.entity.Study;
import org.dcm4chee.archive.entity.StudyPermission;
@@ -126,9 +132,11 @@
import org.dcm4chee.icons.ImageManager;
import org.dcm4chee.icons.behaviours.ImageSizeBehaviour;
import org.dcm4chee.web.common.behaviours.CheckOneDayBehaviour;
+import org.dcm4chee.web.common.behaviours.MarkInvalidBehaviour;
import org.dcm4chee.web.common.behaviours.SelectableTableRowBehaviour;
import org.dcm4chee.web.common.behaviours.TooltipBehaviour;
import org.dcm4chee.web.common.delegate.BaseCfgDelegate;
+import org.dcm4chee.web.common.exceptions.WicketExceptionWithMsgKey;
import org.dcm4chee.web.common.markup.BaseForm;
import org.dcm4chee.web.common.markup.DateTimeLabel;
import org.dcm4chee.web.common.markup.ModalWindowLink;
@@ -366,6 +374,8 @@
form.addPatientNameField("patientName", new PropertyModel<String>(filter, "patientName"),
WebCfgDelegate.getInstance().useFamilyAndGivenNameQueryFields(), enabledModelPat, false);
+ form.addComponent(new CheckBox("fuzzyPN")).setVisible(filter.isFuzzyPNEnabled());
+ form.addInternalLabel("fuzzyPN").setVisible(filter.isFuzzyPNEnabled());
form.addTextField("patientID", enabledModelPat, true);
form.addTextField("issuerOfPatientID", enabledModelPat, true);
SimpleDateTimeField dtf = form.addDateTimeField("studyDateMin", new PropertyModel<Date>(filter, "studyDateMin"),
@@ -602,12 +612,8 @@
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
- try {
- viewport.setOffset(0);
- queryStudies();
- } catch (Throwable t) {
- log.error("search failed: ", t);
- }
+ viewport.setOffset(0);
+ queryStudies(target);
target.addComponent(form);
}
@@ -652,11 +658,7 @@
protected void onSubmit(AjaxRequestTarget target) {
if (!WebCfgDelegate.getInstance().isQueryAfterPagesizeChange())
return;
- try {
- queryStudies();
- } catch (Throwable t) {
- log.error("search failed: ", t);
- }
+ queryStudies(target);
target.addComponent(form);
target.addComponent(header);
}
@@ -683,7 +685,7 @@
@Override
public void onClick() {
viewport.setOffset(Math.max(0, viewport.getOffset() - pagesize.getObject()));
- queryStudies();
+ queryStudies(null);
}
@Override
@@ -703,7 +705,7 @@
@Override
public void onClick() {
viewport.setOffset(viewport.getOffset() + pagesize.getObject());
- queryStudies();
+ queryStudies(null);
}
@Override
@@ -799,7 +801,7 @@
setStatus(new StringResourceModel("folder.message.deleteDone", StudyListPage.this,null));
if (selected.hasPatients()) {
viewport.getPatients().clear();
- queryStudies();
+ queryStudies(target);
} else
selected.refreshView(true);
} else
@@ -962,7 +964,7 @@
}
if (!patientPks.isEmpty() || !studyPks.isEmpty() || !ppsPks.isEmpty() || !seriesPks.isEmpty()) {
- queryStudies();
+ queryStudies(target);
target.addComponent(getPage());
}
}
@@ -1105,7 +1107,7 @@
setStatus(new StringResourceModel("folder.message.unlinkDone", StudyListPage.this,null));
if (selected.hasPatients()) {
viewport.getPatients().clear();
- queryStudies();
+ queryStudies(target);
} else
selected.refreshView(true);
} else
@@ -1158,20 +1160,30 @@
form.add(confirmEmulateMpps);
}
- private void queryStudies() {
- List<String> dicomSecurityRoles = (studyPermissionHelper.applyStudyPermissions() ?
- studyPermissionHelper.getDicomRoles() : null);
- StudyListFilter filter = viewport.getFilter();
- viewport.setTotal(dao.count(filter, dicomSecurityRoles));
- updatePatients(dao.findPatients(filter, pagesize.getObject(), viewport.getOffset(), dicomSecurityRoles));
- header.expandToLevel(filter.isPatientQuery() ?
- AbstractDicomModel.PATIENT_LEVEL : AbstractDicomModel.STUDY_LEVEL);
- updateAutoExpandLevel();
- if (filter.isExtendedQuery() && filter.getSeriesInstanceUID() != null) {
- filter.setPpsWithoutMwl(false);
- filter.setWithoutPps(false);
+ private void queryStudies(AjaxRequestTarget target) {
+ try {
+ List<String> dicomSecurityRoles = (studyPermissionHelper.applyStudyPermissions() ?
+ studyPermissionHelper.getDicomRoles() : null);
+ StudyListFilter filter = viewport.getFilter();
+ viewport.setTotal(dao.count(filter, dicomSecurityRoles));
+ updatePatients(dao.findPatients(filter, pagesize.getObject(), viewport.getOffset(), dicomSecurityRoles));
+ header.expandToLevel(filter.isPatientQuery() ?
+ AbstractDicomModel.PATIENT_LEVEL : AbstractDicomModel.STUDY_LEVEL);
+ updateAutoExpandLevel();
+ if (filter.isExtendedQuery() && filter.getSeriesInstanceUID() != null) {
+ filter.setPpsWithoutMwl(false);
+ filter.setWithoutPps(false);
+ }
+ notSearched = false;
+ } catch (Throwable x) {
+ if ((x instanceof EJBException) && x.getCause() != null) {
+ x = x.getCause();
+ }
+ if ((x instanceof IllegalArgumentException) && x.getMessage() != null && x.getMessage().indexOf("fuzzy") != -1) {
+ x = new WicketExceptionWithMsgKey("fuzzyError", x);
+ }
+ msgWin.show(target, new WicketExceptionWithMsgKey("folder.message.searcherror", x), true);
}
- notSearched = false;
}
private void updateStudyPermissions() {
@@ -2234,7 +2246,7 @@
@Override
public void onClose(AjaxRequestTarget target) {
updateStudyPermissions();
- queryStudies();
+ queryStudies(target);
modalWindow.getPage().setOutputMarkupId(true);
target.addComponent(modalWindow.getPage());
target.addComponent(header);
@@ -2353,7 +2365,7 @@
filter.setWithoutPps(Boolean.valueOf(paras.getString("withoutPps")));
filter.setExactModalitiesInStudy(Boolean.valueOf(paras.getString("exactModalitiesInStudy")));
if (Boolean.valueOf(paras.getString("query"))) {
- queryStudies();
+ queryStudies(null);
}
}
}
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -45,6 +45,7 @@
import java.util.Comparator;
import java.util.List;
+import javax.ejb.EJBException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.ReflectionException;
@@ -53,6 +54,7 @@
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxCallDecorator;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
@@ -62,6 +64,7 @@
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
@@ -89,6 +92,7 @@
import org.dcm4chee.web.common.ajax.MaskingAjaxCallBehavior;
import org.dcm4chee.web.common.behaviours.CheckOneDayBehaviour;
import org.dcm4chee.web.common.behaviours.TooltipBehaviour;
+import org.dcm4chee.web.common.exceptions.WicketExceptionWithMsgKey;
import org.dcm4chee.web.common.markup.BaseForm;
import org.dcm4chee.web.common.markup.ModalWindowLink;
import org.dcm4chee.web.common.markup.PatientNameField;
@@ -241,6 +245,20 @@
pnField = form.addPatientNameField("patientName", new PropertyModel<String>(filter, "patientName"),
WebCfgDelegate.getInstance().useFamilyAndGivenNameQueryFields(), enabledModel, false);
pnField.setOutputMarkupId(true);
+ form.addComponent(new CheckBox("fuzzyPN") {
+ private static final long serialVersionUID = 1L;
+
+ public boolean isVisible() {
+ return filter.isFuzzyPNEnabled() && viewport.isInternalWorklistProvider();
+ }
+ });
+ form.addComponent(new Label("fuzzyPN.label", new ResourceModel("mw.searchFields.fuzzyPN.label")) {
+ private static final long serialVersionUID = 1L;
+
+ public boolean isVisible() {
+ return filter.isFuzzyPNEnabled() && viewport.isInternalWorklistProvider();
+ }
+ });
form.addTextField("patientID", enabledModel, true);
form.addTextField("issuerOfPatientID", enabledModel, true);
SimpleDateTimeField dtf = form.addDateTimeField("startDateMin", null, enabledModel, false, true);
@@ -256,19 +274,19 @@
form.addInternalLabel("scheduledStationName");
form.addInternalLabel("SPSStatus");
- form.addDropDownChoice("modality", null, new Model<ArrayList<String>>(new ArrayList(WebCfgDelegate.getInstance().getModalityList())),
+ form.addDropDownChoice("modality", null, new Model<ArrayList<String>>(new ArrayList<String>(WebCfgDelegate.getInstance().getModalityList())),
enabledModel, false).setModelObject("*");
List<String> aetChoices = viewport.getAetChoices();
if (aetChoices.size() > 0)
- form.addDropDownChoice("scheduledStationAET", null, new Model<ArrayList<String>>(new ArrayList(aetChoices)), enabledModel, false)
+ form.addDropDownChoice("scheduledStationAET", null, new Model<ArrayList<String>>(new ArrayList<String>(aetChoices)), enabledModel, false)
.setModelObject(aetChoices.get(0));
else
- form.addDropDownChoice("scheduledStationAET", null, new Model<ArrayList<String>>(new ArrayList(aetChoices)), new Model<Boolean>(false), false)
+ form.addDropDownChoice("scheduledStationAET", null, new Model<ArrayList<String>>(new ArrayList<String>(aetChoices)), new Model<Boolean>(false), false)
.setNullValid(true);
- form.addDropDownChoice("scheduledStationName", null, new Model<ArrayList<String>>(new ArrayList(WebCfgDelegate.getInstance().getStationNameList())), enabledModel, false).setModelObject("*");
- form.addDropDownChoice("SPSStatus", null, new Model<ArrayList<String>>(new ArrayList(getSpsStatusChoices())), enabledModel, false).setModelObject("*");
+ form.addDropDownChoice("scheduledStationName", null, new Model<ArrayList<String>>(new ArrayList<String>(WebCfgDelegate.getInstance().getStationNameList())), enabledModel, false).setModelObject("*");
+ form.addDropDownChoice("SPSStatus", null, new Model<ArrayList<String>>(new ArrayList<String>(getSpsStatusChoices())), enabledModel, false).setModelObject("*");
final WebMarkupContainer extendedFilter = new WebMarkupContainer("extendedFilter") {
@@ -346,14 +364,14 @@
protected void onSubmit(final AjaxRequestTarget target, Form<?> form) {
form.clearInput();
viewport.clear();
- ((DropDownChoice) ((WebMarkupContainer) form.get("searchDropdowns")).get("modality")).setModelObject("*");
- DropDownChoice scheduledStationAETDropDownChoice = ((DropDownChoice) ((WebMarkupContainer) form.get("searchDropdowns")).get("scheduledStationAET"));
+ ((DropDownChoice<String>) ((WebMarkupContainer) form.get("searchDropdowns")).get("modality")).setModelObject("*");
+ DropDownChoice<String> scheduledStationAETDropDownChoice = ((DropDownChoice<String>) ((WebMarkupContainer) form.get("searchDropdowns")).get("scheduledStationAET"));
if (scheduledStationAETDropDownChoice.getChoices().size() > 0)
scheduledStationAETDropDownChoice.setModelObject(scheduledStationAETDropDownChoice.getChoices().get(0));
else
scheduledStationAETDropDownChoice.setNullValid(true);
- ((DropDownChoice) ((WebMarkupContainer) form.get("searchDropdowns")).get("scheduledStationName")).setModelObject("*");
- ((DropDownChoice) ((WebMarkupContainer) form.get("searchDropdowns")).get("SPSStatus")).setModelObject("*");
+ ((DropDownChoice<String>) ((WebMarkupContainer) form.get("searchDropdowns")).get("scheduledStationName")).setModelObject("*");
+ ((DropDownChoice<String>) ((WebMarkupContainer) form.get("searchDropdowns")).get("SPSStatus")).setModelObject("*");
pagesize.setObject(WebCfgDelegate.getInstance().getDefaultMWLPagesize());
notSearched = true;
BaseForm.addFormComponentsToAjaxRequestTarget(target, form);
@@ -419,7 +437,7 @@
navPanel = form.createAjaxParent("navPanel");
pagesize.setObject(WebCfgDelegate.getInstance().getDefaultMWLPagesize());
- form.addDropDownChoice("pagesize", pagesize, new Model<ArrayList<String>>(new ArrayList(WebCfgDelegate.getInstance().getPagesizeList())), new Model<Boolean>() {
+ form.addDropDownChoice("pagesize", pagesize, new Model<ArrayList<Integer>>(new ArrayList<Integer>(WebCfgDelegate.getInstance().getPagesizeList())), new Model<Boolean>() {
private static final long serialVersionUID = 1L;
@@ -504,16 +522,15 @@
@Override
protected Object[] getParameters() {
- boolean intern = ViewPort.INTERNAL_WORKLISTPROVIDER.equals(viewport.getWorklistProvider());
return new Object[]{viewport.getOffset()+1,
Math.min(viewport.getOffset() + pagesize.getObject(), viewport.getTotal()),
- intern ? String.valueOf(viewport.getTotal()) : "?" };
+ viewport.isInternalWorklistProvider() ? String.valueOf(viewport.getTotal()) : "?" };
}
}));
form.clearParent();
}
- private void addMwlScpAetSelection(BaseForm form) {
+ private void addMwlScpAetSelection(final BaseForm form) {
DropDownChoice<String> ch = new DropDownChoice<String>("aetSelect",
viewport.getWorklistProviderModel(), viewport.getWorklistProviderListModel()){
private static final long serialVersionUID = 1L;
@@ -522,7 +539,14 @@
public boolean isVisible() {
return viewport.getWorklistProviderListModel().getObject().size() > 1;
}
- };
+ };
+ ch.add(new AjaxFormComponentUpdatingBehavior("onchange") {
+ private static final long serialVersionUID = 1L;
+
+ protected void onUpdate(AjaxRequestTarget target) {
+ BaseForm.addFormComponentsToAjaxRequestTarget(target, form);
+ }
+ });
form.addComponent(ch);
form.addComponent(new Label("aetSelect.label", new ResourceModel("mw.searchFooter.aetSelect.label")) {
private static final long serialVersionUID = 1L;
@@ -572,9 +596,15 @@
notSearched = false;
log.debug("#### queryMWLItems (found "+current.size()+" items) done in "+(System.currentTimeMillis()-t1)+" ms!");
addAfterQueryComponents(target);
- } catch (Exception x) {
+ } catch (Throwable x) {
log.error("Query MWL failed!", x);
- msgWin.show(target, new ResourceModel("mw.search.msg.queryFailed").wrapOnAssignment(this));
+ if ((x instanceof EJBException) && x.getCause() != null) {
+ x = x.getCause();
+ }
+ if ((x instanceof IllegalArgumentException) && x.getMessage() != null && x.getMessage().indexOf("fuzzy") != -1) {
+ x = new WicketExceptionWithMsgKey("fuzzyError", x);
+ }
+ msgWin.show(target, new WicketExceptionWithMsgKey("mw.search.msg.queryFailed", x), true);
}
}
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ViewPort.java
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ViewPort.java 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/java/org/dcm4chee/web/war/worklist/modality/ViewPort.java 2011-07-08 07:55:11 UTC (rev 15662)
@@ -103,6 +103,10 @@
return worklistProvider.getObject();
}
+ public boolean isInternalWorklistProvider() {
+ return INTERNAL_WORKLISTPROVIDER.equals(getWorklistProvider());
+ }
+
public void clear() {
super.clear();
filter.clear();
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/Mpps2MwlLinkPage$Mpps2MwlLinkPanelM.html
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/Mpps2MwlLinkPage$Mpps2MwlLinkPanelM.html 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/Mpps2MwlLinkPage$Mpps2MwlLinkPanelM.html 2011-07-08 07:55:11 UTC (rev 15662)
@@ -70,6 +70,8 @@
<td></td>
<td>
<div wicket:id="patientName" id="patientName" />
+ <input type="checkbox" id="fuzzyPN" wicket:id="fuzzyPN" />
+ <label for="fuzzyPN" wicket:id="fuzzyPN.label" style="padding-right: 5px;">Fuzzy</label>
</td>
<td>
<div wicket:id="patientID.label">ID</div>
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/StudyListPage.html
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/StudyListPage.html 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/StudyListPage.html 2011-07-08 07:55:11 UTC (rev 15662)
@@ -60,6 +60,8 @@
<td></td>
<td colspan="3">
<div wicket:id="patientName" id="patientName" />
+ <input type="checkbox" id="fuzzyPN" wicket:id="fuzzyPN" />
+ <label for="fuzzyPN" wicket:id="fuzzyPN.label" style="padding-right: 5px;">Fuzzy</label>
</td>
<td class="patid">
<div wicket:id="patientID.label">ID</div>
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/folder-style.css
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/folder-style.css 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/folder-style.css 2011-07-08 07:55:11 UTC (rev 15662)
@@ -10,7 +10,7 @@
td.imageSelect {background-color: white; }
/* PatientName formatting */
-table.search-table .patientField {width:230px;}
+table.search-table .patientField {width:300px;}
table.search-table div.patientField input.patient_fn {width:110px;}
table.search-table div.patient_gn input {width:110px;}
table.search-table div input.patient_full {width:220px;}
@@ -19,6 +19,7 @@
table.search-table div input.patient_fn {width:120px;}
/* Date/Time field formatting */
+table.search-table td.dateTime {width: 140px;}
table.search-table div.dateTimeField span input {width: 69px;}
table.search-table div.dateTimeField span input.timeField {width: 38px;}
/* UID field formatting */
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package.properties
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package.properties 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package.properties 2011-07-08 07:55:11 UTC (rev 15662)
@@ -11,6 +11,8 @@
folder.searchLabels.accessionNumber.label=Accession No
#
folder.searchFields.patientName.tooltip=Patient Name search field
+folder.searchFields.fuzzyPN.label=Fuzzy
+folder.searchFields.fuzzyPN.tooltip=Enable phonetic (fuzzy) search
folder.searchFields.patientID.label=ID
folder.searchFields.patientID.tooltip=Patient ID search field
folder.searchFields.issuerOfPatientID.label=Issuer
@@ -206,6 +208,7 @@
Are you sure you wish to unlink selected MPPS? <br/> \
Selected: {0}
folder.message.reduce=Do you want to delete objects without child objects?
+folder.message.searcherror=Search failed! Reason:${}
# add study window
folder.add.study.text=Add study
@@ -280,3 +283,6 @@
folder.studyview.deselectAllSeries.tooltip=Deselect all Series
folder.dcmfileview.title=DICOM File: ${}
+
+# WicketExceptionWithMsgKey msgKeys
+fuzzyError=Wildcard not supported by fuzzy matching!
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package_de.properties
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package_de.properties 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/folder/package_de.properties 2011-07-08 07:55:11 UTC (rev 15662)
@@ -11,6 +11,8 @@
folder.searchLabels.accessionNumber.label=Auftragsnummer
#
folder.searchFields.patientName.tooltip=Suche nach Patienten Namen. Format: Familienname^Vorname
+folder.searchFields.fuzzyPN.label=Fuzzy
+folder.searchFields.fuzzyPN.tooltip=Phonetische Suche (Fuzzy) aktivieren
folder.searchFields.patientID.label=ID
folder.searchFields.patientID.tooltip=Suche nach Patienten ID
folder.searchFields.issuerOfPatientID.label=Aussteller
@@ -206,6 +208,7 @@
M\xF6chten Sie die Verkn\xFCpfung der MPPS mit Auftr\xE4gen tats\xE4chlich aufheben? <br/> \
Ausgew\xE4hlt: {0}
folder.message.reduce=Wollen Sie Objekte ohne Unterobjekte l\xF6schen?
+folder.message.searcherror=Suche ist fehlgeschlagen! Ursache:${}
# add study window
folder.add.study.text=Studie hinzuf\xFCgen
@@ -280,3 +283,6 @@
folder.studyview.deselectAllSeries.tooltip=Auswahl aller Serien aufheben
folder.dcmfileview.title=DICOM Datei: ${}
+
+# WicketExceptionWithMsgKey msgKeys
+fuzzyError=Wildcard wird von Fuzzy Suche nicht unterst\xFCtzt!
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.html
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.html 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/ModalityWorklistPanel.html 2011-07-08 07:55:11 UTC (rev 15662)
@@ -50,6 +50,8 @@
<td></td>
<td>
<div wicket:id="patientName" id="patientName" />
+ <input type="checkbox" id="fuzzyPN" wicket:id="fuzzyPN" />
+ <label for="fuzzyPN" wicket:id="fuzzyPN.label" style="padding-right: 5px;">Fuzzy</label>
</td>
<td>
<div wicket:id="patientID.label">ID</div>
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package.properties
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package.properties 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package.properties 2011-07-08 07:55:11 UTC (rev 15662)
@@ -11,6 +11,8 @@
mw.searchLabels.accessionNumber.label=Accession No
#
mw.searchFields.patientName.tooltip=Patient name search field
+mw.searchFields.fuzzyPN.label=Fuzzy
+mw.searchFields.fuzzyPN.tooltip=Enable phonetic (fuzzy) search
mw.searchFields.patientID.label=ID
mw.searchFields.patientID.tooltip=Patient ID search field
mw.searchFields.issuerOfPatientID.label=Issuer
@@ -92,3 +94,6 @@
#mw.startDateMax.PatternValidator=Start Date '${input}' does not match required pattern
#date.IConverter=Invalid date
#hours.IConverter=Invalid time
+
+# WicketExceptionWithMsgKey msgKeys
+fuzzyError=Wildcard not supported by fuzzy matching!
Modified: dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package_de.properties
===================================================================
--- dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package_de.properties 2011-07-07 15:43:14 UTC (rev 15661)
+++ dcm4chee/dcm4chee-web/trunk/dcm4chee-web-war/src/main/resources/org/dcm4chee/web/war/worklist/modality/package_de.properties 2011-07-08 07:55:11 UTC (rev 15662)
@@ -11,6 +11,8 @@
mw.searchLabels.accessionNumber.label=Auftragsnummer
#
mw.searchFields.patientName.tooltip=Suche nach Patienten Namen. Format: Familienname^Vorname
+mw.searchFields.fuzzyPN.label=Fuzzy
+mw.searchFields.fuzzyPN.tooltip=Phonetische Suche (Fuzzy) aktivieren
mw.searchFields.patientID.label=ID
mw.searchFields.patientID.tooltip=Suche nach Patienten ID
mw.searchFields.issuerOfPatientID.label=Aussteller
@@ -90,3 +92,6 @@
#Validator
#startDateMax.dateField.PatternValidator=Startdatum '${input}' hat nicht das erforderliche Format
+
+# WicketExceptionWithMsgKey msgKeys
+fuzzyError=Wildcard wird von Fuzzy Suche nicht unterst\xFCtzt!
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|