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 1ed81d993981094bf173fedae5b7d5b79a9a87c9..d244551c6d9bbf7967a5b273cde356192462a254 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 @@ -472,4 +472,12 @@ public interface FlexiTableElement extends FormItem, FormItemCollection { * @return The i18n key for the message to be displayed when the table is empty or NULL when no message should be displayed. */ public String getEmtpyTableMessageKey(); + + /** + * Add a button or an other component in the "button grouped" + * panel under the table. + * + * @param item An acceptable form item + */ + public void addBatchButton(FormItem item); } \ No newline at end of file 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 21b1cfad6cf7f5ab8ddb5ab8bb0cbd38ee3ca923..128a0f16f9ed060f0fe4cf9ffbac406a7f79950f 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 @@ -95,6 +95,7 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere sb.append("</table>"); renderFooterButtons(sb, ftC, translator); + renderFooterGroupedButtons(renderer, sb, ftC, ubu, translator, renderResult, args); //draggable if(ftE.getColumnIndexForDragAndDropLabel() > 0) { sb.append("<script>") @@ -402,7 +403,7 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere protected void renderFormItem(Renderer renderer, StringOutput sb, FormItem item, URLBuilder ubu, Translator translator, RenderResult renderResult, String[] args) { - if(item != null) { + if(item != null && item.isVisible()) { Component cmp = item.getComponent(); cmp.getHTMLRendererSingleton().render(renderer, sb, cmp, ubu, translator, renderResult, args); cmp.setDirty(false); @@ -468,6 +469,21 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere } } + protected void renderFooterGroupedButtons(Renderer renderer, StringOutput sb, FlexiTableComponent ftC, + URLBuilder ubu, Translator translator, RenderResult renderResult, String[] args) { + List<FormItem> items = ftC.getFlexiTableElement().getBatchButtons(); + if(items != null) { + boolean atLeastOneVisible = items.stream().anyMatch(FormItem::isVisible); + if(atLeastOneVisible) { + sb.append("<div class='o_button_group'>"); + for(FormItem item:items) { + renderFormItem(renderer, sb, item, ubu, translator, renderResult, args); + } + sb.append("</div>"); + } + } + } + protected abstract void renderHeaders(StringOutput target, FlexiTableComponent ftC, Translator translator); protected void renderBody(Renderer renderer, StringOutput target, FlexiTableComponent ftC, 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 6b04bcef473abf90572f3c5d7035a2888e2d4ceb..93824009f2fbda9dd1dcd09660f04359f0a6fa17 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 @@ -114,8 +114,10 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle private VelocityContainer rowRenderer; private VelocityContainer detailsRenderer; - private FormLink customButton, exportButton; - private FormLink searchButton, extendedSearchButton; + private FormLink customButton; + private FormLink exportButton; + private FormLink searchButton; + private FormLink extendedSearchButton; private FormLink classicTypeButton; private FormLink customTypeButton; private FormLink extendedFilterButton; @@ -147,8 +149,8 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle private FlexiTreeTableNode rootCrumb; private List<FlexiTreeTableNode> crumbs; - private Map<String,FormItem> components = new HashMap<>(); + private List<FormItem> batchButtons = new ArrayList<>(); public FlexiTableElementImpl(WindowControl wControl, String name, Translator translator, FlexiTableDataModel<?> tableModel) { this(wControl, name, translator, tableModel, -1, true); @@ -845,6 +847,18 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle public void addFormItem(FormItem item) { components.put(item.getName(), item); } + + public List<FormItem> getBatchButtons() { + return batchButtons; + } + + @Override + public void addBatchButton(FormItem item) { + if(item != null) { + batchButtons.add(item); + addFormItem(item); + } + } @Override public void doDispatchFormRequest(UserRequest ureq) { @@ -855,10 +869,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle protected void dispatchFormRequest(UserRequest ureq) { super.dispatchFormRequest(ureq); } - - /** - * @see org.olat.core.gui.components.form.flexible.FormItemImpl#evalFormRequest(org.olat.core.gui.UserRequest) - */ + @Override public void evalFormRequest(UserRequest ureq) { Form form = getRootForm(); diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java index 1bfa7136caa93a573f4c4c104a062249844ef8b3..dbd93f9d9d426cb570f49bc5c5106738ab2df456 100644 --- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java +++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java @@ -1393,10 +1393,11 @@ public class FIBAssessmentItemBuilder extends AssessmentItemBuilder { if(match(response, solution)) { return true; } - - for(TextEntryAlternative textEntryAlternative:alternatives) { - if(match(response, textEntryAlternative.getAlternative())) { - return true; + if(alternatives != null && !alternatives.isEmpty()) { + for(TextEntryAlternative textEntryAlternative:alternatives) { + if(match(response, textEntryAlternative.getAlternative())) { + return true; + } } } return false;