diff --git a/ccm-cms/src/com/arsdigita/cms/CMSResources.properties b/ccm-cms/src/com/arsdigita/cms/CMSResources.properties index 75f7e3b23..6005932f2 100755 --- a/ccm-cms/src/com/arsdigita/cms/CMSResources.properties +++ b/ccm-cms/src/com/arsdigita/cms/CMSResources.properties @@ -1099,3 +1099,4 @@ cms.ui.item_search.flat.place=Place cms.ui.item_search.flat.type=Type cms.ui.item_search.flatBrowse=Select item cms.ui.category.undeletable=This category can't be deleted. +cms.ui.item_search.flat.filter.submit=Filter diff --git a/ccm-cms/src/com/arsdigita/cms/CMSResources_de.properties b/ccm-cms/src/com/arsdigita/cms/CMSResources_de.properties index 7f714c8e0..557f7c3c1 100755 --- a/ccm-cms/src/com/arsdigita/cms/CMSResources_de.properties +++ b/ccm-cms/src/com/arsdigita/cms/CMSResources_de.properties @@ -1090,3 +1090,4 @@ cms.ui.item_search.flat.place=Ort cms.ui.item_search.flat.type=Typ cms.ui.item_search.flatBrowse=Item ausw\u00e4hlen cms.ui.category.undeletable=Diese Kategorie kann nicht gel\u00f6scht werden. +cms.ui.item_search.flat.filter.submit=Filtern diff --git a/ccm-cms/src/com/arsdigita/cms/CMSResources_en_GB.properties b/ccm-cms/src/com/arsdigita/cms/CMSResources_en_GB.properties index 5d45e2307..2d38bb9e8 100755 --- a/ccm-cms/src/com/arsdigita/cms/CMSResources_en_GB.properties +++ b/ccm-cms/src/com/arsdigita/cms/CMSResources_en_GB.properties @@ -38,3 +38,4 @@ cms.ui.item_search.flat.place=Place cms.ui.item_search.flat.type=Type cms.ui.item_search.flatBrowse=Select item cms.ui.category.undeletable= +cms.ui.item_search.flat.filter.submit= diff --git a/ccm-cms/src/com/arsdigita/cms/CMSResources_fr.properties b/ccm-cms/src/com/arsdigita/cms/CMSResources_fr.properties index 17e31db4d..65ca5858c 100755 --- a/ccm-cms/src/com/arsdigita/cms/CMSResources_fr.properties +++ b/ccm-cms/src/com/arsdigita/cms/CMSResources_fr.properties @@ -569,3 +569,4 @@ cms.ui.item_search.flat.place=Place cms.ui.item_search.flat.type=Type cms.ui.item_search.flatBrowse=Select item cms.ui.category.undeletable= +cms.ui.item_search.flat.filter.submit= diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFlatBrowsePane.java b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFlatBrowsePane.java index 38dc03d93..08a32e031 100644 --- a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFlatBrowsePane.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFlatBrowsePane.java @@ -5,18 +5,23 @@ import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Form; import com.arsdigita.bebop.FormData; import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.GridPanel; import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Link; import com.arsdigita.bebop.Page; import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.PaginationModelBuilder; +import com.arsdigita.bebop.Paginator; +import com.arsdigita.bebop.RequestLocal; +import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.Table; import com.arsdigita.bebop.event.FormInitListener; import com.arsdigita.bebop.event.FormProcessListener; import com.arsdigita.bebop.event.FormSectionEvent; -import com.arsdigita.bebop.event.PrintEvent; -import com.arsdigita.bebop.event.PrintListener; +import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.TextField; import com.arsdigita.bebop.parameters.BigDecimalParameter; +import com.arsdigita.bebop.parameters.ParameterData; import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.bebop.table.TableCellRenderer; import com.arsdigita.bebop.table.TableColumn; @@ -31,11 +36,14 @@ import com.arsdigita.cms.Folder; import com.arsdigita.cms.util.GlobalizationUtil; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.persistence.DataCollection; -import com.arsdigita.persistence.DataObject; +import com.arsdigita.persistence.DataQuery; import com.arsdigita.persistence.Session; import com.arsdigita.persistence.SessionManager; +import com.arsdigita.toolbox.ui.DataQueryBuilder; +import com.arsdigita.toolbox.ui.DataTable; import com.arsdigita.util.LockableImpl; import java.math.BigDecimal; +import org.bouncycastle.asn1.ess.ContentIdentifier; /** * @@ -44,47 +52,36 @@ import java.math.BigDecimal; */ public class ItemSearchFlatBrowsePane extends Form implements FormInitListener, FormProcessListener { - private static final String QUERY_PARAM = "query"; + private static final String QUERY_PARAM = "queryStr"; public static final String WIDGET_PARAM = "widget"; public static final String SEARCHWIDGET_PARAM = "searchWidget"; + public static final String FILTER_SUBMIT = "filterSubmit"; private final Table resultsTable; + private final Paginator paginator; private final StringParameter queryParam; - private final Label jsLabel; - public ItemSearchFlatBrowsePane(final String name) { super(name); + final BoxPanel mainPanel = new BoxPanel(BoxPanel.VERTICAL); + queryParam = new StringParameter(QUERY_PARAM); - final BoxPanel boxPanel = new BoxPanel(BoxPanel.HORIZONTAL); + final BoxPanel boxPanel = new BoxPanel(BoxPanel.HORIZONTAL); boxPanel.add(new Label(GlobalizationUtil.globalize("cms.ui.item_search.flat.filter"))); - final TextField filter = new TextField(new StringParameter(QUERY_PARAM)); - boxPanel.add(filter); - jsLabel = new Label("", false); - jsLabel.addPrintListener(new PrintListener() { - - public void prepare(final PrintEvent event) { - final PageState state = event.getPageState(); - final String searchWidget = (String) state.getValue(new StringParameter(SEARCHWIDGET_PARAM)); - ((Label)event.getTarget()).setLabel(String.format( - " ", - filter.getName(), - searchWidget)); - - } - }); - boxPanel.add(jsLabel); - add(boxPanel); + final TextField filter = new TextField(new StringParameter(QUERY_PARAM)); + boxPanel.add(filter); + boxPanel.add(new Submit(FILTER_SUBMIT, GlobalizationUtil.globalize("cms.ui.item_search.flat.filter.submit"))); + mainPanel.add(boxPanel); resultsTable = new ResultsTable(); - add(resultsTable); - + paginator = new Paginator((PaginationModelBuilder) resultsTable.getModelBuilder(), 5); + mainPanel.add(paginator); + + mainPanel.add(resultsTable); + + add(mainPanel); + addInitListener(this); addProcessListener(this); } @@ -95,8 +92,15 @@ public class ItemSearchFlatBrowsePane extends Form implements FormInitListener, page.addComponentStateParam(this, queryParam); } - public void init(final FormSectionEvent fse) throws FormProcessException { - + public void init(final FormSectionEvent fse) throws FormProcessException { + final PageState state = fse.getPageState(); + final FormData data = fse.getFormData(); + + final String query = (String) data.get(QUERY_PARAM); + if ((query == null) || query.isEmpty()) { + data.setParameter(QUERY_PARAM, + new ParameterData(queryParam, state.getValue(new StringParameter(ItemSearchPopup.QUERY)))); + } } public void process(final FormSectionEvent fse) throws FormProcessException { @@ -104,6 +108,7 @@ public class ItemSearchFlatBrowsePane extends Form implements FormInitListener, final PageState state = fse.getPageState(); state.setValue(queryParam, data.get(QUERY_PARAM)); + state.setValue(new StringParameter(ItemSearchPopup.QUERY), data.get(QUERY_PARAM)); } private class ResultsTable extends Table { @@ -115,6 +120,7 @@ public class ItemSearchFlatBrowsePane extends Form implements FormInitListener, public ResultsTable() { super(); setEmptyView(new Label(GlobalizationUtil.globalize("cms.ui.item_search.flat.no_items"))); + setClassAttr("dataTable"); final TableColumnModel columnModel = getColumnModel(); columnModel.add(new TableColumn(0, @@ -128,16 +134,61 @@ public class ItemSearchFlatBrowsePane extends Form implements FormInitListener, TABLE_COL_TYPE)); setModelBuilder(new ResultsTableModelBuilder()); - + columnModel.get(0).setCellRenderer(new TitleCellRenderer()); } } - private class ResultsTableModelBuilder extends LockableImpl implements TableModelBuilder { + private class ResultsTableModelBuilder extends LockableImpl implements TableModelBuilder, PaginationModelBuilder { + + //private DataCollection collection; + private RequestLocal collection = new RequestLocal(); public TableModel makeModel(final Table table, final PageState state) { - return new ResultsTableModel(table, state); + + if (collection.get(state) == null) { + query(state); + } + + ((DataCollection) collection.get(state)).setRange(paginator.getFirst(state), paginator.getLast(state) + 1); + + return new ResultsTableModel(table, state, (DataCollection) collection.get(state)); + } + + public int getTotalSize(final Paginator paginator, final PageState state) { + if (collection.get(state) == null) { + query(state); + } + + //((DataCollection)collection.get(state)).setRange(paginator.getFirst(state), paginator.getLast(state) + 1); + + return (int) ((DataCollection)collection.get(state)).size(); + } + + public boolean isVisible(PageState state) { + return true; + } + + private void query(final PageState state) { + final Session session = SessionManager.getSession(); + final BigDecimal typeId = (BigDecimal) state.getValue(new BigDecimalParameter(ItemSearch.SINGLE_TYPE_PARAM)); + if (typeId == null) { + collection.set(state, session.retrieve(ContentPage.BASE_DATA_OBJECT_TYPE)); + } else { + final ContentType type = new ContentType(typeId); + collection.set(state, session.retrieve(type.getClassName())); + } + + final String query = (String) state.getValue(queryParam); + if ((query != null) && !query.isEmpty()) { + ((DataCollection)collection.get(state)).addFilter(String.format( + "(lower(%s) like lower('%%%s%%')) or (lower(%s) like lower('%%%s%%'))", + ContentItem.NAME, query, + ContentPage.TITLE, query)); + } + + ((DataCollection) collection.get(state)).addOrder("title asc, name asc"); } } @@ -148,23 +199,22 @@ public class ItemSearchFlatBrowsePane extends Form implements FormInitListener, private final DataCollection collection; private ContentItem currentItem; - public ResultsTableModel(final Table table, final PageState state) { + public ResultsTableModel(final Table table, final PageState state, final DataCollection collection) { this.table = table; - final Session session = SessionManager.getSession(); - final BigDecimal typeId = (BigDecimal) state.getValue(new BigDecimalParameter(ItemSearch.SINGLE_TYPE_PARAM)); - if (typeId == null) { - collection = session.retrieve(ContentPage.BASE_DATA_OBJECT_TYPE); - } else { - final ContentType type = new ContentType(typeId); - collection = session.retrieve(type.getClassName()); - } - final String query = (String) state.getValue(queryParam); - if ((query != null) && !query.isEmpty()) { - collection.addFilter(String.format("(lower(%s) like lower('%%%s%%')) or (lower(%s) like lower('%%%s%%'))", - ContentItem.NAME, query, - ContentPage.TITLE, query)); + this.collection = collection; + + /* + * final Session session = SessionManager.getSession(); final BigDecimal typeId = (BigDecimal) + * state.getValue(new BigDecimalParameter(ItemSearch.SINGLE_TYPE_PARAM)); if (typeId == null) { collection = + * session.retrieve(ContentPage.BASE_DATA_OBJECT_TYPE); } else { final ContentType type = new + * ContentType(typeId); collection = session.retrieve(type.getClassName()); } + * + * final String query = (String) state.getValue(queryParam); if ((query != null) && !query.isEmpty()) { + * collection.addFilter(String.format( "(lower(%s) like lower('%%%s%%')) or (lower(%s) like + * lower('%%%s%%'))", ContentItem.NAME, query, ContentPage.TITLE, query)); } + */ } public int getColumnCount() { @@ -227,35 +277,39 @@ public class ItemSearchFlatBrowsePane extends Form implements FormInitListener, public Object getKeyAt(final int columnIndex) { return currentItem.getID(); } + } - + private class TitleCellRenderer extends LockableImpl implements TableCellRenderer { - public Component getComponent(final Table table, - final PageState state, - final Object value, - final boolean isSelected, + public Component getComponent(final Table table, + final PageState state, + final Object value, + final boolean isSelected, final Object key, - final int row, + final int row, final int column) { + + if (value == null) { + return new Label("???"); + } + final Link link = new Link(value.toString(), ""); - + final String widget = (String) state.getValue(new StringParameter(WIDGET_PARAM)); final String searchWidget = (String) state.getValue(new StringParameter(SEARCHWIDGET_PARAM)); - + final ContentPage page = new ContentPage((BigDecimal) key); - + link.setOnClick(String.format( "window.opener.document.%s.value=\"%s\";window.opener.document.%s.value=\"%s\";self.close();return false;", - widget, - key.toString(), - searchWidget, - page.getTitle())); - + widget, + key.toString(), + searchWidget, + page.getTitle())); + return link; } - - - + } } diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java index 10414a823..1e960fc2d 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java @@ -43,6 +43,7 @@ import com.arsdigita.bebop.table.TableModel; import com.arsdigita.bebop.util.BebopConstants; import com.arsdigita.cms.CMS; import com.arsdigita.cms.ContentItem; +import com.arsdigita.cms.ContentPage; import com.arsdigita.cms.ContentSection; import com.arsdigita.cms.ContentType; import com.arsdigita.cms.Folder; @@ -347,6 +348,7 @@ public class ItemSearchFolderBrowser extends Table { String widget = (String) state.getValue(new StringParameter( ItemSearchPopup.WIDGET_PARAM)); + String searchWidget = (String) state.getValue(new StringParameter("searchWidget")); boolean useURL = "true".equals(state.getValue(new StringParameter( ItemSearchPopup.URL_PARAM))); @@ -358,9 +360,9 @@ public class ItemSearchFolderBrowser extends Table { getDomainObject().getOID()) : id + " (" + name + ")"; + String title = ((ContentPage) coll.getDomainObject()).getTitle(); - Label js = new Label(generateJSLabel(id, widget, - fillString), + Label js = new Label(generateJSLabel(id, widget, searchWidget, fillString, title), false); container.add(js); @@ -377,15 +379,13 @@ public class ItemSearchFolderBrowser extends Table { } } - private String generateJSLabel(BigDecimal id, String widget, String fill) { + private String generateJSLabel(BigDecimal id, String widget, String searchWidget, String fill, String title) { StringBuilder buffer = new StringBuilder(); - buffer.append(" "; + + " \n" + + " "; } + } } diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java index 52c9357c0..c56f5ad78 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java @@ -85,6 +85,7 @@ public class ItemSearchWidget extends FormSection //this.setReadOnly(); this.setSize(35); } + } private class SearchFragment extends Submit { @@ -105,6 +106,7 @@ public class ItemSearchWidget extends FormSection || parent.m_searchComponent.hasQuery(ps)) && super.isVisible(ps)); } + } private class ClearFragment extends Submit { @@ -118,6 +120,7 @@ public class ItemSearchWidget extends FormSection + ".value = \"\"; return false;"); this.setAttribute("value", "Clear"); } + } private class LabelFragment extends Label { @@ -129,6 +132,7 @@ public class ItemSearchWidget extends FormSection super(name, escaping); this.parent = parent; } + } private class ItemSearchFragment extends ItemSearchSectionInline { @@ -156,6 +160,7 @@ public class ItemSearchWidget extends FormSection || hasQuery(ps)) && super.isVisible(ps)); } + } private class HRLabel extends Label { @@ -170,6 +175,7 @@ public class ItemSearchWidget extends FormSection || m_searchComponent.hasQuery(ps)) && super.isVisible(ps)); } + } /** @@ -204,7 +210,7 @@ public class ItemSearchWidget extends FormSection } else { typeURLFrag = null; } - + m_searchModel = new StringParameter(SEARCH); m_contentType = contentType; @@ -226,7 +232,7 @@ public class ItemSearchWidget extends FormSection CMS.getContext().getContentSection().getID()); params.setParameter("widget", formName + ".elements['" + m_selected. //m_item. getName() + "']"); - params.setParameter("searchWidget", formName + ".elements['" + m_item.getName() + "']"); + params.setParameter("searchWidget", formName + ".elements['" + m_item.getName() + "']"); if (typeURLFrag != null) { params.setParameter("single_type", typeURLFrag); } @@ -248,13 +254,15 @@ public class ItemSearchWidget extends FormSection //+ m_item.getName().replace('.', '_') + m_selected.getName().replace('.', '_') + "Popup(theForm) { \n" - + " aWindow = window.open(\"" + url + "\", " - + "\"search\", \"toolbar=no,width=800,height=600,status=no,scrollbars=yes,resize=yes\");\n" + + " aWindow = window.open(\"" + url + "&query=\" + document.getElementById('" + m_item.getName() + "').value , " + //+ "\"search\", \"toolbar=no,width=800,height=600,status=no,scrollbars=yes,resize=yes\");\n" + + "\"search\", \"toolbar=yes,width=\" + screen.width*0.5 + \",height=\" + screen.height*0.5 + \",status=no,scrollbars=yes,resize=yes\");\n" + "return false;\n" + " } \n" + " --> \n" + " "); } + }); m_topHR = new HRLabel(); add(m_topHR); @@ -417,4 +425,5 @@ public class ItemSearchWidget extends FormSection } } } + }