From 12571689ab13480f23e4c1c41d9ef0e5d5f9029c Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Fri, 3 May 2013 15:24:38 +0200 Subject: [PATCH] OO-535: implements extended search, save the state in gui preferences --- .../admin/sysinfo/model/SessionsStats.java | 19 + .../admin/sysinfo/model/UserSessionView.java | 19 + .../core/_i18n/LocalStrings_de.properties | 1 + .../form/flexible/FormUIFactory.java | 11 +- .../flexible/elements/FlexiTableElement.java | 13 + .../flexible/impl/FormBasicController.java | 1 - .../table/AbstractFlexiTableRenderer.java | 3 + .../DefaultFlexiTableDataSourceModel.java | 10 +- .../ExtendedFlexiTableSearchController.java | 36 ++ .../table/FlexiDataTablesRenderer.java | 14 +- .../elements/table/FlexiTableDataSource.java | 4 + .../elements/table/FlexiTableElementImpl.java | 100 +++- .../generic/modal/ButtonClickedEvent.java | 4 +- .../generic/modal/DialogBoxController.java | 2 +- .../manager/QuestionItemDocumentFactory.java | 7 +- .../manager/QuestionPoolServiceImpl.java | 35 +- .../modules/qpool/model/QItemDocument.java | 2 +- .../qpool/model/SearchQuestionItemParams.java | 22 + .../qpool/ui/AbstractItemListController.java | 16 +- .../ui/CollectionQuestionsController.java | 2 +- .../modules/qpool/ui/ItemListController.java | 2 +- .../modules/qpool/ui/PoolsController.java | 1 + .../ui/QuestionItemDetailsController.java | 1 + .../qpool/ui/QuestionListController.java | 6 +- .../ui/QuestionPoolMainEditorController.java | 11 +- .../modules/qpool/ui/QuestionsController.java | 4 +- .../olat/modules/qpool/ui/_content/items.html | 9 +- .../qpool/ui/_i18n/LocalStrings_de.properties | 4 +- .../qpool/ui/admin/PoolEditController.java | 2 +- .../qpool/ui/admin/PoolsAdminController.java | 2 +- .../QEducationalContextEditController.java | 2 +- .../QEducationalContextsAdminController.java | 2 +- .../ui/admin/QItemTypeEditController.java | 2 +- .../ui/admin/QItemTypesAdminController.java | 2 +- .../ui/admin/QLicenseEditController.java | 2 +- .../ui/admin/QLicensesAdminController.java | 2 +- .../ui/admin/TaxonomyAdminController.java | 2 +- .../ui/admin/TaxonomyLevelController.java | 2 +- .../ui/admin/TaxonomyLevelEditController.java | 2 +- .../datasource/CollectionOfItemsSource.java | 1 + .../ui/datasource/DefaultItemsSource.java | 1 + .../ui/datasource/SharedItemsSource.java | 1 + .../ui/{edit => events}/QItemEdited.java | 2 +- .../EducationalMetadataController.java | 6 +- .../EducationalMetadataEditController.java | 7 +- .../ui/metadata/ExtendedSearchController.java | 538 ++++++++++++++++++ .../qpool/ui/metadata/ExtendedSearchPref.java | 62 ++ .../ui/metadata/ExtendedSearchPrefs.java | 44 ++ .../GeneralMetadataController.java | 6 +- .../GeneralMetadataEditController.java | 10 +- .../LifecycleMetadataController.java | 6 +- .../LifecycleMetadataEditController.java | 11 +- .../ui/{edit => metadata}/MetaUIFactory.java | 65 ++- .../MetadataBulkChangeController.java | 62 +- .../{ => metadata}/MetadatasController.java | 23 +- .../QuestionMetadataController.java | 6 +- .../QuestionMetadataEditController.java | 16 +- .../RightsMetadataController.java | 6 +- .../RightsMetadataEditController.java | 9 +- .../{edit => metadata}/SharingController.java | 6 +- .../TechnicalMetadataController.java | 6 +- .../TechnicalMetadataEditController.java | 11 +- .../_content/author_list.html | 0 .../_content/bulk_change.html | 0 .../_content/edit_edu_context.html | 0 .../ui/metadata/_content/extended_search.html | 11 + .../_content/item_metadatas.html | 0 .../_content/learning_time.html | 0 .../{edit => metadata}/_content/sharing.html | 0 .../ui/{edit => metadata}/_content/view.html | 0 .../ui/wizard/ExportOverviewController.java | 2 +- .../search/service/SearchServiceImpl.java | 2 +- .../search/service/indexer/JmsIndexWork.java | 16 +- .../search/service/indexer/JmsIndexer.java | 58 +- .../service/indexer/LifeFullIndexer.java | 13 + .../search/service/indexer/LifeIndexer.java | 2 + .../service/indexer/QuestionItemIndexer.java | 7 + .../themes/openolat/all/modules/_dialogs.scss | 3 +- .../arquillian/DroneStudentExtension.java | 19 + .../arquillian/StudentConfiguration.java | 19 + .../browser/arquillian/StudentFactory.java | 22 +- 81 files changed, 1262 insertions(+), 198 deletions(-) create mode 100644 src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java rename src/main/java/org/olat/modules/qpool/ui/{edit => events}/QItemEdited.java (96%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/EducationalMetadataController.java (95%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/EducationalMetadataEditController.java (95%) create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/GeneralMetadataController.java (95%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/GeneralMetadataEditController.java (96%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/LifecycleMetadataController.java (94%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/LifecycleMetadataEditController.java (90%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/MetaUIFactory.java (65%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/MetadataBulkChangeController.java (90%) rename src/main/java/org/olat/modules/qpool/ui/{ => metadata}/MetadatasController.java (90%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/QuestionMetadataController.java (95%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/QuestionMetadataEditController.java (89%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/RightsMetadataController.java (96%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/RightsMetadataEditController.java (96%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/SharingController.java (97%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/TechnicalMetadataController.java (95%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/TechnicalMetadataEditController.java (91%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/author_list.html (100%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/bulk_change.html (100%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/edit_edu_context.html (100%) create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html rename src/main/java/org/olat/modules/qpool/ui/{ => metadata}/_content/item_metadatas.html (100%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/learning_time.html (100%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/sharing.html (100%) rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/view.html (100%) diff --git a/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java b/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java index c3d971e1c90..aff233fb64f 100644 --- a/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java +++ b/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java @@ -1,3 +1,22 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ package org.olat.admin.sysinfo.model; public class SessionsStats { diff --git a/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java b/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java index b4e0b567d31..6adb7bb8c10 100644 --- a/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java +++ b/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java @@ -1,3 +1,22 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ package org.olat.admin.sysinfo.model; import java.util.Date; diff --git a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties index 75940b27c1b..6ed1263a5f8 100644 --- a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties @@ -60,6 +60,7 @@ rating.explanation=Klicken Sie um zu bewerten save=Speichern savesas=Speichern unter search=Suchen +extsearch=Erweiterte Suche select=Ausw\u00E4hlen server.no.response.title=Kommunikationsfehler server.no.response=Die Aktion konnte nicht ausgeführt werden da der Server nicht antwortet oder überlastet ist. Versuchen Sie die Aktion erneut durchzuführen oder laden Sie die Seite neu. diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java b/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java index f01d4df4c63..70e8f3f9999 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java @@ -68,7 +68,6 @@ import org.olat.core.gui.components.form.flexible.impl.elements.TextBoxListEleme import org.olat.core.gui.components.form.flexible.impl.elements.TextElementImpl; import org.olat.core.gui.components.form.flexible.impl.elements.richText.RichTextElementImpl; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModel; -import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataSource; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableElementImpl; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.tree.TreeModel; @@ -905,22 +904,22 @@ public class FormUIFactory { * @param formLayout * @return */ - public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel tableModel, FormItemContainer formLayout) { + public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel, FormItemContainer formLayout) { FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name,tableModel); formLayout.add(fte); return fte; } - public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel tableModel, + public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel, Translator translator, FormItemContainer formLayout) { FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name, translator, tableModel); formLayout.add(fte); return fte; } - public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel tableModel, - int pageSize, boolean search, Translator translator, FormItemContainer formLayout) { - FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name, translator, tableModel, pageSize, search); + public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel, + int pageSize, Translator translator, FormItemContainer formLayout) { + FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name, translator, tableModel, pageSize); formLayout.add(fte); return fte; } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java index ab00a811fa1..d404e767608 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java @@ -28,6 +28,7 @@ package org.olat.core.gui.components.form.flexible.elements; import java.util.Set; import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.impl.elements.table.ExtendedFlexiTableSearchController; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRendererType; /** @@ -95,6 +96,18 @@ public interface FlexiTableElement extends FormItem { */ public boolean isSearchEnabled(); + /** + * Enable the search field + * @param enable + */ + public void setSearchEnabled(boolean enable); + + /** + * + * @param callout + */ + public void setExtendedSearchCallout(ExtendedFlexiTableSearchController callout); + /** * Return the page size diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java index f6e7ab9750e..1d96ca79008 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java @@ -32,7 +32,6 @@ import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.FormUIFactory; -import org.olat.core.gui.components.form.flexible.elements.InlineElement; import org.olat.core.gui.components.panel.Panel; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Disposable; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java index ee208995892..5ab27eec916 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java @@ -75,6 +75,9 @@ public abstract class AbstractFlexiTableRenderer implements ComponentRenderer { renderFormItem(renderer, sb, ftE.getSearchElement(), ubu, translator, renderResult, args); renderFormItem(renderer, sb, ftE.getSearchButton(), ubu, translator, renderResult, args); } + if(ftE.getExtendedSearchButton() != null) { + renderFormItem(renderer, sb, ftE.getExtendedSearchButton(), ubu, translator, renderResult, args); + } renderFormItem(renderer, sb, ftE.getCustomButton(), ubu, translator, renderResult, args); } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java index 26d8e1451f6..1b335279832 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java @@ -129,6 +129,14 @@ public abstract class DefaultFlexiTableDataSourceModel<U> implements FlexiTableD return rows != null && row >= 0 && row < rows.size(); } + @Override + public void clear() { + rowCount = 0; + if(rows != null) { + rows.clear(); + } + } + @Override public ResultInfos<U> load(final int firstResult, final int maxResults, SortKey... orderBy) { return loadDatas(null, null, false, firstResult, maxResults, orderBy); @@ -177,7 +185,7 @@ public abstract class DefaultFlexiTableDataSourceModel<U> implements FlexiTableD int correctedFirstResult = firstResult; int correctMaxResults = maxResults; - + if(!force && rows.size() > 0) { correctMaxResults = maxResults <= 0 ? rowCount : maxResults; int maxRowsResults = maxResults <= 0 ? rows.size() : maxResults; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java new file mode 100644 index 00000000000..d5d4e45d9a6 --- /dev/null +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java @@ -0,0 +1,36 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.core.gui.components.form.flexible.impl.elements.table; + +import java.util.List; + +import org.olat.core.gui.control.Controller; + +/** + * + * Initial date: 03.05.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface ExtendedFlexiTableSearchController extends Controller { + + public List<String> getConditionalQueries(); + +} diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java index 4d5f4df67d5..194b8e16fd7 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java @@ -79,7 +79,7 @@ class FlexiDataTablesRenderer extends AbstractFlexiTableRenderer implements Comp .append(" 'bScrollInfinite': true,\n") .append(" 'bScrollCollapse': true,\n") .append(" 'bFilter': false,\n") - .append(" 'sScrollY': '200px',\n") + .append(" 'sScrollY': '1px',\n") .append(" 'bProcessing': true,\n") .append(" 'bServerSide': true,\n") .append(" 'iDisplayLength': ").append(ftE.getPageSize()).append(",\n") @@ -115,7 +115,17 @@ class FlexiDataTablesRenderer extends AbstractFlexiTableRenderer implements Comp .append("', bSortable: ").append(col.isSortable()).append(" }\n"); } } - target.append(" ]\n") + target.append(" ],\n") + .append(" fnInitComplete: function (oSettings, json) {\n") + .append(" if(selectedIndex < 0) return;\n") + .append(" var scrollTo = 0;\n") + .append(" jQuery('#").append(id).append(" tbody tr').each(function(index, el) { ") + .append(" if(index < selectedIndex) {\n") + .append(" scrollTo += jQuery(el).outerHeight();\n") + .append(" }\n") + .append(" });\n") + .append(" jQuery('#").append(id).append("').parent().scrollTop(scrollTo - 40);\n") + .append(" }\n") .append(" });\n") //clic rows .append(" jQuery('#").append(id).append(" tbody').click(function(event, ui) {\n") diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java index e570e68fa48..f7d129fbe00 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java @@ -32,6 +32,10 @@ import org.olat.core.commons.persistence.SortKey; */ public interface FlexiTableDataSource<U> extends FlexiTableDataModel<U> { + /** + * Remove all elements of the model + */ + public void clear(); /** * Load the rows needed for paging diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java index 55dda2c90e0..e1244189002 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java @@ -74,12 +74,13 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle private int currentPage; private int currentFirstResult; private int pageSize; - private boolean searchField; + private boolean searchEnabled; private boolean selectAllEnabled; private FormLink customButton; - private FormLink searchButton; + private FormLink searchButton, extendedSearchButton; private TextElement searchFieldEl; + private ExtendedFlexiTableSearchController extendedSearchCtrl; private final FlexiTableDataModel<?> dataModel; private FlexiTableDataSource<?> dataSource; @@ -95,15 +96,15 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle private Map<String,FormItem> components = new HashMap<String,FormItem>(); public FlexiTableElementImpl(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel) { - this(ureq, wControl, name, null, tableModel, -1, false); + this(ureq, wControl, name, null, tableModel, -1); } public FlexiTableElementImpl(UserRequest ureq, WindowControl wControl, String name, Translator translator, FlexiTableDataModel<?> tableModel) { - this(ureq, wControl, name, translator, tableModel, -1, false); + this(ureq, wControl, name, translator, tableModel, -1); } public FlexiTableElementImpl(UserRequest ureq, WindowControl wControl, String name, Translator translator, - FlexiTableDataModel<?> tableModel, int pageSize, boolean searchField) { + FlexiTableDataModel<?> tableModel, int pageSize) { super(name); this.wControl = wControl; this.dataModel = tableModel; @@ -121,17 +122,6 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle mapperUrl = mapper.register(ureq.getUserSession(), new FlexiTableModelMapper(component)); String dispatchId = component.getDispatchID(); - this.searchField = searchField; - if(searchField) { - searchFieldEl = new TextElementImpl(dispatchId + "_searchField", "search", ""); - searchFieldEl.showLabel(false); - components.put("rSearch", searchFieldEl); - searchButton = new FormLinkImpl(dispatchId + "_searchButton", "rSearchButton", "search", Link.BUTTON); - searchButton.setTranslator(translator); - searchButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only o_fulltext_search_button"); - components.put("rSearchB", searchButton); - } - customButton = new FormLinkImpl(dispatchId + "_customButton", "rCustomButton", "search", Link.BUTTON); customButton.setTranslator(translator); customButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only b_table_prefs"); @@ -168,7 +158,47 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle @Override public boolean isSearchEnabled() { - return searchField; + return searchEnabled; + } + + public void setSearchEnabled(boolean enable) { + this.searchEnabled = enable; + if(searchEnabled) { + String dispatchId = component.getDispatchID(); + searchFieldEl = new TextElementImpl(dispatchId + "_searchField", "search", ""); + searchFieldEl.showLabel(false); + components.put("rSearch", searchFieldEl); + searchButton = new FormLinkImpl(dispatchId + "_searchButton", "rSearchButton", "search", Link.BUTTON); + searchButton.setTranslator(translator); + searchButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only o_fulltext_search_button"); + components.put("rSearchB", searchButton); + rootFormAvailable(searchFieldEl); + rootFormAvailable(searchButton); + } else { + components.remove("rSearch"); + components.remove("rSearchB"); + searchFieldEl = null; + searchButton = null; + } + } + + public FormLink getExtendedSearchButton() { + return extendedSearchButton; + } + + @Override + public void setExtendedSearchCallout(ExtendedFlexiTableSearchController callout) { + extendedSearchCtrl = callout; + if(extendedSearchCtrl != null) { + extendedSearchCtrl.addControllerListener(this); + + String dispatchId = component.getDispatchID(); + extendedSearchButton = new FormLinkImpl(dispatchId + "_extSearchButton", "rExtSearchButton", "extsearch", Link.BUTTON); + extendedSearchButton.setTranslator(translator); + //extendedSearchButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only o_fulltext_search_button"); + components.put("rExtSearchB", extendedSearchButton); + rootFormAvailable(extendedSearchButton); + } } @Override @@ -287,6 +317,9 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } else if(searchButton != null && searchButton.getFormDispatchId().equals(dispatchuri)) { evalSearchRequest(ureq); + } else if(extendedSearchButton != null + && extendedSearchButton.getFormDispatchId().equals(dispatchuri)) { + openExtendedSearch(ureq); } else if(dispatchuri != null && select != null && select.equals("checkall")) { doSelectAll(); } else if(dispatchuri != null && select != null && select.equals("uncheckall")) { @@ -313,6 +346,12 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle public void dispatchEvent(UserRequest ureq, Controller source, Event event) { if(source == callout) { //System.out.println("dispatchEvent (Controller): " + source); + } else if(source == extendedSearchCtrl) { + if(event == Event.CANCELLED_EVENT) { + callout.deactivate(); + } else if(event == Event.DONE_EVENT) { + evalExtendedSearch(ureq); + } } } @@ -324,6 +363,13 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle callout.deactivate(); } } + + protected void openExtendedSearch(UserRequest ureq) { + callout = new CloseableCalloutWindowController(ureq, wControl, extendedSearchCtrl.getInitialComponent(), + extendedSearchButton, "Search", true, "o_sel_flexi_search_callout"); + callout.activate(); + callout.addControllerListener(this); + } protected void customizeCallout(UserRequest ureq) { Choice choice = getColumnListAndTheirVisibility(); @@ -362,12 +408,22 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle return choice; } + protected void evalExtendedSearch(UserRequest ureq) { + String search = null; + if(searchFieldEl != null) { + searchFieldEl.evalFormRequest(ureq); + search = searchFieldEl.getValue(); + } + List<String> condQueries = extendedSearchCtrl.getConditionalQueries(); + doSearch(ureq, search, condQueries); + } + protected void evalSearchRequest(UserRequest ureq) { if(searchFieldEl == null) return;//this a default behavior which can occur without the search configured searchFieldEl.evalFormRequest(ureq); String search = searchFieldEl.getValue(); if(StringHelper.containsNonWhitespace(search)) { - doSearch(ureq, search); + doSearch(ureq, search, null); } else { doResetSearch(ureq); } @@ -395,16 +451,18 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle getRootForm().fireFormEvent(ureq, new SelectionEvent(action, index, this, FormEvent.ONCLICK)); } - protected void doSearch(UserRequest ureq, String search) { + protected void doSearch(UserRequest ureq, String search, List<String> condQueries) { if(dataSource != null) { resetInternComponents(); - dataSource.search(search, null, 0, getPageSize()); + dataSource.clear(); + dataSource.search(search, condQueries, 0, getPageSize()); } } protected void doResetSearch(UserRequest ureq) { if(dataSource != null) { resetInternComponents(); + dataSource.clear(); dataSource.load(0, getPageSize()); } } @@ -463,6 +521,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle if(searchFieldEl != null) searchFieldEl.validate(validationResults); if(searchButton != null) searchButton.validate(validationResults); if(customButton != null) customButton.validate(validationResults); + if(extendedSearchButton != null) extendedSearchButton.validate(validationResults); } @Override @@ -497,6 +556,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle rootFormAvailable(searchFieldEl); rootFormAvailable(searchButton); rootFormAvailable(customButton); + rootFormAvailable(extendedSearchButton); } private final void rootFormAvailable(FormItem item) { diff --git a/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java b/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java index dd81c03664e..56f232b0b34 100644 --- a/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java +++ b/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java @@ -57,7 +57,9 @@ import org.olat.core.gui.control.Event; * @author Florian Gnaegi, frentix GmbH, http://www.frentix.com */ public class ButtonClickedEvent extends Event { - int position; + + private static final long serialVersionUID = -2308172939734041300L; + private int position; /** * Constructor diff --git a/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java b/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java index 1689977d0c6..f8e93dcba98 100644 --- a/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java +++ b/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java @@ -94,7 +94,7 @@ public class DialogBoxController extends BasicController { // add content to velocity dialogBoxVC.contextPut("text", text); // add optional buttons to velocity - List buttons = new ArrayList(); + List<String> buttons = new ArrayList<String>(); if (buttonLabels != null) { for (int i = 0; i < buttonLabels.size(); i++) { String buttonText = buttonLabels.get(i); diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java index 7bcf754f3db..ad4a04f03d5 100644 --- a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java +++ b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java @@ -64,6 +64,9 @@ public class QuestionItemDocumentFactory { @Autowired private QPoolService qpoolService; + public String getResourceUrl(Long itemKey) { + return "[QuestionItem:" + itemKey + "]"; + } public Document createDocument(SearchResourceContext searchResourceContext, Long itemKey) { QuestionItemFull item = questionItemDao.loadById(itemKey); @@ -80,7 +83,7 @@ public class QuestionItemDocumentFactory { oDocument.setLastChange(item.getLastModified()); oDocument.setTitle(item.getTitle()); oDocument.setDescription(item.getDescription()); - oDocument.setResourceUrl("[QuestionItem:" + item.getKey() + "]"); + oDocument.setResourceUrl(getResourceUrl(item.getKey())); oDocument.setDocumentType(QItemDocument.TYPE); oDocument.setCssIcon("o_qitem_icon"); oDocument.setParentContextType(searchResourceContext.getParentContextType()); @@ -173,7 +176,7 @@ public class QuestionItemDocumentFactory { if(StringHelper.containsNonWhitespace(path)) { for(StringTokenizer tokenizer = new StringTokenizer(path, "/"); tokenizer.hasMoreTokens(); ) { String nextToken = tokenizer.nextToken(); - document.add(new TextField(QItemDocument.STUDY_FIELD, nextToken, Field.Store.NO)); + document.add(new TextField(QItemDocument.TAXONOMIC_PATH_FIELD, nextToken, Field.Store.NO)); } } return document; diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java b/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java index 2a695dc747f..ba841009d76 100644 --- a/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java +++ b/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java @@ -38,7 +38,6 @@ import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.olat.core.util.StringHelper; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; @@ -119,6 +118,10 @@ public class QuestionPoolServiceImpl implements QPoolService { collectionDao.deleteItemFromCollections(items); //TODO unmark questionItemDao.delete(items); + + for(QuestionItemShort item:items) { + lifeIndexer.deleteDocument(QItemDocument.TYPE, item.getKey()); + } } @Override @@ -378,10 +381,13 @@ public class QuestionPoolServiceImpl implements QPoolService { } private ResultInfos<QuestionItemView> getItemsByPool(SearchQuestionItemParams searchParams, int firstResult, int maxResults, SortKey... orderBy) { - if(StringHelper.containsNonWhitespace(searchParams.getSearchString())) { + if(searchParams.isFulltextSearch()) { try { String queryString = searchParams.getSearchString(); List<String> condQueries = new ArrayList<String>(); + if(searchParams.getCondQueries() != null) { + condQueries.addAll(searchParams.getCondQueries()); + } condQueries.add("pool:" + searchParams.getPoolKey()); List<Long> results = searchClient.doSearch(queryString, condQueries, searchParams.getIdentity(), searchParams.getRoles(), firstResult, 10000, orderBy); @@ -406,10 +412,13 @@ public class QuestionPoolServiceImpl implements QPoolService { private ResultInfos<QuestionItemView> searchByAuthor(SearchQuestionItemParams searchParams, int firstResult, int maxResults, SortKey... orderBy) { Identity author = searchParams.getAuthor(); - if(StringHelper.containsNonWhitespace(searchParams.getSearchString())) { + if(searchParams.isFulltextSearch()) { try { String queryString = searchParams.getSearchString(); List<String> condQueries = new ArrayList<String>(); + if(searchParams.getCondQueries() != null) { + condQueries.addAll(searchParams.getCondQueries()); + } condQueries.add(QItemDocument.OWNER_FIELD + ":" + author.getKey()); List<Long> results = searchClient.doSearch(queryString, condQueries, searchParams.getIdentity(), searchParams.getRoles(), firstResult, 10000, orderBy); @@ -443,13 +452,16 @@ public class QuestionPoolServiceImpl implements QPoolService { */ private ResultInfos<QuestionItemView> searchFavorits(SearchQuestionItemParams searchParams, int firstResult, int maxResults, SortKey... orderBy) { - if(StringHelper.containsNonWhitespace(searchParams.getSearchString())) { + if(searchParams.isFulltextSearch()) { try { //filter with all favorits List<Long> favoritKeys = questionItemDao.getFavoritKeys(searchParams.getIdentity()); String queryString = searchParams.getSearchString(); List<String> condQueries = new ArrayList<String>(); + if(searchParams.getCondQueries() != null) { + condQueries.addAll(searchParams.getCondQueries()); + } condQueries.add(getDbKeyConditionalQuery(favoritKeys)); List<Long> results = searchClient.doSearch(queryString, condQueries, searchParams.getIdentity(), searchParams.getRoles(), firstResult, maxResults * 5, orderBy); @@ -514,10 +526,13 @@ public class QuestionPoolServiceImpl implements QPoolService { public ResultInfos<QuestionItemView> getSharedItemByResource(OLATResource resource, SearchQuestionItemParams searchParams, int firstResult, int maxResults, SortKey... orderBy) { - if(searchParams != null && StringHelper.containsNonWhitespace(searchParams.getSearchString())) { + if(searchParams != null && searchParams.isFulltextSearch()) { try { String queryString = searchParams.getSearchString(); List<String> condQueries = new ArrayList<String>(); + if(searchParams.getCondQueries() != null) { + condQueries.addAll(searchParams.getCondQueries()); + } condQueries.add(QItemDocument.SHARE_FIELD + ":" + resource.getKey()); List<Long> results = searchClient.doSearch(queryString, condQueries, searchParams.getIdentity(), searchParams.getRoles(), firstResult, maxResults * 5, orderBy); @@ -590,12 +605,14 @@ public class QuestionPoolServiceImpl implements QPoolService { public ResultInfos<QuestionItemView> getItemsOfCollection(QuestionItemCollection collection, SearchQuestionItemParams searchParams, int firstResult, int maxResults, SortKey... orderBy) { - if(searchParams != null && StringHelper.containsNonWhitespace(searchParams.getSearchString())) { + if(searchParams != null && searchParams.isFulltextSearch()) { try { List<Long> content = collectionDao.getItemKeysOfCollection(collection); - String queryString = searchParams.getSearchString(); List<String> condQueries = new ArrayList<String>(); + if(searchParams.getCondQueries() != null) { + condQueries.addAll(searchParams.getCondQueries()); + } condQueries.add(getDbKeyConditionalQuery(content)); List<Long> results = searchClient.doSearch(queryString, condQueries, searchParams.getIdentity(), searchParams.getRoles(), firstResult, maxResults * 5, orderBy); @@ -716,8 +733,4 @@ public class QuestionPoolServiceImpl implements QPoolService { public TaxonomyLevel updateTaxonomyLevel(String newField, TaxonomyLevel level) { return taxonomyLevelDao.update(newField, level); } - - - - } \ No newline at end of file diff --git a/src/main/java/org/olat/modules/qpool/model/QItemDocument.java b/src/main/java/org/olat/modules/qpool/model/QItemDocument.java index fd371b54c73..5ca10ac5227 100644 --- a/src/main/java/org/olat/modules/qpool/model/QItemDocument.java +++ b/src/main/java/org/olat/modules/qpool/model/QItemDocument.java @@ -35,7 +35,7 @@ public class QItemDocument extends OlatDocument { public static final String OWNER_FIELD = "owner"; public static final String SHARE_FIELD = "share"; public static final String POOL_FIELD = "pool"; - public static final String STUDY_FIELD = "field"; + public static final String TAXONOMIC_PATH_FIELD = "taxonomy"; public static final String IDENTIFIER_FIELD = "identifier"; diff --git a/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java b/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java index 815d305ded9..5da87f79a78 100644 --- a/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java +++ b/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java @@ -19,10 +19,13 @@ */ package org.olat.modules.qpool.model; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import org.olat.core.id.Identity; import org.olat.core.id.Roles; +import org.olat.core.util.StringHelper; /** * @@ -36,6 +39,8 @@ public class SearchQuestionItemParams { private Collection<Long> itemKeys; private String format; private String searchString; + private List<String> condQueries; + private boolean favoritOnly; private Identity author; @@ -86,6 +91,11 @@ public class SearchQuestionItemParams { public void setAuthor(Identity author) { this.author = author; } + + public boolean isFulltextSearch() { + return StringHelper.containsNonWhitespace(searchString) || + condQueries != null && condQueries.size() > 0; + } public String getSearchString() { return searchString; @@ -95,6 +105,17 @@ public class SearchQuestionItemParams { this.searchString = searchString; } + public List<String> getCondQueries() { + if(condQueries == null) { + return new ArrayList<String>(1); + } + return new ArrayList<String>(condQueries); + } + + public void setCondQueries(List<String> condQueries) { + this.condQueries = condQueries; + } + public Identity getIdentity() { return identity; } @@ -109,6 +130,7 @@ public class SearchQuestionItemParams { clone.poolKey = poolKey; clone.format = format; clone.searchString = searchString; + clone.condQueries = getCondQueries(); clone.favoritOnly = favoritOnly; clone.author = author; return clone; diff --git a/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java b/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java index 10f4f66d1a3..b817bd0b9df 100644 --- a/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java @@ -61,6 +61,7 @@ import org.olat.modules.qpool.QuestionItemView; import org.olat.modules.qpool.ui.QuestionItemDataModel.Cols; import org.olat.modules.qpool.ui.events.QItemMarkedEvent; import org.olat.modules.qpool.ui.events.QItemViewEvent; +import org.olat.modules.qpool.ui.metadata.ExtendedSearchController; /** * @@ -73,13 +74,15 @@ public abstract class AbstractItemListController extends FormBasicController private FlexiTableElement itemsTable; private QuestionItemDataModel model; + private ExtendedSearchController extendedSearchCtrl; + private final MarkManager markManager; private final QPoolService qpoolService; private EventBus eventBus; private QuestionItemsSource source; - public AbstractItemListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) { + public AbstractItemListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source, String key) { super(ureq, wControl, "item_list"); this.source = source; @@ -89,6 +92,9 @@ public abstract class AbstractItemListController extends FormBasicController eventBus = ureq.getUserSession().getSingleUserEventCenter(); eventBus.registerFor(this, getIdentity(), QuestionPoolMainEditorController.QITEM_MARKED); + extendedSearchCtrl = new ExtendedSearchController(ureq, getWindowControl(), key); + listenTo(extendedSearchCtrl); + initForm(ureq); } @@ -123,11 +129,15 @@ public abstract class AbstractItemListController extends FormBasicController columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("details", translate("details"), "select-item")); model = new QuestionItemDataModel(columnsModel, this, getTranslator()); - itemsTable = uifactory.addTableElement(ureq, getWindowControl(), "items", model, 50, true, getTranslator(), formLayout); + itemsTable = uifactory.addTableElement(ureq, getWindowControl(), "items", model, 50, getTranslator(), formLayout); itemsTable.setSelectAllEnable(true); itemsTable.setMultiSelect(true); + itemsTable.setSearchEnabled(true); + itemsTable.setExtendedSearchCallout(extendedSearchCtrl); itemsTable.setRendererType(FlexiTableRendererType.dataTables); + + initButtons(formLayout); } @@ -195,7 +205,7 @@ public abstract class AbstractItemListController extends FormBasicController } super.formInnerEvent(ureq, source, event); } - + @Override public void event(Event event) { if(event instanceof QItemMarkedEvent) { diff --git a/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java b/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java index 9610edb3c00..b1ccc3fc2a6 100644 --- a/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java +++ b/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java @@ -56,7 +56,7 @@ public class CollectionQuestionsController extends QuestionsController { private final QPoolService qpoolService; public CollectionQuestionsController(UserRequest ureq, WindowControl wControl, CollectionOfItemsSource source) { - super(ureq, wControl, source); + super(ureq, wControl, source, "coll-" + source.getCollection().getKey()); this.collection = source.getCollection(); qpoolService = CoreSpringFactory.getImpl(QPoolService.class); } diff --git a/src/main/java/org/olat/modules/qpool/ui/ItemListController.java b/src/main/java/org/olat/modules/qpool/ui/ItemListController.java index fbb0b09b312..0b594c3a87f 100644 --- a/src/main/java/org/olat/modules/qpool/ui/ItemListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/ItemListController.java @@ -43,7 +43,7 @@ public class ItemListController extends AbstractItemListController { private FormLink selectLink; public ItemListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) { - super(ureq, wControl, source); + super(ureq, wControl, source, "select"); initForm(ureq); } diff --git a/src/main/java/org/olat/modules/qpool/ui/PoolsController.java b/src/main/java/org/olat/modules/qpool/ui/PoolsController.java index 591907c0cd8..4d746b0704f 100644 --- a/src/main/java/org/olat/modules/qpool/ui/PoolsController.java +++ b/src/main/java/org/olat/modules/qpool/ui/PoolsController.java @@ -49,6 +49,7 @@ import org.olat.core.util.Util; import org.olat.modules.qpool.Pool; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.ui.events.QPoolSelectionEvent; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java index 8ffc3d3dc4b..e82950b52b8 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java @@ -52,6 +52,7 @@ import org.olat.modules.qpool.QuestionPoolModule; import org.olat.modules.qpool.manager.ExportQItemResource; import org.olat.modules.qpool.ui.events.QItemEvent; import org.olat.modules.qpool.ui.events.QPoolEvent; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java index 35b93710d2e..337017b7a8e 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java @@ -53,10 +53,10 @@ import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionItemShort; import org.olat.modules.qpool.model.QItemList; -import org.olat.modules.qpool.ui.edit.MetadataBulkChangeController; import org.olat.modules.qpool.ui.events.QItemEvent; import org.olat.modules.qpool.ui.events.QPoolEvent; import org.olat.modules.qpool.ui.events.QPoolSelectionEvent; +import org.olat.modules.qpool.ui.metadata.MetadataBulkChangeController; import org.olat.modules.qpool.ui.wizard.Export_1_TypeStep; import org.olat.modules.qpool.ui.wizard.ImportAuthor_1_ChooseMemberStep; import org.olat.repository.RepositoryEntry; @@ -99,8 +99,8 @@ public class QuestionListController extends AbstractItemListController implement private final QPoolService qpoolService; private final RepositoryManager repositoryManager; - public QuestionListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) { - super(ureq, wControl, source); + public QuestionListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source, String key) { + super(ureq, wControl, source, key); qpoolService = CoreSpringFactory.getImpl(QPoolService.class); repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class); diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java index 5cc4458e787..a1ae9161a32 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java @@ -349,7 +349,7 @@ public class QuestionPoolMainEditorController extends BasicController implements source.getDefaultParams().setAuthor(getIdentity()); if(myQuestionsCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("My"), null); - myQuestionsCtrl = new QuestionsController(ureq, swControl, source); + myQuestionsCtrl = new QuestionsController(ureq, swControl, source, "my"); myQuestionsCtrl.setStackedController(stackPanel); listenTo(myQuestionsCtrl); } else { @@ -364,7 +364,7 @@ public class QuestionPoolMainEditorController extends BasicController implements source.getDefaultParams().setFavoritOnly(true); if(markedQuestionsCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Marked"), null); - markedQuestionsCtrl = new QuestionsController(ureq, swControl, source); + markedQuestionsCtrl = new QuestionsController(ureq, swControl, source, "favorit"); markedQuestionsCtrl.setStackedController(stackPanel); listenTo(markedQuestionsCtrl); } else { @@ -383,7 +383,7 @@ public class QuestionPoolMainEditorController extends BasicController implements source.getDefaultParams().setPoolKey(pool.getKey()); if(selectedPoolCtrl == null) { WindowControl swControl = addToHistory(ureq, pool, null); - selectedPoolCtrl = new QuestionsController(ureq, swControl, source); + selectedPoolCtrl = new QuestionsController(ureq, swControl, source, "poll-" + pool.getKey()); selectedPoolCtrl.setStackedController(stackPanel); listenTo(selectedPoolCtrl); cNode.setController(selectedPoolCtrl); @@ -397,15 +397,16 @@ public class QuestionPoolMainEditorController extends BasicController implements private void doSelectGroup(UserRequest ureq, BusinessGroup group, TreeNode node, List<ContextEntry> entries, StateEntry state) { ControlledTreeNode cNode = (ControlledTreeNode)node; QuestionsController sharedItemsCtrl = cNode.getController(); + SharedItemsSource source = new SharedItemsSource(group, getIdentity(), ureq.getUserSession().getRoles()); if(sharedItemsCtrl == null) { WindowControl swControl = addToHistory(ureq, group, null); - sharedItemsCtrl = new QuestionsController(ureq, swControl, new SharedItemsSource(group, getIdentity(), ureq.getUserSession().getRoles())); + sharedItemsCtrl = new QuestionsController(ureq, swControl, source, "share-" + group.getKey()); sharedItemsCtrl.setStackedController(stackPanel); listenTo(sharedItemsCtrl); cNode.setController(sharedItemsCtrl); } else { - sharedItemsCtrl.updateSource(ureq, new SharedItemsSource(group, getIdentity(), ureq.getUserSession().getRoles())); + sharedItemsCtrl.updateSource(ureq, source); } currentCtrl = sharedItemsCtrl; setContent(ureq, sharedItemsCtrl, entries, state); diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java index 2b6e90bf07e..9518d096b0c 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java @@ -68,13 +68,13 @@ public class QuestionsController extends BasicController implements Activateable private final QPoolService qpoolService; private QuestionItemsSource source; - public QuestionsController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) { + public QuestionsController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source, String key) { super(ureq, wControl); this.source = source; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); - listCtrl = new QuestionListController(ureq, wControl, source); + listCtrl = new QuestionListController(ureq, wControl, source, key); listenTo(listCtrl); detailsCtrl = new QuestionItemSummaryController(ureq, wControl); listenTo(detailsCtrl); diff --git a/src/main/java/org/olat/modules/qpool/ui/_content/items.html b/src/main/java/org/olat/modules/qpool/ui/_content/items.html index ace95529640..a0752c58cd1 100644 --- a/src/main/java/org/olat/modules/qpool/ui/_content/items.html +++ b/src/main/java/org/olat/modules/qpool/ui/_content/items.html @@ -24,6 +24,7 @@ jQuery(function() { var headerHeight = jQuery('#b_header').height() + jQuery('#b_nav_main').height(); var footerHeight = jQuery('#b_footer').height() + jQuery('#qbuttons').height(); var maxHeight = winHeight - headerHeight - footerHeight - 50; + var panePadding = 130; jQuery('#qpoolcontainer').width(width).height(maxHeight).layout({ north: { size: '50%' }, @@ -33,8 +34,8 @@ jQuery(function() { jQuery('#$tableId').each(function(index, el) { var table = jQuery(el).dataTable(); var oSettings = table.fnSettings(); - oSettings.oScroll.sY = (paneHeight - 130) + "px"; - table.fnDraw(); + oSettings.oScroll.sY = (paneHeight - panePadding) + "px"; + jQuery('div.dataTables_scrollBody', jQuery('#qitems')).height(paneHeight - panePadding); }); }, west: { size: '50%' }, @@ -45,8 +46,8 @@ jQuery(function() { var paneHeight = jQuery('#qitems').height(); var table = jQuery(el).dataTable(); var oSettings = table.fnSettings(); - oSettings.oScroll.sY = (paneHeight - 130) + "px"; - table.fnDraw(); + oSettings.oScroll.sY = (paneHeight - panePadding) + "px"; + jQuery('div.dataTables_scrollBody', jQuery('#qitems')).height(paneHeight - panePadding); }); }); </script> \ No newline at end of file diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties index 43330760116..09ed7e5a57b 100644 --- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties @@ -2,6 +2,8 @@ create.list=Liste erstellen create.test=Test erstellen add.to.list=Zur Liste hinzufügen +add=+ +remove=- topnav.qpool=Q-Pool topnav.qpool.alt=Question pools create.collection.description=Geben Sie eine Name zu Ihre Liste. @@ -17,7 +19,7 @@ details=Detailansicht rename.collection=Liste rename next=Next previous=Previous -confirm.delete=Wollen Sie wirklich diese Frage löschen? +confirm.delete=Wollen Sie wirklich diese Frage löschen? Sie wird von allen Gruppen, alle Pools und alle Liste gelöscht. confirm.delete.source=Wollen Sie wirklich diese Liste löschen? confirm.unshare=Wollen Sie wirklich diese Frage von "{0}" entfernen? menu.admin=Administration diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java index 8bb6332552f..0915c248226 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java @@ -33,7 +33,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.qpool.Pool; import org.olat.modules.qpool.QPoolService; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java index 9e947484573..0ac311a58b9 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java @@ -56,8 +56,8 @@ import org.olat.core.util.Util; import org.olat.modules.qpool.Pool; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.PoolImpl; -import org.olat.modules.qpool.ui.MetadatasController; import org.olat.modules.qpool.ui.events.QPoolEvent; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java index 6aeb31d67cd..8059bddc61b 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java @@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QEducationalContext; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java index c0be45ad68a..6d412f3feaa 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java @@ -58,7 +58,7 @@ import org.olat.core.util.i18n.ui.TranslationToolI18nItemEditCrumbController; import org.olat.core.util.prefs.Preferences; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QEducationalContext; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java index 81c60369ea1..f63d207493f 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java @@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QItemType; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java index 8d4d6dcce3b..0b019e423cd 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java @@ -58,7 +58,7 @@ import org.olat.core.util.i18n.ui.TranslationToolI18nItemEditCrumbController; import org.olat.core.util.prefs.Preferences; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QItemType; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java index f7113724866..db36527e496 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java @@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QLicense; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java index 87aa6d1cab4..16e3e1d879a 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java @@ -51,7 +51,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.model.QLicense; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java index 852c7c5aa55..c12bde17aa2 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java @@ -35,7 +35,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle import org.olat.core.util.Util; import org.olat.core.util.tree.TreeHelper; import org.olat.modules.qpool.TaxonomyLevel; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java index 8215c4f5c12..da0a4ee0de0 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java @@ -34,7 +34,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.util.Util; import org.olat.modules.qpool.TaxonomyLevel; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java index e4b8ae53cb3..5168c346b4d 100644 --- a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java @@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.TaxonomyLevel; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java b/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java index feb3b5e4a82..a0238a783c4 100644 --- a/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java +++ b/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java @@ -98,6 +98,7 @@ public class CollectionOfItemsSource implements QuestionItemsSource { public ResultInfos<QuestionItemView> getItems(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) { SearchQuestionItemParams params = new SearchQuestionItemParams(identity, roles); params.setSearchString(query); + params.setCondQueries(condQueries); return qpoolService.getItemsOfCollection(collection, params, firstResult, maxResults, orderBy); } } diff --git a/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java b/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java index 49c3469e3cd..67dfd00bde4 100644 --- a/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java +++ b/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java @@ -103,6 +103,7 @@ public class DefaultItemsSource implements QuestionItemsSource { public ResultInfos<QuestionItemView> getItems(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) { SearchQuestionItemParams params = defaultParams.clone(); params.setSearchString(query); + params.setCondQueries(condQueries); return doSearch(params, firstResult, maxResults, orderBy); } diff --git a/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java b/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java index ae02fb3b977..16ebb755dec 100644 --- a/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java +++ b/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java @@ -97,6 +97,7 @@ public class SharedItemsSource implements QuestionItemsSource { public ResultInfos<QuestionItemView> getItems(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) { SearchQuestionItemParams params = new SearchQuestionItemParams(identity, roles); params.setSearchString(query); + params.setCondQueries(condQueries); return qpoolService.getSharedItemByResource(resource, params, firstResult, maxResults, orderBy); } } diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/QItemEdited.java b/src/main/java/org/olat/modules/qpool/ui/events/QItemEdited.java similarity index 96% rename from src/main/java/org/olat/modules/qpool/ui/edit/QItemEdited.java rename to src/main/java/org/olat/modules/qpool/ui/events/QItemEdited.java index 6d7d8d121c1..7f88f222c62 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/QItemEdited.java +++ b/src/main/java/org/olat/modules/qpool/ui/events/QItemEdited.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.events; import org.olat.core.gui.control.Event; import org.olat.modules.qpool.QuestionItem; diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataController.java similarity index 95% rename from src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataController.java index b0dba9f74a3..e4b2034f855 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -35,7 +35,7 @@ import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.manager.MetadataConverterHelper; import org.olat.modules.qpool.model.LOMDuration; import org.olat.modules.qpool.model.QEducationalContext; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.events.QPoolEvent; /** @@ -53,7 +53,7 @@ public class EducationalMetadataController extends FormBasicController { public EducationalMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) { super(ureq, wControl, "view"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.edit = edit; initForm(ureq); setItem(item); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataEditController.java similarity index 95% rename from src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataEditController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataEditController.java index 382475be941..9baa930e0eb 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataEditController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import java.util.List; @@ -38,7 +38,8 @@ import org.olat.modules.qpool.manager.MetadataConverterHelper; import org.olat.modules.qpool.model.LOMDuration; import org.olat.modules.qpool.model.QEducationalContext; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; +import org.olat.modules.qpool.ui.events.QItemEdited; /** * @@ -57,7 +58,7 @@ public class EducationalMetadataEditController extends FormBasicController { public EducationalMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) { super(ureq, wControl); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.item = item; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java new file mode 100644 index 00000000000..7c69474af60 --- /dev/null +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java @@ -0,0 +1,538 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.qpool.ui.metadata; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.olat.core.CoreSpringFactory; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.elements.SingleSelection; +import org.olat.core.gui.components.form.flexible.elements.TextElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.ExtendedFlexiTableSearchController; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.tree.GenericTreeNode; +import org.olat.core.gui.components.tree.TreeNode; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.util.CodeHelper; +import org.olat.core.util.StringHelper; +import org.olat.core.util.Util; +import org.olat.core.util.nodes.INode; +import org.olat.modules.qpool.QPoolService; +import org.olat.modules.qpool.TaxonomyLevel; +import org.olat.modules.qpool.model.QItemDocument; +import org.olat.modules.qpool.model.QLicense; +import org.olat.modules.qpool.ui.QuestionsController; +import org.olat.modules.qpool.ui.admin.TaxonomyTreeModel; +import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues; +import org.olat.search.model.AbstractOlatDocument; + +/** + * + * Initial date: 03.05.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ExtendedSearchController extends FormBasicController implements ExtendedFlexiTableSearchController { + + private FormLink searchButton; + + private final SearchAttributes searchAttributes = new SearchAttributes(); + private final List<ConditionalQuery> uiQueries = new ArrayList<ConditionalQuery>(); + private final List<String> condQueries = new ArrayList<String>(); + + private final String prefsKey; + private ExtendedSearchPrefs prefs; + + private final QPoolService qpoolService; + + public ExtendedSearchController(UserRequest ureq, WindowControl wControl, String prefsKey) { + super(ureq, wControl, "extended_search"); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); + + qpoolService = CoreSpringFactory.getImpl(QPoolService.class); + + + + this.prefsKey = prefsKey; + prefs = (ExtendedSearchPrefs) ureq.getUserSession().getGuiPreferences() + .get(ExtendedFlexiTableSearchController.class, prefsKey); + + if(prefs != null && prefs.getCondQueries().size() > 0) { + for(ExtendedSearchPref pref:prefs.getCondQueries()) { + uiQueries.add(new ConditionalQuery(pref)); + } + + } else { + uiQueries.add(new ConditionalQuery()); + } + + + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + if(formLayout instanceof FormLayoutContainer) { + FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; + layoutCont.contextPut("uiQueries", uiQueries); + } + + FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonsCont.setRootForm(mainForm); + formLayout.add(buttonsCont); + searchButton = uifactory.addFormLink("search", buttonsCont, Link.BUTTON); + } + + @Override + protected void formOK(UserRequest ureq) { + doSearch(ureq); + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(source == searchButton) { + doSearch(ureq); + } else if (source instanceof SingleSelection) { + SingleSelection attrEl = (SingleSelection)source; + if(attrEl.isOneSelected()) { + ConditionalQuery query = (ConditionalQuery)attrEl.getUserObject(); + query.selectAttributeType(attrEl.getSelectedKey(), null); + } + } else if(source instanceof FormLink) { + FormLink button = (FormLink)source; + ConditionalQuery query = (ConditionalQuery)button.getUserObject(); + if(button.getCmd().startsWith("add")) { + addParameter(ureq, query); + } else if(button.getCmd().startsWith("remove")) { + removeParameter(ureq, query); + } + } + super.formInnerEvent(ureq, source, event); + } + + private void addParameter(UserRequest ureq, ConditionalQuery query) { + int index = uiQueries.indexOf(query); + ConditionalQuery newQuery = new ConditionalQuery(); + if(index < 0 || (index + 1) > uiQueries.size()) { + uiQueries.add(newQuery); + } else { + uiQueries.add(index+1, newQuery); + } + } + + private void removeParameter(UserRequest ureq, ConditionalQuery query) { + if(uiQueries.size() > 1 && uiQueries.remove(query)) { + flc.setDirty(true); + } + } + + private void doSearch(UserRequest ureq) { + condQueries.clear(); + + List<ExtendedSearchPref> params = new ArrayList<ExtendedSearchPref>(); + for(ConditionalQuery uiQuery:uiQueries) { + String query = uiQuery.getQuery(); + if(StringHelper.containsNonWhitespace(query)) { + condQueries.add(query); + + params.add(new ExtendedSearchPref(uiQuery.getAttribute(), uiQuery.getValue())); + } + } + + if (prefs == null){ + prefs = new ExtendedSearchPrefs(); + } + prefs.setCondQueries(params); + ureq.getUserSession().getGuiPreferences().putAndSave(ExtendedFlexiTableSearchController.class, prefsKey, prefs); + fireEvent(ureq, Event.DONE_EVENT); + } + + /** + * Append 'AND' operation if buf is not empty. + * @param buf + */ + private String append(String... strings) { + StringBuilder query = new StringBuilder(); + for(String string:strings) { + query.append(string); + } + return query.toString(); + } + + @Override + public List<String> getConditionalQueries() { + return condQueries; + } + + @Override + protected void doDispose() { + // + } + + public class ConditionalQuery { + + private SingleSelection attributeChoice; + private FormItem parameter; + private QueryParameterFactory parameterFactory; + private FormLink addButton; + private FormLink removeButton; + + public ConditionalQuery() { + this(null); + } + + public ConditionalQuery(ExtendedSearchPref pref) { + long id = CodeHelper.getRAMUniqueID(); + + String[] attrKeys = searchAttributes.getKeys(); + String[] attrValues = new String[attrKeys.length]; + for(int i=attrValues.length; i-->0; ) { + attrValues[i] = translate(attrKeys[i]); + } + + attributeChoice = uifactory.addDropdownSingleselect("attr-" + id, flc, attrKeys, attrValues, null); + attributeChoice.select(attrKeys[0], true); + if(pref == null) { + selectAttributeType(attrKeys[0], null); + } else { + selectAttributeType(pref.getAttribute(), pref.getValue()); + } + attributeChoice.addActionListener(ExtendedSearchController.this, FormEvent.ONCHANGE); + attributeChoice.setUserObject(this); + flc.add(attributeChoice.getName(), attributeChoice); + addButton = uifactory.addFormLink("add-" + id, "add", null, flc, Link.BUTTON); + addButton.setUserObject(this); + flc.add(addButton.getComponent().getComponentName(), addButton); + removeButton = uifactory.addFormLink("remove-"+ id, "remove", null, flc, Link.BUTTON); + removeButton.setUserObject(this); + flc.add(removeButton.getComponent().getComponentName(), removeButton); + } + + public String getAttribute() { + return attributeChoice.isOneSelected() ? attributeChoice.getSelectedKey() : null; + } + + public String getValue() { + return "test"; + } + + public SingleSelection getAttributChoice() { + return attributeChoice; + } + + public FormItem getParameterItem() { + return parameter; + } + + public FormLink getAddButton() { + return addButton; + } + + public FormLink getRemoveButton() { + return removeButton; + } + + public void selectAttributeType(String type, String value) { + parameterFactory = searchAttributes.getQueryParameterFactory(type); + if(parameterFactory != null) { + parameter = parameterFactory.createItem(value); + } + } + + public String getQuery() { + if(parameterFactory != null && parameter != null) { + return parameterFactory.getQuery(parameter); + } + return null; + } + } + + public static interface QueryParameterFactory { + public String getValue(FormItem item); + + public FormItem createItem(String startValue); + + public String getQuery(FormItem item); + } + + private class SearchAttributes { + private List<SearchAttribute> attributes = new ArrayList<SearchAttribute>(); + + public SearchAttributes() { + //general + attributes.add(new SearchAttribute("general.title", new StringQueryParameter(AbstractOlatDocument.TITLE_FIELD_NAME))); + attributes.add(new SearchAttribute("general.keywords", new StringQueryParameter(QItemDocument.KEYWORDS_FIELD))); + attributes.add(new SearchAttribute("general.coverage", new StringQueryParameter(QItemDocument.COVERAGE_FIELD))); + attributes.add(new SearchAttribute("general.additional.informations", new StringQueryParameter(QItemDocument.ADD_INFOS_FIELD))); + attributes.add(new SearchAttribute("general.language", new StringQueryParameter(QItemDocument.LANGUAGE_FIELD))); + attributes.add(new SearchAttribute("classification.taxonomic.path", new TaxonomicPathQueryParameter())); + //educational + attributes.add(new SearchAttribute("educational.context", new ContextQueryParameter())); + //question + attributes.add(new SearchAttribute("question.type", new TypeQueryParameter())); + attributes.add(new SearchAttribute("question.assessmentType", new AssessmentQueryParameter())); + //lifecycle + attributes.add(new SearchAttribute("lifecycle.status", new StatusQueryParameter())); + //technical + attributes.add(new SearchAttribute("technical.editor", new StringQueryParameter(QItemDocument.EDITOR_FIELD))); + attributes.add(new SearchAttribute("technical.format", new FormatQueryParameter())); + //rights + attributes.add(new SearchAttribute("rights.copyright", new LicenseQueryParameter())); + } + + public QueryParameterFactory getQueryParameterFactory(String type) { + for(SearchAttribute attribute:attributes) { + if(type.equals(attribute.getI18nKey())) { + return attribute.getFactory(); + } + } + return null; + } + + public String[] getKeys() { + String[] keys = new String[attributes.size()]; + for(int i=keys.length; i-->0; ) { + keys[i] = attributes.get(i).getI18nKey(); + } + return keys; + } + } + + public class StringQueryParameter implements QueryParameterFactory { + private final String docAttribute; + + public StringQueryParameter(String docAttribute) { + this.docAttribute = docAttribute; + } + + @Override + public String getValue(FormItem item) { + if(item instanceof TextElement) { + return ((TextElement)item).getValue(); + } + return null; + } + + @Override + public FormItem createItem(String startValue) { + return uifactory.addTextElement("type-" + CodeHelper.getRAMUniqueID(), null, 50, startValue, flc); + } + + @Override + public String getQuery(FormItem item) { + String val = getValue(item); + if(StringHelper.containsNonWhitespace(val)) { + return append(docAttribute, ":(", val, ") "); + } + return null; + } + } + + public class TaxonomicPathQueryParameter extends SingleChoiceQueryParameter { + + public TaxonomicPathQueryParameter() { + super(QItemDocument.TAXONOMIC_PATH_FIELD); + } + + @Override + public FormItem createItem(String startValue) { + TaxonomyTreeModel treeModel = new TaxonomyTreeModel(); + List<String> keys = new ArrayList<String>(); + List<String> values = new ArrayList<String>(); + flatTree(treeModel.getRootNode(), "", keys, values); + + String[] keysArr = keys.toArray(new String[keys.size()]); + String[] valuesArr = values.toArray(new String[values.size()]); + return createItem(keysArr, valuesArr, startValue); + } + + private void flatTree(TreeNode node, String path, List<String> keys, List<String> values) { + for(int i=0; i<node.getChildCount(); i++) { + INode child = node.getChildAt(i); + if(child instanceof GenericTreeNode) { + GenericTreeNode gChild = (GenericTreeNode)child; + TaxonomyLevel level = (TaxonomyLevel)gChild.getUserObject(); + String field = level.getField(); + keys.add(field); + values.add(path + "" + field); + flatTree(gChild, path + "\u00A0\u00A0\u00A0\u00A0", keys, values); + } + } + } + } + + public class LicenseQueryParameter extends SingleChoiceQueryParameter { + + public LicenseQueryParameter() { + super(QItemDocument.COPYRIGHT_FIELD); + } + + @Override + public FormItem createItem(String startValue) { + List<QLicense> allLicenses = qpoolService.getAllLicenses(); + List<QLicense> licenses = new ArrayList<QLicense>(allLicenses); + for(Iterator<QLicense> it=licenses.iterator(); it.hasNext(); ) { + String key = it.next().getLicenseKey(); + if(key != null && key.startsWith("perso-")) { + it.remove(); + } + } + + String[] keys = new String[licenses.size()]; + int count = 0; + for(QLicense license:licenses) { + keys[count++] = license.getLicenseKey(); + } + return createItem(keys, keys, startValue); + } + } + + public class TypeQueryParameter extends SingleChoiceQueryParameter { + + public TypeQueryParameter() { + super(QItemDocument.ITEM_TYPE_FIELD); + } + + @Override + public FormItem createItem(String startValue) { + KeyValues types = MetaUIFactory.getQItemTypeKeyValues(getTranslator(), qpoolService); + return createItem(types.getKeys(), types.getValues(), startValue); + } + } + + public class FormatQueryParameter extends SingleChoiceQueryParameter { + + public FormatQueryParameter() { + super(QItemDocument.FORMAT_FIELD); + } + + @Override + public FormItem createItem(String startValue) { + KeyValues formats = MetaUIFactory.getFormats(); + return createItem(formats.getKeys(), formats.getValues(), startValue); + } + } + + public class ContextQueryParameter extends SingleChoiceQueryParameter { + + public ContextQueryParameter() { + super(QItemDocument.EDU_CONTEXT_FIELD); + } + + @Override + public FormItem createItem(String startValue) { + KeyValues contexts = MetaUIFactory.getContextKeyValues(getTranslator(), qpoolService); + return createItem(contexts.getKeys(), contexts.getValues(), startValue); + } + } + + public class AssessmentQueryParameter extends SingleChoiceQueryParameter { + + public AssessmentQueryParameter() { + super(QItemDocument.ASSESSMENT_TYPE_FIELD); + } + + @Override + public FormItem createItem(String startValue) { + KeyValues types = MetaUIFactory.getAssessmentTypes(getTranslator()); + return createItem(types.getKeys(), types.getValues(), startValue); + } + } + + public class StatusQueryParameter extends SingleChoiceQueryParameter { + public StatusQueryParameter() { + super(QItemDocument.ITEM_STATUS_FIELD); + } + + @Override + public FormItem createItem(String startValue) { + KeyValues types = MetaUIFactory.getStatus(getTranslator()); + return createItem(types.getKeys(), types.getValues(), startValue); + } + } + + public abstract class SingleChoiceQueryParameter implements QueryParameterFactory { + private final String docAttribute; + + public SingleChoiceQueryParameter(String docAttribute) { + this.docAttribute = docAttribute; + } + + @Override + public String getValue(FormItem item) { + if(item instanceof SingleSelection && ((SingleSelection)item).isOneSelected()) { + return ((SingleSelection)item).getSelectedKey(); + } + return null; + } + + protected FormItem createItem(String[] keys, String[] values, String startValue) { + SingleSelection choice = uifactory.addDropdownSingleselect(docAttribute + "-" + CodeHelper.getRAMUniqueID(), flc, + keys, values, null); + + if(startValue != null) { + for(String key:keys) { + if(key.equals(startValue)) { + choice.select(key, true); + + } + } + } + return choice; + } + + @Override + public String getQuery(FormItem item) { + String val = getValue(item); + if(StringHelper.containsNonWhitespace(val)) { + return append(docAttribute, ":(", val, ") "); + } + return null; + } + } + + private static class SearchAttribute { + private final String i18nKey; + private final QueryParameterFactory factory; + + public SearchAttribute(String i18nKey, QueryParameterFactory factory) { + this.i18nKey = i18nKey; + this.factory = factory; + } + + public String getI18nKey() { + return i18nKey; + } + + public QueryParameterFactory getFactory() { + return factory; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java new file mode 100644 index 00000000000..48c89589da9 --- /dev/null +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java @@ -0,0 +1,62 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.qpool.ui.metadata; + +import java.io.Serializable; + +/** + * + * Initial date: 03.05.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ExtendedSearchPref implements Serializable { + + private static final long serialVersionUID = -5102715838988265773L; + private String attribute; + private String value; + + public ExtendedSearchPref() { + // + } + + public ExtendedSearchPref(String attribute, String value) { + this.attribute = attribute; + this.value = value; + } + + public String getAttribute() { + return attribute; + } + + public void setAttribute(String attribute) { + this.attribute = attribute; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + +} diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java new file mode 100644 index 00000000000..9e2ab20ec28 --- /dev/null +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java @@ -0,0 +1,44 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.qpool.ui.metadata; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * + * Initial date: 03.05.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ExtendedSearchPrefs implements Serializable { + + private static final long serialVersionUID = -1531232270649506181L; + private List<ExtendedSearchPref> condQueries = new ArrayList<ExtendedSearchPref>(); + + public List<ExtendedSearchPref> getCondQueries() { + return condQueries; + } + + public void setCondQueries(List<ExtendedSearchPref> condQueries) { + this.condQueries = condQueries; + } +} diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataController.java similarity index 95% rename from src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataController.java index c46a542847a..d910978efbb 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -32,7 +32,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; import org.olat.modules.qpool.QuestionItem; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.events.QPoolEvent; /** @@ -50,7 +50,7 @@ public class GeneralMetadataController extends FormBasicController { public GeneralMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) { super(ureq, wControl, "view"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.edit = edit; initForm(ureq); setItem(item); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java similarity index 96% rename from src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataEditController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java index 1a86d041e1a..94470fd99d6 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java @@ -17,10 +17,9 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; - -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic; +package org.olat.modules.qpool.ui.metadata; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; @@ -49,8 +48,9 @@ import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.TaxonomyLevel; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.admin.TaxonomyTreeModel; +import org.olat.modules.qpool.ui.events.QItemEdited; /** * * Initial date: 05.03.2013<br> @@ -74,7 +74,7 @@ public class GeneralMetadataEditController extends FormBasicController { public GeneralMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) { super(ureq, wControl); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.item = item; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataController.java similarity index 94% rename from src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataController.java index ff9c118a7dd..98539b43089 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -33,7 +33,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionStatus; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.events.QPoolEvent; /** @@ -51,7 +51,7 @@ public class LifecycleMetadataController extends FormBasicController { public LifecycleMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) { super(ureq, wControl, "view"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.edit = edit; initForm(ureq); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataEditController.java similarity index 90% rename from src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataEditController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataEditController.java index 2253334cfa1..3526c72082f 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataEditController.java @@ -17,10 +17,10 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateSelection; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; @@ -37,7 +37,8 @@ import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionStatus; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; +import org.olat.modules.qpool.ui.events.QItemEdited; /** * @@ -55,7 +56,7 @@ public class LifecycleMetadataEditController extends FormBasicController { public LifecycleMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) { super(ureq, wControl); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.item = item; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/MetaUIFactory.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java similarity index 65% rename from src/main/java/org/olat/modules/qpool/ui/edit/MetaUIFactory.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java index bedd431fe67..634060c3631 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/MetaUIFactory.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java @@ -1,4 +1,23 @@ -package org.olat.modules.qpool.ui.edit; +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.qpool.ui.metadata; import java.math.BigDecimal; import java.util.ArrayList; @@ -9,7 +28,10 @@ import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.translator.Translator; import org.olat.core.util.StringHelper; +import org.olat.ims.qti.QTIConstants; import org.olat.modules.qpool.QPoolService; +import org.olat.modules.qpool.QuestionStatus; +import org.olat.modules.qpool.model.QEducationalContext; import org.olat.modules.qpool.model.QItemType; import org.olat.modules.qpool.model.QLicense; @@ -21,6 +43,47 @@ import org.olat.modules.qpool.model.QLicense; */ public class MetaUIFactory { + protected static KeyValues getFormats() { + String[] formatKeys = new String[]{ QTIConstants.QTI_12_FORMAT }; + + return new KeyValues(formatKeys, formatKeys); + } + + protected static KeyValues getAssessmentTypes(Translator translator) { + String[] assessmentTypeKeys = new String[]{ "summative", "formative", "both"}; + String[] assessmentTypeValues = new String[]{ + translator.translate("question.assessmentType.summative"), + translator.translate("question.assessmentType.formative"), + translator.translate("question.assessmentType.both"), + }; + return new KeyValues(assessmentTypeKeys, assessmentTypeValues); + } + + protected static KeyValues getStatus(Translator translator) { + String[] statusTypeKeys = QuestionStatus.valueString(); + String[] statusTypeValues = new String[statusTypeKeys.length]; + for(int i=statusTypeKeys.length; i-->0; ) { + statusTypeValues[i] = translator.translate("lifecycle.status." + statusTypeKeys[i]); + } + return new KeyValues(statusTypeKeys, statusTypeValues); + } + + protected static KeyValues getContextKeyValues(Translator translator, QPoolService qpoolService) { + List<QEducationalContext> levels = qpoolService.getAllEducationlContexts(); + String[] contextKeys = new String[ levels.size() ]; + String[] contextValues = new String[ levels.size() ]; + int count = 0; + for(QEducationalContext level:levels) { + contextKeys[count] = level.getLevel(); + String translation = translator.translate("item.level." + level.getLevel().toLowerCase()); + if(translation.length() > 128) { + translation = level.getLevel(); + } + contextValues[count++] = translation; + } + return new KeyValues(contextKeys, contextValues); + } + protected static KeyValues getQLicenseKeyValues(QPoolService qpoolService) { List<QLicense> allLicenses = qpoolService.getAllLicenses(); List<QLicense> licenses = new ArrayList<QLicense>(allLicenses); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/MetadataBulkChangeController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java similarity index 90% rename from src/main/java/org/olat/modules/qpool/ui/edit/MetadataBulkChangeController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java index 1b990bb7f16..6f11b8d954d 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/MetadataBulkChangeController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java @@ -17,16 +17,16 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.getQItemTypeKeyValues; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.getQLicenseKeyValues; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.toBigDecimal; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.toInt; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateBigDecimal; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateRights; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateSelection; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.getQItemTypeKeyValues; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.getQLicenseKeyValues; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toBigDecimal; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toInt; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateBigDecimal; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateRights; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection; import java.util.ArrayList; import java.util.Collections; @@ -56,18 +56,16 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.util.Util; -import org.olat.ims.qti.QTIConstants; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionItemShort; -import org.olat.modules.qpool.QuestionStatus; import org.olat.modules.qpool.TaxonomyLevel; import org.olat.modules.qpool.manager.MetadataConverterHelper; import org.olat.modules.qpool.model.QEducationalContext; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.admin.TaxonomyTreeModel; -import org.olat.modules.qpool.ui.edit.MetaUIFactory.KeyValues; +import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues; /** * @@ -115,7 +113,7 @@ public class MetadataBulkChangeController extends FormBasicController { public MetadataBulkChangeController(UserRequest ureq, WindowControl wControl, List<QuestionItemShort> items) { super(ureq, wControl, "bulk_change"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.items = items; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); @@ -193,19 +191,9 @@ public class MetadataBulkChangeController extends FormBasicController { learningTimeSecondElement = uifactory.addIntegerElement("learningTime.second", "", 0, learningTimeContainer); learningTimeSecondElement.setDisplaySize(3); - List<QEducationalContext> levels = qpoolService.getAllEducationlContexts(); - String[] contextKeys = new String[ levels.size() ]; - String[] contextValues = new String[ levels.size() ]; - int count = 0; - for(QEducationalContext level:levels) { - contextKeys[count] = level.getLevel(); - String translation = translate("item.level." + level.getLevel().toLowerCase()); - if(translation.length() > 128) { - translation = level.getLevel(); - } - contextValues[count++] = translation; - } - contextEl = uifactory.addDropdownSingleselect("educational.context", "educational.context", eduCont, contextKeys, contextValues, null); + KeyValues contexts = MetaUIFactory.getContextKeyValues(getTranslator(), qpoolService); + contextEl = uifactory.addDropdownSingleselect("educational.context", "educational.context", eduCont, + contexts.getKeys(), contexts.getValues(), null); decorate(contextEl, eduCont, listener); } @@ -237,13 +225,9 @@ public class MetadataBulkChangeController extends FormBasicController { numAnswerAltEl.setDisplaySize(4); decorate(numAnswerAltEl, questionCont, listener); - String[] assessmentTypeKeys = new String[]{ "summative", "formative", "both"}; - String[] assessmentTypeValues = new String[]{ - translate("question.assessmentType.summative"), translate("question.assessmentType.formative"), - translate("question.assessmentType.both"), - }; + KeyValues types = MetaUIFactory.getAssessmentTypes(getTranslator()); assessmentTypeEl = uifactory.addDropdownSingleselect("question.assessmentType", "question.assessmentType", questionCont, - assessmentTypeKeys, assessmentTypeValues, null); + types.getKeys(), types.getValues(), null); decorate(assessmentTypeEl, questionCont, listener); } @@ -255,13 +239,9 @@ public class MetadataBulkChangeController extends FormBasicController { versionEl = uifactory.addTextElement("lifecycle.version", "lifecycle.version", 50, null, lifecycleCont); decorate(versionEl, lifecycleCont, listener); - String[] statusTypeKeys = QuestionStatus.valueString(); - String[] statusTypeValues = new String[statusTypeKeys.length]; - for(int i=statusTypeKeys.length; i-->0; ) { - statusTypeValues[i] = translate("lifecycle.status." + statusTypeKeys[i]); - } + KeyValues status = MetaUIFactory.getStatus(getTranslator()); statusEl = uifactory.addDropdownSingleselect("lifecycle.status", "lifecycle.status", lifecycleCont, - statusTypeKeys, statusTypeValues, null); + status.getKeys(), status.getValues(), null); decorate(statusEl, lifecycleCont, listener); } @@ -274,9 +254,9 @@ public class MetadataBulkChangeController extends FormBasicController { decorate(editorEl, technicalCont, listener); editorVersionEl = uifactory.addTextElement("technical.editorVersion", "technical.editorVersion", 50, null, technicalCont); decorate(editorVersionEl, technicalCont, listener); - String[] formatKeys = new String[]{ QTIConstants.QTI_12_FORMAT }; + KeyValues formats = MetaUIFactory.getFormats(); formatEl = uifactory.addDropdownSingleselect("technical.format", "technical.format", technicalCont, - formatKeys, formatKeys, null); + formats.getKeys(), formats.getValues(), null); decorate(formatEl, technicalCont, listener); } diff --git a/src/main/java/org/olat/modules/qpool/ui/MetadatasController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java similarity index 90% rename from src/main/java/org/olat/modules/qpool/ui/MetadatasController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java index 35d38d64ca3..d1ec2d76cca 100644 --- a/src/main/java/org/olat/modules/qpool/ui/MetadatasController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui; +package org.olat.modules.qpool.ui.metadata; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; @@ -28,23 +28,12 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.util.StringHelper; +import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.edit.EducationalMetadataController; -import org.olat.modules.qpool.ui.edit.EducationalMetadataEditController; -import org.olat.modules.qpool.ui.edit.GeneralMetadataController; -import org.olat.modules.qpool.ui.edit.GeneralMetadataEditController; -import org.olat.modules.qpool.ui.edit.LifecycleMetadataController; -import org.olat.modules.qpool.ui.edit.LifecycleMetadataEditController; -import org.olat.modules.qpool.ui.edit.QItemEdited; -import org.olat.modules.qpool.ui.edit.QuestionMetadataController; -import org.olat.modules.qpool.ui.edit.QuestionMetadataEditController; -import org.olat.modules.qpool.ui.edit.RightsMetadataController; -import org.olat.modules.qpool.ui.edit.RightsMetadataEditController; -import org.olat.modules.qpool.ui.edit.SharingController; -import org.olat.modules.qpool.ui.edit.TechnicalMetadataController; -import org.olat.modules.qpool.ui.edit.TechnicalMetadataEditController; +import org.olat.modules.qpool.ui.QuestionsController; +import org.olat.modules.qpool.ui.events.QItemEdited; import org.olat.modules.qpool.ui.events.QPoolEvent; /** @@ -77,6 +66,8 @@ public class MetadatasController extends BasicController { public MetadatasController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean canEdit) { super(ureq, wControl); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); + this.item = item; this.canEdit = canEdit; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); @@ -243,7 +234,7 @@ public class MetadatasController extends BasicController { mainVC.put("details_rights", rightsCtrl.getInitialComponent()); } - protected QuestionItem updateVersionNumber() { + public QuestionItem updateVersionNumber() { if(item instanceof QuestionItemImpl && StringHelper.containsNonWhitespace(item.getItemVersion())) { String version = item.getItemVersion(); int lastPoint = version.lastIndexOf('.'); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataController.java similarity index 95% rename from src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataController.java index ca61918afb9..d5373a82e63 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import java.math.BigDecimal; @@ -35,7 +35,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.model.QItemType; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.events.QPoolEvent; /** @@ -53,7 +53,7 @@ public class QuestionMetadataController extends FormBasicController { public QuestionMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) { super(ureq, wControl, "view"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.edit = edit; initForm(ureq); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java similarity index 89% rename from src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataEditController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java index 561853bc3f6..54603462fcc 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java @@ -17,9 +17,14 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.*; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.bigDToString; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.getQItemTypeKeyValues; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toBigDecimal; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toInt; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateBigDecimal; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection; import java.math.BigDecimal; @@ -38,8 +43,9 @@ import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.MetadatasController; -import org.olat.modules.qpool.ui.edit.MetaUIFactory.KeyValues; +import org.olat.modules.qpool.ui.QuestionsController; +import org.olat.modules.qpool.ui.events.QItemEdited; +import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues; /** * @@ -57,7 +63,7 @@ public class QuestionMetadataEditController extends FormBasicController { public QuestionMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) { super(ureq, wControl); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.item = item; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataController.java similarity index 96% rename from src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataController.java index ba299b83733..ce54de2d565 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import java.util.ArrayList; import java.util.List; @@ -41,7 +41,7 @@ import org.olat.core.util.Util; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.model.QLicense; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.events.QPoolEvent; import org.olat.user.UserManager; @@ -65,7 +65,7 @@ public class RightsMetadataController extends FormBasicController { public RightsMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) { super(ureq, wControl, "view"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); qpoolService = CoreSpringFactory.getImpl(QPoolService.class); userManager = CoreSpringFactory.getImpl(UserManager.class); this.edit = edit; diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java similarity index 96% rename from src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataEditController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java index 5d56f6375f1..686023cb5a1 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import java.util.ArrayList; import java.util.Collections; @@ -50,8 +50,9 @@ import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionItemShort; import org.olat.modules.qpool.model.QLicense; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.MetadatasController; -import org.olat.modules.qpool.ui.edit.MetaUIFactory.KeyValues; +import org.olat.modules.qpool.ui.QuestionsController; +import org.olat.modules.qpool.ui.events.QItemEdited; +import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues; import org.olat.user.UserManager; /** @@ -77,7 +78,7 @@ public class RightsMetadataEditController extends FormBasicController { public RightsMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) { super(ureq, wControl); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.item = item; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/SharingController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/SharingController.java similarity index 97% rename from src/main/java/org/olat/modules/qpool/ui/edit/SharingController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/SharingController.java index 858c1803569..5948082992c 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/SharingController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/SharingController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import java.util.List; @@ -41,7 +41,7 @@ import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionItem2Pool; import org.olat.modules.qpool.QuestionItem2Resource; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.user.UserManager; /** @@ -63,7 +63,7 @@ public class SharingController extends FormBasicController { public SharingController(UserRequest ureq, WindowControl wControl, QuestionItem item) { super(ureq, wControl, "sharing"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); qpoolService = CoreSpringFactory.getImpl(QPoolService.class); initForm(ureq); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataController.java similarity index 95% rename from src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataController.java index e5e94325088..0ac2a68c491 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -33,7 +33,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Formatter; import org.olat.core.util.Util; import org.olat.modules.qpool.QuestionItem; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; import org.olat.modules.qpool.ui.events.QPoolEvent; /** @@ -51,7 +51,7 @@ public class TechnicalMetadataController extends FormBasicController { public TechnicalMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) { super(ureq, wControl, "view"); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.edit = edit; initForm(ureq); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java similarity index 91% rename from src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataEditController.java rename to src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java index c4c982c24cf..7010a5ff089 100644 --- a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataEditController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java @@ -17,10 +17,10 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.qpool.ui.edit; +package org.olat.modules.qpool.ui.metadata; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic; -import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateSelection; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic; +import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; @@ -38,7 +38,8 @@ import org.olat.ims.qti.QTIConstants; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.model.QuestionItemImpl; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.QuestionsController; +import org.olat.modules.qpool.ui.events.QItemEdited; /** * @@ -56,7 +57,7 @@ public class TechnicalMetadataEditController extends FormBasicController { public TechnicalMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) { super(ureq, wControl); - setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator())); + setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator())); this.item = item; qpoolService = CoreSpringFactory.getImpl(QPoolService.class); diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/author_list.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/author_list.html similarity index 100% rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/author_list.html rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/author_list.html diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/bulk_change.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/bulk_change.html similarity index 100% rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/bulk_change.html rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/bulk_change.html diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/edit_edu_context.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/edit_edu_context.html similarity index 100% rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/edit_edu_context.html rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/edit_edu_context.html diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html new file mode 100644 index 00000000000..76a3714158f --- /dev/null +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html @@ -0,0 +1,11 @@ +<div class="b_clearfix"><table><tbody> +#foreach($query in $uiQueries) + <tr> + <td>$r.render($query.attributChoice.name)</td> + <td>$r.render($query.parameterItem.name)</td> + <td>$r.render($query.addButton.component.componentName)</td> + <td>$r.render($query.removeButton.component.componentName)</td> + </tr> +#end +</tbody></table></div> +$r.render("buttons") \ No newline at end of file diff --git a/src/main/java/org/olat/modules/qpool/ui/_content/item_metadatas.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html similarity index 100% rename from src/main/java/org/olat/modules/qpool/ui/_content/item_metadatas.html rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/learning_time.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/learning_time.html similarity index 100% rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/learning_time.html rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/learning_time.html diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/sharing.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/sharing.html similarity index 100% rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/sharing.html rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/sharing.html diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/view.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/view.html similarity index 100% rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/view.html rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/view.html diff --git a/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java b/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java index cbfecc7dee6..3272a7acc44 100644 --- a/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java +++ b/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java @@ -40,7 +40,7 @@ import org.olat.modules.qpool.ExportFormatOptions; import org.olat.modules.qpool.QPoolSPI; import org.olat.modules.qpool.QuestionItemShort; import org.olat.modules.qpool.QuestionPoolModule; -import org.olat.modules.qpool.ui.MetadatasController; +import org.olat.modules.qpool.ui.metadata.MetadatasController; /** * diff --git a/src/main/java/org/olat/search/service/SearchServiceImpl.java b/src/main/java/org/olat/search/service/SearchServiceImpl.java index 35e0b0df8b6..a6111521861 100644 --- a/src/main/java/org/olat/search/service/SearchServiceImpl.java +++ b/src/main/java/org/olat/search/service/SearchServiceImpl.java @@ -109,7 +109,7 @@ public class SearchServiceImpl implements SearchService { AbstractOlatDocument.TITLE_FIELD_NAME, AbstractOlatDocument.DESCRIPTION_FIELD_NAME, AbstractOlatDocument.CONTENT_FIELD_NAME, AbstractOlatDocument.AUTHOR_FIELD_NAME, AbstractOlatDocument.DOCUMENTTYPE_FIELD_NAME, AbstractOlatDocument.FILETYPE_FIELD_NAME, - QItemDocument.STUDY_FIELD, QItemDocument.IDENTIFIER_FIELD, + QItemDocument.TAXONOMIC_PATH_FIELD, QItemDocument.IDENTIFIER_FIELD, QItemDocument.MASTER_IDENTIFIER_FIELD, QItemDocument.KEYWORDS_FIELD, QItemDocument.COVERAGE_FIELD, QItemDocument.ADD_INFOS_FIELD, QItemDocument.LANGUAGE_FIELD, QItemDocument.EDU_CONTEXT_FIELD, diff --git a/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java b/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java index 257e89cd85f..1af85e6d449 100644 --- a/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java +++ b/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java @@ -31,14 +31,19 @@ public class JmsIndexWork implements Serializable { private static final long serialVersionUID = 8790611181901676640L; + public static final String INDEX = "index"; + public static final String DELETE = "delete"; + private String indexType; private Long key; + private String action; public JmsIndexWork() { // } - public JmsIndexWork(String indexType, Long key) { + public JmsIndexWork(String action, String indexType, Long key) { + this.action = action; this.indexType = indexType; this.key = key; } @@ -58,7 +63,12 @@ public class JmsIndexWork implements Serializable { public void setKey(Long key) { this.key = key; } - - + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } } diff --git a/src/main/java/org/olat/search/service/indexer/JmsIndexer.java b/src/main/java/org/olat/search/service/indexer/JmsIndexer.java index 538ccbc886b..a521c2f6038 100644 --- a/src/main/java/org/olat/search/service/indexer/JmsIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/JmsIndexer.java @@ -245,7 +245,7 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer { QueueSender sender; QueueSession session; try { - JmsIndexWork workUnit = new JmsIndexWork(type, key); + JmsIndexWork workUnit = new JmsIndexWork(JmsIndexWork.INDEX, type, key); session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE ); ObjectMessage message = session.createObjectMessage(); message.setObject(workUnit); @@ -257,14 +257,36 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer { log.error("", e ); } } - + + @Override + public void deleteDocument(String type, Long key) { + QueueSender sender; + QueueSession session; + try { + JmsIndexWork workUnit = new JmsIndexWork(JmsIndexWork.DELETE, type, key); + session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE ); + ObjectMessage message = session.createObjectMessage(); + message.setObject(workUnit); + + sender = session.createSender(getJmsQueue()); + sender.send( message ); + session.close(); + } catch (JMSException e) { + log.error("", e ); + } + } + @Override public void onMessage(Message message) { if(message instanceof ObjectMessage) { try { ObjectMessage objMsg = (ObjectMessage)message; JmsIndexWork workUnit = (JmsIndexWork)objMsg.getObject(); - doIndex(workUnit); + if(JmsIndexWork.INDEX.equals(workUnit.getAction())) { + doIndex(workUnit); + } else if(JmsIndexWork.DELETE.equals(workUnit.getAction())) { + doDelete(workUnit); + } message.acknowledge(); } catch (JMSException e) { log.error("", e); @@ -282,6 +304,16 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer { } } + private void doDelete(JmsIndexWork workUnit) { + if(searchService instanceof SearchServiceImpl) { + String type = workUnit.getIndexType(); + List<LifeIndexer> indexers = getIndexerByType(type); + for(LifeIndexer indexer:indexers) { + indexer.deleteDocument(workUnit.getKey(), this); + } + } + } + private DirectoryReader getReader() throws IOException { DirectoryReader newReader = DirectoryReader.openIfChanged(reader); if(newReader != null) { @@ -289,14 +321,30 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer { } return reader; } - + + @Override public IndexWriter getAndLockWriter() throws IOException { return permanentIndexWriter.getAndLock(); } - + + @Override public void releaseWriter(IndexWriter writer) { permanentIndexWriter.release(writer); } + + @Override + public void deleteDocument(String resourceUrl) { + IndexWriter writer = null; + try { + Term uuidTerm = new Term(AbstractOlatDocument.RESOURCEURL_FIELD_NAME, resourceUrl); + writer = permanentIndexWriter.getAndLock(); + writer.deleteDocuments(uuidTerm); + } catch (IOException e) { + log.error("", e); + } finally { + permanentIndexWriter.release(writer); + } + } /** * Add or update a lucene document in the permanent index. diff --git a/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java b/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java index b37fa162c6d..d4da3c1b1cf 100644 --- a/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java @@ -46,6 +46,13 @@ public interface LifeFullIndexer { */ public void indexDocument(String type, Long key); + /** + * Delete a document + * @param type + * @param key + */ + public void deleteDocument(String type, Long key); + /** * Return the index writer, don't forget to release it. * @return @@ -71,5 +78,11 @@ public interface LifeFullIndexer { * @param writer */ public void addDocument(Document doc, IndexWriter writer); + + /** + * + * @param resourceUrl + */ + public void deleteDocument(String resourceUrl); } diff --git a/src/main/java/org/olat/search/service/indexer/LifeIndexer.java b/src/main/java/org/olat/search/service/indexer/LifeIndexer.java index 38bbcaae8bb..d38ec126505 100644 --- a/src/main/java/org/olat/search/service/indexer/LifeIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/LifeIndexer.java @@ -41,4 +41,6 @@ public interface LifeIndexer { */ public void indexDocument(Long key, LifeFullIndexer indexWriter); + public void deleteDocument(Long key, LifeFullIndexer indexWriter); + } diff --git a/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java b/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java index 137a9a01a22..8865fb36a7f 100644 --- a/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java @@ -56,6 +56,13 @@ public class QuestionItemIndexer implements LifeIndexer { indexWriter.addDocument(doc); } + @Override + public void deleteDocument(Long key, LifeFullIndexer indexWriter) { + QuestionItemDocumentFactory docFactory = CoreSpringFactory.getImpl(QuestionItemDocumentFactory.class); + String resourceUrl = docFactory.getResourceUrl(key); + indexWriter.deleteDocument(resourceUrl); + } + @Override public void fullIndex(LifeFullIndexer indexWriter) { QPoolService qpoolService = CoreSpringFactory.getImpl(QPoolService.class); diff --git a/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss b/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss index 2474b05fff6..4efcb12c960 100644 --- a/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss +++ b/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss @@ -142,7 +142,8 @@ div.b_msg_dialog { /* sticky info (admins can create stick-messages that will show for all users) */ #b_msg_sticky { clear:both; padding: 10px 10px 10px 50px; - min-height: 32px; background: #FFB651 url(../openolat/images/icon_warning_32.png) no-repeat 10px 10px; + min-height: 32px; + background: #FFB651 url(../openolat/images/icon_warning_32.png) no-repeat 10px 10px; border:none; } diff --git a/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java b/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java index 79fbbb69756..8bec5307b96 100644 --- a/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java +++ b/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java @@ -1,3 +1,22 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ package org.olat.util.browser.arquillian; import org.jboss.arquillian.core.spi.LoadableExtension; diff --git a/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java b/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java index 36cf4bc0eee..0a189076773 100644 --- a/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java +++ b/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java @@ -1,3 +1,22 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ package org.olat.util.browser.arquillian; import java.lang.annotation.Annotation; diff --git a/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java b/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java index 9fd474b62f6..67f9b3e3c41 100644 --- a/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java +++ b/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java @@ -1,13 +1,29 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ package org.olat.util.browser.arquillian; import java.lang.annotation.Annotation; -import java.util.List; import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor; -import org.jboss.arquillian.drone.selenium.configuration.SeleniumConfiguration; import org.jboss.arquillian.drone.spi.Configurator; import org.jboss.arquillian.drone.spi.Destructor; -import org.jboss.arquillian.drone.spi.DroneConfiguration; import org.jboss.arquillian.drone.spi.Instantiator; import com.thoughtworks.selenium.DefaultSelenium; -- GitLab