diff --git a/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java b/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java index 2675429b5b77f4f57c909254d8c124424df6905f..eb7fd68d8825b35ef1f284481c1a459529e0071c 100644 --- a/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java +++ b/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java @@ -146,6 +146,8 @@ public class SitesConfigurationController extends FormBasicController { tableEl = uifactory.addTableElement(ureq, getWindowControl(), "sitesTable", model, getTranslator(), formLayout); tableEl.setRendererType(FlexiTableRendererType.classic); + tableEl.setCustomizeColumns(true); + tableEl.setAndLoadPersistedPreferences(ureq, "sites-admin"); reload(ureq); } diff --git a/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java b/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java index 643332cb140267eaff32aa9a3a3f249e94f1942c..63e539a431aa848a0e4881334bf6aa2e269a487e 100644 --- a/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java +++ b/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java @@ -55,7 +55,7 @@ public class ExtendedIdentitiesTableControllerFactory { /** * @param args */ - public static TableController createController(ExtendedIdentitiesTableDataModel dataModel, UserRequest ureq, WindowControl wControl, boolean actionEnabled) { + public static TableController createController(ExtendedIdentitiesTableDataModel dataModel, UserRequest ureq, WindowControl wControl) { Locale loc = ureq.getLocale(); Translator trans = Util.createPackageTranslator(ExtendedIdentitiesTableControllerFactory.class, loc); TableGuiConfiguration tableConfig = new TableGuiConfiguration(); diff --git a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java index 16837364682a9addeb28d960aad20673f121f5cb..a6a9d5ed3298201a07d53e3bacc836893a0e1100 100644 --- a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java +++ b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java @@ -225,6 +225,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { Translator myTrans = userManager.getPropertyHandlerTranslator(getTranslator()); userTableModel = new UserSearchFlexiTableModel(Collections.<UserResultWrapper>emptyList(), resultingPropertyHandlers, isAdministrativeUser, getLocale(), tableColumnModel); tableEl = uifactory.addTableElement(ureq, getWindowControl(), "users", userTableModel, myTrans, formLayout); + tableEl.setCustomizeColumns(false); selectAll = uifactory.addFormLink("selectall", formLayout); deselectAll = uifactory.addFormLink("deselectall", formLayout); diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java index 6bd0874da9c2550bb439694c6f26a9a5c4456405..43fa729e7a2e5fe9ec194214256d8ba83e1465dd 100644 --- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java +++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java @@ -327,7 +327,7 @@ public class UsermanagerUserSearchController extends BasicController implements OLATResourceable ores = OresHelper.createOLATResourceableInstance("table", 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = addToHistory(ureq, ores, null); - tableCtr = ExtendedIdentitiesTableControllerFactory.createController(tdm, ureq, bwControl, actionEnabled); + tableCtr = ExtendedIdentitiesTableControllerFactory.createController(tdm, ureq, bwControl); listenTo(tableCtr); if (showEmailButton) { diff --git a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java index 1a251b6cf7a14299dd377d1d8f5baa1628ae2102..5a5c6f1ce18b8c5141879d58c1de4de81060d954 100644 --- a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java +++ b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java @@ -119,7 +119,7 @@ public class GroupOverviewController extends BasicController { tableDataModel = new BusinessGroupTableModelWithType(getTranslator(), 4); groupListCtr.setTableDataModel(tableDataModel); - updateModel(ureq); + updateModel(); addGroups = LinkFactory.createButton("add.groups", vc, this); vc.put("table.groups", groupListCtr.getInitialComponent()); @@ -132,7 +132,7 @@ public class GroupOverviewController extends BasicController { * @param identity * @return */ - private void updateModel(UserRequest ureq) { + private void updateModel() { SearchBusinessGroupParams params = new SearchBusinessGroupParams(); params.setIdentity(identity); params.setOwner(true); @@ -203,7 +203,7 @@ public class GroupOverviewController extends BasicController { if (currBusinessGroup==null) { //group seems to be removed meanwhile, reload table and show error showError("group.removed"); - updateModel(ureq); + updateModel(); } else if (TABLE_ACTION_LAUNCH.equals(te.getActionId())) { NewControllerFactory.getInstance().launch("[BusinessGroup:" + currBusinessGroup.getKey() + "]", ureq, getWindowControl()); } else if (TABLE_ACTION_UNSUBSCRIBE.equals(te.getActionId())){ @@ -230,7 +230,7 @@ public class GroupOverviewController extends BasicController { boolean mailMandatory = groupModule.isMandatoryEnrolmentEmail(ureq.getUserSession().getRoles()); if(mailMandatory) { doAddToGroups(groupsEv, true); - updateModel(ureq); + updateModel(); } else { confirmSendMailBox = activateYesNoDialog(ureq, null, translate("dialog.modal.bg.send.mail"), confirmSendMailBox); confirmSendMailBox.setUserObject(groupsEv); @@ -241,7 +241,7 @@ public class GroupOverviewController extends BasicController { boolean sendMail = DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event); AddToGroupsEvent groupsEv = (AddToGroupsEvent)confirmSendMailBox.getUserObject(); doAddToGroups(groupsEv, sendMail); - updateModel(ureq); + updateModel(); } else if (source == removeFromGrpDlg){ if(event == Event.DONE_EVENT) { boolean sendMail = removeFromGrpDlg.isSendMail(); @@ -331,7 +331,7 @@ public class GroupOverviewController extends BasicController { } } - updateModel(ureq); + updateModel(); StringBuilder groupNames = new StringBuilder(); for(BusinessGroup group:groupsToLeave) { diff --git a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java index 8ee3bf48d1e3c96b56bca8094945666aaf4ff4d0..d8c36c8ad06cdfb8e7ad47090a39ceabe8e80266 100644 --- a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java +++ b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java @@ -143,6 +143,7 @@ public class GroupSearchController extends StepFormBasicController { tableDataModel = new GroupTableDataModel(Collections.<GroupWrapper>emptyList(), tableColumnModel); table = uifactory.addTableElement(ureq, getWindowControl(), "groupList", tableDataModel, tableCont); + table.setCustomizeColumns(false); tableCont.add("groupList", table); if (!isUsedInStepWizzard()) { @@ -155,7 +156,7 @@ public class GroupSearchController extends StepFormBasicController { */ @Override protected void formOK(UserRequest ureq) { - doSearchGroups(ureq); + doSearchGroups(); } @Override @@ -171,7 +172,7 @@ public class GroupSearchController extends StepFormBasicController { @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == searchButton || source == searchLink || source == search) { - doSearchGroups(ureq); + doSearchGroups(); } else if(source == saveLink) { if(validateFormLogic(ureq)) { doSave(ureq); @@ -181,9 +182,9 @@ public class GroupSearchController extends StepFormBasicController { } } - private void doSearchGroups(UserRequest ureq) { + private void doSearchGroups() { String searchValue = search.getValue(); - doSearchGroups(searchValue, ureq); + doSearchGroups(searchValue); lastSearchValue = searchValue; } @@ -194,7 +195,7 @@ public class GroupSearchController extends StepFormBasicController { * @param searchValue * @param ureq */ - private void doSearchGroups(String searchValue, UserRequest ureq) { + private void doSearchGroups(String searchValue) { if (StringHelper.containsNonWhitespace(searchValue)) { SearchBusinessGroupParams param1s = new SearchBusinessGroupParams(); param1s.setNameOrDesc(searchValue); @@ -267,7 +268,7 @@ public class GroupSearchController extends StepFormBasicController { || (lastSearchValue != null && !lastSearchValue.equals(searchValue))) { // User pressed enter in input field to search for groups, no group // selected yet. Just search for groups that matches for this input - doSearchGroups(searchValue, ureq); + doSearchGroups(searchValue); lastSearchValue = searchValue; return false; } 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 1dce43769c3fd9f860aaf07dfc3cfeafd04fae5e..6f9148543cb6fb9d78f183eb0462e26735d789af 100644 --- a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties @@ -61,6 +61,7 @@ rating.5.3=$\:rating.2.2 rating.5.4=$\:rating.4.4 rating.5.5=Hervorragend rating.explanation=Klicken Sie um zu bewerten +reset=Reset save=Speichern save.close=Speichern und schliessen savesas=Speichern unter diff --git a/src/main/java/org/olat/core/gui/components/choice/Choice.java b/src/main/java/org/olat/core/gui/components/choice/Choice.java index 70f455ed407baf708dafd95aea59a06ba620c937..240885e146e48b401151b8e700fc612b6dc345ff 100644 --- a/src/main/java/org/olat/core/gui/components/choice/Choice.java +++ b/src/main/java/org/olat/core/gui/components/choice/Choice.java @@ -33,7 +33,6 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.AbstractComponent; import org.olat.core.gui.components.ComponentRenderer; import org.olat.core.gui.components.table.Table; -import org.olat.core.gui.components.table.TableDataModel; import org.olat.core.gui.control.Event; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; @@ -46,26 +45,18 @@ import org.olat.core.util.Util; public class Choice extends AbstractComponent { private static final ComponentRenderer RENDERER = new ChoiceRenderer(); - /** - * Comment for <code>EVENT_VALIDATION_OK</code> - */ public static final Event EVNT_VALIDATION_OK = new Event("validation ok"); - /** - * Comment for <code>EVENT_FORM_CANCELLED</code> - */ public static final Event EVNT_FORM_CANCELLED = new Event("form_cancelled"); - /** - * Comment for <code>CANCEL_IDENTIFICATION</code> - */ + public static final Event EVNT_FORM_RESETED = new Event("form_reseted"); public static final String CANCEL_IDENTIFICATION = "olat_foca"; + public static final String RESET_IDENTIFICATION = "olat_fore"; - private String submitKey; - private String cancelKey; + private String submitKey, cancelKey, resetKey; private boolean displayOnly = false; private List<Integer> selectedRows = new ArrayList<Integer>(); private List<Integer> removedRows = new ArrayList<Integer>(); private List<Integer> addedRows = new ArrayList<Integer>(); - private TableDataModel<?> tableDataModel; + private ChoiceModel model; /** * @param name of the component @@ -85,21 +76,24 @@ public class Choice extends AbstractComponent { /** * @see org.olat.core.gui.components.Component#dispatchRequest(org.olat.core.gui.UserRequest) */ + @Override protected void doDispatchRequest(UserRequest ureq) { // since we are a >form<, this must be a submit or a cancel // check for cancel first if (ureq.getParameter(CANCEL_IDENTIFICATION) != null) { fireEvent(ureq, EVNT_FORM_CANCELLED); + } else if (ureq.getParameter(RESET_IDENTIFICATION) != null) { + fireEvent(ureq, EVNT_FORM_RESETED); } else { selectedRows.clear(); removedRows.clear(); addedRows.clear(); // standard behavior: set all values, validate, and fire Event - int size = tableDataModel.getRowCount(); + int size = model.getRowCount(); for (int i = 0; i < size; i++) { String keyN = "c" + i; String exists = ureq.getParameter(keyN); - Boolean oldV = (Boolean) tableDataModel.getValueAt(i, 0); // column 0 + Boolean oldV = model.isEnabled(i); // column 0 // must always // return a // Boolean @@ -125,41 +119,29 @@ public class Choice extends AbstractComponent { fireEvent(ureq, EVNT_VALIDATION_OK); } } + + public String getSubmitKey() { + return submitKey; + } - /** - * @return String - */ + public void setSubmitKey(String string) { + submitKey = string; + } + public String getCancelKey() { return cancelKey; } - /** - * @return String - */ - public String getSubmitKey() { - return submitKey; - } - - /** - * @param string - */ public void setCancelKey(String string) { cancelKey = string; } - /** - * @param string - */ - public void setSubmitKey(String string) { - submitKey = string; + public String getResetKey() { + return resetKey; } - /** - * @see org.olat.core.gui.components.Component#getExtendedDebugInfo() - */ - public String getExtendedDebugInfo() { - return "choice: " - + (tableDataModel == null ? "no model!" : "rows:" + tableDataModel.getRowCount() + ", cols:" + tableDataModel.getColumnCount()); + public void setResetKey(String resetKey) { + this.resetKey = resetKey; } /** @@ -186,8 +168,8 @@ public class Choice extends AbstractComponent { /** * @return TableDataModel */ - public TableDataModel<?> getTableDataModel() { - return tableDataModel; + public ChoiceModel getModel() { + return model; } /** @@ -198,8 +180,8 @@ public class Choice extends AbstractComponent { * * @param model */ - public void setTableDataModel(TableDataModel<?> model) { - tableDataModel = model; + public void setModel(ChoiceModel model) { + this.model = model; } /** @@ -217,7 +199,13 @@ public class Choice extends AbstractComponent { return removedRows; } + @Override public ComponentRenderer getHTMLRendererSingleton() { return RENDERER; } + + @Override + public String getExtendedDebugInfo() { + return "choice: " + (model == null ? "no model!" : "rows:" + model.getRowCount()); + } } \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/choice/ChoiceModel.java b/src/main/java/org/olat/core/gui/components/choice/ChoiceModel.java new file mode 100644 index 0000000000000000000000000000000000000000..859771e6f0a96a966467263918a60c896cf00422 --- /dev/null +++ b/src/main/java/org/olat/core/gui/components/choice/ChoiceModel.java @@ -0,0 +1,38 @@ +/** + * <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.choice; + +/** + * + * Initial date: 27.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface ChoiceModel { + + public int getRowCount(); + + public Boolean isEnabled(int row); + + public String getLabel(int row); + + public boolean isDisabled(int row); + +} diff --git a/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java b/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java index 26e72a36af4bcea11af0795cd4d7bdeabedadcfb..3b84a384ded4d0541be67b1f5aac3ec12be26d34 100644 --- a/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java +++ b/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java @@ -29,7 +29,6 @@ package org.olat.core.gui.components.choice; import org.apache.commons.lang.StringEscapeUtils; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.DefaultComponentRenderer; -import org.olat.core.gui.components.table.TableDataModel; import org.olat.core.gui.control.winmgr.AJAXFlags; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; @@ -56,7 +55,7 @@ public class ChoiceRenderer extends DefaultComponentRenderer { // Get the model object Choice choice = (Choice) source; - TableDataModel<?> tdm = choice.getTableDataModel(); + ChoiceModel model = choice.getModel(); boolean iframePostEnabled = renderer.getGlobalSettings().getAjaxFlags().isIframePostEnabled(); // form header @@ -70,31 +69,26 @@ public class ChoiceRenderer extends DefaultComponentRenderer { target.append(">"); target.append("<table class=\"b_choice\">"); - int rows = tdm.getRowCount(); - int cols = tdm.getColumnCount(); - + int rows = model.getRowCount(); for (int i = 0; i < rows; i++) { - target.append("<tr>"); - for (int j = 0; j < cols; j++) { - Object val = tdm.getValueAt(i, j); - if (j == 0) { // column with on/off Boolean - target.append("<td class=\"b_choice_checkrow\">"); - boolean selected = ((Boolean) val).booleanValue(); - String keyN = "c" + i; - target.append("<input type=\"checkbox\" class=\"b_checkbox\""); - if (selected) target.append(" checked=\"checked\""); - target.append(" name=\"").append(keyN).append("\" onchange=\"return setFormDirty('").append(id).append("')\" />"); - } else { // regular row, dump value - target.append("<td class=\"b_choice_textrow\">"); - String sVal = val.toString(); - target.append(StringEscapeUtils.escapeHtml(sVal)); - } - target.append("</td>"); - } - target.append("</tr>"); + Boolean val = model.isEnabled(i); + boolean selected = val == null ? false : val.booleanValue(); + boolean disabled = model.isDisabled(i); + + String keyN = "c" + i; + target.append("<tr><td class='b_choice_checkrow'><input type='checkbox' class='b_checkbox'") + .append(" checked='checked'", selected) + .append(" disabled='disabled'", disabled) + .append(" name='").append(keyN).append("' onchange=\"return setFormDirty('").append(id).append("')\" />") + .append("</td>"); + + String label = model.getLabel(i); + target.append("<td class='b_choice_textrow'>") + .append(StringEscapeUtils.escapeHtml(label)) + .append("</td></tr>"); } // Toggle all on/off - target.append("<tr><td colspan=\"").append(cols).append("\" class=\"b_togglecheck\">") + target.append("<tr><td colspan='2' class=\"b_togglecheck\">") .append("<div class=\"b_togglecheck\">") .append("<a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', true)\">") .append("<input type=\"checkbox\" checked=\"checked\" disabled=\"disabled\" />") @@ -102,19 +96,29 @@ public class ChoiceRenderer extends DefaultComponentRenderer { .append("</a> <a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', false)\">") .append("<input type=\"checkbox\" disabled=\"disabled\" />") .append(translator.translate("uncheckall")) - .append("</a></div>") - .append("</td></tr>"); - + .append("</a></div></td></tr>"); + + //buttons + target.append("<tr><td colspan='2'><div class='btn-group'>"); // Submit button - target.append("<tr><td colspan=\"").append(cols).append("\"><div class=\"b_button_group\">"); - target.append("<input type=\"submit\" name=\"olat_fosm\" value=\"" + StringEscapeUtils.escapeHtml(translator.translate(choice.getSubmitKey())) - + "\" class=\"btn btn-default\" />"); + target.append("<input type='submit' name='olat_fosm' value=\"") + .append(StringEscapeUtils.escapeHtml(translator.translate(choice.getSubmitKey()))) + .append("\" class='btn btn-primary' />"); + //Reset button + String resetKey = choice.getResetKey(); + if (resetKey != null) { + target.append("<input type='submit' name='").append(Choice.RESET_IDENTIFICATION) + .append("' value=\"").append(StringEscapeUtils.escapeHtml(translator.translate(resetKey))) + .append("\" class='btn btn-default' />"); + } + // Cancel button String cancelKey = choice.getCancelKey(); if (cancelKey != null) { - target.append("<input type=\"submit\" name=\"" + Choice.CANCEL_IDENTIFICATION + "\" value=\"" - + StringEscapeUtils.escapeHtml(translator.translate(cancelKey)) + "\" class=\"btn btn-default\" />"); + target.append("<input type='submit' name='").append(Choice.CANCEL_IDENTIFICATION) + .append("' value=\"").append(StringEscapeUtils.escapeHtml(translator.translate(cancelKey))) + .append("\" class='btn btn-default' />"); } target.append("</div></td></tr></table></form>"); } 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 0399a20320c5a4d75231f7fbe7b263846838cc2d..9ce358183f1726e42d707326f4865dfb5893f3b6 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 @@ -93,6 +93,14 @@ public interface FlexiTableElement extends FormItem { */ public void setCustomizeColumns(boolean customizeColumns); + /** + * Set the id of the preferences saved on the database. + * + * @param ureq + * @param id + */ + public void setAndLoadPersistedPreferences(UserRequest ureq, String id); + /** * @return The CSS selector used to calculate the height of the table * (datatables variant only) diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java index 2cdfc00607943abbba375cbe1ea96e0a96aaba53..1d0d55d88999b5624a1cdd2188a796f4bafd7ea3 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java @@ -25,7 +25,7 @@ package org.olat.core.gui.components.form.flexible.impl.elements.table; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class AbstractFlexiColumnModel implements FlexiColumnModel { +public abstract class AbstractFlexiColumnModel implements FlexiColumnModel { private int alignment; private String headerKey; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java index 46b5c518e591cd162dc483915f583063c14d9bf1..0e36a7b695017e475ee02065a6610e63b4f3204e 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java @@ -71,6 +71,11 @@ public class DefaultFlexiColumnModel implements FlexiColumnModel { this.cellRenderer = cellRenderer; } + @Override + public boolean isAlwaysVisible() { + return false; + } + @Override public String getAction() { return null; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java index 17a38b18bf7da066927f9026539422dc07a3dd3f..8ffc95477e4ab30beb7bc8e91ac9f9e0782dd68f 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java @@ -37,12 +37,16 @@ public interface FlexiColumnModel { public static int ALIGNMENT_RIGHT = 2; public static int ALIGNMENT_CENTER = 3; + + public boolean isSortable(); public void setSortable(boolean enable); public boolean isDefaultVisible(); + public boolean isAlwaysVisible(); + public String getSortKey(); public void setSortKey(String sortedKey); 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 33d77289f6d0bb7ac66058dc76771d7463facb65..d7d86650e11ba61534e4a002e8853e1dcfa2425f 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 @@ -44,10 +44,10 @@ import org.olat.core.gui.components.ComponentEventListener; import org.olat.core.gui.components.choice.Choice; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemCollection; -import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions; import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; import org.olat.core.gui.components.form.flexible.elements.FlexiTableSort; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.Form; @@ -66,6 +66,7 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.translator.Translator; import org.olat.core.util.StringHelper; import org.olat.core.util.ValidationStatus; +import org.olat.core.util.prefs.Preferences; /** @@ -75,6 +76,8 @@ import org.olat.core.util.ValidationStatus; */ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableElement, FormItemCollection, ControllerEventListener, ComponentEventListener { + + //private static final XStream prefsXStream //settings private boolean multiSelect; @@ -83,6 +86,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle FlexiTableRendererType.classic }; + private String persistentId; private boolean customizeColumns = true; private int rowCount = -1; @@ -262,18 +266,28 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle this.multiSelect = multiSelect; } + @Override public boolean isCustomizeColumns() { return customizeColumns; } + @Override public void setCustomizeColumns(boolean customizeColumns) { this.customizeColumns = customizeColumns; } + @Override + public void setAndLoadPersistedPreferences(UserRequest ureq, String id) { + persistentId = id; + loadCustomSettings(ureq); + } + + @Override public String getWrapperSelector() { return wrapperSelector; } + @Override public void setWrapperSelector(String wrapperSelector) { this.wrapperSelector = wrapperSelector; } @@ -645,12 +659,15 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } else if(customTypeButton != null && customTypeButton.getFormDispatchId().equals(dispatchuri)) { setRendererType(FlexiTableRendererType.custom); + saveCustomSettings(ureq); } else if(classicTypeButton != null && classicTypeButton.getFormDispatchId().equals(dispatchuri)) { setRendererType(FlexiTableRendererType.classic); + saveCustomSettings(ureq); } else if(dataTablesTypeButton != null && dataTablesTypeButton.getFormDispatchId().equals(dispatchuri)) { setRendererType(FlexiTableRendererType.dataTables); + saveCustomSettings(ureq); } else { FlexiTableColumnModel colModel = dataModel.getTableColumnModel(); for(int i=colModel.getColumnCount(); i-->0; ) { @@ -685,8 +702,12 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle @Override public void dispatchEvent(UserRequest ureq, Component source, Event event) { if(source instanceof Choice) { - Choice visibleColsChoice = (Choice)source; - setCustomizedColumns(visibleColsChoice); + if(Choice.EVNT_VALIDATION_OK.equals(event)) { + Choice visibleColsChoice = (Choice)source; + setCustomizedColumns(ureq, visibleColsChoice); + } else if(Choice.EVNT_FORM_RESETED.equals(event)) { + resetCustomizedColumns(ureq); + } callout.deactivate(); } } @@ -790,7 +811,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle @Override public boolean isColumnModelVisible(FlexiColumnModel col) { - return enabledColumnIndex.contains(col.getColumnIndex()); + return col.isAlwaysVisible() || enabledColumnIndex.contains(col.getColumnIndex()); } @Override @@ -805,10 +826,10 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } } - protected void setCustomizedColumns(Choice visibleColsChoice) { + protected void setCustomizedColumns(UserRequest ureq, Choice visibleColsChoice) { List<Integer> visibleCols = visibleColsChoice.getSelectedRows(); if(visibleCols.size() > 1) { - VisibleFlexiColumnsModel model = (VisibleFlexiColumnsModel)visibleColsChoice.getTableDataModel(); + VisibleFlexiColumnsModel model = (VisibleFlexiColumnsModel)visibleColsChoice.getModel(); for(int i=model.getRowCount(); i-->0; ) { FlexiColumnModel col = model.getObject(i); if(visibleCols.contains(new Integer(i))) { @@ -818,15 +839,56 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } } } + saveCustomSettings(ureq); + component.setDirty(true); + } + + protected void resetCustomizedColumns(UserRequest ureq) { + enabledColumnIndex.clear(); + for(int i=dataModel.getTableColumnModel().getColumnCount(); i-->0; ) { + FlexiColumnModel col = dataModel.getTableColumnModel().getColumnModel(i); + if(col.isDefaultVisible()) { + enabledColumnIndex.add(new Integer(col.getColumnIndex())); + } + } + saveCustomSettings(ureq); component.setDirty(true); + } + + private void saveCustomSettings(UserRequest ureq) { + if(StringHelper.containsNonWhitespace(persistentId)) { + Preferences prefs = ureq.getUserSession().getGuiPreferences(); + FlexiTablePreferences tablePrefs = + new FlexiTablePreferences(enabledColumnIndex, rendererType); + prefs.put(FlexiTableElement.class, persistentId, tablePrefs); + prefs.save(); + } + } + + private void loadCustomSettings(UserRequest ureq) { + if(StringHelper.containsNonWhitespace(persistentId)) { + Preferences prefs = ureq.getUserSession().getGuiPreferences(); + FlexiTablePreferences tablePrefs = (FlexiTablePreferences)prefs.get(FlexiTableElement.class, persistentId); + if(tablePrefs != null) { + if(tablePrefs.getEnabledColumnIndex() != null) { + enabledColumnIndex.clear(); + enabledColumnIndex.addAll(tablePrefs.getEnabledColumnIndex()); + } + + if(tablePrefs.getRendererType() != null) { + setRendererType(tablePrefs.getRendererType()); + } + } + } } private Choice getColumnListAndTheirVisibility() { Choice choice = new Choice("colchoice", getTranslator()); - choice.setTableDataModel(new VisibleFlexiColumnsModel(dataModel.getTableColumnModel(), enabledColumnIndex, getTranslator())); + choice.setModel(new VisibleFlexiColumnsModel(dataModel.getTableColumnModel(), enabledColumnIndex, getTranslator())); choice.addListener(this); choice.setCancelKey("cancel"); choice.setSubmitKey("save"); + choice.setResetKey("reset"); return choice; } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTablePreferences.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTablePreferences.java new file mode 100644 index 0000000000000000000000000000000000000000..44673e7b27ae7f6871f4e8e715e352676bcf0e23 --- /dev/null +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTablePreferences.java @@ -0,0 +1,57 @@ +/** + * <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.io.Serializable; +import java.util.Set; + +/** + * + * Initial date: 27.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class FlexiTablePreferences implements Serializable { + + private static final long serialVersionUID = 220256298006571339L; + private Set<Integer> enabledColumnIndex; + private FlexiTableRendererType rendererType; + + public FlexiTablePreferences(Set<Integer> enabledColumnIndex, FlexiTableRendererType rendererType) { + this.enabledColumnIndex = enabledColumnIndex; + this.rendererType = rendererType; + } + + public Set<Integer> getEnabledColumnIndex() { + return enabledColumnIndex; + } + + public void setEnabledColumnIndex(Set<Integer> enabledColumnIndex) { + this.enabledColumnIndex = enabledColumnIndex; + } + + public FlexiTableRendererType getRendererType() { + return rendererType; + } + + public void setRendererType(FlexiTableRendererType rendererType) { + this.rendererType = rendererType; + } +} diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java index 43cf35116005b7f6d7edf1caac37d2bee307e8d2..d6a6b9e863c3c2afb5ded834e6d89a7be8937060 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java @@ -57,6 +57,11 @@ public class StaticFlexiColumnModel extends AbstractFlexiColumnModel { this.action = action; } + @Override + public boolean isAlwaysVisible() { + return true; + } + @Override public String getAction() { return action; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java index 2199d0db8d5bea5a0edc20ead23ae3c72a8f4ef0..8aa35bae48ca82f6b57b12cb460720af7baa260e 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java @@ -20,10 +20,9 @@ package org.olat.core.gui.components.form.flexible.impl.elements.table; import java.util.HashSet; -import java.util.List; import java.util.Set; -import org.olat.core.gui.components.table.TableDataModel; +import org.olat.core.gui.components.choice.ChoiceModel; import org.olat.core.gui.translator.Translator; /** @@ -32,7 +31,7 @@ import org.olat.core.gui.translator.Translator; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class VisibleFlexiColumnsModel implements TableDataModel<FlexiColumnModel> { +public class VisibleFlexiColumnsModel implements ChoiceModel { private Set<Integer> enabledCols = new HashSet<Integer>(); private final Translator translator; @@ -44,45 +43,33 @@ public class VisibleFlexiColumnsModel implements TableDataModel<FlexiColumnModel this.enabledCols = new HashSet<Integer>(enabledCols); } - @Override - public int getColumnCount() { - return 2; - } - @Override public int getRowCount() { return columns == null ? 0 : columns.getColumnCount(); } @Override - public Object getValueAt(int row, int col) { + public Boolean isEnabled(int row) { FlexiColumnModel cd = getObject(row); - switch (col) { - case 0: // on/off indicator; true if column is visible - return (enabledCols.contains(new Integer(cd.getColumnIndex())) ? Boolean.TRUE : Boolean.FALSE); - case 1: // name of column - if(cd.getHeaderLabel() != null) { - return cd.getHeaderLabel(); - } - return translator.translate(cd.getHeaderKey()); - default: - return "ERROR"; - } + return cd.isAlwaysVisible() || enabledCols.contains(new Integer(cd.getColumnIndex())) + ? Boolean.TRUE : Boolean.FALSE; } @Override - public FlexiColumnModel getObject(int row) { - if(columns == null) return null; - return columns.getColumnModel(row); + public String getLabel(int row) { + FlexiColumnModel cd = getObject(row); + return cd.getHeaderLabel() == null ? + translator.translate(cd.getHeaderKey()) : cd.getHeaderLabel(); } @Override - public void setObjects(List<FlexiColumnModel> objects) { - // + public boolean isDisabled(int row) { + FlexiColumnModel cd = getObject(row); + return cd.isAlwaysVisible(); } - @Override - public VisibleFlexiColumnsModel createCopyWithEmptyList() { - return new VisibleFlexiColumnsModel(columns, enabledCols, translator); + public FlexiColumnModel getObject(int row) { + if(columns == null) return null; + return columns.getColumnModel(row); } } diff --git a/src/main/java/org/olat/core/gui/components/table/Table.java b/src/main/java/org/olat/core/gui/components/table/Table.java index fd0217eb88223de53375c6ba2e7de20282e92455..f417833b1587ad491008b012ca8e99c94e9eb369 100644 --- a/src/main/java/org/olat/core/gui/components/table/Table.java +++ b/src/main/java/org/olat/core/gui/components/table/Table.java @@ -35,6 +35,7 @@ import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.AbstractComponent; import org.olat.core.gui.components.ComponentRenderer; +import org.olat.core.gui.components.choice.ChoiceModel; import org.olat.core.gui.control.Event; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.StringOutputPool; @@ -704,8 +705,8 @@ public class Table extends AbstractComponent { /** * @return a tabledatamodel for a choice */ - protected TableDataModel createChoiceTableDataModel() { - return new ChoiceTableDataModel(this.isMultiSelect(), this.allCDs, this.columnOrder, this.getTranslator()); + protected ChoiceModel createChoiceModel() { + return new ChoiceTableDataModel(isMultiSelect(), allCDs, columnOrder, getTranslator()); } /** @@ -973,7 +974,7 @@ public class Table extends AbstractComponent { } -class ChoiceTableDataModel extends BaseTableDataModelWithoutFilter { +class ChoiceTableDataModel implements ChoiceModel { private boolean isMultiSelect; private List<ColumnDescriptor> allCDs; @@ -986,11 +987,8 @@ class ChoiceTableDataModel extends BaseTableDataModelWithoutFilter { this.columnOrder = columnOrder; this.translator = translator; } - - public int getColumnCount() { - return 2; - } + @Override public int getRowCount() { // if this is a multiselect table, we do not want the checkboxes of // the multiselect to be disabled. therefore we simply exclude the entire @@ -1002,15 +1000,24 @@ class ChoiceTableDataModel extends BaseTableDataModelWithoutFilter { } } - public Object getValueAt(final int row, final int col) { - ColumnDescriptor cd = allCDs.get(isMultiSelect? (row + 1): row); - switch (col) { - case 0: // on/off indicator; true if column is visible - return (columnOrder.contains(cd) ? Boolean.TRUE : Boolean.FALSE); - case 1: // name of columndescriptor - return cd.translateHeaderKey() ? translator.translate(cd.getHeaderKey()) : cd.getHeaderKey(); - default: - return "ERROR"; - } + @Override + public Boolean isEnabled(int row) { + ColumnDescriptor cd = getObject(row); + return columnOrder.contains(cd) ? Boolean.TRUE : Boolean.FALSE; + } + + @Override + public String getLabel(int row) { + ColumnDescriptor cd = getObject(row); + return cd.translateHeaderKey() ? translator.translate(cd.getHeaderKey()) : cd.getHeaderKey(); + } + + @Override + public boolean isDisabled(int row) { + return false; + } + + public ColumnDescriptor getObject(int row) { + return allCDs.get(isMultiSelect? (row + 1): row); } } \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/table/TableController.java b/src/main/java/org/olat/core/gui/components/table/TableController.java index 210a5d96cef0a6bad3e1888e6f33b661b5da2e89..bef87e080e669490c627a4572245403d3827510b 100644 --- a/src/main/java/org/olat/core/gui/components/table/TableController.java +++ b/src/main/java/org/olat/core/gui/components/table/TableController.java @@ -266,12 +266,13 @@ public class TableController extends BasicController { contentVc.contextPut(VC_VAR_HAS_TABLE_SEARCH, Boolean.FALSE); //preference + download links - preferenceLink = LinkFactory.createCustomLink("prefLink", "cmd.changecols", "", Link.NONTRANSLATED, contentVc, this); - preferenceLink.setCustomEnabledLinkCSS("b_table_prefs"); + preferenceLink = LinkFactory.createCustomLink("prefLink", "cmd.changecols", "", Link.BUTTON | Link.NONTRANSLATED, contentVc, this); + preferenceLink.setCustomEnabledLinkCSS("o_icon o_icon-lg o_icon_customize"); preferenceLink.setTooltip(translate("command.changecols")); - downloadLink = LinkFactory.createCustomLink("downloadLink", "cmd.download", "", Link.NONTRANSLATED, contentVc, this); + + downloadLink = LinkFactory.createCustomLink("downloadLink", "cmd.download", "", Link.BUTTON | Link.NONTRANSLATED, contentVc, this); downloadLink.setTooltip(translate("table.export.title")); - downloadLink.setCustomEnabledLinkCSS("b_table_download"); + downloadLink.setCustomEnabledLinkCSS("o_icon o_icon-lg o_icon_download"); putInitialPanel(contentVc); } @@ -380,7 +381,7 @@ public class TableController extends BasicController { private Choice getColumnListAndTheirVisibility() { Choice choice = new Choice("colchoice", getTranslator()); - choice.setTableDataModel(table.createChoiceTableDataModel()); + choice.setModel(table.createChoiceModel()); choice.addListener(this); choice.setCancelKey("cancel"); choice.setSubmitKey("save"); diff --git a/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html b/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html index 38a17deed0216e64f0a2d7d9649dfe9db769dfe9..7600ca57bc3ebec5b5520dd5dd384f91354eb7ab 100644 --- a/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html +++ b/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html @@ -59,13 +59,14 @@ #end </div> #end + <div class="pull-right"> #if ($tableConfig.isPreferencesOffered()) $r.render("prefLink") #end - #if ($tableConfig.isDownloadOffered()) $r.render("downloadLink") #end + </div> </div> <div class="clearfix"></div> $r.render("table", $tableConfig.getCssPrefix()) diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java index 92554f10acac99264bdd4592294e26c2d6958ced..5ab0271e59febe04ec18ca6673adab28e83b5b57 100644 --- a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java +++ b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java @@ -31,6 +31,7 @@ import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.PersistenceHelper; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; @@ -123,7 +124,8 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr Translator myTrans = userManager.getPropertyHandlerTranslator(getTranslator()); ImportMemberOverviewDataModel userTableModel = new ImportMemberOverviewDataModel(oks, resultingPropertyHandlers, isAdministrativeUser, getLocale(), tableColumnModel); - uifactory.addTableElement(ureq, getWindowControl(), "users", userTableModel, myTrans, formLayout); + FlexiTableElement tableEl = uifactory.addTableElement(ureq, getWindowControl(), "users", userTableModel, myTrans, formLayout); + tableEl.setCustomizeColumns(false); } private void loadModel(List<String> keys) { diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java index e7eea2addfbb7e824e229ff222036c803372d93d..0bb62d0c2d7e47810b8b843b4eb5fd3a3a90a38c 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java @@ -254,6 +254,8 @@ public class CheckListAssessmentController extends FormBasicController implement table.setFilters("participants", filters); } table.setExportEnabled(true); + table.setCustomizeColumns(true); + table.setAndLoadPersistedPreferences(ureq, "checklist-assessment"); pdfExport = uifactory.addFormLink("pdf.export", formLayout, Link.BUTTON); pdfExport.setEnabled(numOfCheckbox > 0); diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java index fbd90d6b5a0f2abe7ab985e0c341f20d38267a68..b8816b98a82e906d05032af3c4193147c4d7620c 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java @@ -132,6 +132,7 @@ public class CheckListBoxListEditController extends FormBasicController { } model = new CheckboxConfigDataModel(boxList, getTranslator(), columnsModel); boxTable = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), tableCont); + boxTable.setCustomizeColumns(false); } @Override diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java index 61db889358a9bdbfcd0b65cbb99a76e61577e7b9..973ff0a3a989567e81831f77da5da99a451307fb 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java @@ -221,7 +221,9 @@ public class CheckboxAssessmentController extends FormBasicController { model = new CheckboxAssessmentDataModel(boxRows, columnsModel); table = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), formLayout); + table.setCustomizeColumns(true); table.setEditMode(true); + table.setAndLoadPersistedPreferences(ureq, "checkbox-assessment"); FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); formLayout.add(buttonsCont); diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java index eb0eac849032e3e5412234cd4983a2ff1cd8af94..23d4bcef919552393454a0ac99c14b84bfc6716b 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java @@ -102,6 +102,7 @@ public class CheckboxListStepController extends StepFormBasicController { List<Checkbox> boxList = data.getCheckboxList(); model = new CheckboxConfigDataModel(boxList, getTranslator(), columnsModel); boxTable = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), tableCont); + boxTable.setCustomizeColumns(false); } @Override diff --git a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java index f1101d908e22b78472ae18d97c7d4d84f4e62fc9..c3ec3455d12dfea8a90400111b40349851a82942 100644 --- a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java +++ b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java @@ -144,6 +144,7 @@ public class CourseSiteAdminController extends FormBasicController { tableEl = uifactory.addTableElement(ureq, getWindowControl(), "languageTable", model, getTranslator(), tableLayout); tableEl.setRendererType(FlexiTableRendererType.classic); tableEl.setCustomizeColumns(true); + tableEl.setAndLoadPersistedPreferences(ureq, "course-site-admin"); FormLayoutContainer buttonsLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); formLayout.add(buttonsLayout); diff --git a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java index 670717566774ea6f6ec6f7461c9080e4214e622e..fb7018d1fc30a047684e0d11fad6887d9c25d460 100644 --- a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java +++ b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java @@ -140,7 +140,7 @@ public class BGAreaEditController extends BasicController { groupsChoice = new Choice("groupsChoice", getTranslator()); groupsChoice.setSubmitKey("submit"); groupsChoice.setCancelKey("cancel"); - groupsChoice.setTableDataModel(groupsDataModel); + groupsChoice.setModel(groupsDataModel); groupsChoice.addListener(this); groupsTabVC.put("groupsChoice", groupsChoice); groupsTabVC.contextPut("noGroupsFound", (allGroups.size() > 0 ? Boolean.FALSE : Boolean.TRUE)); diff --git a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java index e1c22100c0735f7fb8c447112d50af294fc9e892..6f645f61028cf03ad0319b1d62e0395394b8d73d 100644 --- a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java +++ b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java @@ -25,10 +25,9 @@ package org.olat.group.ui.area; -import java.util.ArrayList; import java.util.List; -import org.olat.core.gui.components.table.DefaultTableDataModel; +import org.olat.core.gui.components.choice.ChoiceModel; import org.olat.group.BusinessGroup; /** @@ -37,7 +36,8 @@ import org.olat.group.BusinessGroup; * * @author gnaegi */ -public class GroupsToAreaDataModel extends DefaultTableDataModel<BusinessGroup> { +public class GroupsToAreaDataModel implements ChoiceModel { + private final List<BusinessGroup> allGroups; private final List<BusinessGroup> inAreaGroups; /** @@ -48,32 +48,31 @@ public class GroupsToAreaDataModel extends DefaultTableDataModel<BusinessGroup> * checked rows. */ public GroupsToAreaDataModel(List<BusinessGroup> allGroups, List<BusinessGroup> inAreaGroups) { - super(allGroups); + this.allGroups = allGroups; this.inAreaGroups = inAreaGroups; } - /** - * @see org.olat.core.gui.components.table.TableDataModel#getColumnCount() - */ - public int getColumnCount() { - return 2; + @Override + public int getRowCount() { + return allGroups == null ? 0 : allGroups.size(); } - /** - * @see org.olat.core.gui.components.table.TableDataModel#getValueAt(int, int) - */ - public Object getValueAt(int row, int col) { - if (col == 0) { - return inAreaGroups.contains(getObject(row)) ? Boolean.TRUE : Boolean.FALSE; - } else if (col == 1) { - return getObject(row).getName(); - } else { - return "ERROR"; - } + @Override + public Boolean isEnabled(int row) { + return inAreaGroups.contains(getObject(row)) ? Boolean.TRUE : Boolean.FALSE; } @Override - public GroupsToAreaDataModel createCopyWithEmptyList() { - return new GroupsToAreaDataModel(new ArrayList<BusinessGroup>(), inAreaGroups); + public String getLabel(int row) { + return getObject(row).getName(); + } + + @Override + public boolean isDisabled(int row) { + return false; + } + + public BusinessGroup getObject(int row) { + return allGroups.get(row); } } 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 a2092bdb0dfef7a27eff76272d0e32fad57b2f5d..f1ebeb031abc1674b329d2ce95e8485207dfef27 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 @@ -114,6 +114,7 @@ public class PoolsAdminController extends FormBasicController { model = new PoolDataModel(columnsModel, getTranslator()); poolTable = uifactory.addTableElement(ureq, getWindowControl(), "pools", model, getTranslator(), formLayout); + poolTable.setCustomizeColumns(false); poolTable.setRendererType(FlexiTableRendererType.classic); reloadModel(); 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 f26b91d7c5f32857284a44becf26bceaef8c35e5..9a300e4e4597d9c3d7b3b85ec395bf1ede33715d 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 @@ -107,6 +107,7 @@ public class QEducationalContextsAdminController extends FormBasicController { model = new LevelDataModel(columnsModel); tableEl = uifactory.addTableElement(ureq, getWindowControl(), "levels", model, getTranslator(), formLayout); tableEl.setRendererType(FlexiTableRendererType.classic); + tableEl.setCustomizeColumns(false); createType = uifactory.addFormLink("create.level", formLayout, Link.BUTTON); } 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 02b5353804c27f2155c664de8566eb3338864d52..a5de1edbc804d4f366e406f8d324a3be560fa1ae 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 @@ -107,6 +107,7 @@ public class QItemTypesAdminController extends FormBasicController { model = new QItemTypeDataModel(columnsModel); tableEl = uifactory.addTableElement(ureq, getWindowControl(), "types", model, getTranslator(), formLayout); tableEl.setRendererType(FlexiTableRendererType.classic); + tableEl.setCustomizeColumns(false); createType = uifactory.addFormLink("create.type", formLayout, Link.BUTTON); } 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 4af38b97b873035cb9e95fecc76affbb9238fef7..a14e3e54bd1a823a7a2d720af35c5d2e721a18d5 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 @@ -99,6 +99,7 @@ public class QLicensesAdminController extends FormBasicController { model = new QItemTypeDataModel(columnsModel); tableEl = uifactory.addTableElement(ureq, getWindowControl(), "licenses", model, getTranslator(), formLayout); tableEl.setRendererType(FlexiTableRendererType.classic); + tableEl.setCustomizeColumns(false); createType = uifactory.addFormLink("create.license", formLayout, Link.BUTTON); } diff --git a/src/main/java/org/olat/repository/ui/LifecycleAdminController.java b/src/main/java/org/olat/repository/ui/LifecycleAdminController.java index a1a7610f7a435ac03374772dc7273c3bdfff012f..48ae1660a54209e4be3393ce147483cdee981e93 100644 --- a/src/main/java/org/olat/repository/ui/LifecycleAdminController.java +++ b/src/main/java/org/olat/repository/ui/LifecycleAdminController.java @@ -95,6 +95,7 @@ public class LifecycleAdminController extends FormBasicController { model = new LifecycleDataModel(columnsModel); tableEl = uifactory.addTableElement(ureq, getWindowControl(), "cycles", model, getTranslator(), formLayout); tableEl.setRendererType(FlexiTableRendererType.classic); + tableEl.setCustomizeColumns(false); createLifeCycle = uifactory.addFormLink("create.lifecycle", formLayout, Link.BUTTON); } diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java index 29fff07da8842c5667df9ebc0425c3f8116fd18c..0a9ee7edc569132e98d5c836a64873c24855cfd8 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java @@ -96,6 +96,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class AuthorListController extends FormBasicController implements Activateable2, AuthoringEntryDataSourceUIFactory { + private final String i18nName; private FlexiTableElement tableEl; private final TooledStackedPanel stackPanel; @@ -129,6 +130,7 @@ public class AuthorListController extends FormBasicController implements Activat super(ureq, wControl, "entries"); setTranslator(Util.createPackageTranslator(RepositoryManager.class, getLocale(), getTranslator())); + this.i18nName = i18nName; this.searchParams = searchParams; this.startExtendedSearch = startExtendedSearch; @@ -221,6 +223,7 @@ public class AuthorListController extends FormBasicController implements Activat tableEl.setElementCssClass("o_coursetable"); tableEl.setMultiSelect(true); tableEl.setSortSettings(new FlexiTableSortOptions(true)); + tableEl.setAndLoadPersistedPreferences(ureq, "authors-list-" + i18nName); if(startExtendedSearch) { tableEl.expandExtendedSearch(ureq); diff --git a/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java b/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java index 953731cf5fe2ba915317ad3bbe81f12e7553671c..37e3a5e0a87d615b59242d4c3fe2ab0c1c290297 100644 --- a/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java +++ b/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java @@ -122,7 +122,7 @@ public class CatalogNodeController extends BasicController implements Activateab SearchMyRepositoryEntryViewParams searchParams = new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule"); searchParams.setParentEntry(catalogEntry); - entryListController = new RepositoryEntryListController(ureq, wControl, searchParams, stackPanel); + entryListController = new RepositoryEntryListController(ureq, wControl, searchParams, "catalog", stackPanel); mainVC.put("entries", entryListController.getInitialComponent()); listenTo(entryListController); diff --git a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java index 1267b2b3bd95acbd3afdd42b3f242b59874f0b5d..b371d9ffd18f165074a9804e3bbc6583b10330b9 100644 --- a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java +++ b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java @@ -169,7 +169,7 @@ public class OverviewRepositoryListController extends BasicController implements ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); markedStackPanel = new BreadcrumbedStackedPanel("mrkstack", getTranslator(), this); - markedCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, markedStackPanel); + markedCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, "marked", markedStackPanel); markedStackPanel.pushController(translate("search.mark"), markedCtrl); listenTo(markedCtrl); } @@ -189,7 +189,7 @@ public class OverviewRepositoryListController extends BasicController implements ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); myCoursesStackPanel = new BreadcrumbedStackedPanel("mystack", getTranslator(), this); - myCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, myCoursesStackPanel); + myCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, "my", myCoursesStackPanel); myCoursesStackPanel.pushController(translate("search.mycourses.student"), myCoursesCtrl); listenTo(myCoursesCtrl); } diff --git a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java index 5629d03727bfa7d812a58b06b02cef922b34f277..3f385784eaebf2e0f58866df8835121a6fe0548d 100644 --- a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java +++ b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java @@ -82,6 +82,7 @@ public class RepositoryEntryListController extends FormBasicController private final List<Link> filters = new ArrayList<>(); private final List<Link> orderBy = new ArrayList<>(); + private final String name; private FlexiTableElement tableEl; private RepositoryEntryDataModel model; private DefaultRepositoryEntryDataSource dataSource; @@ -97,11 +98,11 @@ public class RepositoryEntryListController extends FormBasicController private UserRatingsDAO userRatingsDao; public RepositoryEntryListController(UserRequest ureq, WindowControl wControl, - SearchMyRepositoryEntryViewParams searchParams, BreadcrumbPanel stackPanel) { + SearchMyRepositoryEntryViewParams searchParams, String name, BreadcrumbPanel stackPanel) { super(ureq, wControl, "repoentry_table"); setTranslator(Util.createPackageTranslator(RepositoryManager.class, getLocale(), getTranslator())); mapperThumbnailUrl = registerCacheableMapper(ureq, "repositoryentryImage", new RepositoryEntryImageMapper()); - + this.name = name; this.stackPanel = stackPanel; dataSource = new DefaultRepositoryEntryDataSource(searchParams, this); @@ -178,6 +179,7 @@ public class RepositoryEntryListController extends FormBasicController VelocityContainer row = createVelocityContainer("row_1"); row.setDomReplacementWrapperRequired(false); // sets its own DOM id in velocity container tableEl.setRowRenderer(row, this); + tableEl.setAndLoadPersistedPreferences(ureq, "re-list-" + name); } @Override